From 9285a7198ee1f19571d10453db1b708fc6306e9a Mon Sep 17 00:00:00 2001 From: ThomasV Date: Thu, 20 Oct 2016 10:22:17 +0200 Subject: [PATCH] Revert "remove custom entropy option; nobody uses it" This reverts commit e0c38b31b40b42138527e9fd3f4bad78e0b12802. --- lib/commands.py | 12 ++++++++++-- lib/mnemonic.py | 14 +++++++++++--- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/lib/commands.py b/lib/commands.py index ba29b30ba..068949d63 100644 --- a/lib/commands.py +++ b/lib/commands.py @@ -143,12 +143,18 @@ class Commands: return True @command('') - def make_seed(self, nbits=128, language=None): + def make_seed(self, nbits=128, entropy=1, language=None): """Create a seed""" from mnemonic import Mnemonic - s = Mnemonic(language).make_seed(nbits) + s = Mnemonic(language).make_seed(nbits, custom_entropy=entropy) return s.encode('utf8') + @command('') + def check_seed(self, seed, entropy=1, language=None): + """Check that a seed was generated with given entropy""" + from mnemonic import Mnemonic + return Mnemonic(language).check_seed(seed, entropy) + @command('n') def getaddresshistory(self, address): """Return the transaction history of any address. Note: This is a @@ -656,6 +662,7 @@ command_options = { 'from_addr': ("-F", "--from", "Source address. If it isn't in the wallet, it will ask for the private key unless supplied in the format public_key:private_key. It's not saved in the wallet."), 'change_addr': ("-c", "--change", "Change address. Default is a spare address, or the source address if it's not in the wallet"), 'nbits': (None, "--nbits", "Number of bits of entropy"), + 'entropy': (None, "--entropy", "Custom entropy"), 'language': ("-L", "--lang", "Default language for wordlist"), 'gap_limit': ("-G", "--gap", "Gap limit"), 'privkey': (None, "--privkey", "Private key. Set to '?' to get a prompt."), @@ -679,6 +686,7 @@ arg_types = { 'num': int, 'nbits': int, 'imax': int, + 'entropy': long, 'tx': tx_from_str, 'pubkeys': json_loads, 'jsontx': json_loads, diff --git a/lib/mnemonic.py b/lib/mnemonic.py index 1203166fb..8e0f788af 100644 --- a/lib/mnemonic.py +++ b/lib/mnemonic.py @@ -154,16 +154,24 @@ class Mnemonic(object): i = i*n + k return i - def make_seed(self, num_bits=128, prefix=version.SEED_PREFIX): + def check_seed(self, seed, custom_entropy): + assert is_new_seed(seed) + i = self.mnemonic_decode(seed) + return i % custom_entropy == 0 + + def make_seed(self, num_bits=128, prefix=version.SEED_PREFIX, custom_entropy=1): # increase num_bits in order to obtain a uniform distibution for the last word bpw = math.log(len(self.wordlist), 2) - n = int(math.ceil(num_bits/bpw)) * bpw + num_bits = int(math.ceil(num_bits/bpw)) * bpw + # handle custom entropy; make sure we add at least 16 bits + n_custom = int(math.ceil(math.log(custom_entropy, 2))) + n = max(16, num_bits - n_custom) print_error("make_seed", prefix, "adding %d bits"%n) my_entropy = ecdsa.util.randrange(pow(2, n)) nonce = 0 while True: nonce += 1 - i = my_entropy + nonce + i = custom_entropy * (my_entropy + nonce) seed = self.mnemonic_encode(i) assert i == self.mnemonic_decode(seed) if is_old_seed(seed):