【发布时间】:2020-05-18 00:58:41
【问题描述】:
我正在开发一个应用程序,该应用程序需要在 TPM 中生成一个 RSA 密钥以用于签名操作。公共部分向后端注册一次,然后私有部分重复用于身份验证。这种使用将跨越机器关闭/重启周期。在我的层次结构的根部,我有一个使用 CreatePrimary() 生成的 SRK 密钥(即基于这样的模板)。我知道我可以为后续会话重新生成此密钥(通过将随机输入保存在程序数据中)。程序的实际签名密钥也可以以加密形式保存,然后在重新生成 SRK 密钥后使用 Load 函数加载。
所以功能上一切正常,但我想避免密钥重新生成开销。我在这里有什么选择?
1) 据我所知(但如果我错了,请更正)一个 ContextSave 将无法在电源循环后存活(文档说它会在电源重置期间重置)。请确认是否可以使用 ContextSave。
2) 有一个名为 EvictControl 的函数可以完成这项工作。但它涉及有限的 NV 内存(因此,如果应用程序“忘记”这样的返回句柄,则在不重置整个 TPM 的情况下,永远无法释放内存)并且会磨损 TPM(仅在初始注册时)。这样合适吗?
3) 也许我还没有找到第三种选择?是否有可以使用的“默认”SRK,这样我就不必(重新)生成一个?
如果没有其他方法,我打算使用此功能,但我想知道是否有其他选择。我不明白为什么没有 ExportPrimary()/ImportPrimary() 之类的可以导出可以稍后导入的主文件,而无需触及 NV 存储。导出将在 NV 存储中存储在 TPM 内的密钥下完成(仅在 TPM 清除等时重新生成),因此具有与 EvictControl 相同的安全级别,但不会占用每个生成的密钥的 NV 存储。
【问题讨论】:
标签: tpm