URI: 
       tRevert "remove custom entropy option; nobody uses it" - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 9285a7198ee1f19571d10453db1b708fc6306e9a
   DIR parent b907018a2565e7d80f256a542bb52e4f45c064f9
  HTML 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:
         M lib/commands.py                     |      12 ++++++++++--
         M lib/mnemonic.py                     |      14 +++++++++++---
       
       2 files changed, 21 insertions(+), 5 deletions(-)
       ---
   DIR diff --git a/lib/commands.py b/lib/commands.py
       t@@ -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
       t@@ -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."),
       t@@ -679,6 +686,7 @@ arg_types = {
            'num': int,
            'nbits': int,
            'imax': int,
       +    'entropy': long,
            'tx': tx_from_str,
            'pubkeys': json_loads,
            'jsontx': json_loads,
   DIR diff --git a/lib/mnemonic.py b/lib/mnemonic.py
       t@@ -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):