使用裤子将SRK存储在TPM上

时间:2018-07-20 05:28:39

标签: tpm

我正在使用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?

1 个答案:

答案 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)。