Создайте ключ подтверждения, используя TSS с TrouSerS в C - PullRequest
0 голосов
/ 13 октября 2019

Я пишу программу на 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 через терминал.

1 Ответ

0 голосов
/ 14 октября 2019

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

...