lift_indicator_suite/docs/mimxrt1052/HAB_GUIDE.md

12 KiB
Raw Permalink Blame History

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 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 — документация по nxpimage, blhost, sdphost
  • NXP Application Note AN4581 — "Secure Boot on i.MX50, i.MX53, and i.MX 6 Series"