Почему я получаю нестандартные ответы от TPM через TBS?

У меня есть программа на C++ для выполнения базового TPM_GetCapabilities через базовые службы TPM и пакет SDK для Windows 7.

Я установил программу ниже

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, значение 18 для моего paramSize, 0 для моего TPM_RESULT, 0x...04 для порядкового номера (не уверен, что это должно означать.), затем 1,1,0,0 для моих последних битов. Я в недоумении, как это расшифровать.


person Yablargo    schedule 17.06.2014    source источник


Ответы (1)


Ответ на ваш вопрос:

Вы не получите нестандартный ответ.

  1. Ответ отличный, в нем нет ничего нестандартного. Это выглядит точно так, как это определено в спецификации.
  2. Содержание ответа resp, которое вы получаете, также соответствует ожидаемому. Доверенный платформенный модуль, соответствующий стандарту, должен ответить 01 01 00 00 при запросе TPM_CAP_VERSION.

Почему?

Прежде всего: строка с указанием 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

Вы запросили возможность 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.

Итак, когда вы декодируете resp, то есть 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, точно по спецификации.

person Scolytus    schedule 22.06.2014
comment
Ну считайте меня образованным. Спасибо. - person Yablargo; 23.06.2014