首页 > 解决方案 > 使用 TPM / TrouSerS API 创建密钥时出现“身份验证失败”

问题描述

我正在尝试通过 TrouSerS API 使用 TPM 签署一些数据。我在网上搜索了代码示例,我遇到的唯一一个是这个 PDF的幻灯片 #30 (在我看来,TPM 和 Trousers 的文档非常神秘)。

当我调用以下函数来创建签名密钥时,代码失败:

Tspi_Key_CreateKey()

我获得的错误代码是“1”,当通过该Trspi_Error_String()函数运行时,它会转换为字符串“身份验证失败”。显然,创建签名密钥的调用失败,因为它没有正确的授权策略。

在下面的代码示例中,您可以看到我将默认策略密码设置为TSS_WELL_KNOWN_SECRET,如果我没记错的话,它是 20 个 0。我无法找到有关策略如何运作以及如何确保我对 TPM 的调用得到授权的良好文档。我需要帮助理解两件事:

TSS_HCONTEXT hContext;
TSS_HKEY hSigningKey, hSRK;
TSS_HPOLICY hPolicy;
BYTE secret[] = TSS_WELL_KNOWN_SECRET;

// Init context and connect to tcsd daemon
Tspi_Context_Create(&hContext);
Tspi_Context_Connect(hContext, NULL);

// Create object for Software Root Key
Tspi_Context_CreateObject(hContext, TSS_OBJECT_TYPE_RSAKEY, TSS_KEY_TSP_SRK, &hSRK);

// Create object for signing key
Tspi_Context_CreateObject(hContext, TSS_OBJECT_TYPE_RSAKEY,
                    TSS_KEY_TYPE_SIGNING |
                    TSS_KEY_SIZE_2048 |
                    TSS_KEY_AUTHORIZATION |
                    TSS_KEY_NOT_MIGRATABLE,
                    &hSigningKey);

// Set up the default policy, which applies to all objects
Tspi_Context_GetDefaultPolicy(hContext, &hPolicy);
Tspi_Policy_SetSecret(hPolicy, TSS_SECRET_MODE_SHA1, 20, secret);

// Load the SRK key
TSS_UUID SRK_UUID = TSS_UUID_SRK;
Tspi_Context_LoadKeyByUUID(hContext, TSS_PS_TYPE_SYSTEM, SRK_UUID, &hSRK);

// Create the signing key
Tspi_Key_CreateKey(hSigningKey, hSRK, 0);
if (result != TSS_SUCCESS) {
    LOG(ERROR) << "Failed to create signing key " << result;
    LOG(ERROR) << Trspi_Error_String(result);
    return;
}

标签: tpm

解决方案


我犯了一个错误,没有详细阅读我的特定系统(Google Chromebook)的 TPM 文档。正如文档所述,Chromebook 将 SRK 密码设置为 NULL。调整我的代码以使用这个秘密使调用Tspi_Key_CreateKey()成功返回。从那里我能够签署一些数据并验证签名。您可以在下面找到调整后的代码:

TSS_HCONTEXT hContext;
TSS_HKEY hSigningKey, hSRK;
TSS_HPOLICY hPolicy;
BYTE secret[] = {}; // NOTE: Secret is now empty

// Init context and connect to tcsd daemon
Tspi_Context_Create(&hContext);
Tspi_Context_Connect(hContext, NULL);

// Create object for Software Root Key
Tspi_Context_CreateObject(hContext, TSS_OBJECT_TYPE_RSAKEY, TSS_KEY_TSP_SRK, &hSRK);

// Create object for signing key
Tspi_Context_CreateObject(hContext, TSS_OBJECT_TYPE_RSAKEY,
                    TSS_KEY_TYPE_SIGNING |
                    TSS_KEY_SIZE_2048 |
                    TSS_KEY_AUTHORIZATION |
                    TSS_KEY_NOT_MIGRATABLE,
                    &hSigningKey);

Tspi_Context_GetDefaultPolicy(hContext, &hPolicy);
Tspi_Policy_SetSecret(hPolicy, TSS_SECRET_MODE_PLAIN, 0, secret); // NOTE: Using TSS_SECRET_MODE_PLAIN now

// Load the SRK key
TSS_UUID SRK_UUID = TSS_UUID_SRK;
Tspi_Context_LoadKeyByUUID(hContext, TSS_PS_TYPE_SYSTEM, SRK_UUID, &hSRK);

// Create the signing key
Tspi_Key_CreateKey(hSigningKey, hSRK, 0);

推荐阅读