NXP i.MX7D закрываем прошивку от нанайцев

Данный референс прокладывает путь к методике шифрования прошивки.

1) Скачайте и установите openssl для windows

Пропишите в виндовую переменную path путь к директории bin
которая находится в папке с установленным openssl.

2) Скачайте и распакуйте NXP code signing tool

Далее, как написано в AN4581

- открываем в командной строке папку keys и выполняем батник hab4_pki_tree.bat
- отвечаем на вопросы как написано в AN4581
  срок действия сертификата можно установить в 50 лет

- открываем папку crts и выполняем команду
..\mingw32\bin\srktool -h 4 -t SRK_1_2_3_4 ..... (длинная строка, скопировать из pdf 1:1)

Сертификаты и ключи готовы.
Файлы из папок keys и crts хранить вечно.


Далее, нужно научиться шифровать бинарник и прожигать перемычки.


Создаём бинарник

Создайте в папке mingw32\bin текстовый файл command.csf со следующим содержимым:

----- хрум -----
#Illustrative Command Sequence File Description
[Header]
Version = 4.2
Hash Algorithm = sha256
Engine = ANY
Engine Configuration = 0
Certificate Format = X509
Signature Format = CMS

[Install SRK]
File = "../../crts/SRK_1_2_3_4_table.bin"
# Index of the key location in the SRK table to be installed
Source index = 0

[Install CSFK]
# Key used to authenticate the CSF data
File = "../../crts/CSF1_1_sha256_2048_65537_v3_usr_crt.pem"

[Authenticate CSF]

[Install Key]
# Key slot index used to authenticate the key to be installed
Verification index = 0
# Target key slot in HAB key store where key will be installed
Target Index = 2
# Key to install
File= "../../crts/IMG1_1_sha256_2048_65537_v3_usr_crt.pem"

[Authenticate Data]
# Key slot index used to authenticate the image data
Verification index = 2
# Address + Offset + Length + Data File Path
Blocks = 0x80000000 0 0x6DC00 "input.bin" << этих строк будет минимум две
----- хрум -----
	
в последней строке цифры:

1) Адрес, куда расшифрованные данные будут загружаться HAB-ом (0x80000000)
2) Адрес начала данных непосредственно в исходной незашифрованной прошивке (всегда 0)
3) Длина данных в байтах = полной длине файла input.bin (0x6DC00)

Таким образом: можно создать несколько зашифрованных блоков,
которые HAB самостоятельно растолкает по разным адресам.

Но нас интересует только блок с программой и блок данных DCD, поднимающий DDR memory.


Далее: открываем в командной строке папку mingw32\bin

В эту папку положить НЕ-зашифрованную, исходную прошивку со всеми её заголовками IVT.
Путь к прошивке (input.bin) прописывается в последней строке файла command.csf.

ВЫПОЛНИТЬ команду:
cst -o csf_binary.bin -i command.csf

Готовая ЗАшифрованная прошивка содержится в файле csf_binary.bin
Это готовый бинарник для заливки в камень (проверять)

Всё! Больше ничего не проверялось, прошивку в камень я не лил!
И перемычки не шил!

Так как реальной потребности в этом пока не было, работа осталась на уровне теории
и вам придётся самостоятельно во всём разбираться!

Но на мой взгляд, самая сложная часть пути уже описана выше!
Без телепатии, вытащить эти знания было бы невозможно.

Как и написать стартовый код для многих модулей.

Ведь мы живём в зазеркалье. Просто, читая всякие pdf-ки, вы не поднимете даже COM порт.


ДОПОЛНЕНИЕ

ВНИМАНИЕ!! DCD data инкапсулируются и шифруются отдельно от кода.

Для этого: отредактируйте файл IVT + DCD.asm:

1) В заголовочном блоке IVT занулите базовый адрес DCD.

2) Данные DCD зашифруйте отдельным блоком, добавив строку в разделе Blocks в файле command.csf:

[Authenticate Data]
Verification index = 2
Blocks = 0x80000000 0 0x6DC00 "input.bin", \ ## Вся прошивка целиком вместе с DCD
0x00911000 44 0x1C4 "input.bin" ## DCD из этой прошивки, отдельно
	
Здесь в самой последней строке:

1) Адрес, куда DCD будет загружаться HAB-ом и выполняться, очевидно в OCRAM
2) Адрес (смещение) к началу DCD в незашифрованной прошивке, обычно 44 байта
3) Длина DCD в байтах, равная dcd_len, смотрите файл IVT + DCD.asm.

Уловите суть: зашифрованная DCD теперь загружается, расшифровывается и выполняется
ДО того, как будет загружена и расшифрована большая прошивка.

Соображайте: прежде чем расшифровать прошивку, камню нужно поднять память DDR.
Ну а как он её поднимет, если данные DCD зашифрованы одним большим файлом вместе с прошивкой?
Поэтому DCD инкапсулируется в зашифрованный файл отдельным блоком.
Во время загрузки камня, в первую очередь будет расшифрована и выполнена DCD.
Далее в ожившую DDR дешифруется и стартует большая прошивка вместе с её DCD.
А так как базовый адрес DCD в прошивке == 0, то повторно выполняться он уже не будет.
Если DCD повторно выполнить, то камень просто вывесится наглухо.
Именно для этого, базовый адрес DCD должен быть установлен в ноль.
Соображаете?

Как жечь keys в камне, надеюсь разберётесь сами.

Кстати, перемычки можно жечь из-под ассемблера. Элементарная задача.


hint!
Если играясь с перемычками keys, вы умудритесь напортачить. Например, прошить их зеркально..
То камень выбрасывать не спешите. Возьмите получившийся key и сгенерируйте новые сертификаты под него.
Таким образом, можно спасти камень и ещё поработать, хотя ключ в нём будет прошит "левый".

До того, как наглухо закрыть камень, можно протестировать всю эту канитель,
проверить перемычки, позаливать зашифрованную прошивку в камень и убедиться
в работоспособности механизма её корректной распаковки.
Для этого, в камушке есть волшебные флажки.

p.s. Если в камне прошит ключ, то запустить прошивку на выполнение можно только при закрытом камне (?)
Зашифрованную прошивку нельзя загружать через USB? Только с флешек?
Это предстоит выяснить!


Пока что всё!


Читайте так же AN12056 и AN4581.

Для прожигания перемычек с компьютера, можно использовать MFG tool

Статья про перемычки. (копия)

Ещё пара полезных статеек.
Их локальные копии <- тутъ.


Эх.. а в тинках.. было всё так просто....