O Device Identifier Composition Engine (DICE) é uma especificação do grupo de computação confiável que foi adotada no Android. O objetivo do DICE é criar uma identidade criptográfica imutável para um dispositivo, além de uma medição remotamente verificável do firmware que é carregado durante a inicialização. Além disso, esse processo cria identidades criptográficas para cada parte do firmware que é carregada. Essas identidades dependem totalmente da identidade base e de cada imagem de firmware carregada durante uma determinada inicialização.
O DICE começa quando a ROM do chipset carrega um segredo de dispositivo exclusivo (UDS, na sigla em inglês) de um banco de dados imutáveis, geralmente fusíveis, que foi provisionado com segurança com um valor aleatório criptográfico durante o processo de produção do chip. Quando a ROM lê esse segredo, ela interrompe qualquer acesso adicional à UDS usando algum mecanismo de bloqueio de hardware dependente do fornecedor, como uma trava. O acesso ao UDS não é restaurado até o próximo processo de inicialização.
A ROM usa o UDS como entrada para uma função de derivação de chaves (KDF, na sigla em inglês) para gerar o par de chaves assimétricas permanente que identifica esse dispositivo específico. A ROM carrega e mede a próxima etapa do firmware na sequência de inicialização, especificando metadados adicionais sobre o ambiente para a inicialização específica, como se a inicialização segura estiver ativada. A ROM processa a medição, a configuração e o UDS com um KDF para derivar o secret para o carregamento do próximo estágio. Esse segredo é chamado de identificador de dispositivo composto (CDI, na sigla em inglês).
O processo se repete. O CDI atua como UDS do próximo estágio, que deriva um par de chaves, e o CDI é inserido em um KDF com o hash da próxima imagem a ser carregada para formar outro valor de CDI derivado.
O firmware carregado usa os pares de chaves gerados para assinar certificados Sign1 de assinatura e criptografia de objeto CBOR (COSE, na sigla em inglês). Cada fase assina um certificado sobre a próxima fase a ser carregada. Esse certificado inclui informações como a medição desse estágio, o modo de inicialização, a chave pública do CDI para esse estágio e outros metadados associados.
Figura 1. Processo simplificado de derivação do DICE.
Esse processo ajuda a garantir que qualquer alteração em uma imagem de firmware carregada mude tanto o valor do CDI quanto os valores do CDI de todos os estágios subsequentes. Isso significa que cada combinação de firmware carregado gera identidades exclusivas e chaves associadas. Além disso, a assinatura é feita de forma a garantir que cada etapa seja medida e certificada pela etapa anterior, impedindo que qualquer etapa evite a medição falsificando o próprio certificado. Isso significa que, desde que a ROM não esteja comprometida, a postura de segurança do dispositivo pode ser corrigida e verificada remotamente fora do dispositivo.