Übergabe der CDI für Android-HLOS

Wenn das Android-HLOS die CDI-Werte und die DICE-Kette aus der vorherigen Phase empfängt, liest es sie und leitet dann die erforderlichen Secrets (z. B. öffentliche und private Schlüsselpaare und weitere CDI-Phasen) für die SDV-Dienstermittlung ab und löscht sie.

Dieser Vorgang findet so schnell wie möglich im Bootflow während early-init in der zweiten Initialisierungsphase statt. So wird sichergestellt, dass Android HLOS die CDI-Werte verarbeitet und löscht, bevor Drittanbietercode ausgeführt wird.

Der Android-Bootloader (oder der Gast-Loader im Hypervisor, falls kein Android-Bootloader vorhanden ist) übergibt die folgenden Werte über den Linux-Kernel des SDV an second stage init im Android-Userspace:

  • CDI-Wert der Attestierung der Android-HLOS-Ebene.
  • CDI-Wert für die Versiegelung der Android-HLOS-Ebene.
  • CBOR-codierte DICE-Kette bis zur Android-HLOS-Ebene.

Diese Werte haben das Format SdvDiceHandover. SdvDiceHandover ist eine CBOR-codierte Zuordnung, die durch dieses CDDL-Fragment beschrieben wird:

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

Die IRemotelyProvisionedComponent-HAL DiceCertChain gibt das Format von DiceCertChain an. Für SdvDiceHandover ist deterministisch codiertes CBOR nicht erforderlich, es wird jedoch dringend empfohlen, da es eine größere Auswahl an DICE-Richtlinien unterstützt.

Das Format SdvDiceHandover ähnelt dem:

  • AndroidDiceHandover-Format, das in der Open Profile for DICE-Referenzimplementierung definiert ist,

  • PvmfwDiceHandover-Format, das vom pvmfw verwendet wird, um die DICE-Kette an eine pVM zu übergeben. Beispiel: Microdroid.

Im Gegensatz zu AndroidDiceHandover und ähnlich wie beim Format PvmfwDiceHandover ist DiceCertChain erforderlich und nicht optional.

Profil für DICE-Kernel-Treiber öffnen

Die DICE-Übergabe des Android-HLOS-CDI vom Android-Bootloader (oder vom Gast-Loader im Hypervisor, falls kein Bootloader vorhanden ist) an das Android-HLOS basiert auf dem Open Profile for DICE kernel driver. Der Android-Bootloader schreibt den DICE-Chain-Eintrag in einen Bereich im Arbeitsspeicher des Gastsystems, der im Gerätebaum (Device Tree, DT) angegeben werden muss.

Der Treiber liest diesen Speicherbereich, der vom Gerätebaum angegeben wird, und macht ihn im Userspace als /dev/open-dice0-Gerät verfügbar. Der Treiber ermöglicht das Lesen und Löschen dieses Speicherbereichs. Der Open Profile for DICE-Treiber ist nur für arm64-Architekturen verfügbar, da der Gerätebaum nur für arm64-Architekturen verwendet wird.

Geben Sie den Speicherbereich an, den der Open Profile for DICE-Treiber über einen reserved-memory-Knoten im Gerätebaum verfügbar macht. Taggen Sie den Knoten für den Treiber, indem Sie "google,open-dice" in der compatible-Property angeben. Beispiel:

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>;
  };
};