تحویل اندروید HLOS CDI

وقتی Android HLOS مقادیر و گواهی‌های Android HLOS CDI خود را از مرحله قبل دریافت می‌کند، آنها را می‌خواند و سپس اطلاعات محرمانه لازم - مانند جفت کلیدهای عمومی و خصوصی و مراحل بعدی CDI - را برای کشف سرویس SDV استخراج و پاک می‌کند.

این فرآیند در اسرع وقت در جریان بوت، در طول early-init در مرحله دوم راه‌اندازی، انجام می‌شود. انجام این کار تضمین می‌کند که HLOS اندروید، قبل از اجرای هرگونه کد شخص ثالث، مقادیر CDI را مصرف و پاک می‌کند.

بوت لودر اندروید (یا لودر مهمان در هایپروایزر، در صورت عدم وجود بوت لودر اندروید) مقادیر زیر را از طریق هسته لینوکس SDV به second stage init در فضای کاربر اندروید منتقل می‌کند:

  • مقدار CDI گواهی لایه HLOS اندروید.
  • آب‌بندی مقدار CDI لایه HLOS اندروید.
  • زنجیره DICE با کدگذاری CBOR تا لایه Android HLOS.

این مقادیر از قالب 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 را مشخص می‌کند. برای SdvDiceHandover نیازی به CBOR رمزگذاری‌شده قطعی ندارید، هرچند که اکیداً توصیه می‌شود زیرا از طیف وسیع‌تری از سیاست‌های DICE پشتیبانی می‌کند.

فرمت SdvDiceHandover بسیار شبیه به فرمت زیر است:

  • فرمت AndroidDiceHandover که پیاده‌سازی مرجع Open Profile for DICE آن را تعریف می‌کند،

  • فرمت PvmfwDiceHandover که pvmfw برای تحویل زنجیره DICE به یک pVM استفاده می‌کند. به عنوان مثال، Microdroid.

برخلاف AndroidDiceHandover و مشابه فرمت PvmfwDiceHandover ، فرمت DiceCertChain الزامی است و اختیاری نیست.

نمایه باز برای درایور هسته DICE

تحویل DICE از Android HLOS CDI از Android Bootloader (یا guest loader در hypervisor، در صورت عدم وجود bootloader) به Android HLOS به Open Profile for DICE kernel driver متکی است. Android Bootloader ورودی DICE Chain را در ناحیه‌ای از حافظه guest می‌نویسد که Device Tree (DT) باید آن را مشخص کند.

درایور این ناحیه حافظه را که DT مشخص می‌کند، می‌خواند و آن را به عنوان یک دستگاه /dev/open-dice0 در فضای کاربر قرار می‌دهد. درایور امکان خواندن و پاک کردن این ناحیه حافظه را فراهم می‌کند. درایور Open Profile for DICE فقط روی معماری‌های arm64 وجود دارد زیرا درخت دستگاه یک مفهوم فقط برای 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>;
  };
};