«Ошибка аутентификации» при создании ключа с помощью API TPM / TrouSerS - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь подписать некоторые данные с помощью TPM через API TrouSerS.Я искал в Интернете примеры кода, и единственный, с которым я столкнулся, находится на слайде № 30 этого PDF (на мой взгляд, TPM и брюки имеют зашифрованную документацию).

Код не выполняется, когда я вызываю следующую функцию для создания ключа подписи:

Tspi_Key_CreateKey ()

Код ошибки, который я получаю, равен «1», который приВыполнение функции Trspi_Error_String() переводит в строку «Ошибка аутентификации».Ясно, что вызов для создания ключа подписи терпит неудачу, потому что у него нет правильной политики авторизации.

В приведенном ниже примере кода вы видите, что я устанавливаю секрет политики по умолчанию равным TSS_WELL_KNOWN_SECRET, что соответствует двадцати 0, если я правильно помню.Я не смог найти хорошую документацию о том, как работают политики и как убедиться, что мои звонки в TPM авторизованы.Мне нужна помощь в понимании двух вещей:

  • Как работают политики в TrouSerS и TPM?
  • Как мне убедиться, что мой звонок на Tspi_Key_CreateKey() авторизован?
TSS_HCONTEXT hContext;
TSS_HKEY hSigningKey, hSRK;
TSS_HPOLICY hPolicy;
BYTE secret[] = TSS_WELL_KNOWN_SECRET;

// Init context and connect to tcsd daemon
Tspi_Context_Create(&hContext);
Tspi_Context_Connect(hContext, NULL);

// Create object for Software Root Key
Tspi_Context_CreateObject(hContext, TSS_OBJECT_TYPE_RSAKEY, TSS_KEY_TSP_SRK, &hSRK);

// Create object for signing key
Tspi_Context_CreateObject(hContext, TSS_OBJECT_TYPE_RSAKEY,
                    TSS_KEY_TYPE_SIGNING |
                    TSS_KEY_SIZE_2048 |
                    TSS_KEY_AUTHORIZATION |
                    TSS_KEY_NOT_MIGRATABLE,
                    &hSigningKey);

// Set up the default policy, which applies to all objects
Tspi_Context_GetDefaultPolicy(hContext, &hPolicy);
Tspi_Policy_SetSecret(hPolicy, TSS_SECRET_MODE_SHA1, 20, secret);

// Load the SRK key
TSS_UUID SRK_UUID = TSS_UUID_SRK;
Tspi_Context_LoadKeyByUUID(hContext, TSS_PS_TYPE_SYSTEM, SRK_UUID, &hSRK);

// Create the signing key
Tspi_Key_CreateKey(hSigningKey, hSRK, 0);
if (result != TSS_SUCCESS) {
    LOG(ERROR) << "Failed to create signing key " << result;
    LOG(ERROR) << Trspi_Error_String(result);
    return;
}

1 Ответ

0 голосов
/ 29 ноября 2018

Я сделал ошибку, не читая больше в документации TPM для моей конкретной системы (Google Chromebook).Как сказано в документации , Chromebook устанавливает для пароля SRK значение NULL.При настройке моего кода для использования этого секрета был успешно возвращен вызов Tspi_Key_CreateKey().Оттуда я смог подписать немного данных и проверить подпись.Вы можете найти скорректированный код ниже:

TSS_HCONTEXT hContext;
TSS_HKEY hSigningKey, hSRK;
TSS_HPOLICY hPolicy;
BYTE secret[] = {}; // NOTE: Secret is now empty

// Init context and connect to tcsd daemon
Tspi_Context_Create(&hContext);
Tspi_Context_Connect(hContext, NULL);

// Create object for Software Root Key
Tspi_Context_CreateObject(hContext, TSS_OBJECT_TYPE_RSAKEY, TSS_KEY_TSP_SRK, &hSRK);

// Create object for signing key
Tspi_Context_CreateObject(hContext, TSS_OBJECT_TYPE_RSAKEY,
                    TSS_KEY_TYPE_SIGNING |
                    TSS_KEY_SIZE_2048 |
                    TSS_KEY_AUTHORIZATION |
                    TSS_KEY_NOT_MIGRATABLE,
                    &hSigningKey);

Tspi_Context_GetDefaultPolicy(hContext, &hPolicy);
Tspi_Policy_SetSecret(hPolicy, TSS_SECRET_MODE_PLAIN, 0, secret); // NOTE: Using TSS_SECRET_MODE_PLAIN now

// Load the SRK key
TSS_UUID SRK_UUID = TSS_UUID_SRK;
Tspi_Context_LoadKeyByUUID(hContext, TSS_PS_TYPE_SYSTEM, SRK_UUID, &hSRK);

// Create the signing key
Tspi_Key_CreateKey(hSigningKey, hSRK, 0);
...