Skip to content

Planning and executing a new release #330

@k9ert

Description

@k9ert

Context

This issue should coordinate the different acitivities for a new release. The v1.9.0 release is now 20 month old. So let's do a v1.10.0.
It's a bit special as want to change release-keys and therefore the new release's upgrade binary needs to contain the bootloader inclusing the (new) keys.

Steps

# something like 
docker run --platform linux/amd64 -ti -v $(pwd):/app -e HOST_UID=$(id -u) -e HOST_GID=$(id -g) stepansnigirev/diy-firmware ./build_firmware.sh main bootloader assemble

docker run --rm -it -v $(pwd):/specter-diy -w /specter-diy stepansnigirev/diy-firmware  python3 ./bootloader/tools/upgrade-generator.py import-sig -s  "sigHere="  ./release/specter_upgrade.bin
  • introspect with introspection tool:
Details
(.env) ➜  specter-diy_old git:(master) ✗ bootloader/tools/.env/bin/python3.9 bootloader/tools/introspect-binary.py release/specter_upgrade.bin
📋 Loaded keys from: /home/kim/src/specter-diy_old/bootloader/tools/../keys/production/pubkeys.c
   Vendor keys: 4
   Maintainer keys: 4

📦 Upgrade file analysis:
   Payload sections: 2
   Type: Bootloader
   Required signatures: 2
   Message hash: b1.0.1-1.10.0-1984mrfplq705g8qw85sguw728cves4vl9hmhfefwwywnh86ajglqyvc7dc

🔐 Signature analysis:
   Found 2 signature(s)

🔐 Signature verification:
   ✅ maintainer (Backup_m/99h): 7c5de6a71d2abae563945e05d767626a
   ✅ maintainer (Stepan): 33793141d1557bc6b4249e0be8ef6b46

✅ Threshold verification:
   Valid signatures: 2/2
   Signed by: Backup_m/99h(maintainer), Stepan(maintainer)
   Result: Upgrade file is valid and can be installed

🔑 Public key analysis:
   Searching for embedded keys in payload sections...
   Found 4 embedded public key(s):
   ✅ k9ert (maintainer/vendor): c8638d869d056ce1b18677e2b0bfaa60
   ✅ Mike (maintainer/vendor): cf0239e7708148c0fe2bc1ff485d950e
   ✅ Stepan (maintainer/vendor): 33793141d1557bc6b4249e0be8ef6b46
   ✅ Backup_m/99h (maintainer/vendor): 7c5de6a71d2abae563945e05d767626a

✅ Key verification:
   Result: Upgrade contains the public keys needed for future upgrade verification
(.env) ➜  specter-diy_old git:(master) ✗ 
  • signed binaries published on this ticket
  • Merging yet another PR
  • creating another tag v1.10.1
  • agree on the build architecture, the docker-image: maybe https://hub.docker.com/r/stepansnigirev/diy-firmware
  • build the firmware on Mike/k9erts laptop and share the hash here: b1.0.1-1.10.1-19j32lx39tm4l5h06nwz5q5jhhuqv0j3e24g96rcglk499uh8fafszmerfd
  • check whether the hashes do not differ
  • Create signatures:
    • Mike: Iw60/b3N60Ng9rsWmSmF4Cz1XHsHK4s/s4sUob4eJlSMGVumrWhr7ZNcvPLpfCvox+J3guMRr4j99KjC+1z3og0=
    • k9ert: H9kO/gE5gQJ36FiXaIOIzgXARlMtUDc1JALRgKA6HYpdba8U2D36J7ToS3ZVe2mlL5qBHFFbJ5Rv8RAN8YQRAXM=
  • k9ert to combine the different pieces to the upgrade binary:
docker run --rm -it -v $(pwd):/specter-diy -w /specter-diy stepansnigirev/diy-firmware  python3 ./bootloader/tools/upgrade-generator.py import-sig -s  "Iw60/b3N60Ng9rsWmSmF4Cz1XHsHK4s/s4sUob4eJlSMGVumrWhr7ZNcvPLpfCvox+J3guMRr4j99KjC+1z3og0="  ./release/specter_upgrade.bin
docker run --rm -it -v $(pwd):/specter-diy -w /specter-diy stepansnigirev/diy-firmware  python3 ./bootloader/tools/upgrade-generator.py import-sig -s  "H9kO/gE5gQJ36FiXaIOIzgXARlMtUDc1JALRgKA6HYpdba8U2D36J7ToS3ZVe2mlL5qBHFFbJ5Rv8RAN8YQRAXM="  ./release/specter_upgrade.bin
  • text with introspection tool:
Details
(.env) ➜  specter-diy_old git:(master) ✗ bootloader/tools/.env/bin/python3.9 bootloader/tools/introspect-binary.py release/specter_upgrade.bin
📋 Loaded keys from: /home/kim/src/specter-diy_old/bootloader/tools/../keys/production/pubkeys.c
   Vendor keys: 4
   Maintainer keys: 4

📦 Upgrade file analysis:
   Payload sections: 2
   Type: Bootloader
   Required signatures: 2
   Message hash: b1.0.1-1.10.1-19j32lx39tm4l5h06nwz5q5jhhuqv0j3e24g96rcglk499uh8fafszmerfd

🔐 Signature analysis:
   Found 2 signature(s)

🔐 Signature verification:
   ✅ maintainer (Mike): cf0239e7708148c0fe2bc1ff485d950e
   ✅ maintainer (k9ert): c8638d869d056ce1b18677e2b0bfaa60

✅ Threshold verification:
   Valid signatures: 2/2
   Signed by: Mike(maintainer), k9ert(maintainer)
   Result: Upgrade file is valid and can be installed

🔑 Public key analysis:
   Searching for embedded keys in payload sections...
   Found 4 embedded public key(s):
   ✅ k9ert (maintainer/vendor): c8638d869d056ce1b18677e2b0bfaa60
   ✅ Mike (maintainer/vendor): cf0239e7708148c0fe2bc1ff485d950e
   ✅ Stepan (maintainer/vendor): 33793141d1557bc6b4249e0be8ef6b46
   ✅ Backup_m/99h (maintainer/vendor): 7c5de6a71d2abae563945e05d767626a

✅ Key verification:
   Result: Upgrade contains the public keys needed for future upgrade verification
- [x] zip and [upload](https://github.com//issues/330#issuecomment-4099615783) `zip v1.10.1_signed.zip release release/*` - [ ] Test the release upgrade (@Schnuartz ) - [ ] Create release-changelog for v1.10.0 ([here](https://github.com//issues/330#issuecomment-4099840826)) - [ ] Review changelog - [ ] Create release page in github, upload binaries, hashes and signatures
Planned Release notes (for `v1.10.0`):

Release notes

Important: This release includes a bootloader update with new signing keys. The upgrade binary contains the updated bootloader, which will be applied automatically during the upgrade process.

Upgrade process

Copy specter_upgrade_v1.10.0.bin to the SD card and insert it into the device. The bootloader will check the signatures of the upgrade file and update the firmware.

Flashing on empty board

If your discovery board is empty or you have a very old firmware (below 1.4.0) - connect your board over miniUSB with power jumper set to STLK and copy-paste initial_firmware_v1.10.0.bin file to the mounted drive.

If you have problems flashing initial firmware consider using stlink-tools. A command to flash firmware:

st-flash write path/to/initial_firmware.bin 0x8000000

If you want to use self-signed bootloader and firmware check out the instructions in the bootloader repo

sha256.signed.txt file contains sha256 hashes of the firmware binary files and signed with the "Specter Signer 2026" GPG key.

You can get the public key from here.
Fingerprint of the key is 9DC3 3CA8 3058 9DE3 B322 5C26 EEF5 756B 2EA4 2349

Reproducible build

You can build binaries identical to the ones in this release yourself. Follow this instruction, when the build is almost complete the script will output a message for signing and ask you for the signatures.

Verify that upgrade message is:

b1.0.1-1.10.0-1984mrfplq705g8qw85sguw728cves4vl9hmhfefwwywnh86ajglqyvc7dc

Add first signature:

ID2rAxeSFrfCmPcHt57XCMHZSFyp2fB+52vix8iAqDooLwd1sBRMW1j59AGqamgsTQ0CUj5eZ3ky0XpY/+rXlkY=

Add second signature:

H9mlVmjGnyRddlfbD8CMwQpq7D0m/9OWSd44q5J6OcHVcMj9OoALFSsdgXnvb0GL7PlwLBUoePC06ExLhSvcpnw=

Then hit enter and check that sha256.txt has the same hashes as in sha256.signed.txt file.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions