我正在使用Trousers与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?
答案 0 :(得分:1)
您对所发生的事情的评估非常正确。将密钥存储在持久性存储中的要求直接来自TSS规范:
所有密钥,应由密钥管理人员内部管理 TSS服务必须在永久性存储数据库中注册 TCS(系统持久性存储)或TSP(用户持久性存储)。 在这些数据库之一中注册的每个密钥将被引用 它的UUID,并从该规范的角度称为持久性密钥 的观点。
话虽这么说,代替SRK存储的是zeroed-out "fake 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)。