TPM 2.0规范解读系列——Part 1体系结构第(十)读:TPM命令/响应结构

前言

TPM 2.0第1部分包含对TPM属性、功能和方法的叙述描述。
本篇主要基于TPM 2.0规范Part 1的第18章(TPM Command/Response Structure)的相关概念描述和定义进行解读。


文章目录

  • 前言
  • 一、介绍(Introduction)
  • 二、命令/响应头字段(Command/Response Header Fields)
    • 1.tag
    • 2.commandSize/responseSize
    • 3.commandCode
    • 4.responseCode
  • 三、句柄(Handles)
  • 四、参数(Parameters)
  • 五、authorizationSize/parameterSize
  • 六、授权区域(Authorization Area)
    • 1.介绍
    • 2.授权结构
      • 2.1 命令
      • 2.2 响应
      • 2.3 会话句柄
      • 2.4 会话属性
  • 七、命令参数哈希(*cpHash*)
  • 八、响应参数哈希(*rpHash*)
  • 九、命令示例
  • 十、响应示例
  • 总结


一、介绍(Introduction)

命令为TPM Protected Capability,表示TPM需要执行的操作。 它包含五个组成部分,按下列顺序排列:
1)命令头,指示命令的总体大小,命令代码,以及指示授权区域是否存在的标记;
2)一个与命令相关的编号(0到3)的句柄数,用于标识命令(Protected Capability)在/上运行的屏蔽位置;
3)32位值,表示授权区域的大小;
4)授权区域,包含一到三个会话结构; 和
注:组件3和组件4总是同时出现。 如果授权区域中没有会话,则不存在授权大小参数。
5)一个与命令相关的参数区域,包含命令的限定信息。

一个响应包含:
1)响应头,表示响应的整体大小,响应代码,以及表示授权区域是否存在的标记;
2)一个依赖于命令(0或1)的句柄数,用于标识命令(Protected Capability)运行的/上的屏蔽位置;
3)32位值,表示参数区域的大小;
4)一个命令相关的参数区域,包含TPM产生的值; 和
5)一个授权区域,包含一个到三个会话结构。
说明:组件3和组件5总是同时出现。 也就是说,如果授权区域为空,则参数大小的32位值将不存在。

与命令一样,响应的其余区域的格式依赖于相关命令代码的值。 会话和参数区域的顺序在响应中是颠倒的。

授权结构和与命令相关的参数的排序是为了最小化TPM的复杂性。 在命令中,首先是授权结构,以便TPM可以在到达命令相关参数时从它们生成授权摘要。 在响应中,与命令相关的参数是第一个,以便TPM可以在生成授权摘要之前使用输出缓冲区来组装与命令相关的参数。
注:在传统实现中,命令的所有字节同时可用,所以在数据结构中跳跃不是问题。 在一些预期的实现中,情况并非如此,命令或响应的处理需要更加线性化。

本规范中的Tabel 4中显示了指示头、句柄、授权和参数组件之间界限的分隔符。
TPM 2.0规范解读系列——Part 1体系结构第(十)读:TPM命令/响应结构_第1张图片
Figure 10Figure 11显示了TPM命令和响应的基本布局(参见18.9获得详细的示例命令,参见18.10获得详细的示例响应)。
TPM 2.0规范解读系列——Part 1体系结构第(十)读:TPM命令/响应结构_第2张图片
注:并不是授权区域中的所有会话都需要进行授权。 会话还可以用于审计或参数加密。

二、命令/响应头字段(Command/Response Header Fields)

命令或响应头总是包含三个值,如Figure 12所示。
TPM 2.0规范解读系列——Part 1体系结构第(十)读:TPM命令/响应结构_第3张图片

1.tag

在发送到TPM的所有命令中以及从TPM接收到的响应中都存在一个tag。tag指示命令是按照TPM 1.2还是这个2.0规范格式化的。 如果是后者,则tag指示是否存在任何会话数据。

Table 5列出了用于本规范中定义的命令和响应的标记值。
注:本规范中定义的命令的tags仅表示该命令使用了一个或多个会话,而不表示授权区域中存在的会话数。 每个使用变量会话句柄的会话结构遵循相同的格式,可以通过解析该格式来找到下一个会话的开始。
TPM 2.0规范解读系列——Part 1体系结构第(十)读:TPM命令/响应结构_第4张图片

2.commandSize/responseSize

commandSize/responseSize值表示该命令/响应的总字节数,从标记的第一个字节开始。

3.commandCode

commandCode只出现在TPM的命令中。 它指示TPM应该执行的操作以及命令和响应的句柄和参数区域的格式。 commandCode参数包含在命令参数hash (cpHash)和响应参数hash (rpHash)中。

4.responseCode

responseCode只出现在TPM的响应中。 TPM_RC_SUCCESS(zero)的responseCode表示TPM已经成功地完成了命令,并且根据命令格式,句柄、参数和授权组件都存在。

非零的responseCode表示错误或故障。 在本例中,标签为TPM_ST_NO_SESSIONS, responseSize为10,表示responseCode后面没有字节。 不存在句柄、参数或会话响应组件。

三、句柄(Handles)

句柄是由TPM分配的值,让调用者指示要操作命令的TPM常驻结构。 也就是说,句柄标识保护能力操作的/所在的屏蔽位置。 一些TPM命令(如TPM2_Startup())不需要句柄。

命令和响应中的句柄数由commandCode隐含。 它还指示具有关联授权会话的命令句柄。 关联授权会话中需要授权的句柄列在没有关联授权会话的句柄之前。
例:TPM2_ObjectChangeAuth()有两个句柄,一个(objectHandle)使用授权会话,一个(parentHandle)不使用授权会话。 标准命令语法要求首先出现objectHandle。

只有当responseCode为TPM_RC_SUCCESS时,响应才能有句柄。

句柄区域中句柄数量的体系结构限制为7个。 这个限制是由错误报告机制决定的。
注:当前定义的命令没有一个句柄超过3个。

四、参数(Parameters)

commandCode表示可选句柄和参数区域的结构。 这些参数区域的内容对于命令和响应是不同的。 有些TPM命令(如TPM2_Clear())不需要参数。

所有参数值和commandCode都包含在cpHashrpHash中。 cpHash中没有包含authorizationSize,而rpHash中没有包含parameterSize
注1:参数加密后,该参数会包含在加密后的“cpHash/rpHash”中。 因为审计也使用cpHash和rpHash,所以对加密会话的审计虽然有效,但在应用程序级别不太可能有用。

响应只有在responseCode为TPM_RC_SUCCESS时才可以有参数。

句柄区域内参数数量的体系结构限制为15个。 这个限制是由错误报告机制决定的。
注2:这是参数列表中的参数限制,而不是参数区域中可能存在的值的数量。 如果一个命令需要超过15个参数,则可以定义一个新结构,将两个或多个参数封装到单个结构中,然后可以将其作为一个单元解组。 唯一的损失是,当复合参数出现错误时,错误报告可能无法提供足够的细节。

如第21章所述,对于要加密的命令或响应参数,它必须是第一个参数,并且必须是TPM2B类型。
注3:为了加密多个参数,它们必须封装在TPM2B中,使它们成为单个参数。
例:TPM2B_SENSITIVE_CREATE是TPM2_CreatePrimary()的第一个参数。数据成员TPMS_SENSITIVE_CREATE有两个成员,一个TPM2B_AUTH和一个TPM2B_SENSITIVE_DATA。将它们封装在TPM2B_SENSITIVE_ CREATE中允许对它们进行加密。

五、authorizationSize/parameterSize

只有当命令/响应的标记为TPM_ST_SESSIONS时,才会出现这些值。

其中,authorizationSize表示该命令授权区域内所有授权结构的字节数。 authorizationSize不包括authorizationSize值的四个字节。 authorizationSize的最小值是9。
注1:最大值取决于在TPM上实现的任何哈希产生的最大摘要的大小。
注2:驱动和TPM使用authorizationSize字段来确定授权数。 处理完authorizationSize字节后,将不再有授权。

在响应中,parameterSize表示响应参数区域的字节数,不包括parameterSize值的四个字节数。 parameterSize的值可以为0。

cpHash中没有包含authorizationSize,而rpHash中没有包含parameterSize

六、授权区域(Authorization Area)

1.介绍

只有当命令的标记为TPM_ST_SESSIONS时,命令中才会出现授权区域。 如果存在,授权区域将包含:

  • 0、1或2次授权(会话或密码)
  • 一个可选的会话,用于解密发送到TPM的数据
  • 一个可选的会话,用于加密TPM发送的数据
  • 用于审计的可选会话。

如果tag是TPM_ST_SESSIONS,那么授权区域将至少有一个但不超过三个授权/会话块。 如果标记是TPM_ST_NO_SESSIONS,则不存在授权区域。

在TPM 2.0第3部分的命令示意图中显示了命令将拥有的授权会话的数量。 如果句柄区域中的句柄带有“@”装饰,则需要存在一个授权会话(授权会话可以是密码会话、策略会话或HMAC会话)。

授权会话按照关联实体句柄的顺序发生。 也就是说,第一个带有“@”装饰的句柄将与Authorization Area中的第一个会话相关联。

其他会话可以添加到授权区域。 这些会话可以被指定为用于加密、解密或审核; 以任何组合,任何顺序。 但是,在一个命令中,只有一个会话允许具有encrypt属性,一个会话允许具有decrypt属性,一个会话允许具有audit属性。

单个会话可以同时用于授权、加密、解密和审计。 也就是说,如果一个会话有一个带有“@”装饰的句柄,那么关联的授权会话可能设置了所有的加密、解密和审计属性。 密码授权只能用于授权,如果在密码授权中设置了加密、解密或审计,TPM将返回错误(TPM_RC_ATTRIBUTES)。
注1:如果一个授权会话的“加密、解密、审计”都SET,则该命令只能有一个授权会话。

Table 6总结了每个会话所允许的属性组合。
TPM 2.0规范解读系列——Part 1体系结构第(十)读:TPM命令/响应结构_第5张图片
在TPM 2.0第3部分中,每个命令的示意图将指示它是否有句柄,以及使用这些句柄是否需要授权。 如果句柄名称前面有一个at符号(“@”)字符,那么使用与句柄相关联的TPM资源需要授权,授权(会话或密码)将出现。 将为每个需要授权的TPM资源提供授权(每个句柄带有“@”)。 句柄需要授权的另一个指示是,在命令示意图的“Description”列中,每个句柄都有一个“Auth Index:”条目。 如果条目显示“None”,则不需要授权。 如果该条目后面跟着一个数字,则该数字表示关联授权在授权列表中的顺序。
注2:目前,任何命令都不需要两次以上的授权。

如果一个命令需要授权,那么这些授权将位于授权/会话列表的第一个位置。 随后可能会有用于加密、解密或审计的其他会话。

如果responcode是TPM_RC_SUCCESS,则响应具有与请求相同顺序的相同数量的会话。 否则,不存在授权或审计会话。

2.授权结构

2.1 命令

在命令中,每个授权结构的格式如Figure 13所示。 TPM 2.0规范解读系列——Part 1体系结构第(十)读:TPM命令/响应结构_第6张图片

2.2 响应

在响应中,每个会话结构的格式如Figure 14所示。
TPM 2.0规范解读系列——Part 1体系结构第(十)读:TPM命令/响应结构_第7张图片
第19.6.7节介绍了创建授权会话的方法。

2.3 会话句柄

会话句柄见15.4。 它们标识由特定会话结构引用的会话。

对于给定的命令,与特定HMAC或策略会话相关联的句柄只能在授权区域中出现一次。 表示密码授权(TPM_RS_PW)的句柄可以出现多次。

2.4 会话属性

每个会话都有一个sessionAttributes区段来指示如何应用会话。 Table 7解释了这个八位元中字段的含义。

如果一个会话未用于授权,则必须SET解密、加密或审计中的至少一个。

属性 含义
continueSession 此属性用于指示TPM在命令完成时会话是否保持“活动”。 如果该属性在命令中是CLEAR并且命令成功完成(TPM_RC_SUCCESS),那么会话将从TPM内存中刷新,并且关联的会话句柄将可用来分配给新的会话。当TPM响应时,它将响应此属性以指示会话保持打开状态(请参阅下面的密码授权例外)。 注:在这种情况下,“echo”表示会话属性的值在响应中与命令中的值相同。 此属性的主要目的是避免在不再使用会话时对其进行显式刷新(TPM2_FlushContext())。 在会话最后一次使用时清除此位将结束会话并回收分配给该会话的TPM资源。 对于密码授权,这个属性没有作用,因为没有与密码授权相关联的TPM资源。 此属性将始终在与密码授权关联的响应中SET。 如果审计属性是SET,那么此属性也应该是SET,因为如果刷新会话,审计数据将丢失。
decrypt 此属性用于向TPM指示,与会话相关的机密将用于解密命令的第一个参数(基于会话的加密方案在第21条中定义)。 HMAC计算成功后,该参数将被解密。 该属性只能在第一个参数为大小缓冲区的命令中设置。在密码会话中,此属性要求为CLEAR。 如果在密码会话中设置,那么TPM将返回一个错误,因为没有用于解密操作的会话密钥。该属性由响应中的相应会话中的TPM响应。每个命令只能在一个会话中设置此属性。 具有此属性的会话不需要与句柄区域中标识的实体关联。 也就是说,添加会话可能只是为了使用会话的秘密进行参数解密。此属性可以与任何其他会话属性组合使用SET。
encrypt 此属性用于向TPM指示,与会话相关的秘密将用于加密响应的第一个参数(基于会话的加密方案在第21条中定义)。 在TPM为任何会话执行HMAC计算之前,将对该参数进行加密。此属性只能在以大小缓冲区作为其第一个参数的响应中设置。在密码会话中,此属性要求为CLEAR。 如果在密码会话中设置,那么TPM将返回一个错误,因为没有用于加密操作的会话密钥。该属性由响应中的相应会话中的TPM响应。每个命令只能在一个会话中设置此属性。 具有此属性的会话不需要与句柄区域中标识的实体关联。 也就是说,添加会话可能只是为了使用会话的秘密进行参数解密。此属性可以与任何其他会话属性组合使用SET。
audit 此属性指示正在使用该会话进行审计。 在会话上下文中维护摘要,并在每次与命令一起使用会话和设置审计时更新它。不需要在每次使用会话时都设置此属性,但是TPM只会在使用此属性SET使用会话时更新审计数据。此属性对于密码授权没有意义,需要为CLEAR。不允许在策略或试验策略会话中设置此属性。 这是因为为了容纳额外的审计摘要,策略会话的上下文必须增加。 这是一笔巨大的开销,而且审计的使用仅限于HMAC会话,而不需要在策略会话中增加额外的内存。在HMAC会话启动后(TPM2_StartAuthSession(sessionType = TPM_SE_HMAC),该属性可以在后续使用该会话时设置。 在第一次使用设置了此属性的会话时,TPM将把审计摘要初始化为0…0,然后扩展用于命令的cpHash和用于响应的rpHash的连接。TPM将在响应中响应此属性。这个属性可以与任何其他会话属性组合使用,但每个命令中只有一个会话可以有这个属性SET。
auditExclusive 此属性用于限制审计会话的使用。 当此属性设置为SET时,TPM将验证自审计序列启动以来,会话已用于所有可审计命令。说明当审计摘要被重置为0…0时,启动审计顺序。 当会话第一次被用作审计会话和审计摘要被重置时,审计摘要被设置为0…0(参见下面auditReset属性的描述)。如果该会话用于所有可审计的命令,那么它被称为“独占”(参见20.2了解独占审计会话的解释)。如果此属性为SET,并且会话是独占的,则将执行命令。 否则,TPM将无法执行该命令,以指示调用者在审计序列中没有包含某些TPM操作。独占状态的计算在命令开始时完成。 直到命令结束时,会话才会获得独占状态(这可以防止在命令失败时会话成为独占状态)。 此处理的含义是,如果在启动审计序列的命令中设置了此属性,则命令将失败,因为会话还没有成为独占的。在响应中,如果会话具有独占状态,则此属性将被设置为SET。 当一个会话第一次用作审核会话时,该属性将在响应中设置,因为从序列开始以来,没有在没有此会话的情况下执行过任何命令。只有当审计属性为SET时,才可以设置此属性,该审计属性不允许在密码授权或策略会话上设置此属性。
auditReset 此属性允许调用者使用以前用于审计的会话重新启动审计序列。 如果关联命令成功完成,TPM将在扩展cpHash和rpHash之前用0…0初始化会话审计散列。 响应将具有独占属性SET。只有当audit为SET时,此属性才可以设置。TPM将在响应中响应此属性。

七、命令参数哈希(cpHash

命令参数hash (cpHash)用于命令授权HMAC的计算,并包含在会话和命令审计的摘要中(根据策略的不同,还可以在授权中使用cpHash)。 cpHash由命令参数计算得出:
cpHashHsessionAlg (commandCode {|| Name1 {|| Name2 {|| Name3 }}} {|| parameters })
其中:

  • HsessionAlg:使用初始化会话时为会话选择的算法的哈希函数
  • commandCode :命令的命令码
  • Name1:与第一个句柄关联的实体的唯一标识
  • Name2:与第二个句柄关联的实体的唯一标识
  • Name3:与第三个句柄关联的实体的唯一标识
  • parameters:保留命令参数

八、响应参数哈希(rpHash

响应参数哈希用于响应确认HMAC的计算,并包含在会话和命令审计的摘要中。 rpHash从响应的参数中计算,如下所示:
rpHashHsessionAlg (responseCode || commandCode {|| parameters })
其中:

  • HsessionAlg:使用初始化会话时为会话选择的算法的哈希函数
  • responseCode:命令结果码
  • commandCode:命令的命令码
  • parameters:响应参数

响应的句柄区域的内容不包含在rpHash中。
注:只有当responseCode为TPM_SUCCESS时才需要计算rpHash,即包含响应码是多余的。 保留它是由于遗留原因。

九、命令示例

Table 8显示了本规范中使用的一个命令原理图示例。 该命令有两个对象句柄(handleA和handleB)。 句柄名称上的“@”表示使用与句柄关联的实体需要授权。 该命令至少有一个会话来授权handleA的使用。 它不会有使用handleB的会话。 授权区域可能有一个额外的审计会话和一个仅用于参数加密的会话。 因为需要一个会话,所以标记是TPM_ST_SESSIONS,并且存在authorizationSize字段。
注:命令示意图中没有显示授权区域,因为不可能有单一的表示形式。

命令和响应表有三列。

  1. Type — 这一列表示在命令中传递给TPM或在响应中从TPM接收到的参数的数据类型。
  2. Name — 这一列表示参数的名称。该名称在命令表之前的命令描述以及响应表之后的命令的详细操作中被引用。
  3. Description — 该列提供了参数的有限描述,并表示命令的可能选项。
    示例1
    TPM 2.0规范解读系列——Part 1体系结构第(十)读:TPM命令/响应结构_第8张图片
    Table 9展示了Table 8中命令的所有命令字节数。 本例中nonce大小为20个字节,授权HMAC使用SHA256计算。 在TPM 2.0的第3部分示意图中没有显示阴影单元中的值,但是包含在发送给TPM的命令数据中。
    示例2:
    TPM 2.0规范解读系列——Part 1体系结构第(十)读:TPM命令/响应结构_第9张图片

十、响应示例

Table 10显示了在TPM 2.0第3部分中出现的示例示意图。 这个示例是在成功完成Table 8中的示例命令之后从TPM发送的响应。 响应具有与命令相同的会话数和顺序。
示例1:
TPM 2.0规范解读系列——Part 1体系结构第(十)读:TPM命令/响应结构_第10张图片
Table 11展示了Table 8中命令的完整响应。 与该命令一样,nonce大小为20字节,并且使用SHA256计算确认HMAC。 阴影单元格中的值没有在TPM 2.0第3部分响应示意图中显示,而是出现在TPM的响应数据中。
示例2:
TPM 2.0规范解读系列——Part 1体系结构第(十)读:TPM命令/响应结构_第11张图片


总结

以上就是今天要讲的内容。本文介绍了TPM命令/响应结构,包括:命令响应头、句柄、参数、authorizationSize/parameterSize、授权区域、命令参数哈希和响应参数哈希,其中有一些字段不是必须出现的。

下一篇我们介绍授权和确认(Authorizations and Acknowledgments,Part 1体系结构第19章)。

你可能感兴趣的:(可信计算,TPM,TCM,安全架构,系统安全,安全)