- Создан первый рабочий, шаблонный HIL-тест (bsp_opto) - актуализирована вся документация
12 KiB
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)
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:
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, где начинается образ и каков его полный размер:
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)
Производитель устройства
│
├── Генерирует пару ключей 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 0xC0000007 ← option word для FlexSPI NOR
├─ 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 — документация по nxpimage, blhost, sdphost
- NXP Application Note AN4581 — "Secure Boot on i.MX50, i.MX53, and i.MX 6 Series"