我一直在探索 TPM 世界,并尝试了一些不同的库(即 Trousers、jTSS、JSR321 和 TPM/J)。基于多项要求TPM/J符合要求,我能够完成大部分必要的操作,例如绑定(bind)/解除绑定(bind)、签名/验证等。
但是我遇到的一个问题是 key handle 。根据可信计算组织发布的规范,1.2和 2.0 ,两者都声明键句柄是 32 位值。当我运行 TPM/J 并加载 key 时,TPM 会在 32 位空间之外发出 key 。
例如,如果我运行以下命令:
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
如果我的计算(以及我发现的一些在线转换工具)正确,那么上面的 key 句柄计算结果为 3,320,400,889,即 OUTSIDE 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 类型处理的 key (即落在 32 位范围内),然后命令运行就好了。
还有人遇到过这种情况吗?提前致谢。
最佳答案
0xc5e94bf9
是一个 32 位数字。
在十六进制表示中,一个“数字”代表 4 位。因此,8 位数字的范围是从 0x00
到 0xFF
。所以 2 个十六进制数字,也称为半字节。
16 位将是 0x0000
到 0xFFFF
你的情况是32位:0x00000000
到0xFFFFFFFF
您找到的有符号整数链接指出 -2,147,483,648
到 2,147,483,647
。如果您将其解释为无符号,则十进制表示形式为 0
到 4,294,967,296
。因此 3,320,400,889
在范围内。
现在您遇到的错误是:这是 TPM/J 中的错误。它使用
Integer.parseInt( s.substring( 2 ), 16 );
解析输入字符串。 parseInt()
方法不适用于大于 0x7FFFFFFF
的十六进制数。
关于java - TPM 32 位 key 句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18986024/