在 Linux 中为 TPM 分配 PCR 库

在 Linux 中为 TPM 分配 PCR 库

我想要拥有sha1sha256银行中的所有 PCR(0-23),但现在我只有sha256设置和sha1为空但存在,tpm2_pcrread输出:

  sha1:
  sha256:
    0 : 0xC373FA10837B62B48E9CA87E5F31440FCDC8F5C51FB1BF0FC72D4E241E680ABC
    1 : 0x6182DB76DAE2E1F0540C5EFAB413141D2F1957BA4F1344087A744CD36B34D1A1
    2 : 0x3D458CFE55CC03EA1F443F1562BEEC8DF51C75E14A9FCF9A7234A13F198E7969
    3 : 0x3D458CFE55CC03EA1F443F1562BEEC8DF51C75E14A9FCF9A7234A13F198E7969
    4 : 0x30FBEFFB0D106992F28146DEDF62A2154164585F9606ACBDAB9FD4FA89806FD9
    5 : 0x514DDD32584089DC386AD6C28FD03B70D42AAE7B7029A0899A9287BE6646D7EB
    6 : 0x3D458CFE55CC03EA1F443F1562BEEC8DF51C75E14A9FCF9A7234A13F198E7969
    7 : 0x65CAF8DD1E0EA7A6347B635D2B379C93B9A1351EDC2AFC3ECDA700E534EB3068
    8 : 0x0000000000000000000000000000000000000000000000000000000000000000
    9 : 0x0000000000000000000000000000000000000000000000000000000000000000
    10: 0xA63AFE1C978C162B2D0BCEC08ABC0D1F31D7988D7A9F3CC0AB9A48A34399573A
    11: 0x0000000000000000000000000000000000000000000000000000000000000000
    12: 0x0000000000000000000000000000000000000000000000000000000000000000
    13: 0x0000000000000000000000000000000000000000000000000000000000000000
    14: 0x0000000000000000000000000000000000000000000000000000000000000000
    15: 0x0000000000000000000000000000000000000000000000000000000000000000
    16: 0x0000000000000000000000000000000000000000000000000000000000000000
    17: 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
    18: 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
    19: 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
    20: 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
    21: 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
    22: 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
    23: 0x0000000000000000000000000000000000000000000000000000000000000000

我试过了tpm2_pcrallocate,因为正如所写这里默认情况下它分配sha1并且sha256

如果没有给出分配,则分配 PCR 为 0 - 23 的 SHA1 和 SHA256 库。

但我收到的是错误信息:

WARNING:esys:src/tss2-esys/api/Esys_PCR_Allocate.c:321:Esys_PCR_Allocate_Finish() Received TPM Error 
ERROR:esys:src/tss2-esys/api/Esys_PCR_Allocate.c:114:Esys_PCR_Allocate() Esys Finish ErrorCode (0x000009a2) 
ERROR: Could not allocate PCRs.
ERROR: Esys_PCR_Allocate(0x9A2) - tpm:session(1):authorization failure without DA implications
ERROR: Unable to run tpm2_pcrallocate

据我所知,对于 TPM 1.2 这是不可能的,因为“硬编码”哈希算法,但对于 TPM 2.0(我拥有的),我可以为 PCR 库选择几种算法。

那么,你能帮我解决这个问题吗?

答案1

这只能通过系统固件来改变——tpm2_pcrallocate 所做的操作需要“平台”授权,这意味着它只能由系统固件执行,而不能由操作系统执行。

(在 /bin 中放置此类命令的目的是为了与以完全空状态启动的软件 TPM 模拟器一起使用 - 例如,QEMU 可以在启动 VM 之前充当“平台”角色来配置 swtpm - 但它们对于物理 TPM 毫无用处,因为在任何用户控制的代码启动时,真实的固件已经初始化了 TPM。

除此之外,一旦系统启动并运行,更改 PCR 分配就毫无意义了,因为你只会得到全零的 PCR,而没有记录任何事件;PCR 值之所以有用,是因为固件和引导加载程序记录了事件操作系统启动。

似乎 TCG EFI 协议(可用于引导加载程序)具有设置活动PCRBanks()该函数应该告诉固件从下次重启开始分配不同的 PCR 库,但我不知道有任何现有工具可以让您方便地调用该函数。

据我所知,对于 TPM 1.2 这是不可能的,因为“硬编码”哈希算法,但对于 TPM 2.0(我拥有的),我可以为 PCR 库选择几种算法。

是的,但不是——这意味着 API 和数据结构支持算法灵活性,允许TPM 支持非 SHA1 算法(和/或同时支持多种算法)——例如,TCG 事件日志中的“扩展值”字段已从固定的 20 字节字段更改为可变长度哈希值的可变长度数组——但是,这并不一定意味着可用算法的数量必须多于一个。

TCG“TPM 2.0 的 PC 客户端平台配置文件”规范列出了两种强制实施的哈希算法,但固件会在启动时选择实际启用哪些算法(并且允许 TPM 支持的活动库数量少于算法数量)。请注意,SHA-1 不再是“强制”算法 - 它已被 SHA-384 取代较新的版本因此,仅提供 SHA-256 而不提供 SHA-1 的系统是完全符合规范的。

相关内容