Device Identifier Composition Engine (DICE) è una specifica del Trusted Computing Group che è stata adottata in Android. L'obiettivo di DICE è creare un'identità crittografica immutabile per un dispositivo, insieme a una misurazione verificabile da remoto del firmware caricato durante l'avvio. Questo processo crea anche identità crittografiche per ogni parte di firmware che viene caricata. Queste identità dipendono interamente dall'identità di base e da ogni immagine del firmware caricata durante un determinato avvio.
DICE si avvia quando la ROM del chipset carica un segreto dispositivo univoco (UDS) da una banca di dati immutabili, in genere fusi, di cui è stato eseguito il provisioning in modo sicuro con un valore cryptographically random durante il processo di produzione del chip. Quando la ROM ha letto questo secret, disattiva ogni ulteriore accesso all'UDS utilizzando un meccanismo di blocco hardware dipendente dal fornitore, ad esempio un chiavistello. L'accesso all'UDS non viene ripristinato fino al successivo processo di avvio.
La ROM utilizza l'UDS come input per una funzione di derivazione delle chiavi (KDF) per generare la coppia di chiavi asimmetriche permanente che identifica quel determinato dispositivo. La ROM carica e misura la fase successiva del firmware nella sequenza di avvio, specificando al contempo metadati aggiuntivi sull'ambiente per l'avvio specifico, ad esempio se l'avvio protetto è abilitato. La ROM elabora la misurazione, la configurazione e l'UDS con un KDF per dedurre la chiave segreta da caricare nella fase successiva. Questo secret è indicato come identificatore di dispositivi composti (CDI).
La procedura viene ripetuta. Il CDI funge da UDS della fase successiva, che ricava una coppia di chiavi e il CDI viene inserito in un KDF insieme all'hash dell'immagine successiva da caricare per formare un altro valore CDI derivato.
Il firmware caricato utilizza le coppie di chiavi generate per firmare i certificati Sign1 di CBOR Object Signing and Encryption (COSE). In ogni fase, ogni fase firma un certificato da caricare nella fase successiva. Questo certificato include informazioni come la misurazione della fase, la modalità di avvio, la chiave pubblica CDI per quella fase e altri metadati associati.
Figura 1. Procedura di derivazione DICE semplificata.
Questa procedura contribuisce a garantire che qualsiasi modifica apportata a un'immagine del firmware modifichi sia il proprio valore CDI sia i valori CDI di tutte le fasi successive. Ciò significa che ogni combinazione di firmware caricato genera identità univoche e chiavi associate. Inoltre, la firma viene eseguita in modo da garantire che ogni fase venga misurata e certificata dalla fase precedente, impedendo a qualsiasi fase di eludere la misurazione falsificando il proprio certificato. Ciò significa che, a condizione che la ROM non sia compromessa, la situazione di sicurezza del dispositivo può essere corretta e verificata da remoto off-device.