Reminder: if you didn’t roll your own seed phrase offline, you’re trusting a third-party random number generator with your life savings. #Bitcoin

Reply to this note

Please Login to reply.

Discussion

Just roll over 99 plebs

Minor nit though: those rolls are being turned into a seed by a process you can’t verify.

You can audit the code, yes, but fundamentally it’s un-verifiable because you can’t interrogate the specific circuit and firmware performing the roll-to-seed procedure.

Think it was you I read suggesting inputting to two different devices to see if output same phrase, as an extra check.

Also, can put decent bait on it for a while and watch, if still there later on can feel confident to add more

Yes. Whatever you produce yourself, put in multiple devices to ensure none are lying to you.

In the dice-rolling example, you could get two manufacturers, enter the same rolls and ensure they produce the same seed phrases. The problem is that there aren’t two vendors (just ColdCard, AFAIK) so to verify, you basically have to spin up an offline computer and run the Python source code.

Using an offline computer to reproduce your seed phrase generation process kinda negates the advantage of having eternally quarantined, air gapped hardware in the first place. Plus, it’s not Coinkite’s preferred method anyway. They recommend using a mix of your own words and their in-device entropy, which is entirely unverifiable.

By contrast, many vendors can perform the last word generation, XPUB generation, and address generation. So starting with seed words makes more sense to me.

Ooh didn’t know it was just coinkite, assumed others too.

Could roll once as a test wallet to get confirm with computer calc, if agreement, roll a new seed and trust it, I guess.

I didn’t know about the vendors helping with last word, that’s kinda huge news to me. You could ā€œrollā€ random 1-2048 23 times, and then roll 1-8 for final word. Do I have that right?

> and trust it, I guess.

Exactly. Best you can do is audit, dry-run with offline computer, then trust.

> You could ā€œrollā€ random 1-2048 23 times, and then roll 1-8 for final word. Do I have that right?

Correct. ColdCard, Keystone (formerly Cobo Vault), SeedSigner and Spetre DIY will show you the list of conforming last words, from which you can pick. There may be other devices, I don’t know.

Thanks for info. Now to hopefully retrieve this note down the line when I wanna find it šŸ˜…

Seedsigner lets you enter dice rolls

Does it use the same algorithm as ColdCard? IIRC, the CC algo was to concatenate the rolls as a string and run it through SHA256.

not sure ...

```

def generate_mnemonic_from_dice(roll_data: str, wordlist_language_code: str = SettingsConstants.WORDLIST_LANGUAGE__ENGLISH) -> list[str]:

"""

Takes a string of 50 or 99 dice rolls and returns a 12- or 24-word mnemonic.

Uses the iancoleman.io/bip39 and bitcoiner.guide/seed "Base 10" or "Hex" mode approach:

* dice rolls are treated as string data.

* hashed via SHA256.

Important note: This method is NOT compatible with iancoleman's "Dice" mode.

"""

entropy_bytes = hashlib.sha256(roll_data.encode()).digest()

if len(roll_data) == DICE__NUM_ROLLS__12WORD:

# 12-word mnemonic; only use 128bits / 16 bytes

entropy_bytes = entropy_bytes[:16]

# Return as a list

return bip39.mnemonic_from_bytes(entropy_bytes, wordlist=Seed.get_wordlist(wordlist_language_code)).split()

```

https://github.com/SeedSigner/seedsigner/blob/825a25a5835bfac0fab3d84c07b3c46676348489/src/seedsigner/helpers/mnemonic_generation.py

what? are you actually suggesting to roll dices?

D6 has ~2.6 bits per roll.

ā€œRollā€ here is a synonym for ā€œgenerateā€ or ā€œproduceā€. Personally, I’m not a fan of the dice rolling method specifically.

I do recommend that people randomly generate their own seed phrases though.

uff, dice rolling is a terrible idea.

Using casino-grade dice, I can confirm that the seed phrases generated by SeedSigner (v0.8.0) and ColdCardQ (1.3.0Q) match!

Rolling 3 dice at a time, gives me these values:

```csv

roll,die_1,die_2,die_3

01,3,4,5

02,4,4,3

03,6,3,3

04,5,3,6

05,2,6,1

06,2,6,2

07,2,1,2

08,3,4,1

09,3,5,2

10,6,1,6

11,2,3,5

12,1,1,5

13,2,3,1

14,3,1,6

15,2,1,6

16,3,5,2

17,2,5,1

18,4,4,1

19,2,6,6

20,6,4,6

21,5,4,4

22,6,6,4

23,4,5,1

24,6,2,1

25,2,1,2

26,2,1,4

27,4,4,5

28,1,2,1

29,1,2,3

30,1,2,6

31,1,6,4

32,2,5,1

33,2,3,3

```

Which generate the following seed phrase:

```csv

index,word

01,TALEnt

02,ROUGH

03,SEA

04,WOLF

05,ORANge

06,CORN

07,MOTOr

08,RIOT

09,WRONg

10,OFFIce

11,THEY

12,RIOT

13,ZEBRa

14,VIRTual

15,PEOPle

16,CAPItal

17,DEPUty

18,PHONe

19,SCENe

20,CASTle

21,COOK

22,ISSUe

23,CRICKet

24,TERM

```

with a fingerprint of `#421e05ba`.

nostr:nevent1qvzqqqqqqypzqc2qg7xf4cf0r594grnu27qxvjfj02gmqs9s0aa68hkux472krd9qqsgqrw9avqkgzsyql6ce49jmpflpkkhm2fg2f873csxs8y0es8ge6cpwl0xl