TPM 32位密钥句柄

时间:2013-09-24 15:36:21

标签: java tpm

我一直在探索TPM世界,并尝试了一些不同的库(即Trousers,jTSS,JSR321和TPM / J)。基于许多要求TPM/J符合要求,我能够完成大部分必要的操作,如绑定/解除绑定,签名/验证等。

然而,我遇到的一个问题是关键句柄。根据可信计算组发布的规范1.22.0,两者都声明密钥句柄是32位值。当我运行TPM / J并加载密钥时,TPM会发出32位空间的密钥OUTSIDE。

例如,如果我运行以下命令:

sudo java edu.mit.csail.tpmj.tools.TPMLoadKey testkey.key SRK ""

我收到以下输出:

Parsing command-line arguments ...

Using SRK as parent.
parentPwd = null, Encoded (NULL [no authorization]) = null

Read testkey.key ...

Loading the key into the TPM ...
keyHandle = 0xc5e94bf9

如果我的计算(以及我发现的一些在线转换工具)是正确的,那么上面的密钥句柄计算为3,320,400,889,这是32位外部。我认为32位有符号值限制在2 billion左右。

这是一个问题,因为当我发出以下命令时:

sudo java -cp $CLASSPATH edu.mit.csail.tpmj.tools.TPMUnbind HelloWorld.txt.enc 0xc5e94bf9

我得到以下输出:

Parsing command-line arguments ...

Exception in thread "main" java.lang.NumberFormatException: For input string: "c5e94bf9"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:484)
    at bayanihan.util.params.Params.getInt(Params.java:67)
    at edu.mit.csail.tpmj.tools.TPMUnbind.main(TPMUnbind.java:71)

正如一个完整性检查,如果我使用上面的TPMUnbind命令并等到我加载一个可以由Java int类型处理的键(即落在32位范围内),那么该命令运行正常。

还有其他人遇到过这个吗?提前谢谢。

1 个答案:

答案 0 :(得分:0)

0xc5e94bf9是32位数字。

在十六进制表示中,一个'数字'代表4位。因此,8位数字的范围从0x000xFF。所以2个十六进制数字,也称为半字节

16位为0x00000xFFFF

你的案例是32位:0x000000000xFFFFFFFF

您为签名整数找到的链接将-2,147,483,648指向2,147,483,647。如果将其解释为无符号,则十进制表示形式为04,294,967,296。因此3,320,400,889在范围内。


现在出现错误:这是TPM / J中的错误。它使用

Integer.parseInt( s.substring( 2 ), 16 );

解析输入字符串。 parseInt() - 方法不适用于大于0x7FFFFFFF的十六进制数。