C++ 使用TSS和C中的裤子创建背书密钥

C++ 使用TSS和C中的裤子创建背书密钥,c++,c,security,tpm,C++,C,Security,Tpm,我正在用C编写一个程序,生成一个背书密钥和存储根密钥。如何设置生成背书密钥所需的密钥信息,以及需要使用哪些标志 我正在VirtualBox中处理两个预配置的虚拟机映像。其中一个模拟TPM,另一个包含C程序。这两者通过内部网络相互连接。我可以连接到TPM机器并通过终端运行TPM_工具。我可以通过运行“createek”和SRK创建一个背书密钥。但是,我在运行Tspi_TPM_createAnnorsementtKey时遇到问题,该键包含在/src/include/tss/Tspi.h中 TCG软件

我正在用C编写一个程序,生成一个背书密钥和存储根密钥。如何设置生成背书密钥所需的密钥信息,以及需要使用哪些标志

我正在VirtualBox中处理两个预配置的虚拟机映像。其中一个模拟TPM,另一个包含C程序。这两者通过内部网络相互连接。我可以连接到TPM机器并通过终端运行TPM_工具。我可以通过运行“createek”和SRK创建一个背书密钥。但是,我在运行Tspi_TPM_createAnnorsementtKey时遇到问题,该键包含在/src/include/tss/Tspi.h中

TCG软件堆栈(TSS)规范版本1.10 Golden August 20,2003提到,“在调用此方法之前,必须由Tspi_SetAttribData()在密钥对象中设置创建背书密钥所需的密钥信息。”当使用Tspi_TPM_Create背书密钥时。我不知道如何设置此信息或使用什么信息

这是我的方法。“hKey”是用于保存创建背书密钥所需信息的密钥

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
//调试消息的宏
#定义DBG(message,tResult)printf(“(行%d,%s)%s返回0x%08x.%s.\n”、\uuuuu行\uuuuuu、\uuuuu函数\uuuuuuuuuuuuuuuu、message、tResult、(char*)Trspi错误\uu字符串(tResult))
//主要入口点
int main(int argc,字符**argv)
{
TSS_HCONTEXT HCONTEXT=0;
TSS_HTPM HTPM=0;
TSS_结果;
//其他无关属性
//创建上下文并获取tpm句柄
结果=Tspi_上下文_创建(&hContext);
DBG(“创建上下文:”,结果);
//NULL表示本地TPM)
结果=Tspi_Context_Connect(hContext,NULL);
DBG(“连接到TPM:,结果”);
结果=Tspi_Context_gettpobject(hContext和hTPM);
DBG(“获取TPM句柄:”,结果);
//创建背书密钥
TSS_验证验证数据;
TSS_HKEY HKEY=0;
结果=Tspi_TPM_CreateEnderationtKey(hTPM、hKey和pValidationData);
DBG(“创建背书密钥:”,结果);
//获取公开密钥
TSSHKEYHendorsementpubkey;
结果=Tspi_TPM_GetPubEndorsementKey(hTPM、FALSE、NULL和hEndorsementPubKey);
DBG(“获取EK公钥:”,结果);
//应用程序启动
//一些代码
//应用程序结束
//空闲内存
结果=Tspi_上下文_空闲内存(hContext,NULL);
DBG(“Tspi上下文自由内存:”,结果);
结果=Tspi\u上下文\u关闭(hContext);
DBG(“Tspi上下文关闭:”,结果);
返回0;
}
这是运行程序时的打印输出

(Line48, main) Create a context:  returned 0x00000000. Success.
(Line51, main) Connect to TPM:  returned 0x00000000. Success.
(Line53, main) Get TPM handle:  returned 0x00000000. Success.
(Line59, main) Create endorsement key:  returned 0x00003126. Invalid handle.

----Stuff to do afterwards-----

(Line109, main) Tspi Context Free Memory:  returned 0x00000000. Success.
(Line111, main) Tspi Context Close:  returned 0x00000000. Success.
如果其中一个句柄无效,则使用返回代码“无效句柄”;
hTPM,hKey。我敢肯定是hKey。当我在终端上使用createek生成背书密钥时,我可以将hTPM用于其他指令,如Tspi_TPM_OwnerGetSRKPubKey。

看起来您可以创建一个带有“TSS_key_大小_2048”标志的“TSS_object_type_rsake”类型的对象来生成密钥。正如文档中所建议的,不需要使用setAttribData设置任何属性。另一件需要考虑的事情是将CreateEndorsementKey中的“TSS_VALIDATION”参数设置为空指针。这告诉TSS服务处理密钥的验证,这样您就不必自己处理它了