使用ESYS API通过持久化主密钥生成子密钥遇0x98e错误求助
错误码0x98e(TPM_RC_POLICY)的排查与解决
0x98e对应的是TPM_RC_POLICY错误,本质是调用Esys_Create时未满足持久化主密钥的授权策略要求。以下是具体排查和修复方向:
确认主密钥的授权策略配置
持久化主密钥如果在创建时设置了authPolicy(固定授权策略),生成子密钥时必须严格遵循该策略。比如主密钥要求必须通过TPM2_PolicyAuthValue验证,那你必须在授权会话中执行这个策略命令,否则TPM会拒绝操作。检查会话类型是否正确
如果主密钥的authPolicy字段非空,**必须使用策略会话(TPM2_SE_POLICY)**来授权Esys_Create,不能用普通的密码会话(TPM2_SE_PASSWORD)。哪怕输入了正确的authValue,只要策略不匹配,就会触发这个错误。验证模拟器的持久化状态
部分TPM模拟器默认不保存持久化数据,重启后之前持久化的主密钥会丢失。检查你使用的模拟器是否启用了持久化存储:比如IBM的TPM模拟器需要添加-p参数指定存储目录,否则重启后持久化密钥会失效,导致加载的句柄无效,间接触发策略错误。代码参数的关键检查
重点核对Esys_Create的几个核心参数:parentHandle是否是正确的持久化句柄(比如TPM2_HR_PERSISTENT + 0x01这类,而非临时加载的句柄);- 授权会话是否完成了主密钥要求的所有策略步骤;
- 子密钥的模板(
inPublic)是否符合主密钥的限制(比如主密钥是否允许生成RSA/ECC类型的子密钥)。
这里给一个简化的策略会话示例(假设主密钥要求
TPM2_PolicyAuthValue):// 初始化策略会话 ESYS_TR policy_session; Esys_StartAuthSession(esysContext, ESYS_TR_NONE, ESYS_TR_NONE, ESYS_TR_NONE, ESYS_TR_NONE, ESYS_TR_NONE, TPM2_SE_POLICY, NULL, TPM2_ALG_SHA256, &policy_session); // 执行主密钥要求的策略步骤 Esys_PolicyAuthValue(esysContext, policy_session, ESYS_TR_PASSWORD, ESYS_TR_NONE, ESYS_TR_NONE); // 调用Esys_Create,使用策略会话授权 TPM2B_SENSITIVE_CREATE in_sensitive = {0}; TPM2B_PUBLIC in_public = {0}; // 填充in_sensitive和in_public的具体字段... Esys_Create(esysContext, parent_handle, policy_session, ESYS_TR_NONE, ESYS_TR_NONE, &in_sensitive, &in_public, NULL, NULL, NULL, NULL);验证策略摘要一致性
可以用Esys_PolicyGetDigest获取当前策略会话的摘要,和主密钥公钥中的authPolicy字段对比,确认两者是否完全一致。如果不一致,说明策略步骤执行有误,需要调整会话中的策略命令。
内容的提问来源于stack exchange,提问作者pt068
相关产品推荐
相关产品推荐

