为什么我通过TBS从TPM获得非标准响应? 我有一个C++程序,通过TPM基本服务和Windows 7 SDK。

为什么我通过TBS从TPM获得非标准响应? 我有一个C++程序,通过TPM基本服务和Windows 7 SDK。,tpm,trusted-computing,Tpm,Trusted Computing,我已经在下面设置了程序 int _tmain(int argc, _TCHAR* argv[]) { TBS_CONTEXT_PARAMS pContextParams; TBS_HCONTEXT hContext; TBS_RESULT rv; pContextParams.version = TBS_CONTEXT_VERSION_ONE; rv = Tbsi_Context_Create(&am

我已经在下面设置了程序

int _tmain(int argc, _TCHAR* argv[])
{       
    TBS_CONTEXT_PARAMS    pContextParams;
    TBS_HCONTEXT        hContext;
    TBS_RESULT            rv;
    pContextParams.version = TBS_CONTEXT_VERSION_ONE;
    rv = Tbsi_Context_Create(&pContextParams, &hContext);
    printf("\n1 RESULT : %x  STATUS : %x", rv, hContext);   
    BYTE data[200] =   
       {0,0xc1,     /* TPM_TAG_RQU_COMMAND */
        0,0,0,18,  /* blob length, bytes */
        0,0,0,0x65, /* TPM_ORD_GetCapability */
        0,0,0,0x06,   /* TPM_CAP_VERSION */
        0,0,0,0}; /* 0 bytes subcap */


    BYTE buf[4000];
    UINT32 len = 4000;    

    rv = Tbsip_Submit_Command(hContext,0,TBS_COMMAND_PRIORITY_NORMAL,data,18,buf,&len); 
    //CAPABILITY_RETURN* retVal = new CAPABILITY_RETURN(buf);
    //printf("\n2 Response Tag: %x Output Bytes: %x",tag,);
    printf("\n2 RESULT : %x  STATUS : %x\n", rv, hContext);
    printBuf(buf,len);  
    rv = Tbsip_Context_Close(hContext);
    printf("\n3 RESULT : %x  STATUS : %x", rv, hContext);
我的返回缓冲区如下所示:

00:C4:00:00:00:12:00:00:00:00:00:00:00:04:01:01:00:00
根据本文件,第7.1节TPM_GetCapability I应获得以下信息:

查看我的输出缓冲区,我得到了TPM_TAG_RSP_命令,paramSize的值为18,TPM_结果的值为0,序数的值为0x…04(不确定这是什么意思),然后我的最后一位的值为1,1,0,0。我不知道如何破译这个。

你问题的答案是: 你不会得到不标准的答复

  • 反应非常好,没有任何不标准之处。它看起来与规范中定义的完全相同
  • 您得到的响应“content
    resp
    也是预期的结果。当要求
    TPM\u CAP\u版本
    时,符合标准的TPM必须回答
    01 01 00
  • 为什么? 首先:说明
    TPM_COMMAND_code ordinal
    的行是而不是响应的一部分。 它没有
    PARAM#
    PARAM SZ
    。它仅与计算响应的HMAC相关

    因此,回应如下:

    00 C4          tag
    00 00 00 12    paramSize
    00 00 00 00    returnCode
    00 00 00 04    respSize
    01 01 00 00    resp
    
    typedef struct tdTPM_STRUCT_VER {
        BYTE major;      // ==> 1
        BYTE minor;      // ==> 1
        BYTE revMajor;   // ==> 0
        BYTE revMinor;   // ==> 0
    } TPM_STRUCT_VER;
    
    您要求提供功能
    TPM\u CAP\u版本
    。以下是规格说明:

    Value:             0x00000006
    Capability Name:   TPM_CAP_VERSION
    Sub cap:           Ignored
    
    TPM_STRUCT_VER structure.
    The major and minor version MUST indicate 1.1.
    The firmware revision MUST indicate 0.0.
    
    The use of this value is deprecated, new software SHOULD
    use TPM_CAP_VERSION_VAL to obtain version and revision information
    regarding the TPM.
    
    因此,当您解码
    resp
    ,这是一个
    TPM结构版本
    ,您会得到以下信息:

    00 C4          tag
    00 00 00 12    paramSize
    00 00 00 00    returnCode
    00 00 00 04    respSize
    01 01 00 00    resp
    
    typedef struct tdTPM_STRUCT_VER {
        BYTE major;      // ==> 1
        BYTE minor;      // ==> 1
        BYTE revMajor;   // ==> 0
        BYTE revMinor;   // ==> 0
    } TPM_STRUCT_VER;
    

    SO 1.1和0,严格按照规范。

    嗯,考虑我受过教育。谢谢