正确导出 TPM 2.0 密钥句柄(在 TSS.MSR .NET 中)

Proper export of TPM 2.0 key handle (in TSS.MSR .NET)

我最近一直在研究 TPM 2.0 技术,我正试图弄清楚如何在假设应用程序重新运行后保留 keyhendle。我想我需要使用 TPM2_ContextSave 因为这个函数包装并加密了所有的 blob 和诸如此类的东西,这样只有创建上下文的 TPM 才能读回它。因此,这应该是将“密钥”存储在文件中的正确方法。

如果您以后需要使用此密钥进行解密或签名(PC 重启、应用程序重新运行),TPM2_ContextLoad 应该为您提供上下文(如果您正在加载密钥句柄,则处理)。这和我从 Trusted Computing Group 得到的一样多 docs.

TSS.MSR 是带有 .NET 变体的 API。我的问题在于 Tpm2ContextSaveRequestTpm2ContextLoadRequest.

Tpm2ContextSaveRequest 有一个 TpmHandle 的构造函数。所以这个结构应该可以写入文件,稍后读取。
Tpm2ContextLoadRequest 然而只有 Context 个缩窄器。
Context 有一些其他构造函数调用其他一些 TpmHandleulong,此时我迷失了正在发生的事情。

如何通过应用程序重新运行来保持我的句柄?

我已经找到了答案,所以如果有任何可怜的灵魂偶然发现了这个问题,那就是:

您不应该使用 Tpm2ContextLoadRequest 和 Save 等效项。如果您想使用上下文作为媒介,请使用 Tpm2 方法 ContextSaveContextLoad 但我还没有找到如何存储这些对象的方法。

关于此的下一个注意事项是使用可以由 EvictControl 制作的持久密钥。 然后您要做的是导出您的句柄 ID (uint memberVar)。重新运行应用程序并分配此 ID 应该为签名、解密等提供有效参考...

我已经实施了解决方案 here 以获取更多详细信息。