На пальцах запуск qualcomm
1. Жмем в кнопку включения. Как только на устройство подается питание, аппаратная логика инициирует сброс и ЦПУ начать выполнение кода с предопределенного адреса (0x00000000, 0xFFFF0000).
2. Далее выполняется код
hardware_power_on_sequence - выполняется минимально настройка, чтобы ЦПУ могло подготовиться к выполнению более кода PBL. Вкратце:
а. init_cpu_core - Инициализация ядра ЦПУ. Сюда входят такие процессы как (настройка режимов работы процессора, конфигурация базовых регистров, отключение watchdog-таймера)
б. init_cache_and_mmu - Кэш ускоряет доступ к памяти, сохраняя часто используемые данные в SRAM, MMU преобразует виртуальные адреса, используемые программой, в физические адреса в RAM.
в. init_basic_clocks() - Тактовые сигналы (генераторы, фазовые автоподстройки частоты, делители)
3. После того как минимально необходимое оборудование настроено, управление передается
Primary Bootloader (PBL).
hardware_power_on_sequence это по сути подготовка железа к запуску основного первого кода, который зашит заводом qualcomm
pbl_main.
задача
PBL — подготовить и загрузить следующий этап загрузки —
вторичный загрузчик (SBL), который, в свою очередь, загрузит ядро операционной системы.
4. Далее запуск процесса
secure_boot_init. Мы потихоньку подходим к фьюзам, регистрам и другим связанным вещам. Так мы в основном имеем дело с так называемыми aftersale устройствами, т.е. все то что продается вендорами, то соответственно secureboot флаг у нас включен. Если брать инженерные процессоры, по типу тех, которые покупаем на алиэкспрессе, то там secureboot off, так же как и arb =0 и т.д. Для примера:
В исходниках
sec.elf функция anti_rollback_feature_enable >
false так как разработчикам нужно часто записывать и старую версию ПО. На продаваемых устройствах эта функция всегда включена. Ниже будет табличка которая очень наглядно показывает запуск и количество проверок при включенном секбуте и выключенном, думаю сразу станет понятно почему инженерные процы стартуют без проблем.
Обращаем внимание на
"is efused" - N Т.е. после Brom TA "Наплевав на все" грузит систему. И то количество проверок сертификатов при ON.

Немного про sec.elf — это образ, который пишется в раздел secdata. При первой загрузке BROM считывает этот раздел, проверяет его подпись и, если все в порядке, то
прожигает конфигурационные данные в efuse (QFPROM).
Также не забудем про
devcfg.mbn (Device Configuration) который загружается задолго до ядра ОС, и конфигурирует аппаратные блоки и параметры безопасности. Писал уже про него и почему с "правильным" Devcfg трубка загружается без ключа в RPMB (флаг skip check rpmb).
Теперь самое интересное, собственно то, к чему мы и шли. Это структура данных
QFPROM с небольшими пояснениями:
root_key_hash Хэш корневого ключа (SHA256, 32 байта)
oem_pk_hash Хэш открытого ключа OEM
sec_boot_enable Флаг включения SecureBoot
debug_disable Флаг отключения отладки
rpmb_key Ключ RPMB
device_serial Серийный номер устройства
anti_rollback_version Версия защиты от отката
reserved Зарезервированные поля
Итак погнали по регистрам чуть подробнее, именно чуть, т.к. делать полноценную выкладку с примерами кода, то это все превратится в скукотищу, а так наглядно убережет надеюсь многих от подкидывания процессоров сяоми на самсунг, подкидывания непонятных xbl, тем более от "пропатчивания" ))))) FH, XBL, DEVCFG и т.д.
1. root_key_hash -
(Хэш корневого ключа): Самый важный элемент, на нем завязана все секьюрити. Это не сам ключ, а его хэш (SHA-256, 32) байта). Этот хэш является "Папой" всей цепи доверия.
2. oem_pk_hash -
(Хэш открытого ключа OEM): Хэш открытого ключа производителя устройства (OEM). Корневой ключ используется для проверки подлинности этого ключа OEM. Это создает цепочку доверия: Корень -> OEM -> Загрузчик -> ОС. Это в том случае, когда у нас обычное устройство. Т.е. если вернуться к приложенной табличке, то это путь
"is efused" - Y, т.е. со всеми возможными проверками. И когда у нас стоит не инженерный проц у которого в
sec_boot_enable флаг off, а ON со всеми проверками, то он соответственно и упирается в проверку
rpmb, но упирается не из-за записей во фьюзах, а потому что в DEVCFG указано проверить RPMB, а вот соответствие ключей в UFS и Efuse это уже QFPROM.
3. sec_boot_enable -
(Флаг включения SecureBoot): Повторимся, если он не установлен (прожжен), вся система Secure Boot отключается, и устройство может загружать любую фирмварь. Обычно он прожигается на всех ТА которые идут в свободную продажу. Соответственно шаг в лево, шаг в право труп. Ну это конечно хорошо видно, если ко всему этому добавить выкладку со стороны софта, т.е. TZ, XBL и т.д., но это долго, пока железо посмотрим.
4. debug_disable -
(Флаг отключения отладки): Тот самый JTAG, который нам отрубили много лет назад )))))
5. rpmb_key -
(Ключ RPMB): Ключ для
Replay Protected Memory Block — тот самый заветный ключик от замочка в eMMC/UFS.
6. device_serial -
(Серийный номер устройства): Думаю тут комментарии излишние, хотя, мягко говоря не последнее место в безопастности занимает.
7. anti_rollback_version - Собственно сам виновник данного поста. При каждой успешной установке новой прошивки этот "счетчик" увеличивается. Загрузчик будет отказываться загружать ПО с версией ниже, чем записана в QFPROM. Выше писал про sec.elf.
8. reserved - (Зарезервированные поля): Это на случай, когда куалком придумает нам очередную гадость, то будет куда дописать ))))))).
Интересная для изучения литература касаемо уже софтовой части, не факт что найдется в свободном доступе:
80-NM248-3 Fuse Blowing
80-P1824-1 Provisioning Encryption Tool
80-NM248-5 Encryption Key Provisioning
80-NU861-1 Android Security Features
80-N9340-1 Widevine DRM
80-PD867-97 - QFPROM SM-8150