commit 9285a7198ee1f19571d10453db1b708fc6306e9a
parent b907018a2565e7d80f256a542bb52e4f45c064f9
Author: ThomasV <thomasv@electrum.org>
Date: Thu, 20 Oct 2016 10:22:17 +0200
Revert "remove custom entropy option; nobody uses it"
This reverts commit e0c38b31b40b42138527e9fd3f4bad78e0b12802.
Diffstat:
2 files changed, 21 insertions(+), 5 deletions(-)
diff --git 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
@@ -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):