Воспроизводимая сборка прошивок 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