Wenn das Android-HLOS die CDI-Werte und Zertifikate für das Android-HLOS aus der vorherigen Phase empfängt, werden diese gelesen. Anschließend werden die erforderlichen vertraulichen Daten wie öffentliche und private Schlüsselpaare sowie weitere CDI-Phasen für die SDV-Dienstermittlung abgeleitet und gelöscht.
Dieser Vorgang findet so bald wie möglich im Bootflow während early-init in der zweiten Phase der Initialisierung 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 der Android-HLOS-Ebene versiegeln.
- 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 vompvmfwverwendet 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 im Gerätebaum angegeben ist, und macht ihn im Nutzerbereich als /dev/open-dice0-Gerät verfügbar. Der Treiber ermöglicht das Lesen und Löschen dieses Speicherbereichs. Das offene Profil für den 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>;
};
};