2012-04-15 28 views
3

这是有点相关的帖子在: Perform OR on two hash outputs of sha1sumPCR值的扩展如何能够用例如SHA1SUM?

我有一个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 ||数据),即“串联PCR与旧值数据,散列连接的字符串并将散列存储在PCR中“。此外,我发现规范多篇论文和演示文稿提到数据是要加载的软件的散列。

但是,当我执行像echo H(PCR)||H(data) | sha1sum这样的操作时,我没有获得正确的结果值。即,当计算(使用上述散列):echo 1ca03ef9cca98b0a04e5b01dabe1ff825ff0280a0ea26e75253dc2fda7e4210980537d035e2fb9f8 | sha1sum时,重设值不是7f36b991f8ae94141753bcb2cf78936476d82f1d

我对TPM_Extend操作的理解是否正确?如果是这样,为什么生成的散列与样本测量文件中的散列不同?

谢谢! /n

+0

除了我的回答之外,您还需要更多信息吗? – Scolytus 2012-05-02 10:59:22

+0

好吧,所以考虑到文件中的值不是PCR10的内容,实际存储在注册表中的是什么?是从存储在文件中的度量值中计算出来的哈希值? – nico 2012-05-10 12:02:25

+0

我不是100%确定的,因为我在国外,没有适合我的系统,但它应该是所有哈希的“连锁”。所以像SHA-1(SHA-1(0 ... 0 | 1ca03ef9cca98b0a04e5b01dabe1ff825ff0280a)| 7f36b991f8ae94141753bcb2cf78936476d82f1d)..... 随意打开一个关于该问题的新问题(因为它是一个不同的问题),我会尝试进一步调查... – Scolytus 2012-05-13 09:56:04

回答

2

要回答你的第一个问题:你对扩展操作的理解或多或少是正确的。但是,你有2个问题:

  1. 你误解了你在这里复制的东西
  2. 喜欢你的shell做你无法计算哈希值

你这里提供的日志输出来自Linux的IMA。按照 documentation第一哈希template-hash并定义为

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

所以对于第一行:SHA1(0ea26e75253dc2fda7e4210980537d035e2fb9f8 | "boot_aggregate") 结果1ca03ef9cca98b0a04e5b01dabe1ff825ff0280a

请注意,文件名提示是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哈希值。所以基本上你是对的, 你必须连接两个值并计算结果的320位数据的SHA1。

所以对于命令行正确的命令将在printf的字符串的十六进制代码XX转换成 二进制输出的一个字节像

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 

\xXX

这将导致d14f958b2804cc930f2f5226494bd60ee5174cfa, 的输出,这很好。

+0

嗨,谢谢很多Scolytus! 是的,我对价值观有完全错误的理解;像往常一样,看着源是最好的补救措施:) 为了记录(和其他人可能会遇到这个麻烦),填充0发生在这里: http://lxr.free-electrons.com/source /security/integrity/ima/ima.h#L47 – nico 2012-05-10 11:56:14