Device Identifier Composition Engine (DICE) הוא מפרט של Trusted Computing Group שאומצ ב-Android. מטרת DICE היא ליצור זהות קריפטוגרפית שלא ניתנת לשינוי למכשיר, יחד עם מדידה של הקושחה שנטענת במהלך האתחול, שניתן לאמת מרחוק. התהליך הזה יוצר גם זהויות קריפטוגרפיות לכל קטע של קושחת מערכת שנטען. הזהויות האלה תלויות לחלוטין בזהות הבסיס ובכל תמונת קושחה שנטענה במהלך הפעלה נתונה.
DICE מתחיל לפעול כש-ROM של ערכת השבבים טוען סוד מכשיר ייחודי (UDS) ממאגר של נתונים שלא ניתן לשינוי, בדרך כלל רכיבי ניתוק (fuses), שהוקצה בצורה מאובטחת עם ערך אקראי מבחינה קריפטוגרפית במהלך תהליך ייצור השבב. אחרי ש-ROM קורא את הסוד הזה, הוא חוסם כל גישה נוספת ל-UDS באמצעות מנגנון נעילה של חומרה שמשתנה בהתאם לספק, כמו מנעול. הגישה ל-UDS לא תשוחזר עד לתהליך האתחול הבא.
ה-ROM משתמש ב-UDS כקלט לפונקציית הפקת מפתחות (KDF) כדי ליצור את זוג המפתחות האסימטרי הקבוע שמזהה את המכשיר הספציפי. ה-ROM נטען ומודד את השלב הבא של הקושחה ברצף האתחול, תוך ציון מטא-נתונים נוספים על הסביבה בשביל ההפעלה הספציפית, למשל אם מופעלת הפעלה מאובטחת. ה-ROM מעבד את המדידה, ההגדרה וה-UDS באמצעות KDF כדי להפיק את הסוד לשלב הבא שרוצים לטעון. הסוד הזה נקרא מזהה מכשיר מורכב (CDI).
לאחר מכן התהליך חוזר על עצמו. ה-CDI משמש כ-UDS של השלב הבא, השלב הזה מניב זוג מפתחות, וה-CDI מוזן ל-KDF יחד עם הגיבוב של התמונה הבאה שתישאר, כדי ליצור ערך CDI נגזר נוסף.
הקושחה שהוטענה משתמשת בזוגות המפתחות שנוצרו כדי לחתום על אישורי Sign1 של הצפנה וחתימת אובייקטים ב-CBOR (COSE). כל שלב חותם על אישור לגבי השלב הבא שרוצים לטעון. האישור הזה כולל מידע כמו המדידה של השלב הזה, המצב שבו ההפעלה נמצאת, המפתח הציבורי של CDI לשלב הזה ומטא-נתונים משויכים אחרים.
איור 1. תהליך פשוט יותר להסקת ערך DICE.
התהליך הזה עוזר להבטיח שכל שינוי בתמונת קושחה שנטענה משנה גם את ערך ה-CDI שלה וגם את ערכי ה-CDI של כל השלבים הבאים. כלומר, כל שילוב של קושחת טעינה יוצר זהויות ייחודיות ומפתחות משויכים. בנוסף, החתימה מתבצעת בצורה שמבטיחה שכל שלב יימדד ואושר על ידי השלב הקודם, ולמנוע מכל שלב לחמוק מהמדידה על ידי זיוף האישור שלו. כלומר, כל עוד ה-ROM לא נפרץ, אפשר לתקן את מצב האבטחה של המכשיר ולאמת אותו מרחוק מחוץ למכשיר.