TPM 32-битные ключи
Я изучал мир TPM и попробовал несколько разных библиотек (например, брюки, 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, то есть ВНЕ 32-битных. Я считаю, что 32-разрядные подписанные значения ограничены примерно 2 миллиардами.
Это становится проблемой, потому что, когда я запускаю следующую команду:
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-битный диапазон), тогда команда выполняется просто отлично.
кто-нибудь еще сталкивался с этим? Заранее спасибо.
1 ответ
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
,