デバイス識別子構成エンジン(DICE)は、Android に採用されている Trusted Computing Group の仕様です。DICE の目的は、起動時に読み込まれるファームウェアのリモート検証可能な測定値とともに、デバイスの不変の暗号 ID を作成することです。このプロセスではさらに、読み込まれるファームウェアごとに暗号 ID が作成されます。こうした ID は、ベース ID と、特定の起動で読み込まれる各ファームウェア イメージによってまったく異なります。
DICE は、チップセットの ROM が不変のデータのバンク(チップ製造プロセスにおいて暗号論的にランダムな値で安全にプロビジョニングされたもので、通常はヒューズ)から一意のデバイス シークレット(UDS)を読み込むと起動します。ROM がこのシークレットを読み取ると、ラッチなどのベンダー依存ハードウェア ロック メカニズムを使用して、UDS へのさらなるアクセスを遮断します。UDS へのアクセスは、次回の起動プロセスまで復元されません。
ROM は UDS を鍵導出関数(KDF)への入力として使用し、特定のデバイスを識別する永続的な非対称の鍵ペアを生成します。ROM は起動シーケンスにおいてファームウェアの次のステージを読み込んで測定し、セキュアブートが有効になっているかどうかなど、特定の起動環境に関する追加のメタデータを指定します。また、KDF を使用して測定、構成、UDS を処理し、次に読み込まれるステージのシークレットを導出します。このシークレットのことを、複合デバイス識別子(CDI)といいます。
その後、このプロセスが繰り返されます。CDI は次のステージの UDS として機能し、そのステージで鍵ペアが導出されます。また、次に読み込まれるイメージのハッシュとともに CDI が KDF に入力され、別の導出 CDI 値が形成されます。
読み込まれたファームウェアは、生成された鍵ペアを使用して、CBOR Object Signing and Encryption(COSE) Sign1 証明書に署名します。各ステージで、次に読み込まれるステージの証明書に署名します。この証明書には、そのステージの測定値、起動時のモード、そのステージの CDI 公開鍵、その他の関連メタデータなどの情報が含まれています。
図 1. DICE の導出プロセスの概要
このプロセスにより、読み込まれたファームウェア イメージに加えた変更は、そのファームウェア イメージ自体の CDI 値と、その後のすべてのステージの CDI 値に反映されます。つまり、読み込まれたファームウェアのあらゆる組み合わせで、固有の ID と、関連する鍵が生成されます。さらに、各ステージが前のステージで測定および認証されることを保証するように署名が行われるため、あるステージが自身の証明書を偽造して測定を回避するような事態を防止できます。つまり、ROM が侵害されていない限り、デバイスのセキュリティ ポスチャーにパッチを適用し、デバイス外から���モートで検証することができます。