Я пишу программу на C, чтобы сгенерировать ключ подтверждения и корневой ключ хранилища. Как установить ключевую информацию, необходимую для генерации ключа подтверждения, и какие флаги мне нужно использовать?
Я работаю над двумя предварительно сконфигурированными образами виртуальных машин в VirtualBox. Один из них моделирует TPM, а другой содержит программу на Си. Эти два связаны друг с другом через внутреннюю сеть. Я могу подключиться к машине TPM и запустить TrouSerS tpm_tools через терминал. Я могу создать ключ подтверждения, запустив «createek», а также SRK. Однако у меня возникают проблемы с запуском Tspi_TPM_CreateEndorsementKey из брюк / src / include / tss / tspi.h.
Спецификация программного стека TCG (TSS) Версия 1.10 Золотой 20 августа 2003 г. упоминает, что «Требуется ключевая информациядля создания ключа подтверждения должен быть установлен в объекте ключа с помощью Tspi_SetAttribData () до вызова этого метода. "при использовании Tspi_TPM_CreateEndorsementKey. Я не понимаю, как установить эту информацию или какую информацию использовать.
Это мой подход. «hKey» - это ключ, который должен содержать информацию, необходимую для создания ключа подтверждения.
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<tss/platform.h>
#include<tss/tss_defines.h>
#include<tss/tss_typedef.h>
#include<tss/tss_structs.h>
#include<tss/tspi.h>
#include<trousers/trousers.h>
#include<tss/tss_error.h>
// Macro for debug messages
#define DBG(message , tResult) printf("(Line%d, %s) %s returned 0x%08x. %s.\n", __LINE__, __func__, message, tResult, (char*)Trspi_Error_String(tResult))
// MAIN entry point
int main (int argc, char **argv)
{
TSS_HCONTEXT hContext = 0;
TSS_HTPM hTPM = 0;
TSS_RESULT result;
// Other unrelated attributes
// Create context and get tpm handle
result = Tspi_Context_Create(&hContext);
DBG("Create a context: ", result);
// NULL represents the local TPM)
result = Tspi_Context_Connect(hContext, NULL);
DBG("Connect to TPM: ", result);
result = Tspi_Context_GetTpmObject(hContext, &hTPM);
DBG("Get TPM handle: ", result);
// Create the endorsement key
TSS_VALIDATION pValidationData;
TSS_HKEY hKey = 0;
result = Tspi_TPM_CreateEndorsementKey(hTPM, hKey, &pValidationData);
DBG("Create endorsement key: ", result);
// Get EK public key
TSS_HKEY hEndorsementPubKey;
result = Tspi_TPM_GetPubEndorsementKey(hTPM, FALSE, NULL, &hEndorsementPubKey);
DBG("Get EK public key: ", result);
// START OF APP
// some code
// END OF APP
// Free memory
result = Tspi_Context_FreeMemory(hContext, NULL);
DBG("Tspi Context Free Memory: " , result);
result = Tspi_Context_Close(hContext);
DBG("Tspi Context Close: ", result);
return 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. Я могу использовать hTPM для других инструкций, таких как Tspi_TPM_OwnerGetSRKPubKey, когда я генерирую ключ подтверждения с помощью createek через терминал.