Сборка прошивки 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 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