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