You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 19:52:34