Przekazywanie sterowania HLOS CDI w Androidzie

Gdy system Android HLOS otrzyma swoje wartości i certyfikaty CDI Androida HLOS z poprzedniego etapu, odczyta je, a następnie wygeneruje i usunie niezbędne tajne dane, takie jak pary kluczy publicznych i prywatnych oraz kolejne etapy CDI, na potrzeby wykrywania usług SDV.

Ten proces odbywa się jak najszybciej podczas uruchamiania w fazie early-init w drugiej fazie inicjowania. Dzięki temu system Android HLOS zużywa i usuwa wartości CDI, zanim zostanie wykonany kod innej firmy.

Bootloader Androida (lub program ładujący gościa w hiperwizorze, jeśli nie ma bootloadera Androida) przekazuje te wartości przez jądro systemu Linux SDV do second stage init w przestrzeni użytkownika Androida:

  • wartość CDI atestu warstwy Android HLOS;
  • wartość CDI uszczelnienia warstwy Android HLOS;
  • łańcuch DICE zakodowany w formacie CBOR do warstwy Android HLOS.

Te wartości używają formatu SdvDiceHandover. SdvDiceHandover to mapa zakodowana w formacie CBOR opisana przez ten fragment CDDL:

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

Format DiceCertChain określa HAL IRemotelyProvisionedComponent DiceCertChain. W przypadku SdvDiceHandover nie jest wymagany deterministycznie zakodowany format CBOR, ale jest on wysoce zalecany, ponieważ obsługuje szerszy zakres zasad DICE.

Format SdvDiceHandover jest bardzo podobny do:

  • AndroidDiceHandover formatu zdefiniowanego przez implementację referencyjną Open Profile for DICE ;

  • PvmfwDiceHandover formatu, którego pvmfw używa do przekazywania łańcucha DICE do pVM. Na przykład Microdroid.

W przeciwieństwie do formatu AndroidDiceHandover i podobnie jak w przypadku formatu PvmfwDiceHandover format DiceCertChain jest wymagany, a nie opcjonalny.

Sterownik jądra Open Profile for DICE

Przekazywanie CDI Androida HLOS z programu rozruchowego Androida (lub modułu wczytującego gościa w hipernadzorcy, jeśli nie ma programu rozruchowego) do Androida HLOS opiera się na sterowniku jądra systemu Open Profile for DICE. Bootloader Androida zapisuje wpis łańcucha DICE w regionie pamięci gościa, który musi określić drzewo urządzenia (DT).

Sterownik odczytuje ten region pamięci określony przez DT i udostępnia go w przestrzeni użytkownika jako urządzenie /dev/open-dice0. Sterownik umożliwia odczytywanie i usuwanie tego regionu pamięci. Sterownik Open Profile for DICE występuje tylko w architekturach arm64, ponieważ drzewo urządzenia jest koncepcją dostępną tylko w architekturze arm64.

Określ region pamięci, który sterownik Open Profile for DICE udostępnia za pomocą reserved-memory węzła w DT, który oznaczysz dla sterownika, określając "google,open-dice" we właściwości compatible. Przykład:

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