Создайте ключ подтверждения с помощью TSS с TrouSerS на C

Я пишу программу на C, чтобы сгенерировать ключ подтверждения и корневой ключ хранилища. Как мне установить ключевую информацию, необходимую для генерации ключа подтверждения, и какие флаги мне нужно использовать?

Я работаю над двумя предварительно настроенными образами виртуальных машин в VirtualBox. Один из них моделирует TPM, а другой - программу C. Эти два соединены друг с другом по внутренней сети. Я могу подключиться к машине TPM и запустить TrouSerS tpm_tools через терминал. Я могу создать ключ подтверждения, запустив «createek», а также SRK. Однако у меня возникают проблемы с запуском Tspi_TPM_CreateEndorsementKey, включенного из брюки / src / include / tss / tspi.h.

В спецификации TCG Software Stack (TSS) версии 1.10 Golden от 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 через терминал.


person AndroBro    schedule 12.10.2019    source источник


Ответы (1)


Похоже, вы можете просто создать объект типа «TSS_OBJECT_TYPE_RSAKEY» с флагом «TSS_KEY_SIZE_2048», чтобы сгенерировать ключ. Нет необходимости устанавливать какие-либо атрибуты с помощью setAttribData, как это предлагается в документации. Еще одна вещь, о которой следует подумать, - установить для параметра «TSS_VALIDATION» в CreateEndorsementKey нулевой указатель. Это указывает службе TSS выполнять проверку ключа, чтобы вам не приходилось обрабатывать ее самостоятельно.

person AndroBro    schedule 14.10.2019