2013-09-24 107 views
0

我一直在探索TPM世界并尝试了几个不同的库(即Trousers,jTSS,JSR321和TPM/J)。根据一些要求TPM/J符合法案,我能够完成大部分必要的操作,如绑定/解除绑定,签名/验证等。TPM 32位密钥句柄

但是我遇到的一个问题是关键句柄。根据可信计算组织发布的规范,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位有符号值被限制在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类型处理的键(即在32位范围内),那么该命令运行得很好。

有没有其他人遇到过吗?提前致谢。

回答

0

0xc5e94bf9是一个32位数字。

在十六进制表示中,'数字'表示4位。因此,一个8位数的范围从0x000xFF。所以2个十六进制数字,也被称为半字节

16位将被0x00000xFFFF

而且你的情况下32位:0x000000000xFFFFFFFF

您发现有符号整数的链路状态-2,147,483,6482,147,483,647。如果您将其解释为无符号数,则以十进制表示形式表示为04,294,967,296。因此3,320,400,889在该范围内。


我们的错误你:这是一个在TPM/J的错误。它使用

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

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

+0

感谢Scolytus的解释。我猜如果我想要使用这个库,那么我必须将键句柄从int更改为long。 – schmudu