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

#tpm #trusted-computing

#tpm #доверенные вычисления

Вопрос:

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

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

 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(amp;pContextParams, amp;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,amp;len); 
    //CAPABILITY_RETURN* retVal = new CAPABILITY_RETURN(buf);
    //printf("n2 Response Tag: %x Output Bytes: %x",tag,);
    printf("n2 RESULT : %x  STATUS : %xn", 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 для моих последних битов. Я в недоумении, как это расшифровать.

Ответ №1:

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

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

  1. Ответ в полном порядке, в нем нет ничего нестандартного. Это выглядит точно так, как определено в спецификации.
  2. Содержимое ответа resp , которое вы получаете, также является ожидаемым. TPM, соответствующий стандарту, должен отвечать, 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 , то есть 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, точно в соответствии со спецификацией.

Комментарии:

1. Что ж, считайте меня образованным. Спасибо.