1
0

extended seed prefix

This commit is contained in:
ThomasV
2014-09-09 11:51:45 +02:00
parent c657212e5b
commit 6361abaf4d
5 changed files with 23 additions and 22 deletions

View File

@@ -23,8 +23,8 @@ import re
import sys
import hmac
import version
from util import print_error
from version import SEED_PREFIX
try:
import ecdsa
@@ -147,7 +147,10 @@ def Hash(x):
hash_encode = lambda x: x[::-1].encode('hex')
hash_decode = lambda x: x.decode('hex')[::-1]
hmac_sha_512 = lambda x,y: hmac.new(x, y, hashlib.sha512).digest()
is_new_seed = lambda x: hmac_sha_512("Seed version", x.encode('utf8')).encode('hex')[0:2].startswith(SEED_PREFIX)
def is_new_seed(x, prefix=version.SEED_BIP44):
s = hmac_sha_512("Seed version", x.encode('utf8')).encode('hex')
return s.startswith(prefix)
def is_old_seed(seed):

View File

@@ -133,7 +133,7 @@ class Commands:
def make_seed(self, nbits, custom_entropy, language):
from mnemonic import Mnemonic
s = Mnemonic(language).make_seed(nbits, custom_entropy)
s = Mnemonic(language).make_seed(nbits, custom_entropy=custom_entropy)
return s.encode('utf8')
def check_seed(self, seed, custom_entropy, language):

View File

@@ -27,7 +27,7 @@ import pbkdf2
from util import print_error
from bitcoin import is_old_seed, is_new_seed
import version
class Mnemonic(object):
# Seed derivation follows BIP39
@@ -89,11 +89,13 @@ class Mnemonic(object):
i = self.mnemonic_decode(seed)
return i % custom_entropy == 0
def make_seed(self, num_bits=128, custom_entropy=1):
def make_seed(self, num_bits=128, prefix=version.SEED_BIP44, custom_entropy=1):
n = int(math.ceil(math.log(custom_entropy,2)))
# bits of entropy used by the prefix
k = len(prefix)*4
# we add at least 16 bits
n_added = max(16, 8 + num_bits - n)
print_error("make_seed: adding %d bits"%n_added)
n_added = max(16, k + num_bits - n)
print_error("make_seed", prefix, "adding %d bits"%n_added)
my_entropy = ecdsa.util.randrange( pow(2, n_added) )
nonce = 0
while True:
@@ -103,8 +105,7 @@ class Mnemonic(object):
assert i == self.mnemonic_decode(seed)
if is_old_seed(seed):
continue
# this removes 8 bits of entropy
if is_new_seed(seed):
if is_new_seed(seed, prefix):
break
print_error('%d words'%len(seed.split()))
return seed

View File

@@ -5,4 +5,5 @@ OLD_SEED_VERSION = 4 # old electrum deterministic generation
# The hash of the mnemonic seed must begin with this
SEED_PREFIX = '01' # for BIP44
SEED_BIP44 = '01' # BIP44
SEED_2FA = '101' # extended seed for two-factor authentication