v2.4.0: Scanning, Seed XOR split, backup sheets and seed safety fixes
This release is about the seed tools themselves. The Seed Tool can now read SeedQR codes and animated PSBT QR codes, split a seed with Seed XOR, derive Nostr keys, output descriptors, BIP-85 base85 passwords and dice rolls, and print a backup sheet to fill in by hand. It also fixes several places where the tool could show a wrong seed as if it were right, or leave seed material on the page after Clear seed. The page now carries a Content Security Policy, and every release can be rebuilt from its tag.
New
QR scanning
Scan with your camera, or pick an image. Enter words reads a SeedQR, Compact SeedQR or seed-words QR into the word boxes so you can check them before pressing Load Seed. The PSBT Inspector reads a plain PSBT QR or an animated UR code (ur:psbt or ur:crypto-psbt), with a progress bar. Everything is decoded in the page; nothing is sent anywhere.
Seed XOR: split and combine
Split my seed turns the loaded seed into 2 to 8 shares, as on COLDCARD, and checks on screen that they combine back to your seed. Combine shares rebuilds a seed from the shares alone, with no seed loaded, and can load the result. Seed XOR now matches COLDCARD's own test vectors, and a mistyped word, a bad checksum or a share of another length is refused instead of producing a valid-looking wrong seed.
Printable backup sheet
Print a sheet with numbered word boxes, a notes box and a SeedQR grid to fill in by hand. The parts of the SeedQR that never change, such as its corner squares, are printed for you. The sheet is blank by default. Filling in your words and SeedQR is a separate choice, with a warning that printers can keep a copy of what they print.
Nostr Keys
A new tool for NIP-06 (m/44'/1237'/n'/0/0) and the BIP-85 Nostr application. It shows the npub and nsec, the hex keys and a QR code for the npub.
Output descriptors
Derived Addresses now shows descriptors for BIP-44, 49, 84 and 86 accounts: the combined <0;1> form plus separate receive and change descriptors, with key origin, BIP-380 checksum and a QR code. Import one into Sparrow or Bitcoin Core to watch the account.
BIP-85 base85 passwords and dice rolls
Passwords can now use base85 (10 to 80 characters, with more symbols) as well as base64. A new Dice rolls tab gives rolls you can recreate from your seed at any time. Both match the test vectors in the BIP-85 spec.
Standard SeedQR
Shown next to Compact SeedQR. It stores each word's number, so it can be read and copied by hand: 25×25 for 12 words and 29×29 for 24, the sizes SeedSigner uses.
Passphrase lists
The Passphrase Tester takes a list of passphrases and how many addresses to check for each, with progress, a Stop button and "Use this passphrase" on a match. Taproot paths now give Taproot addresses.
UI and usability
- The seed input tabs are labelled Generate, Enter words and From entropy. Word boxes are checked as you type, suggest the nearest word, and have spellcheck and autocorrect turned off.
- The Seed Workspace keeps its output out of the way until a seed is loaded.
- The entropy panel shows a pattern check instead of a "time to crack", which meant nothing for dice or cards. The passphrase estimate appears only once you type a passphrase.
- The eye button also hides the seed words in the top bar and on the seed cards. Derived Addresses hides private keys until you ask for them.
- PSBT and Lightning errors are in plain English, with the technical detail folded underneath.
lightning:links are accepted. - Tool search shows how many tools match, and what to try when none do.
- A link straight to a tool that needs a seed opens the "No seed loaded yet" dialog instead of an empty tool.
- Larger tap targets on touch screens. Dialogs move keyboard focus in and hand it back when they close, and pop-up messages are read out by screen readers.
Seed safety fixes
- Raw entropy that starts with zero bits no longer loses them. Before, it could throw or silently produce a shorter phrase and leave the previous seed on screen. (#76)
- Entropy input no longer discards what you typed on other panels, and entropy too weak for the chosen length no longer leaves the previous seed's phrase and addresses showing.
- One Time Pad refuses unknown words, damaged keys and keys for another length. A failed decryption shows nothing instead of a plausible wrong seed.
- BIP-85 shows the Compact SeedQR only for BIP-39 children. For WIF, xprv and hex it encoded a different secret from the one displayed.
- Clear seed now wipes everything derived from the seed and everything typed into the tools, including address lists with private keys, account keys, XOR shares and the BIP-85 parent seeds held in memory.
- Typing entropy, BIP-85 "Load Child" and Learn's "Try another seed" now ask before replacing a loaded seed.
- Diceware rolls are unbiased. Random bytes modulo 6 favoured faces 1 to 4 by about 1.6%.
- PayNym avatars are only fetched when you press the button, which says that it contacts paynym.rs.
Security and build
- The page carries a Content Security Policy. Nothing can load or connect except the opt-in PayNym images and BIP-353 DNS-over-HTTPS lookups.
- Sign & Verify no longer signs with the
ellipticlibrary, which has an unfixed advisory. It now uses@noble/secp256k1. - The Silent Payments bundle is 2.3 MB smaller.
- Every release can be rebuilt from its tag. The README explains how, and CI checks that
index.htmlmatches the source.
How to verify this release
curl -sL https://github.com/BitcoinQnA/seedtool/raw/main/RELEASE-SIGNING-KEY.asc | gpg --import
curl -LO https://github.com/BitcoinQnA/seedtool/releases/download/2.4.0/signature.txt
gpg --verify signature.txtYou should see Good signature from "QnA <qna@bitcoiner.guide>" with the fingerprint:
EB3D 738B EC6A 873A C274 5292 CF4F E215 EA66 63AC
The signed sha256 of the index.html asset is embedded below.
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512
sha256sum index.html 22cbe98f9ab30a047a9f45172278feecf81b804f6c8caf4e9e346adce8645ec1
-----BEGIN PGP SIGNATURE-----
iJEEARYKADkWIQTrPXOL7GqHOsJ0UpLPT+IV6mZjrAUCaqO7lRsUgAAAAAAEAA5t
YW51MiwyLjUrMS4xMiwwLDMACgkQz0/iFepmY6wF5gD/ewSHBO5TQJlsGQ/l6Vxh
gPC8cDtXrMwDNxG1fr0c+X4BALprEfkSQ1bYlBdjFWd8E/57ahB37mSy6OiFrzZT
CsMH
=FesK
-----END PGP SIGNATURE-----