Воспроизводимая сборка прошивок Trezor

Подготовка

  • Виртуальная машина VirtualBox с установленным дистрибутивом Ubuntu 22.04 Desktop
  • 50 GB для диска виртуальной машины
  • 4 GB оперативной памяти
  • 4 потока процессора
  • Установленный Docker

Зависимости

Устанавливаем trezorctl:

sudo apt install python3-pip
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
python3 -m pip install trezor

Клонируем репозиторий прошивки:

git clone https://github.com/trezor/trezor-firmware ~/trezor-firmware
cd ~/trezor-firmware

Версии прошивок

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

Модели устройств имеют следующие условные обозначения:

  • T1B1 – Trezor One
  • T2T1 – Trezor T
  • T2B1 – Trezor Safe 3 rev.A
  • T3B1 – Trezor Safe 3 rev.B
  • T3T1 – Trezor Safe 5

Условные обозначения моделей состоят из четырех символов:

  • T – Trezor
  • Цифровое обозначение основного чипа: 1 – STM32F20x, 2 – STM32F42x, 3 – STM32U5
  • Тип управления: B – кнопки (Buttons), T – сенсорный экран (Touch)
  • Поколение устройства

Обозначения прошивок:

  • legacy – прошивки Trezor One
  • core – прошивки Trezor T, Safe 3 и Safe 5

История версий прошивок доступна по ссылкам:

Сборка прошивки

Команда запуска сборки может отличаться от версии к версии, поэтому необходимо проверить доступные опции с помощью команды:

./build-docker.sh --help

Legacy

Соберем мультивалютную прошивку 1.13.0 для Trezor One. Команды будут выглядеть следующим образом:

git checkout legacy/v1.13.0
./build-docker.sh --skip-core --skip-bitcoinonly legacy/v1.13.0

После сборки файл прошивки firmware.bin будет находиться в поддиректории build/legacy-T1B1/firmware/.

Core

Соберем мультивалютную прошивку 2.8.9 для Trezor T. Команды будут выглядеть следующим образом:

git checkout core/v2.8.9
# модели устройств можно указать через запятую, например --models T2B1, T3T1
./build-docker.sh --skip-bitcoinonly --models T2T1 core/v2.8.9

После сборки файл прошивки firmware.bin будет находиться в поддиректории build/core-T2T1/firmware/.

Проверка прошивки

Legacy

Скачайте, распространяемую разработчиками, версию прошивки:

trezorctl firmware download --model T1B1 --version 1.13.0
Downloading from https://data.trezor.io/firmware/t1b1/trezor-t1b1-1.13.0.bin  
Trezor One v2 firmware (1.8.0 or later)  
Firmware version 1.13.0 build 0  
Firmware fingerprint: 356433bd9de6cb564bf7778fc5de73c56197459523358f267e9235af9e1ce46d  
Firmware saved under trezor-t1b1-1.13.0.bin.

Заголовок официальной прошивки включает цифровые подписи Satoshi Labs – 195 байт на смещении 0x220 или 544 в десятичной системе счисления. Перепишем подписи в заголовке нулями:

dd if=/dev/zero of=trezor-t1b1-1.13.0.bin bs=1 seek=544 count=195 conv=notrunc
195+0 records in
195+0 records out
195 bytes copied, 0,00155346 s, 126 kB/s

Сравним хэш-суммы подготовленной официальной прошивки и прошивки, собранной из исходного кода:

sha256sum trezor-t1b1-1.13.0.bin
cf72859c0995e04e09ea36eefaca28906e99dffa7b72fb1327410de4006cbd6c  trezor-t1b1-1.13.0.bin
sha256sum build/legacy-T1B1/firmware/firmware.bin
cf72859c0995e04e09ea36eefaca28906e99dffa7b72fb1327410de4006cbd6c  build/legacy-T1B1/firmware/firmware.bin

Также можно считать подписи из оригинала и записать в скомпилированную прошивку, тем самым получив оригинальный файл:

rm -f trezor-t1b1-1.13.0.bin
trezorctl firmware download --model T1B1 --version 1.13.0
dd if=trezor-t1b1-1.13.0.bin bs=1 skip=544 count=195 | dd of=build/legacy-T1B1/firmware/firmware.bin bs=1 seek=544 conv=notrunc
195+0 records in  
195+0 records out  
195 bytes copied, 0,00124924 s, 156 kB/s  
195+0 records in  
195+0 records out  
195 bytes copied, 0,0016341 s, 119 kB/s

Сверим хэш-суммы и верифицируем созданную прошивку:

sha256sum trezor-t1b1-1.13.0.bin
a5f51f64c0ad8dac888ed5a1c5e6b64271b382b6ed73cfe6a569cfb874cd4545  trezor-t1b1-1.13.0.bin
sha256sum build/legacy-T1B1/firmware/firmware.bin
a5f51f64c0ad8dac888ed5a1c5e6b64271b382b6ed73cfe6a569cfb874cd4545  build/legacy-T1B1/firmware/firmware.bin
trezorctl firmware verify build/legacy-T1B1/firmware/firmware.bin
Trezor One v2 firmware (1.8.0 or later)  
Firmware version 1.13.0 build 0  
Firmware fingerprint: 356433bd9de6cb564bf7778fc5de73c56197459523358f267e9235af9e1ce46d

Core

Скачайте, распространяемую разработчиками, версию прошивки:

trezorctl firmware download --model T2T1 --version 2.8.9
Downloading from https://data.trezor.io/firmware/t2t1/trezor-t2t1-2.8.9.bin  
T2T1 firmware image.  
Vendor header from SatoshiLabs, version 0.0  
Firmware version 2.8.9 build 0  
Firmware fingerprint: ec61dba50be195f1cbb78688a0b92fb293c23150b68f5dab3b44420a106fca17  
Firmware saved under trezor-t2t1-2.8.9.bin.

Заголовок официальной прошивки включает цифровую подпись Satoshi Labs длиной 65 байт.

В зависимости от модели устройства подписи находятся на следующих смещениях в прошивке:

  • T2T1 – 5567
  • T2B1 – 1471
  • T3B1 – 1471
  • T3T1 – 1983

Используя нужное смещение, перепишем подписи в заголовке нулями:

dd if=/dev/zero of=trezor-t2t1-2.8.9.bin bs=1 seek=5567 count=65 conv=notrunc
65+0 records in  
65+0 records out  
65 bytes copied, 0,000794589 s, 81,8 kB/s

Сравним хэш-суммы подготовленной официальной прошивки и прошивки, собранной из исходного кода:

sha256sum trezor-t2t1-2.8.9.bin
16c98a0ce67a84723f053da98a02cfa79717af85bd73df52acafc6c37aeebe94  trezor-t2t1-2.8.9.bin
sha256sum build/core-T2T1/firmware/firmware.bin
16c98a0ce67a84723f053da98a02cfa79717af85bd73df52acafc6c37aeebe94  build/core-T2T1/firmware/firmware.bin