首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UEFI TGC2的sendCommand总是返回错误21

UEFI TGC2的sendCommand总是返回错误21
EN

Stack Overflow用户
提问于 2019-06-05 22:33:36
回答 1查看 1.1K关注 0票数 0

我正在使用TPM2开发一个UEFI应用程序。getCapabilities可以工作,但其他一切都推到了这个submitCommand()函数上。我在那里尝试的所有内容都将EFI_ABORTED作为状态返回。

我尝试了几个命令,比如read_PCR和get_random_number,但似乎所有命令都会出现这种情况(TPM2规范第3部分)。我选择随机数命令是因为它是一个没有授权或加密的简单命令,在正确执行时应该始终返回。

代码语言:javascript
复制
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/普通的GCC / EDK2)都给出了相同的行为。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-06 17:09:12

这台特定的PC就有这个问题。可能TPM被锁住了。当使用另一台带有TPM2的PC时,问题并没有发生,相反,我只是得到了一个随机的数字。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56462658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档