我一直在探索TPM世界,并尝试了几个不同的库(即Trousers,jTSS,JSR321和TPM/J(。 基于许多要求,TPM/J 符合要求,我能够完成大多数必要的操作,如绑定/取消绑定、签名/验证等。
但是,我遇到的一个问题是密钥句柄。 根据可信计算组发布的规范,1.2 和 2.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,这在 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 位范围内(,那么该命令运行良好。
还有其他人遇到过这种情况吗? 提前谢谢。
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
的十六进制数。