העברה של HLOS CDI ב-Android

כשמערכת ההפעלה HLOS של Android מקבלת את ערכי ה-CDI ואת שרשרת ה-DICE מהשלב הקודם, היא קוראת אותם ואז גוזרת ומנקה את הסודות הנדרשים (כמו זוגות של מפתחות ציבוריים ופרטיים ושלבי CDI נוספים) לצורך גילוי שירות SDV.

התהליך הזה מתבצע בהקדם האפשרי בתהליך האתחול, במהלך early-init בשלב השני של האתחול. כך מוודאים שמערכת Android HLOS צורכת את ערכי ה-CDI ומנקה אותם לפני שקוד של צד שלישי מופעל.

טוען האתחול של Android (או טוען האורח בהיפר-ויז'ר, אם לא קיים טוען אתחול של Android) מעביר את הערכים הבאים דרך ליבת ה-Linux של SDV אל second stage init במרחב המשתמש של Android:

  • ערך ה-CDI של האימות בשכבת ה-HLOS של Android.
  • איטום של ערך ה-CDI בשכבת ה-HLOS של Android.
  • שרשרת DICE עם קידוד CBOR עד לשכבת ה-HLOS של Android.

הערכים האלה צריכים להיות בפורמט SdvDiceHandover. ‫SdvDiceHandover הוא מפה מקודדת ב-CBOR שמתוארת על ידי קטע CDDL הזה:

SdvDiceHandover = {
   1 : bstr .size 32, ; CDI_Attest
   2 : bstr .size 32, ; CDI_Seal
   3 : DiceCertChain, ; Android SDV DICE chain
}

IRemotelyProvisionedComponent HAL DiceCertChain מציין את הפורמט של DiceCertChain. לא נדרש קידוד CBOR דטרמיניסטי עבור SdvDiceHandover, אבל מומלץ מאוד להשתמש בו כי הוא תומך במגוון רחב יותר של מדיניות DICE.

הפורמט של SdvDiceHandover דומה מאוד לפורמט של:

  • פורמט AndroidDiceHandover שמוגדר בהטמעה לדוגמה של Open Profile for DICE,

  • פורמט PvmfwDiceHandover שבו pvmfw משתמש כדי להעביר את שרשרת ה-DICE ל-pVM. לדוגמה, Microdroid.

בניגוד לפורמט AndroidDiceHandover ובדומה לפורמט PvmfwDiceHandover, הפורמט DiceCertChain הוא חובה ולא אופציונלי.

פתיחת הפרופיל של מנהל התקן הליבה של DICE

העברת השליטה של ה-CDI של Android HLOS מ-Android Bootloader (או מטוען האורח בהיפר-ויז'ר, אם אין Bootloader) אל Android HLOS באמצעות DICE מסתמכת על Open Profile for DICE kernel driver. ‏ Android Bootloader כותב את הרשומה של שרשרת DICE לאזור בזיכרון של האורח שצריך לציין ב-Device Tree ‏ (DT).

הדרייבר קורא את אזור הזיכרון הזה שצוין ב-DT ומציג אותו במרחב המשתמש כמכשיר /dev/open-dice0. הדרייבר מאפשר לקרוא ולמחוק את אזור הזיכרון הזה. הפרופיל Open ל-DICE driver קיים רק בארכיטקטורות arm64 כי פירוט מבנה המכשיר (DT) הוא מושג שקיים רק ב-arm64.

מציינים את אזור הזיכרון שהדרייבר של Open Profile for DICE חושף באמצעות צומת reserved-memory ב-DT שמתייגים עבור הדרייבר על ידי ציון "google,open-dice" במאפיין compatible. לדוגמה:

reserved-memory {
  // The number of u32 cells to represent the address of a memory region
  #address-cells = <2>;
  // The number of u32 cells to represent the size of a memory region
  #size-cells = <2>;
  ranges;
  // The unit address (after the @) must match the address in the reg property
  dice@D1C30000 {
    compatible = "google,open-dice";
    no-map;
    // The address and the size of the memory region that is passed to the Open
    // Profile for DICE driver. The address must be page-aligned, and the size a
    // multiple of the page size. The first two hex numbers (cells) represent
    // the address of the memory region, the last two represent its size.
    reg = <0x0 0xD1C30000 0x0 0x1000>;
  };
};