目录
前言
密码授权
密码授权生命周期
密钥授权步骤
创建密码授权实体
修改已创建实体的密码授权
使用密码授权
会话启动
HMAC授权
HMAC授权生命周期
HMAC授权步骤
创建或修改需要HMAC授权的实体
创建HMAC会话
使用HMAC会话授权
会话授权
Trial Session
Policy Session
策略授权时间间隔
策略授权生命周期
构建实体的策略摘要
创建使用策略摘要的实体
开始真正的策略会话
发送策略命令完成策略
执行需要授权的操作
组合授权生命周期
以下部分内容来自我对tpm2-tools API文档、《A Practical Guide to TPM 2.0》的翻译和理解
关于TPM2基本原理、特性、密钥、层次、PCR等内容,TPM-JS这个项目有较详细的说明:
TPM-JShttps://google.github.io/tpm-js/#pg_welcome想自学以及更深入了解的同学可以参考tpm2-tools doc :Home - tpm2-tools
TPM 的外部编程接口规范: https ://trustedcomputinggroup.org/tpm-library-specification/
TPM2.0实用指南 《A Practical Guide to TPM 2.0》:
https://link.springer.com/content/pdf/10.1007/978-1-4302-6584-9.pdf
密码授权的生命周期非常简单:使用密码作为授权创建实体,然后对实体上的操作进行授权。
创建和使用密码授权所需的高级步骤如下:
1.创建将使用授权值的实体,或更改现有实体的授权值。这个步骤通常对每个实体执行一次。
2. 使用密码授权实体授权操作。此步骤可以对特定实体执行多次,并且可以在设置实体密码后的任何时间发生,无论是通过创建实体还是通过更改其授权。
可以使用以下命令创建一个实体:tpm2_creatprimary、tpm2_create和v tpm2_nvdefine。它们每个都有一个参数字段,用于传递authValue,该authValue将用于授权实体上的操作。这个authValue既可以用作简单的明文密码,也可以用作HMAC授权的输入。
内部命令具体细节:
tpm2_creatprimary用于在层次结构中创建主对象(直接位于主种子下的对象)。如果设置了inPublic参数的userWithAuth属性,USER授权可以是密码授权;这意味着需要USER角色的操作授权可以通过密码或HMAC来执行。authValue(在本例中是密码)通过将参数inSensitive型的userAuth字段设置为密码来传递。
tpm2_create用于创建可加载到TPM中的对象。授权类型、userWithAuth和authValue通过设置tpm2_creatprimary使用的相同字段来配置。
tpm2_nvdefine用于定义NV索引。如果设置了TPMA_NV_AUTHREAD和或TPMA_NV_AUTHWRITE属性,就可以使用密码授权。输入参数authValue(密码)作为tpm2_nvdefine命令的认证参数传入。
TPM命令执行流程:
使用tpm2_creatprimary创建主密钥的同时,AUTH 值默认为空,可以设置通过-P使用-C指定的层次结构的授权值,或者通过-p创建的主密钥的授权值。
使用tpm2_create创建子密钥的同时,AUTH 值默认为空,可以设置通过-P使用-C指定的父对象的授权值,或者通过-p创建的主密钥的授权值。
使用tpm2_nvdefine创建nv索引时,根据-C,--hierarchy(指定用于授权的句柄。当未指定任何值时,默认为o,TPM_RH_OWNER),确定授权层次,可以设置通过-P使用-C指定的父对象的授权值,或者通过-p创建指定 NV Index 的密码。
可以采用tpm2_changeauth为各种层次结构、NV 索引、瞬态和持久对象配置授权值。
在后续加载对象、加密/解密、审计等使用授权操作时,可以直接通过命令输入密码的形式进行授权。
HMAC和策略会话都是通过TPM2_StartAuthSession命令启动的。
当会话启动时,会话类型必须是HMAC、policy或trial policy中的一种。trial policy会话是无效策略会话:它们不能授权任何操作,但可以在创建实体之前生成策略摘要。
当会话启动时,会话的基本特征就确定了。具体来说,会话是绑定还是去绑定、会话是加盐还是不加盐、会话密钥的强度、防重放保护的强度、参数加解密的强度、会话hmac的强度,这些都是由调用TPM2_StartAuthSession时使用的参数决定的。
当会话启动时,TPM处理该命令并生成会话句柄、计算nonceTPM和计算会话密钥。该密钥用于生成hmac、加密命令参数、解密响应参数。创建会话后,会话密钥在会话的生命周期内保持不变。该命令返回会话句柄和nonceTPM。
会话密钥由传递给TPM2_StartAuthSession的这些命令参数决定:tpmKey、bind、encryptedSalt、nonceCaller和authHash。响应参数nonceTPM也包含在会话密钥中在创建会话密钥时使用nonceTPM保证使用相同的authValue、salt和nonceCaller将生成不同的会话密钥。
因为调用应用程序还必须知道会话密钥,所以它使用nonceTPM和输入变量来重复TPM的计算,以执行此计算。此时,会话已经启动,调用者和TPM都知道会话密钥。
在最新的tpm2-tools中,几乎没有看见HMAC授权的相关命令和操作。应该是和tpm1.2版本中类似。
1. 创建将使用授权值的实体,或更改现有实体的授权值。这个步骤通常对每个实体执行一次。
2. 创建HMAC会话。
3. 使用HMAC会话对实体进行操作。此操作可以在步骤1和步骤2之后的任何时间发生,并且可以多次发生。一个HMAC会话可以用于授权多个操作。
对于实体创建的目的,指定authValue的方法与前面在密码授权生命周期中描述的完全相同。改变现有实体的authValue也是如此。在这两个操作中,对于HMAC和密码授权,authValue的处理完全相同。
内部命令具体细节:
HMAC会话通过TPM2_StartAuthSession命令启动,该命令的sessionType字段设置为TPM_SE_HMAC。当HMAC会话启动时,TPM使用前面描述的公式创建一个会话密钥。这个会话密钥在TPM中创建。在TPM2StartAuthSession返回之后,调用者还使用绑定实体的authValue、salt和TPM2StartAuthSession命令发送给TPM的nonceCaller参数,以及TPM返回的nonceTPM,重新创建会话密钥。
TPM命令执行流程:
使用tpm2_startauthsession命令选项--hmac-session启动TPM_SE_HMAC类型的 HMAC 会话。
使用 TPM2_StartAuthSession 命令创建一个trial会话对象,tria会话接受用户在 TPM2_PolicyPCR 命令中定义的 PCR 值。此命令更新会话对象中名为 policy_digest 的散列字段。可以通过 TPM2_PolicyGetDigest 读取策略摘要值。 最后,我们将策略摘要插入到传递给 TPM2_CreatePrimary 或 TPM2_Create 的 TPM2B_PUBLIC 中的 publicArea.authPolicy 字段中。
authPolicy 字段保护密钥对象:任何使用密钥的授权命令都必须包含一个带有预期身份验证摘要的会话句柄。
一旦使用 authPolicy 保护密钥,它就只能与对预期身份验证摘要进行编码的会话一起使用。
使用 TPM2_StartAuthSession 创建一个新的会话对象,只是这次创建的是 TPM2_SE_POLICY 会话而不是 TPM2_SE_TRIAL 会话。
调用TPM2_PolicyPCR 命令将实际 PCR 值的内容散列到会话 policy_digest 字段中。最后调用 TPM2_Unseal 时,TPM 评估会话的策略摘要并将其与密钥的预期 authPolicy 摘要进行比较。如果它们匹配,则将密封数据返回给用户,否则将失败并出现错误。
要通过策略授权对命令进行授权,必须做到以下两点:
有些命令可以组合断言,这意味着立即条件和延迟条件对于断言传递都必须有效。
在处理策略授权时,必须考虑四个不同的时间间隔:
总之,策略计算通常执行两次,一次在生成实体策略时,一次在生成策略摘要时:
策略授权生命周期中的典型步骤非常类似,只是添加了一些用于密码和HMAC会话的生命周期步骤:
1. 构建实体策略。
2. 使用步骤1中创建的策略摘要创建实体。
步骤1和步骤2通常在其他步骤之前执行。其余步骤可以多次执行,以授权对实体的多个操作。
3. 开始一个策略会话。
4. 通过策略会话,发送策略命令来完成授权。
5. 对需要授权的实体执行操作。
使用策略会话的第一个任务是确定授权策略:例如,需要保护哪些实体,需要限制这些实体上的哪些操作,以及这些限制的确切性质。然后,必须创建策略摘要(此步骤对应于构建实体策略时间间隔)。
创建策略摘要有两种方法:使用试用策略会话,或者使用软件创建策略摘要,该软件模拟TPM在创建策略摘要时的操作。
使用试用策略会话创建策略摘要示例流程:
1. 使用TPM2_StartAuthSession命令启动试用策略会话。
2. 使用TPM2_PolicyAuthValue或TPM2_PolicyPassword将策略绑定到授权 TPM 对象的授权值。
3. 使用TPM2_GetPolicyDigest命令从会话中返回策略摘要。
TPM命令执行流程:
示例1:
tpm2_startauthsession -S session.dat
tpm2_policypassword -S session.dat -L policy.dat
tpm2 getpolicydigest -S session.ctx -o policy.out
tpm2_flushcontext session.dat
示例2:
tpm2_startauthsession -S session.dat
tpm2_policyauthvalue -S session.dat -L policy.dat
tpm2 getpolicydigest -S session.ctx -o policy.out
tpm2_flushcontext session.dat
现在,需要以允许策略授权写入的方式创建索引;此步骤对应于前面描述的创建实体时间间隔。
通过以下输入发送TPM2_NV_DefineSpace命令(通过调用tpm2_nvdefine函数来完成), 该命令创建一个NV索引,该索引只能在满足策略的情况下写入。
tpm2_nvdefine 0x01400001 -s 32 -g sha256 -L policy.dat -a policywrite| policyread
下一步是创建一个实际策略会话(即非trial会话),并使用它授权对NV索引的写操作。
使用TPM2_StartAuthSession命令启动一个真正的策略会话。
设置tpmKey和bind为空,意味着这是一个未绑定和无盐会话。选择这些设置是为了使这个示例尽可能简单;它们也是策略会话最常见的使用方式。这里的目标是理解过程并尽可能避免低级的细节。
tpm2_startauthsession --policy-session –g sha256 -S mysession.ctx
该命令返回一个策略会话句柄Hps = mysession.ctx。现在我们可以使用这个策略会话发送命令来授权NV索引上的操作。
使用在前一步中创建的策略会话,现在发送与在构建实体策略时创建NV索引的policyDigest相同的策略命令序列;此步骤对应于前面描述的构建策略摘要时间间隔。在这种情况下,序列非常简单,我们只需要发送一个策略命令,即带有选项policySession=Hps的TPM2_PolicyAuthValue命令。
tpm2_policyauthvalue -S mysession.ctx
为了响应此命令,TPM执行两件事:
1、它扩展了策略会话的策略摘要,就像在构建实体策略时扩展试用会话一样。
2、因为TPM2_PolicyAuthValue是一个延迟断言,它将一些状态信息保存到策略会话的上下文中,以便它知道在授权时检查HMAC。
此时,策略授权完全“锁定并加载”以授权操作。接下来发生的事情是,我们尝试写入NV索引。
该步骤对应于前面描述的授权时间间隔。我们写入NV索引,如果它被正确授权,写入将成功完成。要执行此步骤,请发送带有以下输入的TPM2_NV_Write命令:
echo "nv data wirte" > nv.test_w
tpm2_nvwrite 0x01400001 -C o -S mysession.ctx -i nv.test_w --offset=0
作为对该命令的响应,TPM检查policySession->policyDigest是否与被访问实体的authPolicy匹配。然后检查HMAC是否正确。如果两个检查都通过,则继续写入,并且命令成功完成。
将密码、HMAC和策略授权的生命周期统一为一个生命周期。授权生命周期中的典型步骤如下:
1.对于HMAC或策略会话,在创建实体之前必须确定一个authValue或authPolicy:
a.如果对实体的操作将使用策略会话授权,则预先计算authPolicy策略哈希值。
b.如果对实体的操作授权使用密码或HMAC会话,确定共享秘密将是什么。
2.使用授权值(authValue)和/或策略哈希(authPolicy)创建要访问的实体,或者修改现有实体的authValue值:
a.实体的authValue将用于密码授权或HMAC授权。对于密码授权,将使用authValue作为明文密码。对于HMAC授权,将使用authValue生成会话HMAC。
b.实体的authPolicy用于确定在授权命令之前是否传递了正确的策略断言。这个策略散列必须在创建实体之前预先计算;因此要首先通过1.a这一步骤。
3. 计算HMAC。对于不使用HMAC的策略会话,可以跳过此步骤。
4. 如果是HMAC或策略授权,则启动HMAC或策略会话。
5. 使用授权执行授权操作。如果:
a. 命令发送的密码与实体的authValue匹配。
b. 命令下发过程中发送的HMAC与TPM计算的HMAC匹配。这两个HMAC部分地来自实体的authValue。
c. 授权时策略会话的policyDigest与实体的authPolicy匹配。此策略散列源自由用于创建policyDigest的策略命令确定的各种因素。此外,任何延迟的断言都必须通过才能使授权成功。
6. 对于HMAC会话,计算预期的响应HMAC,并将其与TPM返回的响应进行验证。
这些步骤以相对时间顺序表示,但它们之间可能会发生许多其他操作。此外,可以使用单个policyDigest将多个操作授权给多个实体。类似地,可以使用单个HMAC会话将多个操作授权给多个实体。这些步骤的确切机制因授权类型而异,但除以下例外情况外,所有授权都必须执行这些步骤: