2013-09-24 113 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