裝置識別碼組合引擎 (DICE) 是 Android 引入的受信任運算群組 規格。DICE 的目標是為裝置建立不可變更的加密編譯身分,以及在啟動期間載入的韌體可遠端驗證的測量值。這個程序會為載入的每項韌體另外建立加密編譯身分。這些身分完全取決於基本身分,以及在特定啟動期間載入的每個韌體映像檔。
當晶片組的 ROM 從一組不可變動資料 (通常是熔絲) 中載入獨特的裝置機密值 (UDS) 時,DICE 就會啟動。這些資料是在晶片製造過程中,以加密隨機值安全佈建的。當 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 未遭到入侵,裝置的安全性狀態就能進行修補,並在離線狀態下進行遠端驗證。