# High Assurance Boot (HAB) — Принцип работы и применение на MIMXRT1052 ## 1. Что такое HAB **High Assurance Boot (HAB)** — механизм безопасной загрузки, встроенный в BootROM микроконтроллеров семейства NXP i.MX/RT. Его цель — криптографически гарантировать, что на чипе запустится только авторизованный код. HAB работает на уровне кремния: BootROM прошит на заводе и не может быть изменён. Вся цепочка доверия строится от него. --- ## 2. Угрозы без HAB Без механизма защищённой загрузки любой, имеющий физический доступ к устройству, может: - подключить программатор и залить произвольную прошивку - загрузить вредоносный код через USB в режиме Serial Download Protocol (SDP) - модифицировать прошивку во Flash между производством и эксплуатацией HAB устраняет эти угрозы на аппаратном уровне. --- ## 3. Структура HAB-образа HAB-образ — это не просто бинарник прошивки, а обёртка с метаданными вокруг него. BootрOM ищет обязательные структуры по фиксированным смещениям. ### Карта памяти Flash (FlexSPI NOR, XIP) ```bash 0x60000000 ┌──────────────────────────────────┐ │ FCB — Flash Configuration Block │ 512 байт │ (конфигурация FlexSPI контроллера│ │ записывается Flashloader'ом) │ 0x60001000 ├──────────────────────────────────┤ │ IVT — Image Vector Table │ 32 байта 0x60001020 ├──────────────────────────────────┤ │ BDT — Boot Data Table │ 12 байт 0x60001030 ├──────────────────────────────────┤ │ DCD — Device Config Data │ опционально │ (инициализация SDRAM и др.) │ ├──────────────────────────────────┤ 0x60003000 │ Код прошивки (.text, .data, ...) │ │ │ ├──────────────────────────────────┤ │ CSF — Command Sequence File │ только в signed-образе │ (подпись, ключи, хэши) │ └──────────────────────────────────┘ ``` ### 3.1 IVT — Image Vector Table Главная точка входа для BootROM. Структура фиксирована, 32 байта, тег `0xD1`: ```c typedef struct { uint32_t header; // тег 0xD1, длина, версия uint32_t entry; // адрес Reset_Handler прошивки uint32_t reserved1; uint32_t dcd; // адрес DCD (0 если не нужен) uint32_t boot_data; // адрес BDT uint32_t self; // адрес самого IVT uint32_t csf; // адрес CSF (0 если unsigned) uint32_t reserved2; } ivt_t; ``` BootROM находит IVT по фиксированному смещению от начала Flash (`ivtOffset = 0x1000` для FlexSPI NOR), читает его и получает адреса всех остальных структур. ### 3.2 BDT — Boot Data Table Сообщает BootROM, где начинается образ и каков его полный размер: ```c typedef struct { uint32_t start; // 0x60000000 — начало образа во Flash uint32_t length; // полный размер в байтах uint32_t plugin; // 0 для обычного образа } boot_data_t; ``` ### 3.3 DCD — Device Configuration Data Опциональная секция с командами инициализации периферии, которые BootROM выполняет **до** передачи управления прошивке. Типичное применение — инициализация SDRAM (SEMC), чтобы к моменту старта первой инструкции прошивки память уже была доступна. DCD содержит последовательность команд двух типов: | Команда | Тег | Назначение | |---|---|---| | `Write Data` | `0xCC` | Записать значение по адресу | | `Check Bits Set` | `0xCF` | Ждать пока бит станет `1` (poll) | Формат бинарника: `Tag(1) | Length(2 BE) | Parameter(1) | данные`. ### 3.4 CSF — Command Sequence File Криптографическая секция. Присутствует только в подписанных образах. Содержит: - таблицу публичных ключей (SRK table) - хэши защищённых регионов образа (IVT, BDT, код) - подпись RSA 2048/4096 или ECDSA --- ## 4. Режимы HAB ### 4.1 По типу образа | Режим | `flags` | CSF | Применение | |---|---|---|---| | Unsigned | `0x00` | отсутствует | разработка, отладка | | Signed | `0x08` | RSA/ECDSA подпись | производство | | Signed + Encrypted | `0x0C` | подпись + шифрование кода | максимальная защита | ### 4.2 По состоянию чипа (OTP fuse) Независимо от типа образа, чип может находиться в одном из двух состояний: **HAB Open** (fuse `SEC_CONFIG = 0`, заводское состояние): BootROM проверяет подпись, но **игнорирует ошибки** — запуск происходит в любом случае. Это позволяет работать с unsigned образами на этапе разработки. **HAB Closed** (fuse `SEC_CONFIG = 1`): При ошибке проверки подписи BootROM **отказывает в запуске** безвозвратно. Запись fuse необратима — чип нельзя вернуть в Open состояние. --- ## 5. Цепочка доверия (Trust Chain) ```bash Производитель устройства │ ├── Генерирует пару ключей RSA 4096 │ private.pem → хранится в защищённом месте (HSM / vault) │ public.pem → включается в образ (SRK table) │ ├── SHA256(public.pem) записывается в OTP fuses (SRK_HASH) │ ↑ необратимо, выполняется один раз при производстве │ └── При сборке каждого релиза: nxpimage hab export (flags=0x08) → хэшируются IVT + BDT + код → подписывается private.pem → CSF встраивается в образ При загрузке на чипе: BootROM → читает IVT → находит CSF → извлекает public key из CSF → SHA256(public key) == SRK_HASH из fuses? → ДА → проверяет подпись хэшей регионов → ОК → прыгает на entry point ``` --- ## 6. Почему Unsigned-образ требует HAB-контейнер Распространённое заблуждение: "раз образ без подписи, зачем вообще HAB?". Ответ прост: **BootROM всегда ищет IVT по фиксированному смещению.** Это не опциональная безопасность — это формат загрузки. Без IVT и BDT BootROM не знает: - куда прыгать (entry point) - где находится DCD для инициализации SDRAM - каков размер образа `nxpimage hab export` для unsigned образа выполняет именно эту работу — добавляет IVT, BDT, встраивает DCD — без какой-либо криптографии. CSF при этом равен нулю. --- ## 7. Процесс прошивки MIMXRT1052 (USB, без JTAG) BootROM в режиме SDP умеет только писать в RAM и прыгать. Для записи во Flash необходим **Flashloader** — специальная программа от NXP. ``` Плата в SDP режиме (BOOT_MOD_1 = 3V3) │ │ sdphost -u 0x1FC9,0x0130 ├─ write-file 0x20001C00 ivt_flashloader.bin └─ jump-address 0x20001C00 │ │ (ожидание ~3с инициализации) │ Flashloader запущен │ blhost -u 0x15A2,0x0073 ├─ fill-memory 0x2000 4 0xC0000207 ← option word для FlexSPI NOR (+QE-бит) ├─ configure-memory 9 0x2000 ← Flashloader пишет FCB в Flash ├─ flash-erase-region 0x60000000 … ├─ write-memory 0x60002000 firmware_hab.bin ← HAB образ └─ reset ``` --- ## 8. Жизненный цикл для проекта TFT | Стадия | Режим HAB | Подпись | Fuse | |---|---|---|---| | Разработка | Open | Unsigned (`0x00`) | не трогаем | | Входной контроль | Open | Unsigned (`0x00`) | не трогаем | | Предсерийные образцы | Open | Signed (`0x08`) | не трогаем | | Серийное производство | **Closed** | Signed (`0x08`) | `SEC_CONFIG = 1` | > ⚠️ Запись `SEC_CONFIG = 1` необратима. Перед закрытием HAB необходимо убедиться, что подписанный образ успешно проходит верификацию на реальном железе. --- ## 9. Инструменты | Инструмент | Назначение | |---|---| | `nxpimage hab export` | Сборка HAB-образа (IVT + BDT + DCD + опционально CSF) | | `nxpimage hab parse` | Разбор готового образа для проверки | | `sdphost` | Связь с BootROM в SDP режиме (запись в RAM, прыжок) | | `blhost` | Связь с Flashloader (запись во Flash, конфигурация памяти) | | `nxpdevscan` | Обнаружение подключённых NXP устройств | --- ## 10. Литература - **NXP AN12263** — "HAB Code Signing for i.MX RT" — пошаговая инструкция по подписи образов - **MIMXRT1052 Reference Manual** — Chapter 9: System Boot (структуры IVT, BDT, DCD, CSF) - [**SPSDK Documentation**](https://spsdk.readthedocs.io) — документация по nxpimage, blhost, sdphost - **NXP Application Note AN4581** — "Secure Boot on i.MX50, i.MX53, and i.MX 6 Series"