TPM 32 位密钥句柄



我一直在探索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位数字的范围从0x000xFF。所以 2 个十六进制数字,也称为半字节

16 位将0x0000 0xFFFF

而您的案例 32 位:0x000000000xFFFFFFFF

您找到的有符号整数的链接状态为 -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 的十六进制数。

相关内容

  • 没有找到相关文章

最新更新