使用 TPM 如何使用 SRK 密钥进行密封
Using TPM how do I use the SRK key to seal
构建一个类来封装TPM函数。 此类的目的是使用 SRK 密钥密封和解封数组。 我到了代码中要密封的部分,我需要给它一个密钥,我不知道如何告诉它使用 SRK 密钥: 那么我用什么作为这个调用的第二个参数(hSRKey(: result=Tspi_Data_Seal(hEncData,hSRKey,inv.size((,inv.data((,hPcrs(;
std::vector<u8> CTpm::sealVector(std::vector<u8> inv)
{
std::vector<u8> retVec;
TSS_HOBJECT hPcrs;
TSS_HOBJECT hEncData;
TSS_HKEY hSRKey;
//TSS_HOBJECT hPcrs;
//memset(hPcrs,0,sizeof(TSS_HOBJECT));
UINT32 ulPcrLen;
BYTE rbgPcrValueX;
BYTE* rbgPcrValue = &rbgPcrValueX;
// create context
result=Tspi_Context_CreateObject(hContext,TSS_OBJECT_TYPE_PCRS,0,&hPcrs);
if (result)
myLog->error("Unable to create context while getting FileKey. %s", Trspi_Error_String(result));
// get current value for PCR 8
result=Tspi_TPM_PcrRead(hTPM,8,&ulPcrLen,&rbgPcrValue);
if (result)
myLog->error("Unable to get Current value for PCR 8. %s", Trspi_Error_String(result));
// set value of sealed PCR 8 to current value
result=Tspi_PcrComposite_SetPcrValue(hPcrs,8,20,rbgPcrValue);
if (result)
myLog->error("Unable to set value for PCR 8. %s", Trspi_Error_String(result));
// get current value for PCR 9
result=Tspi_TPM_PcrRead(hTPM,9,&ulPcrLen,&rbgPcrValue);
if (result)
myLog->error("Unable to get Current value for PCR 9. %s", Trspi_Error_String(result));
// set value of sealed PCR 9 to current value
result=Tspi_PcrComposite_SetPcrValue(hPcrs,9,20,rbgPcrValue);
if (result)
myLog->error("Unable to set value for PCR 9. %s", Trspi_Error_String(result));
// Create an data object for sealing
result=Tspi_Context_CreateObject(hContext,TSS_OBJECT_TYPE_ENCDATA,TSS_ENCDATA_SEAL,&hEncData);
if (result)
myLog->error("Unable to create object for sealing. %s", Trspi_Error_String(result));
// sealing the key
result=Tspi_Data_Seal(hEncData,hSRKey,inv.size(),inv.data(),hPcrs);
if (result)
myLog->error("Unable to seal. %s", Trspi_Error_String(result));
return retVec;
}
我收到"无效句柄"的结果错误代码
首先,您需要加载 srk 密钥,最简单的方法是使用
TSS_UUID SRK_UUID = TSS_UUID_SRK;
Tspi_Context_LoadKeyByUUID(hContext, TSS_PS_TYPE_SYSTEM, SRK_UUID, &hSRKey);
进行此调用会将密钥加载到 tpm 中,并为您提供一个句柄,使用 TSS_UUID_SRK 作为用户 ID 代替使 SRK 准备好使用,并为您提供其句柄。完成此操作后,如果您打算将其用于数据密封,则需要对其进行授权,如果您使用众所周知的机密,那么您将需要执行以下操作
TSS_HPOLICY hOwnerPolicy;
BYTE wks[20] = TSS_WELL_KNOWN_SECRET;
Tspi_GetPolicyObject(hSRK, TSS_POLICY_USAGE, &hOwnerPolicy);
Tspi_Policy_SetSecret(hOwnerPolicy, TSS_SECRET_MODE_SHA1, 20, wks);
恐怕我对TSPI的了解只能达到这一步,但您可能还需要设置所有者策略,使用它来获取它。
Tspi_Context_GetTpmObject(hContext, &hTPM);
Tspi_GetPolicyObject(hTPM, TSS_POLICY_USAGE, &hOwnerPolicy);
然后调用Tspi_Policy_SetSecret,并将机密设置为 TPM 的所有者密码。 (我不确定这最后一步是否必要,我已经包含了它,因为没有它,我遇到了授权错误。
我通过阅读《可信计算实用指南》中关于TCG的部分和对称密钥的部分发现了大部分内容。这是迄今为止我在Tspi上找到的最有用的资源,即使它并不完美。
相关文章:
- SSH通过/sbin/SSH无法读取RSA密钥文件(从控制台运行)
- 允许从 std::map 的密钥窃取资源?
- TMap::Emplace() 在应用现有密钥时会覆盖吗?
- 在没有密钥的情况下读取密文的剩余噪声预算
- 如何修复无效的API密钥,IP或操作权限错误?
- 所有可能的链接生成器与64位密钥
- 如何在unordered_map中更改密钥?
- 获取当前密钥状态?
- curl_easy_perform() 失败:SSL 对等证书或 SSH 远程密钥不正常
- 将密钥发送到非前台的游戏窗口
- 有哪些方法可以对基于 256 位密钥的矩阵进行加扰?
- 如何在精灵表上的两个不同部分之间来回切换,同时用户仍使用 SFML 持有密钥
- 如何将CNG密钥转换为OpenSSL EVP_PKEY(反之亦然)?
- 运行密钥密码解密知道密钥?
- std::unordered_map 运算符 [] 是否对非现有密钥进行零初始化?
- 封装 std::map 以允许迭代,但没有直接密钥访问?
- 如果我使用同一个密钥推送用户数据两次,会发生什么
- 如何在C++中创建自己的编译密钥
- 重载std::映射不同的密钥类型
- 使用 TPM 如何使用 SRK 密钥进行密封