2014-06-17 4 views
1

TPM 기본 서비스 및 Windows 7 SDK를 통해 기본 TPM_GetCapabilities를 수행하는 C++ 프로그램이 있습니다.TBS를 통해 TPM에서 비표준 응답을받는 이유는 무엇입니까?

나는 설정을 아래의 프로그램을했습니다

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 내가 다음 얻어야한다 : enter image description here

내 출력 버퍼를 보면 TPM_TAG_RSP_COMMAND, 내 paramSize 값은 18, 내 TPM_RESULT는 0, 0x ... 04 f 서수 (이것이 무엇을 의미하는지 확신 할 수 없다.) 그리고 나의 마지막 비트를 위해 1,1,0,0. 나는 이것을 해독하는 방법에 관해서는 손해를보고있다.

답변

3

질문에 대한 답변 :

당신은 비표준 응답을하지 않습니다.

  1. 응답

    는 아무것도 비표준이없는, 완벽하게 괜찮습니다. 스펙에서 정의 된 것처럼 보입니다.
  2. 당신이 얻는 응답 '내용 resp도 기대되는 것입니다. TPM_CAP_VERSION을 묻는 메시지가 나타나면 표준 준수 TPM은 01 01 00 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 

당신은 능력 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. 

당신이 TPM_STRUCT_VER입니다 resp를 디코딩 할 때, 다음과 같은 얻을 : 정확히 사양에 따라,

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

그래서 1.1 및 0.0.

+0

글쎄, 내가 교육받은 것으로 생각해. 감사. – Yablargo