我一直在探索 TPM 世界并尝试了几个不同的库(即 Trousers、jTSS、JSR321 和 TPM/J)。基于许多要求,TPM/J符合要求,我能够完成大部分必要的操作,如绑定/解除绑定、签名/验证等。
然而,我遇到的一个问题是关键句柄。根据 Trusted Computing Group 发布的规范,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,即 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 位范围内),那么就像一个健全性检查一样,该命令运行得很好。
有人遇到过这种情况么?提前致谢。