tpm - 使用 TPM / TrouSerS API 创建密钥时出现“身份验证失败”
问题描述
我正在尝试通过 TrouSerS API 使用 TPM 签署一些数据。我在网上搜索了代码示例,我遇到的唯一一个是这个 PDF的幻灯片 #30 (在我看来,TPM 和 Trousers 的文档非常神秘)。
当我调用以下函数来创建签名密钥时,代码失败:
Tspi_Key_CreateKey()
我获得的错误代码是“1”,当通过该Trspi_Error_String()
函数运行时,它会转换为字符串“身份验证失败”。显然,创建签名密钥的调用失败,因为它没有正确的授权策略。
在下面的代码示例中,您可以看到我将默认策略密码设置为TSS_WELL_KNOWN_SECRET
,如果我没记错的话,它是 20 个 0。我无法找到有关策略如何运作以及如何确保我对 TPM 的调用得到授权的良好文档。我需要帮助理解两件事:
- 策略如何在 TrouSerS 和 TPM 中发挥作用?
- 我如何确保我的呼叫
Tspi_Key_CreateKey()
被授权?
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;
}
解决方案
我犯了一个错误,没有详细阅读我的特定系统(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);
推荐阅读
- postgresql - PostgreSQL Group By 查询结果不显示组值,只显示列名
- python - 如何使用python创建一个可以用来打开其他文件的应用程序?
- node.js - 事务中的MongoDB更新
- java - 无法开始加载 Logstash 配置文件
- php - Laravel 模型突然使用没有复数的默认表名
- python-3.x - 用于具有行间和定义函数的分组数据的 Python For 循环
- regex - 反馈答案的正则表达式超过 10 字(谷歌表格)
- python - 如何创建具有边和角的三角形图像
- java - 如何使用 JSqlparser 获取 SQL 查询标记的层次结构和位置?
- git - intellij 项目结构需要重新导入模块 SDK 并在切换分支后构建它