这与以下帖子有些相关:
Perform OR on two hash outputs of 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 || data),即“将 PCR 的旧值与数据连接起来,对连接后的字符串进行散列并存储PCR 中的哈希值”。此外,我发现的规范多篇论文和演示文稿提到数据是要加载的软件的散列。

但是,当我执行 echo H(PCR)||H(data) | sha1sum 之类的操作时,我没有获得正确的结果值。即,当计算(使用上述哈希值)时: echo 1ca03ef9cca98b0a04e5b01dabe1ff825ff0280a0ea26e75253dc2fda7e4210980537d035e2fb9f8 | sha1sum ,结果值不是 7f36b991f8ae94141753bcb2cf78936476d82f1d

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

谢谢!
/n

最佳答案

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

  • 您误解了您在此处复制的内容
  • 你不能像在 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 哈希值。所以基本上你是对的,
    您必须连接两个值并计算结果的 SHA1
    320 位数据。

    因此,命令行的正确命令将类似于
    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
    

    printf 字符串中的 \xXX 会将十六进制代码 XX 转换为 1 个字节的
    二进制输出。

    这将导致 d14f958b2804cc930f2f5226494bd60ee5174cfa 的输出,
    没关系。

    关于linux - 如何复制 PCR 值的扩展,例如sha1sum?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10163436/

    10-10 17:45