TPM 2.0第1部分包含对TPM属性、功能和方法的叙述描述。
本篇主要基于TPM 2.0规范Part 1的第10章和第11章(TPM Architecture)的内容,对TPM架构进行解读。
TPM保护基于受保护功能和受保护对象的概念。 受保护功能是一个正确执行的操作,TPM才能被信任。 受保护对象指TPM操作受信任时需要保护的数据(包括密钥)。 TPM上的受保护对象位于“屏蔽位置”; TPM只能通过使用受保护功能来操作屏蔽位置的内容。 屏蔽位置之外的受保护对象对其完整性和机密性进行加密保护。
由于受保护对象可能位于屏蔽位置保护之外,因此“访问”受保护对象的定义是公开其内容,而不是修改。 这些对象不能防止丢失或篡改。 但是,在加载带有外部对象的屏蔽位置之前,TPM将使用一个安全哈希函数来验证该对象是否得到了适当的保护,并且没有被更改。 如果完整性检查失败,TPM将返回错误,不加载该对象。
受保护功能的保护:
一个受保护功能只能被同一个TPM中的其他受保护功能修改。 因此,更新TPM固件的过程需要是一个受保护功能。
受保护位置的保护:
如前所述,访问TPM上的任何数据都需要使用受保护功能。 因此,TPM模块的所有信息都处于“被屏蔽的位置”。 被屏蔽的位置的内容不公开,除非根据受保护功能的定义进行披露。 TPM不支持从导出数据,只能通过受保护功能导出数据。
本文介绍TPM模块的整体操作及操作所需的功能单元。 该架构的主要元素如Figure 2所示。
下图是一个TPM命令的顶层流程图。 图中只显示了成功执行命令的正常流程。 框上的选项卡表示执行操作的模块的名称。下图中所示的每个模块的其他详细信息都在本章和专门用于这些模块的章节中中。
I/O缓冲区是TPM与主机系统之间的通信区域。 系统将命令数据放在I/O缓冲区中,并从缓冲区中检索响应数据。
不要求I/O缓冲区在物理上与系统的其他部分隔离,它可以是共享内存。 但是,当开始处理命令时,实现必须确保TPM使用正确的值。 例如,如果TPM执行命令数据的散列作为授权处理的一部分,TPM需要保护已验证的命令数据不被修改。 也就是说,在验证数据之前,需要保护数据不被修改。 修改数据前,要求数据所在位置为“被屏蔽的位置”。
密码子系统实现TPM的密码功能。它可以由命令解析模块、授权子系统或命令执行模块调用。 TPM以常规方式使用常规密码操作。 这些操作包括:
本节的其余部分将描述TPM中常见的一些算法,以展示如何处理这些算法。 这些描述是为了说明(但不限制)可用算法的选择。
TPM可以实现SMAC (Symmetric Block Cipher Message Authenti-cation Code)。 SMAC是使用对称分组密码算法对某些数据进行对称签名的一种形式。 它保证受保护的数据没有被修改,并且数据来自能够访问密钥值的实体。 为了在保护数据方面有用,密钥值需要是一个秘密或共享秘密。
哈希功能可以直接被外部软件使用,也可以作为许多TPM操作的附带效果。 TPM使用哈希来提供完整性检查和身份验证,以及必要的单向函数(如KDF)。
TPM应该实现一个经过批准的哈希算法,该算法的安全强度与其最强的非对称算法大致相同。
例:使用384-bit密钥的ECC安全强度为192位。 SHA384的安全性为192位,满足上述要求。
说明:TCG可能会为hash和非对称算法创建不同安全强度的算法集。
哈希函数将由Halgorithm()表示,算法下标表示哈希算法或包含哈希算法标识符的参数。
命令分发模块在验证某些类型的授权时将使用哈希函数。 哈希函数还用于支持TPM中的其他操作,如PCR Extend。
TPM实现了ISO/IEC 9797-2中描述的哈希消息认证码(HMAC)算法。
HMAC是对某些数据的一种对称签名形式。 它保证受保护的数据没有被修改,并且数据来自能够访问密钥值的实体。 为了在保护数据方面有用,密钥值需要是一个秘密或共享秘密。
命令分发模块可以使用HMAC功能对授权进行验证。 命令执行模块可以使用HMAC功能来支持其操作。
TPM使用非对称算法进行认证、识别和秘密共享。 TPM可以支持任何由TCG分配标识符的非对称算法。 非对称算法标识符将指示与该算法一起使用的一系列算法和方法。
使用非对称算法的方法可以在TPM 2.0第1部分的特定算法附件中找到。 目前支持的非对称算法只有RSA
和使用素数曲线的ECC。
需要TPM模块实现至少一种非对称算法。
TPM可以使用非对称算法或对称算法进行签名。 签名的方法取决于密钥的类型。 对于非对称算法,签名的方法依赖于算法(RSA或ECC)。 对于对称签名,定义了HMAC和SMAC签名方案。 如果一个密钥可以用于签名,那么它将具有sign属性。
带有签名属性的密钥还可能对可以用该密钥签名的消息内容进行限制。 当密钥有此限制时,TPM将不使用该密钥对TPM没有计算的消息摘要进行签名。
由TPM产生的任何验证消息都将有一个头(TPM_GENERATED_VALUE),以识别在TPM中产生的数据。 如果使用受限密钥对该数据进行签名,则依赖方可以确保消息数据来自TPM。
为了允许受限制的密钥对外部生成的消息进行签名,使用TPM生成消息摘要。 当TPM计算摘要时,它将验证消息是否以TPM_GENERATED_VALUE开头。 如果是这样,那么TPM将不会产生特殊的认证(票据),该认证表明该摘要是由TPM生成的,并且可以安全地使用受限密钥进行签名。
指定为签名密钥的密钥可以在使用签名密钥的任何命令中使用。 对于某些命令,可能会在命令中指定签名方案。 并不是所有的方案对所有密钥都有效,如果该方案不允许使用指定的密钥类型,TPM将生成一个错误。
例1:rsa - pkcs1 -v1_5签名方案对ECC密钥无效。
例2:具有“restricted”属性的密钥只能用于一种签名方案。 如果它被限制用于RSASSA-PSS,它可能不能用于RSASSA-PKCS1-v1_5。
受限的签名密钥需要在密钥定义中指定一个签名方案,这是唯一允许与密钥一起使用的签名方案。 对于不受限制的密钥,密钥定义可以包含签名方案选择,或者在使用密钥时可以确定签名方案。 为了推迟签名方案的选择,将使用TPM_ALG_NULL作为签名方案选择创建密钥。
TPM2_VerifySignature()通过摘要验证签名。 该命令接受公钥句柄、摘要和包含摘要上签名的块。
TPM将验证签名方案与所选密钥是否兼容。 通常,TPM将能够验证它可能生成的摘要上的任何签名。
如果签名有效,TPM将生成一张票据(ticket)。
票据是一种HMAC签名,它使用一个证明值作为HMAC密钥。
注:层次化的证明值在14.4中有详细描述。
TPM使用票据有两个目的:
用于票据的证明值的位数至少等于散列算法生成的摘要的大小。
例:SHA256票据需要256位的证明值。
有五种不同的票据类型:
TPM使用对称加密来加密一些命令参数(通常是身份验证信息),并加密存储在它外面的Protected Objects。 密码反馈模式(CFB)是本规范所要求的唯一分组密码模式。
可以使用TPM支持的任何对称分组密码进行参数加密。 然而,弱密钥是不允许使用的。 此外,TPM应该支持XOR混淆,这是一种基于哈希的流密码。 XOR混淆只能用于机密参数传递。
注:XOR允许只一个应用程序使用一个与TPM相同的算法(哈希)进行机密和完整性保护的交互。
当与非对称密钥配对时——就像在ECC解密密钥中一样——对称密钥需要具有与它配对的非对称密钥相同的安全强度位。
例1:SP800-57将2048位RSA归类为提供112位安全性。 128位或256位密钥的AES为与2048位RSA密钥配对提供了足够的对称安全性。
例2:质数模的ECC密钥的安全强度是质数模的一半。 256位ECC密钥适合使用128或256位的AES加密算法,384位ECC密钥不建议使用128位的AES加密算法。
当使用对称密钥进行数据加密时,被加密的数据具有HMAC。 在数据解密之前会检查这个HMAC。 验证解密数据是否与对称密钥适当关联,目的是增加效能分析的难度。
Extend操作用于对摘要值进行增量更新。 它对于更新PCR、审计和构建策略非常有用。 Extend使用散列函数将新数据与现有摘要结合起来。 它的标记为:
digestnew ≔ HhashAlg (digestold || datanew)
Extend操作也可以应用于具有TPMA_NV_EXTEND属性的NV索引。
密钥生成生成两种不同类型的密钥。 第一个是普通的密钥,使用随机数生成器(RNG)生成来播种计算。 计算的结果是一个保存在屏蔽位置的密钥值。
第二种类型是主密钥(Primary Key),它来自于种子值,而不是直接来自RNG。 RNG通常生成持久存储在TPM上的种子。 从种子生成主密钥是基于使用批准的密钥派生函数(KDF)。 该规格广泛使用SP800-108的KDF。该规范没有对允许生成密钥的时间设置上限。 特定于平台的规范可能会限制生成各种密钥类型的时间。
根据应用程序的不同,TPM可以通过以下输入生成一个密钥:
TPM使用一个基于散列的函数来生成用于多种目的的密钥。 该规范使用了两种不同的方案:一种用于ECDH,另一种用于KDF的所有其他用途。
ECDH KDF来自SP800-56A。 计数器模式KDF来自SP800-108,使用HMAC作为伪随机函数(PRF)。 它在规范中称为KDFa()。
除ECDH外,KDFa()用于所有需要KDF的情况。 KDFa()使用SP800-108的Counter模式,HMAC作为PRF。
RNG是TPM中的随机性来源。 TPM在密钥生成和签名的随机性中使用随机值。
RNG是一个没有访问控制的受保护功能。 它名义上由以下几部分组成:
TPM应该至少有一个内部的熵源,可能更多。 这些来源可能包括噪音、时钟变化、空气运动和其他类型的事件。熵源和熵收集器应该以一种对外部流程或其他TPM功能不可见的方式向状态寄存器提供熵。
任何在TPM生成的随机数都是RNG模块提供的。
本规范中的结构和命令构造时采用对算法默认值的最小依赖。
在大多数情况下,算法标识符标识后跟限定符的一系列算法。 这与规范的TPM 1.2版本不同,后者通常在算法标识符中包含密钥大小(TPM_ALG_AES128)。 该规范仅对散列算法使用TPM 1.2形式的算法标识符。
由于该规范依赖于通过算法ID区分哈希输出的大小,因此它的哈希算法标识符意味着摘要大小。
例1:一些散列算法标识符是TPM_ALG_SHA256、TPM_ALG_SHA384和TPM_ALG_SM3_256。
对称和非对称加密的算法标识符家族,如RSA, ECC, AES等。 对于这些算法,需要补充信息来定义参数。
例2:一些族算法标识符包括TPM_ALG_ECC、TPM_ALG_RSA、TPM_ALG_SM4和TPM_ALG_AES。
TCG将指定由各种特定于平台的规范合并的算法集。每个集合包括一个最小的哈希算法,一个具有批准参数的对称加密算法,以及一个具有批准参数的非对称加密/签名算法。 如果没有一套完整的算法,TPM将无法支持所有必要的功能。
TPM除了支持所需的集合外,还可以支持其它算法。 它们不需要是任何集合的一部分。 例如,TPM可以包括额外的散列算法,而不包括额外的非对称或对称算法。
TPM不会创建或加载使用TPM不支持的算法的对象。 在创建对象时,TPM检查正在创建的对象的模板,在加载对象时,TPM检查对象的公共区域。 在这两种情况下,TPM都验证它是否支持所有指定的算法、参数和密钥大小。
TPM至少支持一种算法集的强度至少为112位。 其他算法和算法集可以以任何组合形式得到支持。
注1:一个集合的强度通常由对称算法的一个密钥的比特数决定。 一个例外是套件B,最高机密,强度被认为是192位,即使对称算法有256位密钥。
如果TPM支持RSA,那么它应该支持2048位或更大的密钥大小。 允许支持较小的密钥大小,但不建议这样做。
注2:允许支持更小的密钥,这样遗留的密钥可以继续支持。 强烈建议使用小于1024位的密钥。
特定于平台的规范可能要求支持某些算法或算法集。 它可以只选择TCG为其分配了算法标识符的那些算法。
命令分发模块在命令执行的开始和结束时调用授权子系统。 在执行命令之前,授权子系统检查是否为使用每个屏蔽位置提供了适当的授权。
一些命令访问屏蔽位置,不需要授权; 访问某些位置可能需要单因素授权; 和访问其他屏蔽位置可能需要使用任意复杂性的授权策略。
授权子系统所需的唯一密码功能是哈希和HMAC。 如果实现了TPM2_PolicySigned(),可能需要使用非对称算法。
随机存取存储器(RAM)保存TPM暂态数据。 拔下TPM电源时,TPM RAM中的数据允许丢失,但不一定丢失。 因为TPM RAM中的值可能会丢失,所以在本规范中,它们被称为是不稳定的,即数据是否丢失与实现有关。
当规范引用一个同时具有易失性和非易失性副本的值时,它们可以保存在一个位置,只要该位置具有允许随机访问和无限持久的属性。
并不是TPM RAM中的所有值都位于屏蔽位置。 TPM RAM的一部分包含具有上文中描述的属性的I/O缓冲区。
PCR是被屏蔽的位置,用于验证测量日志的内容。 可信平台的名义行为是在日志中维护影响平台安全状态的事件记录,至少在建立TCB的引导过程中是这样。 当对日志进行添加时,TPM将接收日志条目的副本或日志描述的数据摘要。 发送到TPM的数据被包含在PCR中的一个累计哈希中。 然后,TPM可能会提供PCR中值的验证,后者又会验证日志的内容。
单个PCR可以记录所有日志条目。 然而,这将使评估平台进入操作系统时的不同阶段变得困难。 通常,TPM中提供多个PCR以简化评估。
PCR也可用来设置对一个对象的访问。 如果所选的PCR没有所需的值,TPM将不允许使用该对象。
PCR的内容可以修改或报告。 修改PCR的两种方法是重置或扩展(Reset it or Extend it)。 PCR报告可以通过简单的阅读、包含在认证中或包含在策略中来完成。
虽然是在这一章中列出,但是PCR不必须在RAM中维护, 它们可以保存在非易失性存储器中。 如果保存在非易失性存储器中,必须考虑在关键启动阶段(当记录许多测量值时)对TPM性能的可能影响。
TPM可能支持TPM Resume,在整个TPM Resume序列中保留它们的状态,但在TPM Reset或TPM Restart时将其设置为默认初始值。
TPM RAM保存着从外部内存加载到TPM的密钥和数据。 在大多数情况下,除非使用对象加载命令(TPM2_Load(), TPM2_CreatePrimary(), TPM2_LoadExternal(),或TPM2_ContextLoad())将对象首先加载到TPM RAM中,否则对象可能不会被使用或修改。
注:TPM2_Create()不会自动加载对象。 创建之后,需要使用TPM2_Load()显式加载对象,以加载公共和私有部分,或者使用TPM2_LoadExternal()仅加载公共部分。
TPM操作在特定命令中作为参数传递的其他结构。 这些结构是暂时的,在命令完成后不会作为可识别实体存储在TPM中。
加载到TPM中的项被提供句柄以便在后续命令中引用它们。
TPM使用会话来控制一系列操作。 会话可以审核操作、为操作提供授权或加密命令中传递的参数。
可以根据需要使用一个会话创建命令创建会话。 此时,会话被分配一个句柄。
TPM可以被设计成用于会话的RAM来自与对象存储共享的内存池。 它也可以被设计成会话存储和对象存储是分离和专用的。
随机访问存储器(RAM)应该足够大,以处理完成任何已实现命令所需的临时状态、会话和对象。 本规范中最坏情况命令的最小值是:
NV存储模块存储与TPM相关的持久状态。 一些NV存储可供平台和TPM所有者授权的实体分配和使用。
TPM NV内存包含“屏蔽位置”,“屏蔽位置”只能通过“受保护功能”访问。
如果规范没有明确说明参数的存储位置,则根据供应商的偏好,该参数可以在RAM或NV中。
TPM功能表明当命令引用持久对象时,TPM是否正在使用Transient Object资源。 如果是这样,TRM需要确保对这样引用的每个持久对象都有一个Transient Object插槽。
该模块结合平台电源状态管理TPM电源状态。 所有定义了TPM到平台绑定的特定于平台的TCG规范都应该包括这样一个要求:将所有电源状态的更改通知TPM。
TPM只支持ON和OFF两种电源状态。 需要复位RTM的系统电源转移也会导致TPM复位(_TPM_Init)。 任何导致TPM复位的系统电源转移也将导致RTM复位。
注:一般情况下,RTM为主机CPU。
以上就是今天要讲的内容。本文介绍TPM架构和组成,包括I/O缓冲、密码子系统、授权子系统、随机存储器、非易失存储器和电源检测模块,其中个部分都很重要,密码子系统最复杂。
对于TPM架构的介绍就到这里了。下一篇我们开始TPM的操作状态(Operational States)和控制域(Control Domains)。