Cuando el HLOS de Android recibe sus valores de CDI y la cadena DICE de la etapa anterior, los lee y, luego, deriva y borra los secretos necesarios (como los pares de claves públicas y privadas, y las etapas de CDI adicionales) para el descubrimiento de servicios de SDV.
Este proceso se lleva a cabo lo antes posible en el flujo de arranque durante
early-init en la inicialización de la segunda etapa. De esta manera, se garantiza que el HLOS de Android consuma y borre los valores de CDI antes de que se ejecute cualquier código de terceros.
El cargador de arranque de Android (o el cargador invitado en el hipervisor, si no existe un cargador de arranque de Android) pasa los siguientes valores a través del kernel de Linux del SDV a second stage init en el espacio de usuario de Android:
- Valor de CDI de atestación de la capa HLOS de Android
- Valor de CDI de sellado de la capa HLOS de Android
- Cadena DICE codificada en CBOR hasta la capa HLOS de Android
Estos valores usan el formato SdvDiceHandover. El SdvDiceHandover es un
mapa codificado en CBOR que se describe en este fragmento deCDDL:
SdvDiceHandover = {
1 : bstr .size 32, ; CDI_Attest
2 : bstr .size 32, ; CDI_Seal
3 : DiceCertChain, ; Android SDV DICE chain
}
La IRemotelyProvisionedComponent HAL DiceCertChain especifica el
formato de DiceCertChain. No necesitas
CBOR codificado de forma determinista para SdvDiceHandover, aunque se
recomienda, ya que admite una gama más amplia de políticas de DICE.
El formato SdvDiceHandover es muy similar a los siguientes:
AndroidDiceHandoverformato que define la implementación de referencia de Open Profile for DICEPvmfwDiceHandoverformato que usapvmfwpara entregar la cadena DICE a una pVM (por ejemplo, Microdroid)
A diferencia de AndroidDiceHandover y de manera similar al formato PvmfwDiceHandover, DiceCertChain es obligatorio y no opcional.
Controlador de kernel de Open Profile for DICE
La entrega de DICE del CDI del HLOS de Android desde el cargador de arranque de Android (o el cargador invitado en el hipervisor, si no hay un cargador de arranque) al HLOS de Android se basa en el controlador de kernel de Open Profile for DICE. El cargador de arranque de Android escribe la entrada de la cadena DICE en una región de la memoria del invitado que debe especificar el árbol de dispositivos (DT).
El controlador lee esta región de memoria que especifica el DT y la expone al espacio de usuario como un dispositivo /dev/open-dice0. El controlador permite leer y borrar esta región de memoria. El controlador de Open Profile for DICE solo existe en arquitecturas arm64 porque el árbol de dispositivos es un concepto exclusivo de arm64.
Especifica la región de memoria que expone el controlador de Open Profile for DICE con un
reserved-memory nodo en el DT que etiquetas para el controlador especificando
"google,open-dice" en la compatible propiedad. Por ejemplo:
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>;
};
};