TPM 2.0第1部分包含对TPM属性、功能和方法的叙述描述。
本篇主要基于TPM 2.0规范Part 1的第15章(TPM Handles)和第16章(Names)的内容,对TPM句柄和名称进行解读。
TPM资源由句柄引用,句柄唯一标识占用TPM内存的资源(RAM或NV)。句柄为32位值。 它的最高有效字节标识所引用的资源类型。 在任何给定的时刻,它的低24位标识了该类型的唯一资源。 低24位标识的实际资源可能会随时间而变化。
一个具体的句柄值一次只能引用一个TPM驻留资源。
为了减少混淆,为PCR分配的句柄与规范的以前版本中具有相同的值。 PCR句柄是PCR数组的索引。 PCR的Index和handle值是相同的。
NV索引与一个由TPM2_NV_DefineSpace()创建的持久TPM资源相关联。
当启动授权会话时,TPM分配会话句柄(TPM2_StartAuthSession())。 一个HMAC会话被分配一个MSO为0216的句柄,一个策略会话被分配一个MSO为0316的句柄。 每个授权会话句柄都与一个惟一的上下文相关联,该上下文可能一次只存在于一个地方:在一个屏蔽位置的TPM上,或者作为一个保护对象保存在一个上下文中。 只要会话存在,句柄就与会话保持关联,并且在上下文保存和重新加载会话时不会更改。
每个会话句柄的低3字节是唯一的。 它们被交替分配给HMAC或策略会话,但每次只分配给一个。
例1:如果一个策略会话的值为03 00 00 0116,那么不会同时分配一个值为02 00 00 0116的HMAC会话。
注1:策略句柄和会话句柄是从一个普通的句柄值池中分配的。
当使用TPM2_GetCapability()获取当前加载在TPM上的会话列表时,调用者将使用MSO为0216的句柄。 虽然这通常是一个HMAC句柄引用,但TPM将响应一个包括HMAC和策略会话的列表。 句柄将按低三个八字节的升序返回。
TPM需要维护所有当前分配的会话句柄列表,以及任何保存的会话上下文的正确“版本号”。
注2:“版本号”是TPM防止重放授权的方式。
当不再需要授权会话时,可以使用TPM2_FlushContext()从TPM内存中删除与会话关联的所有上下文(见30.6)。 该命令的会话句柄可以使用0216或0316的高字节。
注3:刷新会话上下文将删除TPM中与该上下文相关的任何数据,并释放与该上下文相关的句柄,并使任何保存的上下文的版本号失效。
TPM内存中的所有会话上下文都会在任何TPM2_Startup()上刷新。 保存的会话上下文在TPM重置之前一直有效。
固定资源句柄引用总是与相同句柄相关联的屏蔽位置。 这些资源的句柄MSO为4016。 这些资源的示例有所有者、平台和背书层次结构控件以及锁定的授权值。
另一种永久资源句柄是特定于供应商的授权值。 这些可选资源可以填充只有TPM制造商或某些其他特权实体才知道的授权值。 这些授权值的更新依赖于TPM制造商。
由于特定于供应商的授权值可能被知道它们的实体用于识别TPM,因此这些授权值的使用由隐私管理员控制。 这些授权值只有在如13.5所述启用背书层次结构时才可用。
注:特定于供应商的授权值的一个用例是在现场(field)从TPM固件的缺陷中恢复。 例如,TPM供应商可能提供一种基于TPM固件度量更新一个或多个授权值的机制。 这种更新机制可以让制造商确信正在运行一个有效的、不受损害的TPM固件版本。 在这种情况下,如果制造商希望现场升级到可信固件版本后为现场生成的背书密钥提供证书,那么制造商可以使用一个可审计的授权会话,使用特定于供应商的授权值来验证背书密钥的属性,然后为该新背书密钥创建一个证书。
当对象被加载或对象的持久性改变时,TPM分配对象句柄(TPM2_EvictControl())。 TPM RAM中的暂态对象具有8016 MSO的句柄; 每次使用对象时,三个LSO可能有不同的值。 这是因为对象的上下文可能已经换出,并且在对象被换回时TPM分配了一个新的句柄。 TRM确保句柄引用正确的对象。
在任何TPM2_Startup()上,从TPM内存中刷新所有暂态对象。 可以使用TPM2_FlushContext()从TPM内存中刷新加载的Transient Object上下文,并指示要刷新加载上下文的句柄。
**TPM2_EvictControl()**可以将一个临时对象变成一个持久对象。 放置在TPM的NV存储中的Persistent Object不会被TPM2_Startup()清除。
使对象持久需要平台授权或所有者授权。
当TPM将暂态对象更改为持久对象时,调用者指示要分配给持久对象的句柄。 要求句柄的MSO为8116。 如果使用所有者授权(Owner Authorization)提供授权,则下一个最高有效位需要是CLEAR,如果使用平台授权(Platform Authorization)提供授权,则需要是SET。 如果句柄尚未被使用,且空间可用,则创建一个对象的持久副本,并将其分配给调用者提供的句柄。 这个句柄总是引用相同的持久对象,只要它保持持久。 分配给持久对象的句柄可以分配给一个新的持久对象,如果第一个对象被从持久存储中删除。
“名称”是实体的唯一标识。 与对象关联的句柄可能会由于上下文管理而改变(TPM2_ContextSave() / TPM2_ContextLoad()),但对象的名称保持不变。 与NV索引相关联的名称将根据索引属性的更改而更改。
例:当一个NV索引最初被定义时,它会有一个带有TPMA_NV_WRITTEN CLEAR的索引名称。 写入索引之后,Name将改变,以反映TPMA_NV_WRITTEN是为索引SET的。
当一个NV索引被锁定时(TPMA_NV_WRITELOCKED或TPMA_NV_READLOCKED设置为SET), NV索引的名称会改变。 这有两个含义:调用者应该使用它的NV公共区域的副本,并在HMAC授权计算中使用它之前计算名称。 否则,无效授权可能会触发依赖TPMA_NV_NO_DA的字典攻击防护。
在进行授权检查之前,TPM模块必须先进行访问控制检查。 例如,在执行可能触发字典攻击保护的授权检查之前,它应该拒绝读取读锁定的NV索引。
计算实体名称的方法根据作为句柄的MSO的实体类型而不同。 Table 3显示了针对不同实体类型的方法和句柄的MSO。
当Name的计算使用散列算法时,算法标识符将包含在Name结构中。 如果Name是句柄,则Name只是句柄值。
创建对象时,公共区域的“模板(template)”用于定义新对象的属性。 该模板具有对象公共区域的结构。 公共区域模板的“名称”的计算方法与“暂态对象名称”相同。
以上就是今天要讲的内容。本文介绍了TPM句柄和名称,TPM句柄主要包含以下六种类型:PCR、NV索引、会话、永久资源、暂态资源和持久对象。不同类型句柄所对应的实体名称计算方法也不同。
下一篇我们介绍PCR操作(PCR Operations,Part 1体系结构第17章)。