Quando o HLOS do Android recebe os valores de CDI e a cadeia DICE da etapa anterior, ele os lê e deriva e limpa os segredos necessários (como pares de chaves públicas e privadas e outras etapas de CDI) para a descoberta de serviços SDV.
Esse processo ocorre o mais rápido possível no fluxo de inicialização durante
early-init na inicialização da segunda etapa. Isso garante que o
HLOS do Android consuma e apague os valores de CDI antes da execução de qualquer código de terceiros.
O carregador de inicialização do Android (ou o carregador convidado no hipervisor, se não houver um carregador de inicialização do Android) transmite os seguintes valores pelo kernel do Linux do SDV para second stage init no espaço do usuário do Android:
- Valor do CDI de atestado da camada HLOS do Android.
- Lacrando o valor do CDI da camada HLOS do Android.
- Cadeia DICE codificada em CBOR até a camada HLOS do Android.
Esses valores usam o formato SdvDiceHandover. O SdvDiceHandover é um mapa codificado em
CBOR descrito por este fragmento CDDL:
SdvDiceHandover = {
1 : bstr .size 32, ; CDI_Attest
2 : bstr .size 32, ; CDI_Seal
3 : DiceCertChain, ; Android SDV DICE chain
}
O DiceCertChain HAL IRemotelyProvisionedComponent especifica o
formato do DiceCertChain. Não é necessário
CBOR codificado de forma determinística para SdvDiceHandover, embora seja altamente
recomendado porque oferece suporte a uma variedade maior de políticas do DICE.
O formato SdvDiceHandover é muito semelhante ao:
formato
AndroidDiceHandoverdefinido pela implementação de referência Open Profile para DICE,Formato
PvmfwDiceHandoverque opvmfwusa para transferir a cadeia DICE para uma pVM. Por exemplo, Microdroid.
Ao contrário do AndroidDiceHandover e de forma semelhante ao formato PvmfwDiceHandover, o DiceCertChain é obrigatório e não opcional.
Abrir perfil para o driver de kernel do DICE
A transferência do DICE do CDI HLOS do Android do carregador de inicialização do Android (ou do carregador de convidados no hipervisor, se não houver um carregador de inicialização) para o HLOS do Android depende do Open Profile para o driver do kernel do DICE. O carregador de inicialização do Android grava a entrada da cadeia do DICE em uma região da memória do convidado que a árvore de dispositivos (DT) precisa especificar.
O driver lê essa região de memória especificada pelo DT e a expõe ao
espaço do usuário como um dispositivo /dev/open-dice0. O driver permite ler e limpar
essa região de memória. O driver Open Profile para DICE só existe em arquiteturas
arm64 porque a árvore de dispositivos é um conceito exclusivo do arm64.
Especifique a região de memória que o driver Open Profile for DICE expõe usando um
nó reserved-memory na DT que você marca para o driver especificando
"google,open-dice" na propriedade compatible. Exemplo:
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>;
};
};