Сборка прошивки Trezor One из исходного кода
Подготовка
- Виртуальная машина VirtualBox с установленным дистрибутивом Ubuntu 22.04 Desktop
- 30 GB для диска виртуальной машины
- 4 GB оперативной памяти
- 4 потока процессора
- Правила udev для установки прошивки на устройство
Зависимости
sudo apt install git gcc-arm-none-eabi python3-poetry python3-pip libsdl2-dev libsdl2-image-dev protobuf-compiler
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
echo 'export PYTHON_KEYRING_BACKEND=keyring.backends.null.Keyring' >> ~/.bashrc
source ~/.bashrc
python3 -m pip install trezor
Получение исходного кода
git clone --recurse-submodules https://github.com/trezor/trezor-firmware ~/trezor-firmware
cd ~/trezor-firmware/
На этом этапе необходимо определить, какую версию прошивки вы хотите собрать самостоятельно. Обратите внимание, что установить версию прошивки ниже, чем текущая версия загрузчика, находящегося на устройстве, не получится. Узнать текущую версию загрузчика можно с помощью следующих команд:
trezorctl device reboot-to-bootloader
# Подтвердите действие на устройстве
trezorctl get-features
# Версия загрузчика также отобразится на экране устройства
Подробнее об особенностях прошивки Trezor One можно узнать из этого материала. Для сборки рекомендуется использовать не последнюю версию кода, а откатиться на момент выхода нужной версии прошивки с помощью тегов. Для Trezor One прошивки обозначены тегом legacy/v[номер версии]. В данном руководстве будет использована прошивка legacy/v1.12.1:
git checkout legacy/v1.12.1
Устанавливаем дополнительные зависимости:
cd legacy/
poetry install
Внесем небольшое изменение в файл script/bootstrap:
nano script/bootstrap
Замените строку:
git submodule update --init --recursive
на:
git submodule update --init --recursive --force --remote
Последовательно нажмите Ctrl+X, Y и Enter для сохранения изменений и выхода из редактора nano.
Сборка эмулятора
cd ~/trezor-firmware/legacy/
poetry run ./script/setup
export EMULATOR=1
poetry run ./script/cibuild
Готовый файл trezor.elf будет находиться в поддиректории firmware.
Запуск эмулятора
cd ~/trezor-firmware/legacy/
# Значение TREZOR_OLED_SCALE отвечает за увеличение экрана эмулятора
TREZOR_OLED_SCALE=4 ./firmware/trezor.elf
Сборка и установка прошивки
cd ~/trezor-firmware/legacy/
poetry run ./script/setup
export EMULATOR=0 PRODUCTION=0
poetry run ./script/cibuild
Готовый файл trezor.bin будет находиться в поддиректории firmware.
Сброс устройства
Рекомендуется полностью стереть данные с устройства перед установкой собственной прошивки.
Перед сбросом устройства проверьте валидность резервной копии вашей сид-фразы, перейдя в настройки Trezor Suite > Устройство > Проверить резервную копию.
# Перезагрузитесь в режим загрузчика
trezorctl device reboot-to-bootloader
# Подтвердите действие на устройстве
trezorctl device wipe --bootloader
# Переподключите устройство
Другой способ войти в режим загрузчика: зажать левую клавишу на Trezor и подключить кабель питания.
Прошивка устройства
cd ~/trezor-firmware/legacy/
trezorctl firmware update -f firmware/trezor.bin
# Подтвердите действие на устройстве
Во время сборки и установки будет отображен отпечаток прошивки (Firmware fingerprint). Он же будет отображаться при каждом запуске устройства.
Модификация прошивки
Пример модификации прошивки с установкой порта игры Pong.
Оригинальный порт написан для старых версий прошивок и во многом не совместим с современным кодом Trezor One. Кроме того, в репозитории проекта содержится только код эмулятора. Модифицированный код, проверенный на прошивке 1.12.1, доступен по ссылке. Вы можете самостоятельно ознакомиться с изменениями по сравнению с оригиналом.
Получите код Trezor Pong:
cd git clone https://github.com/crypto-warz/trezor-pong ~/trezor-pong
Скопируйте файлы trezor-pong.c, trezor-sdl.c и trezor-sdl.h в поддиректорию firmware в исходном коде прошивки:
cd ~/trezor-firmware/legacy/ cp ~/trezor-pong/*.c ~/trezor-pong/*.h firmware/
Отредактируйте код основного файла прошивки firmware/trezor.c:
nano firmware/trezor.c
В начале файла добавьте
#include "trezor-pong.c"
:... #include "otp.h" #endif #ifdef USE_SECP256K1_ZKP #include "zkp_context.h" #endif #include "trezor-pong.c" ...
Найдите функцию
collect_hw_entropy
и замените:static void collect_hw_entropy(bool privileged) {
на:
void collect_hw_entropy(bool privileged) {
В самом конце файла вставьте
pong_main();
послеusbInit();
:... config_init(); layoutHome(); usbInit(); pong_main(); for (;;) { ...
Последовательно нажмите Ctrl+X, Y и Enter для сохранения изменений и выхода из редактора nano.
Отредактируйте Makefile
nano Makefile
После
OBJS += winusb.o
добавьте:... OBJS += util.o OBJS += webusb.o OBJS += winusb.o ifeq ($(EMULATOR),1) OBJS += firmware/trezor-pong.o OBJS += firmware/trezor-sdl.o endif ...
Соберите и запустите эмулятор по инструкции.
Соберите и установите прошивку по инструкции.
Обновление gcc
Для сборки последних версий прошивки требуется обновление gcc:
cd
wget https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x86_64-arm-none-eabi.tar.xz
tar -xvf arm-gnu-toolchain-13.2.rel1-x86_64-arm-none-eabi.tar.xz
sudo mv arm-gnu-toolchain-13.2.Rel1-x86_64-arm-none-eabi/ /opt/arm-gnu-toolchain-13/
echo 'export PATH=/opt/arm-gnu-toolchain-13/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
rm arm-gnu-toolchain-13.2.rel1-x86_64-arm-none-eabi.tar.xz
Для переключения репозитория прошивки на последнюю версию выполните:
cd ~/trezor-firmware/
git checkout main