Хранение SRK на TPM с брюками

Я использую брюки для взаимодействия с TPM в проекте. У меня возникла проблема с хранением SRK (корневого ключа хранилища).

Насколько я понимаю, пара ключей SRK создается во время владения TPM и хранится внутри TPM. Но похоже, что какая-то его часть хранится в системном постоянном хранилище (определяется конфигурацией system_ps_file). И в случае удаления системного постоянного хранилища невозможно больше загрузить SRK.

Код для создания SRK

TSS_FLAG srk_flags =  TSS_KEY_TSP_SRK|TSS_KEY_AUTHORIZATION;
int result = Tspi_Context_CreateObject(hContext, TSS_OBJECT_TYPE_RSAKEY, srk_flags, srk_handle);

Код для загрузки SRK

TSS_UUID srk_uuid = TSS_UUID_SRK;
int result = Tspi_Context_LoadKeyByUUID(hContext, TSS_PS_TYPE_SYSTEM, srk_uuid, srk_handle);

Приведенный выше код работает правильно до тех пор, пока не появится системный файл данных постоянного хранилища. Но как только он удален, я получаю:

ERROR: Tspi Context LoadKeyByUUID (SRK ) failed rc =0 x2020

Есть ли способ восстановить удаленный файл хранилища? или чтобы не использовать его для SRK?


tpm
person Water    schedule 20.07.2018    source источник


Ответы (1)


Вы в значительной степени правы в своей оценке происходящего. Требование хранить ключи в постоянном хранилище прямо из спецификации TSS:

Все ключи, которые должны находиться под внутренним управлением служб управления ключами TSS, должны быть зарегистрированы в базе данных постоянного хранилища TCS (System Persistent Storage) или TSP (User Persistent Storage). На каждый ключ, зарегистрированный в одной из этих баз данных, будет ссылаться его UUID, и с точки зрения данной спецификации он будет называться постоянным ключом.

При этом вместо SRK хранится обнулен "поддельный SRK", поэтому теоретически вы можете запустить тот же код для его замены:

BYTE *save;
/* Once the key file is created, it stays forever. There could be
 * migratable keys in the hierarchy that are still useful to someone.
 */
result = ps_remove_key(&SRK_UUID);
if (result != TSS_SUCCESS && result != TCSERR(TSS_E_PS_KEY_NOTFOUND)) {
    destroy_key_refs(&srkKeyContainer);
    LogError("Error removing SRK from key file.");
    *srkKeySize = 0;
    free(*srkKey);
    goto done;
}
/* Set the SRK pubkey to all 0's before writing the SRK to disk, this is for
 * privacy reasons as outlined in the TSS spec */
save = srkKeyContainer.pubKey.key;
srkKeyContainer.pubKey.key = fake_pubkey;
offset = 0;
LoadBlob_TSS_KEY(&offset, fake_srk, &srkKeyContainer);
if ((result = ps_write_key(&SRK_UUID, &NULL_UUID, NULL, 0, fake_srk,
               offset))) {
    destroy_key_refs(&srkKeyContainer);
    LogError("Error writing SRK to disk");
    *srkKeySize = 0;
    free(*srkKey);
    goto done;
}
srkKeyContainer.pubKey.key = save;

Но вместо этого вы должны создать резервную копию своего постоянного хранилища. Если вы его потеряете, вы потеряете все остальные ключи (кроме SRK), которые вы создали.

person mnistic    schedule 20.07.2018