的手册页tpm2_负载有以下示例:
要加载对象,您首先必须在主对象下创建一个对象。所以第一步是创建主要对象。
tpm2_createprimary -c primary.ctx
第 2 步是在主对象下创建一个对象。
tpm2_create -C primary.ctx -u key.pub -r key.priv
tpm2_createprimary
由 创建并使用的primary.ctx 文件到底是什么tpm2_create
?的手册页tpm2_createprimary称之为“对象上下文”:
-c, --key-context=FILE:
保存生成的主对象的对象上下文的文件路径。
我可以通过以下方式获取有关文件内容的一些信息tpm2_print -t TPMS_CONTEXT primary.ctx
:
version: 1
hierarchy: owner
handle: 0x80000000 (2147483648)
sequence: 128
contextBlob:
size: 1506
但我还是不明白我在看什么。这个“对象上下文”文件是什么以及为什么需要它?
答案1
我目前也在研究这个问题,到目前为止我的理解是,“上下文”本质上是对象的某种加密形式,或者是 TPM(并且只有 TPM)可以用来重新派生该对象的信息。 TPM 的受保护硬件空间。
对它们的需求似乎源于这样一个事实:TPM 上的工作 RAM/内存量极小,因此您想要对涉及某些对象的 TPM 执行的任何操作都可能需要重新调用这些对象。在您想要执行操作的时间点加载回 TPM。例如,TPM 仅支持仅支持的情况似乎并不罕见三大约在任何一个时间点实际加载的对象。
将整个未加密的密钥存储在 TPM 外部的文件中会破坏 TPM 的某些目的,因为随后可以在 TPM 外部执行使用这些密钥的加密操作,超出了 TPM 对操作强制执行任何身份验证策略的能力,使得这些操作只能执行例如使用正确的密码。因此,这似乎就是为什么这些对象上下文文件本身包含只有 TPM 可以解密的加密数据。
还值得注意的是,这些保存的上下文似乎只能在 TPM 运行的单次供电生命周期内使用 - 即,它们在电源重置后变得不可用。这是因为它们适用于位于 TPM 上的易失性 RAM 中的“非持久实体”。只有存储在非易失性 RAM 中的对象才能在电源重置期间可靠地使用tpm2_evictcontrol
(其中还包括用于生成“序列化持久句柄”的工具,该工具可以在重置和易失性 RAM 存储/清除之间使用,但不是 100%)确定这一点)。
我仍然不能 100% 确定我是否正确 - 如果我能够在这里得出更清晰的结论,我将更新这个答案。
一些参考:
第1部分的TPM 2.0 库规范定义了一个语境如下:
4.17 语境
提供有关数据对象的限定信息的数据集合,以将其与相同类型的其他对象区分开来,或将数据对象的一个版本与另一个版本区分开来
这《TPM 2.0 实用指南》本书(免费下载,CC BY-NC 许可证)内容如下:
第 18 章,第 294 页
由于 TPM 的内部内存有限,因此对象、会话和序列需要动态地换入和换出内存。例如,由 Microsoft 模拟器实现的 TPM 2.0 的参考实现仅允许三个对象槽的空间。对象槽是对象或序列的内部 TPM 内存。还有三个会话槽。
第 295 页:
TPM2_ContextSave
保存瞬态实体的上下文并返回该实体的上下文。返回的上下文经过加密并受到完整性保护。这样做的方式是只允许将上下文加载到保存它的完全相同的 TPM 上;保存的上下文无法加载到不同的 TPM 中。
回到第 8 章第 100 页:
非持久性实体在电源周期内永远不会持久。 (准确地说,它不会通过规范所指的 TPM 重置(重新启动)持续存在。它会通过 TPM 重新启动(从休眠状态恢复)或 TPM 恢复(从睡眠状态恢复)持续存在。)实体可以被保存(请参阅 参考资料
TPM2_ContextSave
),TPM 加密机制可防止在电源循环后加载保存的上下文,从而强制执行易失性。