设备标识符组合引擎

设备标识符组合引擎 (DICE) 是已纳入 Android 的受信任计算机组规范。DICE 旨在为设备创建不可变的加密身份,以及对在启动期间加载的固件进行远程可验证的测量。此过程还会为加载的每个固件创建加密身份。这些身份完全依赖于基本身份以及在给定启动期间加载的每个固件映像。

当芯片组的 ROM 从一组不可变数据(通常是芯片在生产过程中使用加密随机值安全预配的 fuse)中加载唯一的设备密钥 (UDS) 时,DICE 就会启动。当 ROM 读取此密钥后,它会使用某些供应商依赖的硬件锁定机制(例如锁存器)关闭对 UDS 的进一步访问。在下次启动过程中,对 UDS 的访问权限才会恢复。

ROM 使用 UDS 作为密钥派生函数 (KDF) 的输入,以生成用于标识该特定设备的永久性非对称密钥对。ROM 会加载并测量启动序列中的下一个阶段的固件,同时指定有关特定启动环境的其他元数据,例如是否启用了安全启动。ROM 使用 KDF 处理测量、配置和 UDS,以便为要加载的下一个阶段派生出密钥。此 Secret 称为复合设备标识符 (CDI)。

然后,重复此过程。CDI 充当下一个阶段的 UDS,该阶段会派生出一个密钥对,并且 CDI 会连同要加载的下一个映像的哈希输入到 KDF 中,以形成另一个派生的 CDI 值。

加载的固件使用生成的密钥对对 CBOR 对象签名和加密 (COSE) Sign1 证书进行签名。每个阶段都会在要加载的下一个阶段上签署证书。此证书包含该阶段的测量结果、启动模式、该阶段的 CDI 公钥以及其他相关元数据等信息。

简化的 DICE 派生过程

图 1. 简化的 DICE 派生过程。

此流程有助于确保加载的固件映像中的任何更改都会同时更改其自身的 CDI 值和所有后续阶段的 CDI 值。这意味着,加载的固件的每种组合都会生成唯一的身份和关联的密钥。此外,签名的方式必须保证每个阶段都由前一个阶段进行测量和认证,以防止任何阶段通过伪造自己的证书来逃避测量。这意味着,只要 ROM 未遭到破解,设备的安全状况就可以在设备外部进行修补和远程验证。