使用TPM如何使用SRK密钥密封

时间:2019-08-29 15:11:56

标签: c++ tpm

建立一个类来封装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;
}

我得到结果错误代码“无效的句柄”

1 个答案:

答案 0 :(得分:0)

首先,您要加载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上找到的最有用的资源。