5

これは、次の投稿にいくらか関連しています: sha1sumの2つのハッシュ出力でORを実行します

TPM測定のサンプルセットがあります。例:次のとおりです。

10 1ca03ef9cca98b0a04e5b01dabe1ff825ff0280a ima 0ea26e75253dc2fda7e4210980537d035e2fb9f8         boot_aggregate
10 7f36b991f8ae94141753bcb2cf78936476d82f1d ima d0eee5a3d35f0a6912b5c6e51d00a360e859a668 /init
10 8bc0209c604fd4d3b54b6089eac786a4e0cb1fbf ima cc57839b8e5c4c58612daaf6fff48abd4bac1bd7 /init
10 d30b96ced261df085c800968fe34abe5fa0e3f4d ima 1712b5017baec2d24c8165dfc1b98168cdf6aa25 ld-linux-x86-64.so.2

上記の投稿でも参照されているTPM仕様によると、PCR拡張操作は次のとおりです。PCR:= SHA1(PCR || data)、つまり「PCRの古い値をデータと連結し、連結された文字列をハッシュして、 PCRのハッシュ」。また、私が見つけた複数の論文やプレゼンテーションの仕様では、データはロードされるソフトウェアのハッシュであると述べています。

ただし、のような操作を行うとecho H(PCR)||H(data) | sha1sum、正しい結果の値が得られません。つまり、(上記のハッシュを使用して)計算する場合:echo 1ca03ef9cca98b0a04e5b01dabe1ff825ff0280a0ea26e75253dc2fda7e4210980537d035e2fb9f8 | sha1sum、結果の値はではありません7f36b991f8ae94141753bcb2cf78936476d82f1d

TPM_Extend操作についての私の理解は正しいですか?もしそうなら、なぜ結果のハッシュはサンプル測定ファイルのものと異なるのですか?

ありがとう!/ n

4

1 に答える 1

3

最初の質問に答えるには: 拡張操作に関するあなたの理解は多かれ少なかれ正しいです。しかし、2 つの問題があります。

  1. ここにコピーしたものを誤解しています
  2. シェルで行うようにハッシュを計算することはできません

ここで提供したログ出力は、Linux の IMA からのものです。ドキュメントによると 、最初のハッシュは次のtemplate-hashように定義されています

template-hash: SHA1(filedata-hash | filename-hint) 
filedata-hash: SHA1(filedata)

したがって、最初の行の場合:SHA1(0ea26e75253dc2fda7e4210980537d035e2fb9f8 | "boot_aggregate") 結果は1ca03ef9cca98b0a04e5b01dabe1ff825ff0280a.

filename-hintの長さは 256 バイトであることに注意してください。最後に 0 が埋め込まれています。(これをカーネルソースから掘り出してくれたことに感謝します;)

明確にするために、ログには PCR 値はありません。

調査結果を確認するために、Ruby で何かを書きました。

require 'digest/sha1'
filedata_hash = ["0ea26e75253dc2fda7e4210980537d035e2fb9f8"].pack('H*')
filename_hint = "boot_aggregate".ljust(256, "\x00")
puts Digest::SHA1.hexdigest(filedata_hash + filename_hint)

今あなたのコマンドに:

ここで使用している方法では、ハッシュを ASCII 文字列として解釈しています。また、echo は出力に改行文字を追加することにも注意してください。文字シーケンス1ca03ef9cca98b0a04e5b01dabe1ff825ff0280aは、160 ビットのバイナリ データ (SHA1 ハッシュ値) を 16 進数でエンコードしたものです。したがって、基本的には正しいです。2 つの値を連結し、結果の 320 ビット データの SHA1 を計算する必要があります。

したがって、コマンドラインの正しいコマンドは次のようになります

printf "\x1c\xa0\x3e\xf9\xcc\xa9\x8b\x0a\x04\xe5\xb0\x1d\xab\xe1\xff\x82\x5f\xf0\x28\x0a\x0e\xa2\x6e\x75\x25\x3d\xc2\xfd\xa7\xe4\x21\x09\x80\x53\x7d\x03\x5e\x2f\xb9\xf8" | sha1sum

\xXXprintf 文字列の は、16 進コードをXX1 バイトのバイナリ出力に変換します。

これにより、の出力が得られますがd14f958b2804cc930f2f5226494bd60ee5174cfa、それで問題ありません。

于 2012-04-19T18:52:55.513 に答える