设备标识符组合引擎 (DICE) 是 Trusted Computing Group 规范,已被纳入 Android 中。DICE 旨在为设备创建不可变的加密身份,以及对启动期间加载的固件进行远程可验证的测量。此外,此过程还会为加载的每个固件创建加密身份。这些身份完全取决于基本身份以及在给定启动期间加载的每个固件映像。
当芯片组的 ROM 从一组不可变数据(通常是保险丝)加载唯一的设备密钥 (UDS) 时,DICE 就会启动。这些数据在芯片生产过程中已使用加密随机值安全预配。当 ROM 读取此密钥后,它会使用某些供应商依赖的硬件锁定机制(例如锁闩)关闭对 UDS 的任何进一步访问。在下次启动流程之前,系统不会恢复对 UDS 的访问权限。
ROM 使用 UDS 作为密钥派生函数 (KDF) 的输入,以生成用于标识特定设备的永久性非对称密钥对。ROM 会加载并测量启动顺序中的下一个阶段的固件,同时指定特定启动环境的其他元数据,例如是否启用了安全启动。ROM 使用 KDF 处理测量、配置和 UDS,以便为要加载的下一个阶段派生密钥。此密钥称为复合设备标识符 (CDI)。
然后重复此过程。CDI 充当下一个阶段的 UDS,该阶段派生密钥对,并将 CDI 与要加载的下一个映像的哈希一起输入 KDF,以形成另一个派生的 CDI 值。
加载的固件使用生成的密钥对对 CBOR 对象签名和加密 (COSE) Sign1 证书进行签名。每个阶段都会对要加载的下一个阶段签署证书。此证书包含该阶段的测量结果、启动模式、该阶段的 CDI 公钥以及其他相关元数据等信息。
图 1. 简化了 DICE 派生流程。
此过程有助于确保已加载固件映像中的任何更改都会同时更改自身的 CDI 值和所有后续阶段的 CDI 值。这意味着,加载的固件组合的每个组合都会生成唯一的身份和关联的密钥。此外,签名方式可确保每个阶段都由前一阶段进行衡量和认证,从而防止任何阶段通过伪造自己的证书来逃避衡量。这意味着,只要 ROM 未遭到入侵,就可以在设备外部修补设备的安全状况并进行远程验证。