【可信计算】第十一次课:TPM密码资源管理(三) NV索引与PCR

TPM非易失性存储

TPM内部拥有一定数量的非易失性存储空间,可以用于存储可信平台自身的系统数据。这些数据包括授权值,种子,凭据以及TPM从不会暴露在安全边界之外的秘密数据。除此之外,这些数据还包括计数器,时钟,以及其他用户可以读取的数据。可以分为以下两种类型的数据:

TPM架构定义的数据结构。

用户或者平台相关的规范定义的非结构性数据。

非易失性存储索引

计算机通过文件系统地址访问存储在硬盘上的文件,TPM通过NV索引访问存储在非易失性存储中的数据。

文件系统能够对文件的访问施加访问控制,诸如读写等访问权限的设置。TPM通过设置索引的属性和状态来控制对指向区域数据的访问能力。

TPM可以基于多种方式实施对NV索引的访问控制,如HMAC,PCR,locality,和物理存在(physical presence)等多种形式的访问控制,还可提供索引的读写锁定机制。

未被初始化的索引不能访问。索引有一个状态叫做“未初始化的,没有被写过”。在第一次写操作之前的读操作都将失败。在常用的TPM访问控制策略中不能使用具有这种状态的索引,这样可以向索引的使用者保证这个索引的值一定是被具有授权权限的一方初始化过的,而不是简单默认值或者未初始化值。

索引可以有授权值或者policy

NV索引数据类型

TPM支持多种数据类型的NV索引。TPM1.2版本只支持非结构化数据(现在叫做普通数据)。TPM2.0增加了另外三种基本类型,所以一共有四种基本类型的索引:

  • 普通索引
  • 计数器索引
  • 位字段索引
  • 扩展索引

TPM2.0还支持以上基本索引类型的混合,即混合索引。

普通索引

一个NV普通索引用于存储任意长度的非结构化数据。与计数器,位字段以及扩展索引不同的是,普通NV索引对所写入的数据类型没有限制。

案例1:存储秘密信息
假设一个可信平台在系统启动阶段需要用到一个20字节长的秘密信息,那么这个信息可以存储在一个NV普通索引中。索引的属性被设置为TPMA_NV_PPREAD,这表示读取这个索引需要平台授权。在系统启动时运行的平台软件知道平台的授权信息,所以这些软件可以读取这个秘密信息。这同时也确保一旦启动软件完成启动任务之后这个秘密信息再也不会被读取。因为系统启动之后的其他软件并不知道平台授权信息,也就不能读取秘密信息了。

案例2:存储一个通用的口令
一个用户使用某个策略创建了一组密钥,该策略规定,只有提供了一个正确的口令时才可以使用这些密钥。在这种情况下,可以采用普通索引存储该口令,这样密钥的创建者可以通过存储口令来授权所有密钥的访问。而且用户只需要对NV区域做一次写操作就可以修改所有相关密钥的口令。

案例3:存储证书
一个平台OEM厂商会创建一个证书,这个证书会声明平台拥有一个固定的背书密钥,并且平台具备一定程度的安全保证。OEM会在平台生成阶段将证书存储在NV中。其中,这个NV区域的读操作是不受限制的。但是写操作需要OEM的policy,它用于OEM安全地更新证书。

案例4:存储密钥树根节点的公钥
IT管理员可以将一个公钥的哈希值存储在NV中,这个NV可以被写锁定,从而防止其他用户修改。这个哈希值用于验证另外一个公钥,这“另外一个公钥”又进一步用于验证一些签名确实来自于这个IT组织。所以,这个NV中存储的是一个证书链中根证书的公钥的哈希值。

案例5:存储一个HMAC密钥
在Linux系统的完整性测量架构(Integrity Measurement Architecture)的扩展验证模块(Extended Verification Module)中存储了一个HMAC密钥,这个密钥在启动早期就释放给内核,然后内核使用它验证文件的扩展属性。主要目的是看这些文件是否允许被内核加载或者使用。

NV计数器索引

NV计数器索引是一个只能增加的64位数值。在对一个NV计数值执行增加命令之前,这个计数值会被初始化为这个TPM上曾经出现过的最大NV计数值。这个值既包括当前存在的计数值也包括过去曾经定义的但是现在已经删除的计数值。这样一个计数器的计数值就永远不会被回滚,即使是被删除后重新创建也不行。

案例1:撤销一个密钥的访问权限
当密钥的所有者想撤销密钥的访问权限时,密钥在创建时使用policy作为授权方式,policy可以被设定为当一个NV计数器的值与当前值相同时(NV没有增加时)可以访问密钥。这样一来,只要增加NV计数器的值就可撤销密钥的访问权限。

NV位字段索引

一个NV位字段包含64位,默认情况下全部初始化为0,但是也可以选择设置为1。位字段的某一位只能被写1而不能清0。

应用案例:撤销多用户的共享密钥
密钥持有者希望为多达64位用户授予和撤销对密钥的访问权限。密钥是由具有多达64个OR条件的策略创建的。每一个条件将一些特定的授权(例如生物特征或智能卡数字签名)与每个用户结合起来,并且清空指定位。通过设置非NV位字段中的位来撤销用户密钥。当设置NV位域的某一位之后就可以撤销对应用户对这个密钥的使用权限,因为他再也得不到正确的policy了。

NV扩展索引

扩展索引是由特定的哈希算法定义的,并且有固定的索引生命期。索引对应NV区域的大小与哈希算法的输出相对应。NV区域会被初始化位全0。对这个NV区域的写操作是一个扩展操作,与PCR的操作类似。

扩展索引最可能的应用案例就是与混合索引结合来创建灵活的PCR,后面的“混合索引”将会介绍。另外一个应用案例就是安全审计记录,因为扩展的操作可以创建一个无法篡改的密码保护历史记录。

扩展索引本质上是一种哈希链。

案例:CA密钥使用的安全审计日志

  • 一个证书授权中心想要记录每次用来签署证书的密钥使用情况,同时也希望能够检测记录在磁盘上的日志是否已被更改。它就可以通过策略创建一个独占写权限的NV扩展索引。
  • 每次CA签名一个新的证书时,它会记录证书并将证书的摘要扩展到NV索引中。为了验证最终的记录结果,CA会遍历证书并用扩展操作重新创建记录,然后与NV索引中的值进行比较。为了达到更加安全的目的,CA还可以越过NV索引值直接得到签名。

混合索引

TPM2.0在NV方面的另外一个新特性就是混合索引。NV索引元数据(索引句柄,大小、属性、策略和口令)都是非易失性的,而混合索引数据是在易失性存储器中创建的。除了混合计数器(后面会介绍),索引数据只有在关闭TPM时才会被写到NV区域中。四种索引类型(普通,计数器,位字段,或者扩展)都可以成为混合索引。

当上层应用程序希望频繁写操作时,混合索引可能才是适用的。由于非易失性存储技术往往是带来存储介质的损耗(类似固态硬盘),TPM可以通过拒绝频繁写操作保护自己。而易失性存储器不存在耗损问题,因此可以根据需要编写混合索引。

**混合索引主要强调索引数据存储在易失性存储中。**这里与我本来想的不一样,还以为混合索引是对前面几种的综合利用,结果是因为存储在易失性存储中。

案例:增加PCR数量
PC客户端平台的TPM厂商通常只提供24个PCR,可以利用混合索引增加平台PCR的数量。因为对于TPM内置的PCR来说,PCR的索引在上电周期之间是保持不变的,但是PCR的值在重新上电后会被清零。这看起来和普通的易失性内存并没有本质区别,也就意味着可以利用易失性存储中的混合索引来模拟构造PCR。

案例:构造不同属性的PCR
一个应用可能想要使用一个PCR,但是标准的PCR有平台设置的固定属性。比如说,操作系统可能想限制某一个PCR的访问,应用可能想限制PCR的授权,应用可能想用与当前PCR不同的哈希算法,或者应用想要限制只能通过扩展的locality来更新PCR。

这时,应用可以使用自己想要的属性创建一个混合扩展索引,然后把它当作PCR来使用,应用程序结束的时候可以直接删除这个索引。需要强调的是,因为索引是混合索引,所以扩展操作并不会占用NV内存,这避免了性能和NV内存写坏的问题。

NV索引访问控制

NV可能是普通索引、计数器索引,位字段或者扩展的索引,并且NV也可以是一个混合的索引。每个NV索引还有一个独特的控制功能,这个控制与其他TPM对象如密钥的控制不同。每一个索引的读写控制都可以被独立配置,控制可以是索引的policy,口令授权,或者是所有者的口令和授权。

TPM还支持一组读写锁定机制。一个索引可以永久地写锁定。它也可以被读或者写锁定,直到TPM重启。一个索引也可以作为一组索引中的一员被一次性地锁定(全局锁定),同样是直到TPM重启后才能解锁。

许多TPM实体都受到字典攻击保护机制的保护。授权尝试失败达到一定次数之后,TPM就会拒绝执行授权,直到经过一定的时间之后才会解锁授权。一个NV索引也可以受到这样的保护,还可以通过配置索引的属性取消这种保护。

NV写操作

每一个NV索引在创建的时候都有一个隐含的属性:未被写过。在TPM1.2中,一个索引被创建时数据被初始化为全0。但从读取的数值来看并不能区分全零数据和未被写过的数据。在TPM2.0中,没有写过数据是一个独立的状态。一个policy可以制定索引必须或者必须没有被写过。

案例:单次写NV索引
在TPM初始配置的时候,NV索引的创建者可能会要求索引只能被写一次。一旦被写入后,任何知道正确口令的人都可以读取。

为了实现这个功能,可以创建一个具有两个条件的“或”策略,这个策略是两部分执行“或”操作的结果。第一部分保证只有在NV没有被写过时才能执行NV Write命令。第二部分则用于允许在提供口令的情况下执行读操作。

NV索引的句柄值

当用户创建一个NV索引时,会为索引分配一个索引值。在TPM1.2中,这个值中的某些位有特殊的性质,比如说D位用于锁定。在TPM2.0软件规范中,NV索引值除了有一个整体上的范围之外没有对具体的位域定义特殊含义。TPM不会通过索引值来定义索引的属性。但是,一些平台相关的规范或者全局的TCG注册处可以制定特殊的索引值。

举例来说,TCG注册处会为TPM厂商(0-0x3fffff),平台厂商,以及背书和平台证书分配句柄。它还会为平台相关的规范保留句柄范围,比如PC客户端,服务器,移动,和嵌入式平台。所有这些范围都是根据惯例来分配的,TPM不能以任何形式强制它们。

NV名称

TPM实体的名称决定了实体的唯一性,并可用于授权。对于NV索引来说,它的名称就是它公共区域的哈希,公共区域包含索引值(句柄),属性(包含是否已经被写过),策略和大小。

TPM2_PolicyNV允许在策略中使用NV索引值。该策略可以以索引上的一系列逻辑运算和算术运算为基础。如果该策略仅仅基于NV索引的值,它将提供很低的安全性:攻击者可能会删除这个索引,交将其替换为其它访问控制策略。基于这个原因,TPM2_PolicyNV会使用索引的名称。

NV索引名称作用案例
假设你创建了一个NV位字段索引用于密钥撤销。密钥的策略包含一个TPM2_PolicyNV条件,只有当NV的第0位是清除状态时才会满足策略。NV索引策略要求:只有私钥的所有者可以写这个索引(TPM2_PolicySigned)。为了撤销这个密钥,密钥的所有者需要签名一个随机值以满足NV索引策略,然后利用(TPM2_NV_SetBits)将第0位设置为1。\

现在假设一个攻击者试图恢复密钥的访问权限。首先,攻击者不能清除NV索引的第0位,因为NV索引本身的特性决定了这些比特位只能被设置不能被清零。攻击者可能尝试其它的方法:删除这个索引然后重新创建一个名称与之前相同的索引。这个操作会因为策略TPM2_PolicySigned限制而失败。同时攻击者也不能重写NV索引,因为他们不能满足NV索引的策略。

“删除和重新创建索引”的攻击方法不可行是因为以下两个TPM的特性:

  • 如果NV索引没有被写过就不能用于策略。
  • 策略中的NV索引使用完整名称(公共区域),而不仅仅是索引句柄。

NV口令

TPM的微妙之处是用户并不能真正地改变一个TPM对象的口令。TPM2_ObjectChangeAuth命令可以使用新的口令创建一个TPM对象,但是原有的对象仍然存在。用户可以删除所有的对象副本,但是TPM并不会强制这样做。

但是NV索引并不会有这些奇怪的性质。索引仅仅存在于TPM中,它们的上下文不能被保存或者是以任何形式存储到TPM之外。因此,TPM2_NV_ChangeAuth可以改变NV对象的口令。

NV索引总结

TPM2.0有四种类型的NV索引:普通(非结构化的数据),位域,计数器,和扩展数据索引。可以使用标准的TPM口令或者策略控制来读取或写入索引。混合索引通常情况下只存在于易失性内存中,但是正常的TPM关闭可以将其中的数据存储到非易失性内存中。这个特点可以避免产生性能和NV空间被写坏的问题。当一个索引被创建后,它具有一个没有被写过的状态。如果没有被写过,NV数据就不能被读取或者用于policy中,“未被写过”这个状态本身可以在策略中使用。

给TPM设备初始配置证书或者公钥是NV索引的基本应用。高级一点的应用是将NV授权信息应用于一个策略中,然后让多个TPM实体共享这个策略。一个使用位字段索引或者计数器索引的策略可被用于撤销密钥访问权限。一个扩展的索引提供与PCR相同的特性,它可以支持不同的算法,支持授权,并且具有相同的生命周期特性。

NV索引有独立的几组命令和属性用于控制授权,读写锁定,以及字典攻击保护。

PCR

平台配置寄存器是TPM必需的特性之一。它们最初的应用是用于提供一种密码学的方式记录(测量)软件的状态:包括平台上运行的软件和软件使用的配置数据。PCR的更新方法叫做扩展,扩展是一种单向的哈希操作,从而保证测量值不被篡改。这些用于测量的PCR可以被读取来报告这些软件的状态。这些PCR的值可以被签名然后用于更加安全的报告,这被称作认证(或者说引用)。PCR还可以被用于扩展的授权policy从而限制其他TPM对象的使用。

TPM从来不对测量的结果做任何判定。单单根据TPM内部的信息来看,并不能确定测量结果的好坏,或者结果是否安全可信。在测量软件时,TPM仅仅用PCR来记录测量值。至于是否安全,这要到应用程序真正使用PCR用于policy授权的时候,或者是远程请求者请求一个签名认证(quote,引用)然后判定可信性。

TPM2.0新增加的关于PCR的特性是,TPM不再将PCR的哈希算法固定为SHA-1。哈希算法现在可以修改了。有一些TPM的实现包含bank的概念,每一个bank实现一种不同的算法。

一个TPM会实现一定数量的PCR:比如说,PC上使用的TPM实现了24个。这些PCR按照惯例被分配给各种各样的软件层使用,软件类型从早期启动代码到操作系统和应用。这些PCR的分配还可以分为以下两类:需要运行的软件(通常是偶数序号的PCR),和用于定制启动过程的配置文件(通常是奇数序号的PCR)。

PCR最初的应用场景是用于表示平台软件的状态,重要软件运行到当前阶段时的历史信息(包括配置信息)。TPM上电时会初始化所有的PCR,初始值由TPM平台相关的规范定义,通常是全0或者全1。命令调用者不能直接向PCR写值。相反,PCR值的更新是通过被称为“扩展”的操作来完成的,这是一种链接式的哈希运算。从密码学的角度来看,这个过程如下:
PCR new value = Digest of (PCR old value || data to extend)

TPM将会把需要加进来的数据连接到旧的PCR值中。要被扩展到PCR中的数据几乎总是哈希值,尽管TPM并没有限制一定是哈希值。然后TPM会对这个刚刚连接好的值做哈希,然后将新的哈希值存储到PCR中。

系统重启以后,整个平台的运行由CRTM(Core Root of Trust Measurement)开始。CRTM会测量接下来将要运行的软件并将测量值扩展到一个偶数索引的PCR中。然后CRTM还会将软件的配置信息扩展到一个奇数索引的PCR中。这个被测量的软件,可能是BIOS,反过来又会测量和扩展它的下一级软件,这或许是MBR。这个测量链就这样继续下去直到测量完成早期的系统内核代码。在这个过程中,重要的安全配置文件也会被测量。

最终测量的结果就是PCR的值,它代表了所有扩展到PCR中的测量历史。因为安全摘要机制的单向属性,这些值是无法篡改的。

PCR的数量

在实际应用种,一个TPM设备会有多个PCR。PC客户端平台要求TPM实现最少24个PCR,这也是PC平台实际具有的数量。自动化设备的TPM可能会有更多PCR。平台相关的TPM规范会指定PCR的属性,平台相关的软件规范规定各个PCR用于测量哪些软件。

平台相关的规范可能会给用户软件分配几个PCR。还有一个PCR(16),叫做调试PCR,用于软件测试。因为是调试的原因,这个PCR的值可以不在TPM重新上电的情况下复位。

PCR命令

TPM2_PCR_Extend:几乎是PCR最常用的命令,用户可以将一个摘要值扩展到(extend)到PCR中。
TPM2_PCR_Event:让TPM来做哈希并将哈希值扩展到PCR中。这个命令要求输入消息的长度最长为1024字节,和上一个命令相比,多了一个哈希值计算。
TPM_PCR_Read:读取一个PCR的值,这在我们后面要介绍的验证事件记录中很有用。
TPM2_PCR_Reset:复位一个PCR,主要用于为用户层软件分配的PCR(比如前面刚刚介绍的debug用PCR)。大多数的PCR在TPM一个上电周期内是不允许被复位的。
TPM_PCR_Allocate:为PCR设定哈希算法。如果需要修改默认的哈希算法,需要使用这个命令,并且大多数情况下只需要执行一次就足够了。
TPM2_PCR_SetAuthPolicy:为一个PCR组设定一个授权policy。在PC客户端上并不需要这个命令。
TPM2_PCR_SetAuthValue:为一个PCR组设定一个授权口令。在PC客户端上并不需要这个命令。

PCR主要应用—授权

PCR的一个常用功能是授权。

一个TPM实体可以设置一个如下的policy:只有当特定的PCR的值是一个特定值时才允许使用这个TPM实体。这个policy可以选择一组PCR,每个PCR制定不同的值。如果PCR的值与设定的值不同,policy就不会满足,因此相关的TPM实体就不能被访问。

案例:根据平台状态密封密钥

把全磁盘加密软件的密钥存储在TPM中比存储在磁盘上并且仅使用口令保护要安全很多。首先,TPM能够防止暴力攻击,这使得针对口令的暴力攻击不会成功。如果软件使用一个强度较弱的口令保护密钥,那这个密钥会很容易受到攻击。

将密钥存储在磁盘上很容被窃取。拿到硬盘也就意味着拿到了密钥。而如果使用TPM存储密钥,如果要想窃取密钥就需要窃取包含TPM的整个平台,或者至少先窃取硬盘和主板。

密封(sealing)操作让密钥不仅可以被一个口令保护,还可以被一个策略保护。一个典型的策略会将密钥锁定在密封操作时的一个PCR值上(代表了软件的状态)。这个方案还假设系统启动的状态没有变化。任何事先植入的恶意软件都将在启动过程中被测量到PCR中,密钥会在不安全的状态下继续处于密封状态。

一个有较低可信度的公司可能会有一个自己的磁盘镜像,它可以将密钥密封到代表这个镜像状态的PCR中(可以理解为镜像启动以后PCR的值)。这些PCR的值可以在更安全的平台上事先被计算好。

一个更加复杂的方案是公司使用TPM2_PolicyAuthorize命令,并提供用于授权一组可信PCR值的凭据(Tickets)。

尽管普通口令也可以保护密钥,但是即使没有TPM密钥口令,这种TPM的保护也可以增加系统的安全性。攻击者可以在不提供TPM口令的情况下启动该平台,但是没有用户名和登录密码他是无法登录的。

OS的安全特性可以用于保护数据。但是攻击者可以启动另外一个OS,比如通过DVD或者USB设备而不是硬盘启动,这样就可以越过OS登录的安全保护。
在使用TPM的情况下,这种不同的启动配置(不从硬盘启动)和不同的OS软件将会改变PCR的值。这些被改变过的PCR值不能和之前正确的PCR值匹配,所以TPM不会释放解密磁盘的密钥,进而硬盘上的数据文件也就不会被解密。

密封:

  1. 构建一个Policy,使用TPM2_PolicyPCR,选择将来解封(Unseal)密钥时的PCR值作为输入。
  2. 执行以下操作(与TPM1.2类似)
    使用TPM2_GetRandom在TPM外部创建对称密钥。
    使用TPM2_Create命令,根据指定的对称密钥和策略来创建密封对象。在2.0中,TPM2_Create只需要指定策略就可以了。

解封:
TPM2_Load加载TPM2_Create创建的对象。
TPM2_PolicyPCR来满足Policy。
TPM2_Unseal返回被密封的对称密钥。

PCR的典型的应用就是将一个TPM实体的使用授权与平台软件的状态绑定,但是PCR还有其他可能的应用。比如说,可以将一个口令扩展到PCR中,从而解锁一个实体的访问。当不需要访问时,就把PCR复位(如果允许复位操作的话)或者扩展其他的值。

PCR用于认证

PCR用于认证是一种高级的应用案例。在没有TPM的平台上,远程应用软件通常不能决定平台软件的状态。如果平台软件状态是通过软件来报告的,一旦这个软件被攻击,它就可以欺骗远程应用软件。

TPM认证功能为软件状态提供基于密码学的证据。回想一下,我们曾经介绍过,大部分的PCR(除去debug PCR)中的测量状态是不能被撤销的。具体来说就是PCR不能被撤回到曾经的某一个值。认证的过程就是一个TPM引用证实(Quote)操作:将一组PCR的值做哈希,然后使用TPM密钥对哈希进行签名。如果远程一方可以验证这个用于签名的密钥确实来自一个真实的TPM,那就可以确认平台报告的PCR摘要没有被篡改过。在这个过程中,仅仅验证签名和签名密钥的证书是不够的。远程的一方接下来还要验证PCR的摘要值能与报告的PCR匹配。

远程的一方还要读取一个事件记录,记录包含很多测量过的软件等信息,以及所有的测量值。然后会执行类似于PCR Extend的操作得到最终的哈希值,然后与报告过来的PCR值比较。这些操作仍然不算难,它仅仅包含了一些数学计算。

远程软件通过一个TPM签名过的哈希值了解了平台的软件状态。现在它需要决定这个软件的状态是否是安全的。这时候它需要将测量的哈希值与一个白名单比较,这就潜在地需要和第三方软件提供商合作。PCR仅仅提供一种可信的用于表示平台软件状态的方法。但是它们本身并不会做关于软件是否安全的判定。

引用(Quote)应用

一个网络设备想要决定是否允许客户端平台连接一个网络。它需要知道客户端平台上运行的软件是否安装了完整的软件补丁(patch)。此时网络设备就可以引用TPM的PCR,然后与一个打过补丁的软件模块的(哈希)白名单比较。如果平台是正常的,它就允许连接网络。如果不是,平台的网络连接将被路由到一个特殊的patch服务器,但是不能访问网络。

开源的VPN解决方案StrongSwan可以使用TCG TNC标准,从而结合TPM引用和一个策略为VPN的连接实施访问控制。

从上述方法可以看出,引用作为TPM提供的一个安全特性,可以和其他安全手段结合起来,实现更加完善和安全的网络访问。

PCR引用详解

引用的数据结构

魔数–TPM_GENERATED:这可以阻止攻击者使用限制性的签名密钥对任意数据进行签名,然后声称这是一个TPM引用操作。

签名密钥的标识名称:尽管密钥的强度可能很大,但是却可能由算法较弱的父密钥保护。标识名称代表密钥的整个父辈密钥。

由调用者提供的数据:该数据通常是抗重放攻击的随机数。这个随机数证明了该引用是最新的。

TPM固件版本:包含在结构体中,以便验证者可以决定是否信任特定的TPM代码版本。

TPM时钟状态:resetCount对于下一个应用案例很重要。当使用背书组织架构之外的密钥签名时,时钟信息会被混淆的。基于隐私保护的考虑,时钟信息被非背书组织架构下的密钥签名时,需要做混淆处理。因为认证申请者只需要知道resetCount是否已经改变,而不需要读具体的值。

案例:检测交易过程中的重启
一个正在进行金融交易的平台,监控设备每15分钟执行一次引用操作,以检测平台软件状态的变化。然后攻击者潜伏在引用操作执行中,重新启动平台至受破坏的软件,执行未经授权的交易,然后再次重新启动平台使之回到受信任状态,下一次正常的引用操作将显示相同的可信PCR值。但是,resetCount能够检测到重启的发生,并且会(通过Quote)报告给监听软件。

PCR属性

每个PCR都具备一些属性。TPM软件库规范定义了这些属性,但是平台相关的规范最终决定哪个PCR拥有什么样的属性。通常来说,大部分的PCR都按照惯例分配给不同的特定软件来使用,但是也有一少部分没有被分配,它们是留给应用软件使用的。

PCR的Reset属性用于表示PCR的值是否可以通过TPM2_PCR_Reset命令复位。通常来说复位值是全0.大多数的PCR是不能被复位的,因为允许复位将可能导致恶意软件将PCR复位成一个已知的正常状态。有一些PCR只能在特定的位置下被复位。

PCR的Extend属性用于表示一个PCR是否可以通过TPM2_PCR_Extend或者TPM2_PCR_Event命令来扩展它的值。很显然,如果一个PCR不能被扩展,那这个PCR就是没有任何用处的,只是有一些PCR只能在某些特定的Locality下被扩展。

通过DRTM来复位PCR的属性。它表明一个PCR是否可以通过直接向TPM的接口写数据来扩展它的值,而不是通过正常的TPM命令格式。这个属性既是平台相关的,又和具体的TPM硬件接口相关。这个属性通常在不同的Locality下有不同的设置。

当系统重启后使用CLEAR参数执行TPM2_Startup命令时,所有的PCR会被复位。大多数的PCR值会被复位成0,但是有一些是不同的值,比如说全1或者与执行startup命令时的Locality有关系。

No Increment属性是与TPM2_PolicyPCR绑定的。将一个Policy与PCR进行绑定是一个立即断言。

执行TPM2_PolicyPCR命令时,PCR当前的值会被增加到Policy会话的摘要中。但是,一个PCR在这个立即断言(PolicyPCR命令)之后有可能被改变,“正常”情况下,这样就会导致这个policy会话无效。“无效”是通过一个用于记录PCR值变化的计数器来实现的。Policy会话会记录执行TPM2_PolicyPCR命令时的计数值,然后在使用这个policy会话时检查它。如果计数值不相等,TPM就知道PCR的值已经改变了,Policy会话就会失败。

如果No Increment设置为真时,具有此属性的PCR改变时,不会增加计数值,因此不会使正在使用的策略会话无效。

PCR算法

促成TPM2.0的第一个需求就是去掉TPM1.2中固定的SHA-1哈希算法。因为PCR与哈希算法关系很紧密,TPM2.0通过TPM2_PCR_Allocate命令理论上为PCR提供了许多算法相关的可能性。

这里的关键词是“理论上”。PCR可以按照bank来分配,每一个bank对应一种哈希算法。这个命令允许PCR按照任意组合来分配,一个PCR可以被分配到多个bank中,并且可以有多种哈希算法。如果是具有多种算法,除去PCR索引和摘要值以外,TPM2_Extend命令还要提供哈希算法参数。如果输入的算法与PCR配置的所有算法都不匹配,这个命令将会被忽略。

总结

PCR有两个最基本的应用。通过一个签名的认证引用可以把PCR的值传递出去。据此可以判断平台的软件状态是否可信。PCR还可以用于策略,基于PCR的值来授权其他TPM对象的使用。相对于TPM1.2,PCR的算法被固定成SHA-1,TPM2.0做了改进,允许使用其他的哈希算法。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Godams

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值