From 9f08293c0e85e7c0db77a00fc54801bd530f9307 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Sat, 29 Feb 2020 00:34:06 +0100 Subject: [PATCH] mnemonic: make sure newly generated seeds are not valid as bip39 --- electrum/keystore.py | 9 +++++++-- electrum/mnemonic.py | 6 ++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/electrum/keystore.py b/electrum/keystore.py index 4cb002e0a..32c833475 100644 --- a/electrum/keystore.py +++ b/electrum/keystore.py @@ -877,13 +877,18 @@ def bip39_to_seed(mnemonic, passphrase): b'mnemonic' + passphrase.encode('utf-8'), iterations = PBKDF2_ROUNDS) -def bip39_is_checksum_valid(mnemonic: str) -> Tuple[bool, bool]: +def bip39_is_checksum_valid( + mnemonic: str, + *, + wordlist: Wordlist = None, +) -> Tuple[bool, bool]: """Test checksum of bip39 mnemonic assuming English wordlist. Returns tuple (is_checksum_valid, is_wordlist_valid) """ words = [normalize('NFKD', word) for word in mnemonic.split()] words_len = len(words) - wordlist = Wordlist.from_file("english.txt") + if wordlist is None: + wordlist = Wordlist.from_file("english.txt") n = len(wordlist) i = 0 words.reverse() diff --git a/electrum/mnemonic.py b/electrum/mnemonic.py index dc16a1c32..5db4a4a99 100644 --- a/electrum/mnemonic.py +++ b/electrum/mnemonic.py @@ -188,6 +188,7 @@ class Mnemonic(Logger): return i def make_seed(self, *, seed_type=None, num_bits=None) -> str: + from .keystore import bip39_is_checksum_valid if seed_type is None: seed_type = 'segwit' if num_bits is None: @@ -210,6 +211,11 @@ class Mnemonic(Logger): raise Exception('Cannot extract same entropy from mnemonic!') if is_old_seed(seed): continue + # Make sure the mnemonic we generate is not also a valid bip39 seed + # by accident. Note that this test has not always been done historically, + # so it cannot be relied upon. + if bip39_is_checksum_valid(seed, wordlist=self.wordlist) == (True, True): + continue if is_new_seed(seed, prefix): break self.logger.info(f'{len(seed.split())} words')