firmware/stm32/bootloader
2019-10-09 08:53:59 -04:00
..
assets Change from brick icon to text Bricked 2019-09-27 09:11:39 -04:00
micro-ecc Save memory by removing unused code 2019-09-23 10:42:43 -04:00
releases Release build for mark3 bootrom 2019-10-09 08:53:59 -04:00
.gitignore Making whole firmware public with single, signed commit. 2018-07-24 14:07:33 -04:00
ae_config.h Switch to exactly 13 tries 2019-07-26 11:23:45 -04:00
ae.c Long secrets added 2019-07-29 14:21:05 -04:00
ae.h Long secrets added 2019-07-29 14:21:05 -04:00
basics.h Switch to exactly 13 tries 2019-07-26 11:23:45 -04:00
clocks.c Making whole firmware public with single, signed commit. 2018-07-24 14:07:33 -04:00
clocks.h Making whole firmware public with single, signed commit. 2018-07-24 14:07:33 -04:00
constant_time.c Making whole firmware public with single, signed commit. 2018-07-24 14:07:33 -04:00
constant_time.h Making whole firmware public with single, signed commit. 2018-07-24 14:07:33 -04:00
delay.c Making whole firmware public with single, signed commit. 2018-07-24 14:07:33 -04:00
delay.h Making whole firmware public with single, signed commit. 2018-07-24 14:07:33 -04:00
dispatch.c Remove code to support 2.x.x firmware on Mk3 hardware 2019-09-23 14:02:09 -04:00
dispatch.h Making whole firmware public with single, signed commit. 2018-07-24 14:07:33 -04:00
enable.c Verified math for main pin 2019-07-23 10:27:47 -04:00
firmware-keys.h Making whole firmware public with single, signed commit. 2018-07-24 14:07:33 -04:00
gpio.c Making whole firmware public with single, signed commit. 2018-07-24 14:07:33 -04:00
gpio.h Making whole firmware public with single, signed commit. 2018-07-24 14:07:33 -04:00
keylayout.py Switch to exactly 13 tries 2019-07-26 11:23:45 -04:00
link-script.ld Remove code to support 2.x.x firmware on Mk3 hardware 2019-09-23 14:02:09 -04:00
Makefile Tweak 2019-10-09 08:47:26 -04:00
mathcheck.py Encrypt the secrets stored in 608a 2019-07-29 10:11:22 -04:00
misc.h Making whole firmware public with single, signed commit. 2018-07-24 14:07:33 -04:00
mk-sigheader.py Making whole firmware public with single, signed commit. 2018-07-24 14:07:33 -04:00
oled.c Switch to exactly 13 tries 2019-07-26 11:23:45 -04:00
oled.h Switch to exactly 13 tries 2019-07-26 11:23:45 -04:00
pins.c Bugfix: need private_state value even when no pin 2019-09-27 12:59:57 -04:00
pins.h Remove PA_HAS_608A 2019-09-23 12:55:41 -04:00
README.md Working math for KDF used for word prefix 2019-07-17 16:13:59 -04:00
rng.c comment 2019-07-15 09:22:08 -04:00
rng.h Making whole firmware public with single, signed commit. 2018-07-24 14:07:33 -04:00
secel_config.py Means to clear ReqRandom flag 2019-07-19 15:29:45 -04:00
secel_debug.py Can program the config and load the data slots. 2019-07-16 10:44:57 -04:00
sflash.c Do not allow older firmware on Mk3, must be v3.x.x and higher 2019-09-23 10:43:32 -04:00
sflash.h Making whole firmware public with single, signed commit. 2018-07-24 14:07:33 -04:00
sha256.c Making whole firmware public with single, signed commit. 2018-07-24 14:07:33 -04:00
sha256.h Making whole firmware public with single, signed commit. 2018-07-24 14:07:33 -04:00
sigheader.h Making whole firmware public with single, signed commit. 2018-07-24 14:07:33 -04:00
sigheader.py Making whole firmware public with single, signed commit. 2018-07-24 14:07:33 -04:00
startup.S Preserve SP during callgate process. Bump copyright, version 2019-02-11 13:46:28 -05:00
stm32l4xx_hal_conf.h Making whole firmware public with single, signed commit. 2018-07-24 14:07:33 -04:00
stm32l4xx_hal_firewall.c Making whole firmware public with single, signed commit. 2018-07-24 14:07:33 -04:00
stm32l4xx_hal_gpio.c Making whole firmware public with single, signed commit. 2018-07-24 14:07:33 -04:00
stm32l4xx_hal_rcc_ex.c Switch to exactly 13 tries 2019-07-26 11:23:45 -04:00
stm32l4xx_hal_rcc.c Making whole firmware public with single, signed commit. 2018-07-24 14:07:33 -04:00
stm32l4xx_hal_spi.c Remove more dead code to create space: we use only 8-bit mode 2018-08-07 11:13:05 -04:00
storage.c Switch to exactly 13 tries 2019-07-26 11:23:45 -04:00
storage.h Switch to exactly 13 tries 2019-07-26 11:23:45 -04:00
verify.c Remove code to support 2.x.x firmware on Mk3 hardware 2019-09-23 14:02:09 -04:00
verify.h Do not allow older firmware on Mk3, must be v3.x.x and higher 2019-09-23 10:43:32 -04:00
version.c Transition to new API for bootrom/pins 2019-07-11 11:09:15 -04:00
version.h Transition to new API for bootrom/pins 2019-07-11 11:09:15 -04:00

Coldcard Bootloader

We have a bootloader. It does the usual code signature checking, but also offers some security features used during runtime. Part of this is keeping some bytes secret in the long term. It can never be field upgraded, and yet plays an important part in that process.

Firewalled Code/Data

This code is linked separately from other executables, and resides in its own reserved area at the start of flash memory. That area is protected from readback using chip features: "Proprietary Code Read-Out Protection (PCROP)" aka. firewall.

A very limited amount of security-sensitive code resides here. It protects your currency, but only indirectly. It's more about making your key storage per-system unique.

Notes

  • the most helpful file here is bootloader.lss which is generated in build process

  • using OpenOCD is prefered for lower level code like this (not GDB)

  • stm32l4x.cpu arm disassemble 0x000008 10 thumb is very helpful

  • you can power cycle the board (to enter/exit DFU) and OpenOCD keeps working

  • for consistent reading of state, do this:

    • power cycle
    • "reset"
    • "halt"
  • wipe chip with:

    • stm32l4x mass_erase 0 in openocd monitor to bulk-erase whole chip
  • To clear flash with write protect on... FLASH regs at 0x40022000 base FLASH->CR = 0x40022014 FLASH->WRP1AR = 0x4002202c

    have DFU active. doesn't work from running

    halt

    expect 0x40000000, if it's 0xc0000000, can't work; reboot w/ DFU pressed, to fix

    mdw 0x40022014

    ignore warning about "power cycle" from this:

    stm32l4x unlock 0

    expect 0 from this:

    mdw 0x40022014

    disable all write-protect (bank 1, A region)

    mww 0x4002202c 0xff00ffff mww 0x40022030 0xff00ffff

    commit change

    mww 0x40022014 0x20000

    read back in OB (expect ff00ffff NOT ff0fff00)

    mdw 0x1FFF7818

    launch changes? (causes weird reset)

    mww 0x40022014 0x8000000

  • "stm32l4x.cpu mdb" is nice hexdump, much better than regular mdb

  • If you're having trouble getting the debugger to started / link up right, try in DFU mode.

  • You must always wipe flash when you change the 508/608 because no code to erase the pairing secret and can't rewrite flash.

    halt stm32l4x unlock 0 stm32l4x mass_erase 0

Credits

Reading 'pairing secret'

This is a useful command, but only works on non-production units:

dfu-util -d 0483:df11 -a 0 -s 0x08007800:256 -U pairing.bin

Resources

Todo List

  • measure OLED reset and CS pulse lengths, and SPI clk during boot w/ internal RC oscilator
  • HAL code for SPI should be removed and replaced with a few one-liners
  • GPIO code maybe removed as well?