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

TPM NV_DefineSpace会话属性错误:PCR策略保护NV索引失败

TPM PCR策略保护NV索引失败(TPM_RC_ATTRIBUTES错误)

问题背景

在无操作系统的嵌入式设备上通过SPI直接连接TPM芯片,此前使用属性TPMA_NV_PLATFORMCREATE|TPMA_NV_OWNERWRITE|TPMA_NV_OWNERREAD|TPMA_NV_PPWRITE|TPMA_NV_PPREAD读写无保护NV索引完全正常,但尝试用PCR策略保护NV索引时,执行TPM_CC_NV_DefineSpace命令返回**TPM_RC_ATTRIBUTES(0x982)**错误。

操作步骤

  1. 发送tpm_startup命令,再执行带TPM2_SU_CLEAR属性的自检;
  2. 扩展部分PCR使其脱离初始零状态;
  3. 启动授权会话,命令字节流:
头部:
80 01       |   TPM_ST_NO_SESSIONS(无会话会话类型)
00 00 00 3b |   长度(59字节)
00 00 01 76 |   TPM_CC_StartAuthSession(启动授权会话命令码)

句柄:
40 00 00 07 |   TPM2_RH_NULL(空句柄)
40 00 00 07 |   TPM2_RH_NULL(空句柄)

随机数:
00 20       |   随机数长度(32字节)
02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 
00 00       |   盐值长度(0)
03          |   会话类型:TPM_SE_TRIAL(用于构建策略,TPM_SE_POLICY用于身份验证)
00 10       |   TPM2_ALG_NULL(无算法)
00 0b       |   TPM2_ALG_SHA256(SHA256算法)

会话启动响应正常,返回会话句柄03 00 00 00;
4. 在该会话内创建PCR策略,命令字节流:

80 01       |   TPM_ST_NO_SESSIONS(无会话会话类型)
00 00 00 3a |   长度(58字节)
00 00 01 7f |   TPM_CC_PolicyPCR(PCR策略命令码)
03 00 00 00 |   此前获取的会话句柄
00 20       |   TPM_SHA256_DIGEST_SIZE(SHA256摘要长度,32字节)
3b 7c 26 4a 0d 84 cc 84 f3 54 cf ce c0 d2 da 9a 88 ee 0c 26 7f 73 28 84 9a 60 2a 62 24 f9 60 49 -> PCR7的内容(预期PCR值)
00 00 00 01 |   PCR选择数量
00 0b       |   TPM2_ALG_SHA256(SHA256算法)
03          |   选择数组长度(3字节)
80 00 00    |   PCR编号7(从0开始计数,第7位为1)

响应无错误;
5. 尝试定义仅当PCR7为指定值时可读写的NV空间,命令字节流:

80 02       |   TPM_ST_SESSIONS(带会话会话类型)
00 00 00 4d |   长度(77字节)
00 00 01 2a |   TPM_CC_NV_DefineSpace(定义NV空间命令码)
40 00 00 0c |   TPM2_RH_PLATFORM(平台句柄,需TPMA_NV_PLATFORMCREATE属性)

认证区域插入此处(见TPM规范01.59版第1部分第97页表格粗线)

00 00 00 09 |   认证区域长度(9)
03 00 00 00 |   此前获取的会话句柄
00          |   会话属性(见TPM规范01.59版第1部分第93页)
00 00       |   HMAC长度

(认证区域结束)

00 00       |   认证长度(不使用密码认证)
00 00 00 2e |   TPM2B_NV_PUBLIC结构长度
01 50 00 02 |   NV空间索引(0x1500002)
00 0b       |   TPM2_ALG_SHA256(SHA256算法)
40 08 00 08 |   NV属性:TPMA_NV_PLATFORMCREATE | TPMA_NV_POLICYWRITE | TPMA_NV_POLICYREAD

00 20       |   策略长度
3b 7c 26 4a 0d 84 cc 84 f3 54 cf ce c0 d2 da 9a 88 ee 0c 26 7f 73 28 84 9a 60 2a 62 24 f9 60 49 -> PCR7的内容(预期PCR值)
00 20       |   NV空间长度(SHA256对应32字节)

返回错误:

80 01       |   TPM_ST_NO_SESSIONS(无会话会话类型)
00 00 00 0a |   长度(10字节)
00 00 09 82 |   错误码0x982/2434

错误原因分析

  1. TPM_SE_TRIAL会话用途错误:
    TPM_SE_TRIAL类型的会话仅用于构建和计算策略哈希,不能作为授权会话执行需要授权的命令(如NV_DefineSpace)。你在步骤5中用TRIAL会话来授权NV空间定义,违反了TPM对会话类型的属性限制,直接触发TPM_RC_ATTRIBUTES错误。

  2. 策略值设置错误:
    你直接将PCR7的原始值写入NV_PUBLIC的policy字段,但实际上,策略哈希是TRIAL会话中所有Policy命令(此处为PolicyPCR)的累积哈希结果,而非PCR的原始值。PolicyPCR会将PCR选择规则、哈希算法、PCR当前值一起哈希到会话的策略 digest 中,必须通过TPM_CC_PolicyGetDigest命令获取这个最终的策略哈希。

解决方法

修正后的操作流程

  1. 保留原步骤1-4:启动TPM、扩展PCR、启动TRIAL会话、执行PolicyPCR;
  2. 新增步骤:获取策略哈希
    向TRIAL会话发送TPM_CC_PolicyGetDigest命令,获取当前会话的策略哈希值,命令字节流示例:
    80 01       |   TPM_ST_NO_SESSIONS
    00 00 00 14 |   长度(20字节)
    00 00 01 83 |   TPM_CC_PolicyGetDigest
    03 00 00 00 |   TRIAL会话句柄
    
    响应中会返回32字节的SHA256策略哈希,这才是需要写入NV_PUBLIC.policy的内容;
  3. 执行NV_DefineSpace命令:
    • 授权部分:使用TPM2_RH_PLATFORM的合法授权(如平台密码,或若平台允许空授权则使用空认证),不要使用TRIAL会话;
    • NV_PUBLIC字段:将policy字段替换为步骤2获取的策略哈希;
    • NV属性保持TPMA_NV_PLATFORMCREATE | TPMA_NV_POLICYWRITE | TPMA_NV_POLICYREAD不变;
  4. 后续读写该NV空间时,需启动TPM_SE_POLICY会话,执行PolicyPCR命令匹配当前PCR7值,再用该会话授权读写操作。

关键注意点

  • TRIAL会话仅用于策略预计算,不能参与任何需要授权的命令执行;
  • NV空间的策略必须是TRIAL会话中所有Policy命令的累积哈希,而非单个PCR的原始值;
  • NV_DefineSpace的授权需满足TPM2_RH_PLATFORM的授权要求,与NV的策略保护是两个独立的授权环节(前者是创建NV的授权,后者是读写NV的授权)。

内容的提问来源于stack exchange,提问作者Niek Nooijens

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 09:35:53