Derive from the mnemonic's words joined by single spaces (closes #49)
check / check (push) Successful in 2m21s

The BIP-39 seed was computed over the mnemonic string as given, with only its ends trimmed, so the same words one per line, tab-separated or double-spaced passed the checksum but gave different keys with no warning. The words are now joined by single spaces before the checksum and the seed, for every source: the mnemonic command, both environment variables and the prompt. Single-spaced input gives the same keys as before; a test checks the README vector for each spacing.

Model: opus-5-5
This commit was merged in pull request #53.
This commit is contained in:
2026-10-04 07:08:46 +02:00
parent 1ddc2c747a
commit 897b43a206
3 changed files with 28 additions and 7 deletions
+4 -3
View File
@@ -104,10 +104,11 @@ func ask() (string, error) {
return checked(string(typed))
}
// checked drops the surrounding whitespace and refuses a mnemonic that
// does not pass the BIP-39 checksum.
// checked joins the words with single spaces, whatever whitespace
// separated them, since the seed is computed over the string itself,
// and refuses a mnemonic that does not pass the BIP-39 checksum.
func checked(words string) (string, error) {
words = strings.TrimSpace(words)
words = strings.Join(strings.Fields(words), " ")
if !bip39.IsMnemonicValid(words) {
return "", ErrChecksum