Device Identifier Composition Engine (DICE) — это спецификация Trusted Computing Group (TCG) , которая была принята в Android . Она создает набор надежных, неизменяемых криптографических идентификаторов для каждой части прошивки, загружаемой во время последовательности загрузки. Эти идентификаторы позволяют удаленно проверять состояние безопасности устройства, обойти которое можно только путем взлома ПЗУ.
Процесс вывода DICE
Рисунок 1. Упрощенный процесс вывода DICE.
Процесс деривации DICE гарантирует, что любое изменение любого образа прошивки приводит к новому уникальному идентификатору для этого этапа и каждого последующего этапа. Это происходит потому, что каждый загруженный этап прошивки измеряет и сертифицирует следующий, генерируя уникальные идентификаторы и связанные с ними ключи, которые предотвращают обход или подделку. Постоянное запоминающее устройство (ПЗУ) обрабатывает измерение, конфигурацию и уникальный секрет устройства (UDS) с помощью функции деривации ключа (KDF) для получения секрета для следующего загружаемого этапа. Этот секрет называется составным идентификатором устройства (CDI).
Этап 0: Инициализация
Процесс DICE начинается с загрузки UDS в ПЗУ чипсета из банка неизменяемых данных, обычно предохранителей. Этот UDS надежно снабжается криптографически случайным значением в процессе производства чипа. После считывания UDS ПЗУ использует зависящий от поставщика механизм аппаратной блокировки, такой как защелка, чтобы заблокировать доступ к UDS до следующей загрузки.
Этап 1: Начальное получение ключа
ROM использует UDS в качестве входных данных для функции деривации ключа (KDF) для генерации постоянной асимметричной пары ключей, которая однозначно идентифицирует это устройство. Он измеряет следующий этап прошивки, включая метаданные о среде загрузки, например, включена ли безопасная загрузка. Затем ROM объединяет UDS, измерение прошивки и данные конфигурации в KDF для получения первого CDI, который передается на следующий этап как секрет.
Этап 2-й по n-й: Рекурсивное получение ключа
Затем процесс повторяется. На всех последующих этапах CDI с предыдущего этапа служит входом для нового KDF. Этот KDF использует CDI и хэш следующего образа прошивки для создания нового производного CDI. Каждый этап генерирует свою собственную пару ключей и использует ее для подписи сертификата, содержащего измерения, специфичные для этапа, и другие связанные метаданные.