UEFI TGC2 sendCommand всегда возвращает ошибку 21 - PullRequest
0 голосов
/ 05 июня 2019

Я разрабатываю приложение UEFI с использованием TPM2. getCapabilities работает, но все остальное добавляется в эту функцию submitCommand (). все, что я там пробую, возвращает EFI_ABORTED в качестве статуса.

Я пробовал несколько команд, таких как read_PCR и get_random_number, но, похоже, это происходит для всех команд (спецификация TPM2, часть 3). Я выбрал команду случайного числа, потому что это простая команда без авторизации или шифрования, которая всегда должна возвращаться при правильном выполнении.

struct TPM2_ {
    EFI_HANDLE image;
    EFI_BOOT_SERVICES *BS;
    EFI_TCG2_PROTOCOL *prot;
    UINT32 activePCRbanks;
};

struct TPM2_Rand_Read_Command {
        TPMI_ST_COMMAND_TAG     tag;
        UINT32                  commandSize;
        TPM_CC                  commandCode;
        UINT16                  bytesRequested;
    };
    struct TPM2_Rand_Read_Response {
        TPM_ST                  tag;
        UINT32                  responseSize;
        TPM_RC                  responseCode;
        TPM2B_DIGEST            randomBytes;
    };

UINTN tpm_get_random(TPM2 * tpm) {
    struct TPM2_Rand_Read_Command cmd;
    struct TPM2_Rand_Read_Response resp;

    cmd.tag = __builtin_bswap16(TPM_ST_NO_SESSIONS); //x86 is little endian, TPM2 is big-endian, use bswap to convert!)
    cmd.commandCode = __builtin_bswap32(TPM_CC_GetRandom);
    cmd.commandSize = __builtin_bswap32(sizeof(struct TPM2_Rand_Read_Command));
    cmd.bytesRequested = __builtin_bswap16(4);
    EFI_STATUS stat = tpm->prot->SubmitCommand(tpm->prot,sizeof(struct TPM2_Rand_Read_Command), (UINT8*)&cmd,sizeof(struct TPM2_Rand_Read_Response),(UINT8*)&resp); //responds 0x15 || 21
    Print(L"statreadrand: %x \t %d \r\n", stat, *((UINT32*)resp.randomBytes.buffer));
    CHECK_STATUS(stat, L"SubmitReadCommand");
    return 0;
}

TPM2* tpm_create(EFI_BOOT_SERVICES *BS, EFI_HANDLE image) {
    TPM2* tpm = calloc(1, sizeof(TPM2));
    EFI_GUID prot_guid = (EFI_GUID)EFI_TCG2_PROTOCOL_GUID;
    tpm->BS = BS;
    tpm->image = image;
    EFI_STATUS stat = tpm->BS->LocateProtocol(&prot_guid, NULL, (void **)&tpm->prot);
    CHECK_STATUS(stat, L"LocateTPMProtocol");
    return tpm;
}

Я ожидаю, что функция SubmitCommand вернет EFI_SUCCESS (0) и заполнит структуру ответа 4 случайными байтами. Но функция возвращает EFI_ABORTED (21)

Кто-нибудь знает, как это решить?

РЕДАКТИРОВАТЬ: пробовали разные цепочки инструментов (GNU-EFI / plain GCC / EDK2), все дают одинаковое поведение.

1 Ответ

1 голос
/ 06 июня 2019

Конкретный ПК имел именно эту проблему. вероятно, TPM был заблокирован. При использовании другого ПК с TPM2 проблема не возникала, и вместо этого я просто получил случайное число назад.

...