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
Статья
про перемычки.
(
копия)
Ещё пара
полезных
статеек.
Их
локальные
копии <- тутъ.
Эх.. а в тинках.. было всё так просто....