我正在使用长裤与项目的TPM进行交互。我遇到了存储SRK(存储根密钥(的问题。
我的理解是SRK密钥对是在取得TPM所有权时生成的&存储在TPM内部。但它的某些部分似乎存储在系统持久存储中(由system_ps_file config定义(。如果系统永久存储被删除,则无法再加载SRK。
创建SRK 的代码
TSS_FLAG srk_flags = TSS_KEY_TSP_SRK|TSS_KEY_AUTHORIZATION;
int result = Tspi_Context_CreateObject(hContext, TSS_OBJECT_TYPE_RSAKEY, srk_flags, srk_handle);
加载SRK 的代码
TSS_UUID srk_uuid = TSS_UUID_SRK;
int result = Tspi_Context_LoadKeyByUUID(hContext, TSS_PS_TYPE_SYSTEM, srk_uuid, srk_handle);
在系统持久存储数据文件出现之前,以上代码都能正常工作。但一旦它被删除,我得到:
ERROR: Tspi Context LoadKeyByUUID (SRK ) failed rc =0 x2020
有没有办法恢复已删除的存储文件?还是避免将其用于SRK?
您对发生的事情的评估非常正确。将密钥存储在持久存储中的要求直接来自TSS规范:
所有密钥,这些密钥应由密钥管理器内部管理TSS的服务必须在永久存储数据库中注册TCS(系统持久存储(或TSP(用户持久存储(的一种。在其中一个数据库中注册的每个密钥将由它的UUID,并从该规范的角度调用了一个持久密钥这是一个很好的例子。
也就是说,存储在SRK位置的是一个清零的"假SRK",所以理论上你可以运行相同的代码来替换它:
BYTE *save;
/* Once the key file is created, it stays forever. There could be
* migratable keys in the hierarchy that are still useful to someone.
*/
result = ps_remove_key(&SRK_UUID);
if (result != TSS_SUCCESS && result != TCSERR(TSS_E_PS_KEY_NOTFOUND)) {
destroy_key_refs(&srkKeyContainer);
LogError("Error removing SRK from key file.");
*srkKeySize = 0;
free(*srkKey);
goto done;
}
/* Set the SRK pubkey to all 0's before writing the SRK to disk, this is for
* privacy reasons as outlined in the TSS spec */
save = srkKeyContainer.pubKey.key;
srkKeyContainer.pubKey.key = fake_pubkey;
offset = 0;
LoadBlob_TSS_KEY(&offset, fake_srk, &srkKeyContainer);
if ((result = ps_write_key(&SRK_UUID, &NULL_UUID, NULL, 0, fake_srk,
offset))) {
destroy_key_refs(&srkKeyContainer);
LogError("Error writing SRK to disk");
*srkKeySize = 0;
free(*srkKey);
goto done;
}
srkKeyContainer.pubKey.key = save;
但是你应该做的是备份你的持久存储。如果丢失了它,则会丢失您创建的所有其他密钥(不是SRK(。