Android HLOS CDI handover

Quando l'HLOS Android riceve i suoi valori e certificati CDI dell'HLOS Android dalla fase precedente, li legge, quindi deriva ed elimina i secret necessari, come le coppie di chiavi pubbliche e private e le fasi CDI successive, per l'individuazione dei servizi SDV.

Questa procedura viene eseguita il prima possibile nel flusso di avvio durante early-init nella seconda fase di inizializzazione. In questo modo, l'HLOS Android utilizza ed elimina i valori CDI prima dell'esecuzione di qualsiasi codice di terze parti.

Il bootloader Android (o il caricatore guest nell'hypervisor, se non esiste un bootloader Android) passa i seguenti valori tramite il kernel Linux dell'SDV a second stage init nello spazio utente Android:

  • Valore CDI di attestazione del livello HLOS Android.
  • Valore CDI di sealing dello strato HLOS Android.
  • Catena DICE codificata in CBOR fino al livello HLOS Android.

Questi valori utilizzano il formato SdvDiceHandover. Il SdvDiceHandover è una mappa codificata in CBOR descritta da questo frammento CDDL:

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

L'IRemotelyProvisionedComponent HAL DiceCertChain specifica il formato di DiceCertChain. Non è necessario un CBOR codificato in modo deterministico per SdvDiceHandover, anche se è vivamente consigliato perché supporta una gamma più ampia di policy DICE.

Il formato SdvDiceHandover è molto simile a:

  • AndroidDiceHandover formato definito dall'implementazione di riferimento del profilo aperto per DICE,

  • PvmfwDiceHandover formato utilizzato da pvmfw per trasferire la catena DICE a una pVM. Ad esempio, Microdroid.

A differenza di AndroidDiceHandover e in modo simile al formato PvmfwDiceHandover, DiceCertChain è obbligatorio e non facoltativo.

Driver del kernel del profilo aperto per DICE

Il trasferimento CDI dell'HLOS Android da parte del bootloader Android (o del caricatore guest nell'hypervisor, se non è presente un bootloader) all'HLOS Android si basa sul driver del kernel del profilo aperto per DICE. Il bootloader Android scrive la voce della catena DICE in una regione della memoria del guest che deve essere specificata dall'albero dei dispositivi (DT).

Il driver legge questa regione di memoria specificata dal DT e la espone allo spazio utente come dispositivo /dev/open-dice0. Il driver consente di leggere ed eliminare questa regione di memoria. Il driver del profilo aperto per DICE esiste solo sulle architetture arm64 perché l'albero dei dispositivi è un concetto solo arm64.

Specifica la regione di memoria esposta dal driver del profilo aperto per DICE utilizzando un reserved-memory nodo nel DT che contrassegni per il driver specificando "google,open-dice" nella compatible proprietà. Ad esempio:

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