为啥我通过 TBS 从 TPM 收到不标准的响应?
Posted
技术标签:
【中文标题】为啥我通过 TBS 从 TPM 收到不标准的响应?【英文标题】:Why do I get nonstandard responses from the TPM Through TBS?为什么我通过 TBS 从 TPM 收到不标准的响应? 【发布时间】:2014-08-07 22:41:21 【问题描述】:我有一个 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 代表我的最后一点。我不知道如何破译这个。
【问题讨论】:
【参考方案1】:您的问题的答案:
您没有得到非标准响应。
-
响应非常好,其中没有任何非标准。它看起来与规范中的定义完全相同。
你得到的回复内容
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.
因此,当您解码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,完全符合规范。
【讨论】:
好吧,认为我受过教育。谢谢。以上是关于为啥我通过 TBS 从 TPM 收到不标准的响应?的主要内容,如果未能解决你的问题,请参考以下文章
30分钟从工作电脑入侵公司内网!Win11:更新强制要求有TPM2.0,知道为啥了吧?...
Vue2:当我从响应中分配属性时,为啥会收到无限的 $http.get 请求?
WebSocket是基于Socket的吗?为啥我只收到头信息