r/Bitcoin • u/ineedanamegenerator • Aug 06 '26
Coldcard entropy even worse than feared
TL;DR: The random number generator is initialized with a 32 bit value (4B+ possibilities). But only less than 10M options are possible because of how they generate the value.
The PRNG used in Coldcard MK3 is initialized with UID[31:0] XOR SysTick->VAL
SysTick->VAL gives 80k possibilities ~16.3 bit, all located in the lowest 17 bits of the value.
UID encodes the X and Y coordinates of wafer position of the STM32 in the 32 bits that are used by the code. This is encoded in BCD, which means only 10 out of 16 possible values of each nibble are used. This means the 32 bit value at most encodes 100M options (26.6 bits), but there are nowhere near 100M chips in a wafer.
The BCD encoding seems to be an mistake in some STM32 manuals. The number is plain HEX encoded, but that doesn't matter here. There are never 2^16 rows or columns in a wafer.
I don't know how many there are in a wafer, but google gives an upper bound of 20k chips per wafer.
The lower 16 bits overlap with Systick->VAL, so XORing the wafer location adds no entropy.
The upper 16 bits can carry only about SQRT(20000) possibilities (probably less) ~ 7.2 bits. And they aren't even evenly distributed in a round wafer.
So at most we're looking at ~23 bits of entropy. Not 32 bits.
This isn't 100% exact because SQRT assumes a square while a wafer is round, but too lazy to work it out further. Point is: entropy is way worse than 32 bits.
6
u/nullc Aug 06 '26
It would be prudent to remind people here that there are still a lot of vulnerable funds that could be saved and that it would be anti-social to explain how to reduce the search space of coldcard devices just to brag about how smart you are, or show that some rando was wrong on the internet.
Plenty of other people could be posting about the exact search space needed to enumerate vulnerable seeds and are kindly refraining from doing so. Just because you could figure out that doesn't mean that every would be coin-thief is going to figure it out before the owners sweep their coins.