1

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

然而,我遇到的一个问题是关键句柄。根据 Trusted Computing Group 发布的规范,1.22.0都声明密钥句柄是 32 位值。当我运行 TPM/J 并加载一个密钥时,TPM 会在 32 位空间之外发出一个密钥。

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

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,即 OUTSIDE 32 位。我相信 32 位有符号值限制在20 亿左右。

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

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 位范围内),那么就像一个健全性检查一样,该命令运行得很好。

有人遇到过这种情况么?提前致谢。

4

1 回答 1

0

0xc5e94bf9是一个 32 位的数字。

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

16位将0x00000xFFFF

而你的案例 32 位:0x000000000xFFFFFFFF

您找到的有符号整数的链接状态-2,147,483,6482,147,483,647. 如果您将其解释为无符号,它将是0十进制4,294,967,296表示。因此3,320,400,889在范围内。


现在看到你得到的错误:这是 TPM/J 中的一个错误。它用

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

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

于 2013-09-24T20:46:45.603 回答