Lorsque le HLOS Android reçoit ses valeurs et certificats CDI HLOS Android de l'étape précédente, il les lit, puis dérive et efface les secrets nécessaires (tels que les paires de clés publiques et privées, et les autres étapes CDI) pour la découverte de services SDV.
Ce processus a lieu le plus tôt possible dans le flux de démarrage, pendant early-init dans l'initialisation de la deuxième étape. Cela permet de s'assurer que le HLOS Android consomme et efface les valeurs CDI avant l'exécution de tout code tiers.
Le bootloader Android (ou le chargeur invité dans l'hyperviseur, s'il n'existe pas de bootloader Android) transmet les valeurs suivantes via le noyau Linux du SDV à second stage init dans l'espace utilisateur Android :
- Valeur CDI d'attestation de la couche HLOS Android.
- Valeur CDI d'étanchéité de la couche HLOS Android.
- Chaîne DICE encodée au format CBOR jusqu'à la couche HLOS Android.
Ces valeurs utilisent le format SdvDiceHandover. SdvDiceHandover est une carte encodée en CBOR décrite par ce fragment CDDL :
SdvDiceHandover = {
1 : bstr .size 32, ; CDI_Attest
2 : bstr .size 32, ; CDI_Seal
3 : DiceCertChain, ; Android SDV DICE chain
}
Le HAL IRemotelyProvisionedComponent DiceCertChain spécifie le format de DiceCertChain. Vous n'avez pas besoin d'un encodage CBOR déterministe pour SdvDiceHandover, bien que cela soit fortement recommandé, car il est compatible avec un plus grand nombre de règles DICE.
Le format SdvDiceHandover est très semblable à celui de :
Format
AndroidDiceHandoverdéfini par l'implémentation de référence Open Profile for DICE.Format
PvmfwDiceHandoverutilisé parpvmfwpour transmettre la chaîne DICE à un pVM. (par exemple, Microdroid).
Contrairement au format AndroidDiceHandover et comme le format PvmfwDiceHandover, le format DiceCertChain est obligatoire et non facultatif.
Ouvrir le profil pour le pilote de noyau DICE
Le transfert DICE du CDI HLOS Android du bootloader Android (ou du chargeur invité dans l'hyperviseur, s'il n'y a pas de bootloader) au HLOS Android s'appuie sur le pilote de noyau Open Profile pour DICE. Le bootloader Android écrit l'entrée de la chaîne DICE dans une région de la mémoire de l'invité que l'arborescence des périphériques (DT) doit spécifier.
Le pilote lit cette région de mémoire spécifiée par le DT et l'expose à l'espace utilisateur en tant que périphérique /dev/open-dice0. Le pilote permet de lire et d'effacer cette zone de mémoire. Le profil ouvert pour le pilote DICE n'existe que sur les architectures arm64, car l'arborescence des périphériques est un concept arm64 uniquement.
Spécifiez la région de mémoire que le pilote Open Profile for DICE expose à l'aide d'un nœud reserved-memory dans le DT que vous taguez pour le pilote en spécifiant "google,open-dice" dans la propriété compatible. Exemple :
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>;
};
};