1

我有一个 C++ 程序通过 TPM 基础服务和 Windows 7 SDK 执行基本的 TPM_GetCapabilities。

我已经设置了下面的程序

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 我应该得到以下信息: 在此处输入图像描述

查看输出缓冲区,我得到 TPM_TAG_RSP_COMMAND,paramSize 的值为 18,TPM_RESULT 的值为 0,序数的值为 0x...04(不确定这应该是什么意思。)然后是 1,1,0,0我的最后一点。我不知道如何破译这个。

4

1 回答 1

3

你的问题的答案:

你不会得到不标准的回应

  1. 反应很好,没有什么不标准的。它看起来与规范中定义的完全一样。
  2. 您得到的响应内容resp也是意料之中的。符合标准的 TPM01 01 00 00在被要求时必须回答TPM_CAP_VERSION

为什么?

首先:声明的行TPM_COMMAND_CODE ordinal不是响应的一部分。它有 noPARAM #和 no 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

你要求的能力TPM_CAP_VERSION。这是规范所说的:

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.

因此,当您 decode resp(即 a TPM_STRUCT_VER)时,您会得到以下信息:

typedef struct tdTPM_STRUCT_VER {
    BYTE major;      // ==> 1
    BYTE minor;      // ==> 1
    BYTE revMajor;   // ==> 0
    BYTE revMinor;   // ==> 0
} TPM_STRUCT_VER;

所以 1.1 和 0.0,完全符合规范。

于 2014-06-22T15:30:26.480 回答