Object Creation

公共区域模板

Introduction
 


公共区域模板描述了要创建的对象的所需属性。 TPM 使用此模板来指导新对象的创建。
模板的格式必须在所有细节上与要创建的对象的所需格式相匹配。 项目特定信息(唯一字段)将在创建过程中被 TPM 替换,但创建对象中的所有其他字段将与模板中的字段相同。
通常,检查公共区域中的字段,就好像在创建命令中指示的存储父级下加载对象一样。

TYPE


该参数表示对象的基本类型,决定了参数和唯一字段的格式。 该类型可以指示对称密钥、非对称密钥或数据值。 type 的允许值为:TPM_ALG_SYMCIPHER、TPM_ALG_KEYEDHASH、TPM_ALG_RSA 或 TPM_ALG_ECC。

nameAlg


模板中的nameAlg参数是根据对象类型设置的。 如果该对象是受限解密密钥,则该对象需要与 Storage Parent 具有相同的 nameAlg。 对于所有其他情况,nameAlg 可以是任何受支持的散列算法。

在 TPM2_LoadExternal() 的情况下,nameAlg 允许为 TPM_ALG_NULL。 选择此值时,TPM 不会验证对象的公共部分和敏感部分之间的加密链接。 由于 nameAlg 为 TPM_ALG_NULL,因此该对象没有名称。

objectAttributes
 


这些标志必须根据适合加载对象的规则设置。 所需的设置可在 TPM 2.0 第 2 部分的 TPMA_OBJECT 定义中找到。

(TCG_TPM2_r1p59_Part2_Structures_pub.pdf 的第8章节)

authPolicy
 


如果对象的使用要通过策略(包括 PCR)进行控制,则模板将包含策略哈希。 否则,此条目将设置为空策略。

parameters
 


该字段包含描述类型中指示的对象的详细信息的参数。 对于在其 objectAttributes 中具有 fixedParent SET 的 Storage Key,这些参数将与 Storage Parent 的参数相同。 对于其他对象,这些参数可能因类型和应用而异

unique
 

模板的唯一字段是公共区域中唯一在对象创建过程中被 TPM 替换的字段。 调用者可以在此字段中放置任何值,只要值的结构与类型字段一致即可。 也就是说,该字段的结构应与 TPM 将放置在该字段中的数据的结构相同。 调用者还可以将此字段的大小设置为零,TPM 将用正确大小的结构替换它

Sensitive Values

 Overview
 


创建对象时提供的敏感值允许对对象的 authValue 进行初始设置,并可能提供一些其他对象敏感值。 敏感值可以是加密密钥或密封数据。
在 TPM2_Create() 和 TPM2_CreatePrimary()(inSensitive 参数)中提供给 TPM 的敏感值可以选择使用标准的基于会话的加密技术进行加密。 由于基于会话的加密允许使用不同的会话进行授权和加密,因此用于加密授权和其他敏感数据的会话不必与新创建对象的存储父级的授权会话相同。 这确保控制存储父级的实体不会自动获得对子级的秘密值的访问权

userAuth
 


userAuth 值是创建对象的初始 authValue。 该值可能不大于对象的 nameAlg 生成的摘要。

此限制确保任何有效的 authValue 都可用于任何可以加载密钥的 TPM。 如果不施加此限制,则某些 TPM 可能无法加载重复的对象,因为 authValue 对于实现来说太大了。

data
 

这包含调用者希望合并到创建对象的敏感部分的信息。 这可以是对称密钥或用户数据。 如果数据是空缓冲区,则需要设置模板的 sensitiveDataOrigin 属性。 如果数据不为空,则要求 sensitiveDataOrigin 为 CLEAR。

如果对象类型是 TPM_ALG_KEYEDHASH 并且签名和加密都是 CLEAR,则创建的对象是密封数据对象,如果数据是空缓冲区,TPM 将返回错误 (TPM_RC_SIZE)。
如果创建的对象是非对称键而不是主密钥,则要求data为Empty Buffer,模板中的sensitiveDataOrigin要求为SET。 对于主密钥,数据允许使用私有数据对密钥进行个性化设置,这些数据可以作为加密参数提供。

Creation PCR

TPM2_Create() 或 TPM2_CreatePrimary() 参数中存在的 PCR 选择用于选择最能代表对象创建环境的 PCR 值。 选择和 PCR 根据创建数据算法进行哈希处理,并包含在命令响应中返回的创建数据(TPM2B_CREATION_DATA)中。

创建对象时,TPM 会生成一张票据,它 (TPM) 可以使用它来验证它是否创建了对象。 这允许 TPM 证明它创建了对象 (TPM2_CertifyCreation())。

Public Area Creation

本节描述了 TPM 如何使用 TPM2_Create() 和 TPM2_CreatePrimary() 的参数来设置所创建对象的公共区域中的值。
本节不描述参数错误时的错误情况。 TPM 2.0 第 3 部分中 TPM2_Create() 和 TPM2_CreatePrimary() 的描述中提供了该信息。

type, nameAlg, objectAttributes, authPolicy, and parameters
 

TPM 将验证这些参数在模板中是否一致,然后将它们从模板中复制到创建的结构中而不加修改。

unique
 

此参数将包含特定于类型的结构。 它用于确保每个对象都具有统计上唯一的标识。 用于创建唯一性的方法确保它以加密方式绑定到敏感区域的内容。 从敏感数据创建唯一值使用不可逆过程(例如哈希),以便唯一值不会损害敏感区域的机密性。
unique 的计算使用对象敏感区域中的一个或多个值。 TPM 将至少提供一个敏感区域值,以确保唯一性实际上是唯一性的。 对于非对称密钥,唯一性由公钥提供,并且公钥在数学上与敏感区域中的私钥相关联。

对于对称对象(对称密钥、HMAC 密钥和数据 blob),密钥(或数据)使用 TPM 生成的混淆值进行哈希处理,并将生成的摘要用作唯一值。
以这种方式为对称对象生成唯一参数有两个原因。 首先是它保护用户提供的数据的内容。 如果秘密数据具有低熵,那么使唯一参数成为该数据的简单摘要将允许离线攻击来确定秘密数据可能是什么。 TPM 生成的大型随机混淆值不为攻击者所知,从而减轻了这种威胁。

使用此方法的第二个原因是它可以防止攻击者窃取对象的身份。 如果标识不是基于敏感区域的内容,则攻击者可以创建敏感结构并将其与任何对称对象的公共区域相关联。 让敏感区域包含可以加密地将敏感区域链接到公共区域的信息可以防止这种替换。
27.5.3 的其余部分描述了为每个对象类型生成唯一性的方法

以下算法的计算方法

TPM_ALG_KEYEDHASH
TPM_ALG_SYMCIPHER
TPM_ALG_RSA
TPM_ALG_ECC
 

Creation Entropy

参考代码使用通用算法生成特定类型的密钥。 也就是说,存在一种用于生成 RSA 密钥的算法,一种用于 ECC 密钥,一种用于 HMAC 密钥,一种用于对称密钥。

调用这些函数时,允许调用者指示函数应从何处获取熵以用于算法。 这允许这些功能仅通过更改“熵”的来源就可以用于主要对象、派生对象和普通对象。

比较和对比用于创建主密钥、普通密钥和派生密钥的密码值的方法。
• 主对象旨在多次创建,在没有任何其他key的情况下,具有最小的持久存储量。 因此,主密钥的密码值是通过实例化 DRBG 创建的。
• 普通对象旨在仅创建一次并持久存储。 因此,普通对象的加密值由 DRBG 创建,当 TPM 需要随机数据时默认使用该 DRBG。 这个 DRBG 在创建 TPM 时用熵播种,并用每隔一段时间添加的额外熵来填充。
• 派生密钥旨在从父密钥派生多次,而不是永久存储。 因此,派生密钥的密码值是通过将派生父代中指定的 KDF 和哈希算法应用于派生父代的对称密钥,使用调用者提供的标签和上下文值来创建的。

Entropy for Ordinary Objects
 

对于普通对象,调用者将传递一个 NULL 指针。 当密钥生成函数需要一个随机数时,它会将该 NULL 指针传递给随机数生成器。 因为指针为 NULL,随机数生成器将使用 TPM 的默认随机数生成器,它生成的数字与 TPM 能够生成的一样随机。

Entropy for Primary Objects
 

对于主对象,调用者将实例化一个确定性随机数生成器 (DRBG),并使用主种子、模板哈希和使用字符串为 DRBG 播种。 密钥生成函数
会将此指针传递给随机数生成器,该生成器将使用此状态而不是 TPM 的默认状态。 这会产生一个比特序列,其熵与主要种子一样多,并且具有生成主要对象所需的属性——每次创建相同的主要对象时都可以重新实例化 DRBG 状态。 为主要对象选择熵生成是供应商选项

Sensitive Area Creation
 

计算敏感区域内容的过程由对象的类型决定,在模板的类型字段中指示。 一些敏感区域字段可能包含调用者提供的数据。 某些字段始终由 TPM 提供。 当 TPM 提供的字段位于主对象中时,TPM 提供的数据总是以某种方式从关联的主种子派生而来,这样只要关联的主种子保持不变,就可以复制相同的主对象。 对于普通对象,实现可以从 RNG 获取 TPM 提供的数据或计算对象的字段,就好像它是一个主要对象,但使用随机数代替主要种子

两种生成非对称对象的方法之间的性能差异可以忽略不计,因为大部分工作是在验证选择而不是生成它们。 对于对称对象,对于主要对象和普通对象使用不同的方法可能是值得的,但是在开发和测试中会增加成本,这可能会抵消任何轻微的性能优势带来的好处。

对于普通对象,用于生成敏感的方法应该用于生成seedValue。 也就是说,如果 sensitive 是通过从 RNG 中取值生成的,那么 seedValue 应该通过从 RNG 中取值来生成。 如果敏感是通过创建随机种子并使用用于主密钥的方法生成的,则应使用相同的种子来生成 seedValue

type

对象敏感区域的类型参数是对象公共区域模板类型参数的副本

authValue
 

对象的 authValue 是从 TPM2_Create()、TPM2_CreateLoaded 或 TPM2_CreatePrimary() 等命令的 inSensitive 参数的 userAuth 字段中复制的,或者是从 TPM2_ObjectChangeAuth 等命令中的 newAuth 中复制的。
当 TPM 返回 TPM2B_PRIVATE 结构时,TPM 将 TPM2B_AUTH 填充到其最大大小

引用<<TCG_TPM2_r1p59_Part1_Architecture_pub.pdf>> <<TCG_TPM2_r1p59_Part2_Structures_pub.pdf>>

seedValue

对于对称对象,seedValue 字段用作混淆值。 它还用于保存存储密钥的对称种子值。 对于不是存储密钥的非对称密钥,不需要 seedValue 并且 TPM 将忽略该值(如果存在)。 对于存储密钥,seedValue 用作生成完整性和机密性值的种子,以保护密钥的子对象。
对于所有对象类型,当TPM产生seedValue时,它是对象的nameAlg产生的摘要的大小。

sensitive
 

Symmetric Objects
 

对称对象的类型为 TPM_ALG_SYMCIPHER 或 TPM_ALG_KEYEDHASH。 对于对称对象,敏感对象数据可能由调用者提供或由 TPM 生成。
如果对象模板中的 sensitiveDataOrigin 属性为 CLEAR,则敏感数据由调用者提供。 如果由调用者提供,敏感数据将位于 TPM2_Create() 或 TPM2_CreatePrimary() 的 inSensitive 参数的数据字段中。 对于TPM2_CreateLoaded(),如果Parent是Derivation Parent,那么sensitiveDataOrigin需要在模板中为CLEAR

如果sensitiveDataOrigin为SET,说明TPM是敏感数据的来源,inSensitive参数的data字段需要为Empty Buffer。 用户提供的对称密钥的大小必须由 parameters.symDetail.keyBits.sym 指示
在模板中。 它是保存指示的位数所需的八位字节数。

Asymmetric Objects

非对称密钥对象中的敏感字段是私钥。 密钥以特定于算法的方式生成,并在此 TPM 2.0 第 1 部分的特定算法附件中进行了描述

Creation Data and Ticket

当它创建一个对象时,TPM 还会创建一个数据结构来描述创建对象的环境。 这些数据包括:
• 对象创建时所选PCR 的摘要和指示列表中包含的PCR 的位图。 PCR 选择是在调用 TPM2_Create() 和 TPM2_CreatePrimary() 时指示的那些 PCR。
• 创建对象的地点
• Storage Parent 的nameAlg。 如果父代是主种子,则算法将为 TPM _ALG_NULL。
• 存储父项的名称。 如果父级是主种子,则名称将是种子的句柄。
• 存储父代的合格名称。 如果父代是主种子,则限定名称将是种子的句柄。
• 调用者提供的与新对象关联的一些附加数据

除了这些值之外,TPM 还将创建一个票证,允许 TPM 验证创建数据是由 TPM 生成的。

创建数据将作为对象的一种证明形式,当 fixedTPM 在创建的对象中为 CLEAR 时最有用。 没有这些信息,就不可能确定该对象是如何出现在它所在的层次结构中的。 当对象被移动时,复制授权将提供一些复制过程的证明。 如果没有创建数据表明该对象是在找到它的地方创建的,并且没有来自该对象的复制机构的证书,那么可能很难建立该对象的可信度

在这种情况下,对象的可信度是指确定对象的敏感区域仅可由诸如其他 TPM 之类的受信任实体访问。

Creation Resources
 

创建主对象时,它也会加载到 TPM 对象槽中并返回句柄。 如果没有可用的空闲对象槽,TPM 将返回 TPM_RC_OBJECT_MEMORY。

当创建一个普通对象时,TPM 可以使用一个对象槽作为它在其中构建对象的临时内存。 如果实现确实使用了这个方案并且没有对象槽可用,那么 TPM 将返回 TPM_RC_OBJECT_MEMORY。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值