add spanish wordlist and remove accents
This commit is contained in:
parent
e7c7dc8cc9
commit
93d073457c
|
@ -149,6 +149,8 @@ hash_decode = lambda x: x.decode('hex')[::-1]
|
||||||
hmac_sha_512 = lambda x,y: hmac.new(x, y, hashlib.sha512).digest()
|
hmac_sha_512 = lambda x,y: hmac.new(x, y, hashlib.sha512).digest()
|
||||||
|
|
||||||
def is_new_seed(x, prefix=version.SEED_BIP44):
|
def is_new_seed(x, prefix=version.SEED_BIP44):
|
||||||
|
import mnemonic
|
||||||
|
x = mnemonic.Mnemonic.prepare_seed(x)
|
||||||
s = hmac_sha_512("Seed version", x.encode('utf8')).encode('hex')
|
s = hmac_sha_512("Seed version", x.encode('utf8')).encode('hex')
|
||||||
return s.startswith(prefix)
|
return s.startswith(prefix)
|
||||||
|
|
||||||
|
|
|
@ -29,20 +29,25 @@ from util import print_error
|
||||||
from bitcoin import is_old_seed, is_new_seed
|
from bitcoin import is_old_seed, is_new_seed
|
||||||
import version
|
import version
|
||||||
|
|
||||||
|
|
||||||
|
filenames = {
|
||||||
|
'en':'english.txt',
|
||||||
|
'es':'spanish.txt',
|
||||||
|
'ja':'japanese.txt',
|
||||||
|
'pt':'portuguese.txt',
|
||||||
|
}
|
||||||
|
|
||||||
|
def remove_accents(input_str):
|
||||||
|
nkfd_form = unicodedata.normalize('NFKD', unicode(input_str))
|
||||||
|
return u''.join([c for c in nkfd_form if not unicodedata.combining(c)])
|
||||||
|
|
||||||
|
|
||||||
class Mnemonic(object):
|
class Mnemonic(object):
|
||||||
# Seed derivation follows BIP39
|
# Seed derivation follows BIP39
|
||||||
# Mnemonic phrase uses a hash based checksum, instead of a wordlist-dependent checksum
|
# Mnemonic phrase uses a hash based checksum, instead of a wordlist-dependent checksum
|
||||||
|
|
||||||
def __init__(self, lang=None):
|
def __init__(self, lang='en'):
|
||||||
if lang is None:
|
filename = filenames.get(lang[0:2], 'english.txt')
|
||||||
filename = 'english.txt'
|
|
||||||
elif lang[0:2] == 'pt':
|
|
||||||
filename = 'portuguese.txt'
|
|
||||||
elif lang[0:2] == 'ja':
|
|
||||||
filename = 'japanese.txt'
|
|
||||||
else:
|
|
||||||
filename = 'english.txt'
|
|
||||||
|
|
||||||
path = os.path.join(os.path.dirname(__file__), 'wordlist', filename)
|
path = os.path.join(os.path.dirname(__file__), 'wordlist', filename)
|
||||||
s = open(path,'r').read().strip()
|
s = open(path,'r').read().strip()
|
||||||
s = unicodedata.normalize('NFKD', s.decode('utf8'))
|
s = unicodedata.normalize('NFKD', s.decode('utf8'))
|
||||||
|
@ -63,7 +68,10 @@ class Mnemonic(object):
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def prepare_seed(self, seed):
|
def prepare_seed(self, seed):
|
||||||
return unicodedata.normalize('NFKD', unicode(seed.strip()))
|
# remove accents to tolerate typos
|
||||||
|
seed = unicode(remove_accents(seed.strip()))
|
||||||
|
seed = unicodedata.normalize('NFKD', seed)
|
||||||
|
return seed
|
||||||
|
|
||||||
def mnemonic_encode(self, i):
|
def mnemonic_encode(self, i):
|
||||||
n = len(self.wordlist)
|
n = len(self.wordlist)
|
||||||
|
@ -105,7 +113,7 @@ class Mnemonic(object):
|
||||||
assert i == self.mnemonic_decode(seed)
|
assert i == self.mnemonic_decode(seed)
|
||||||
if is_old_seed(seed):
|
if is_old_seed(seed):
|
||||||
continue
|
continue
|
||||||
if is_new_seed(seed, prefix):
|
if is_new_seed(self.prepare_seed(seed), prefix):
|
||||||
break
|
break
|
||||||
print_error('%d words'%len(seed.split()))
|
print_error('%d words'%len(seed.split()))
|
||||||
return seed
|
return seed
|
||||||
|
|
|
@ -1080,7 +1080,7 @@ class Deterministic_Wallet(Abstract_Wallet):
|
||||||
if self.seed:
|
if self.seed:
|
||||||
raise Exception("a seed exists")
|
raise Exception("a seed exists")
|
||||||
|
|
||||||
self.seed_version, self.seed = self.prepare_seed(seed)
|
self.seed_version, self.seed = self.format_seed(seed)
|
||||||
if password:
|
if password:
|
||||||
self.seed = pw_encode( self.seed, password)
|
self.seed = pw_encode( self.seed, password)
|
||||||
self.use_encryption = True
|
self.use_encryption = True
|
||||||
|
@ -1301,8 +1301,8 @@ class BIP32_Wallet(Deterministic_Wallet):
|
||||||
lang = self.storage.config.get('language')
|
lang = self.storage.config.get('language')
|
||||||
return Mnemonic(lang).make_seed()
|
return Mnemonic(lang).make_seed()
|
||||||
|
|
||||||
def prepare_seed(self, seed):
|
def format_seed(self, seed):
|
||||||
return NEW_SEED_VERSION, Mnemonic.prepare_seed(seed)
|
return NEW_SEED_VERSION, ' '.join(seed.split())
|
||||||
|
|
||||||
|
|
||||||
class BIP32_Simple_Wallet(BIP32_Wallet):
|
class BIP32_Simple_Wallet(BIP32_Wallet):
|
||||||
|
@ -1515,7 +1515,7 @@ class OldWallet(Deterministic_Wallet):
|
||||||
seed = random_seed(128)
|
seed = random_seed(128)
|
||||||
return ' '.join(old_mnemonic.mn_encode(seed))
|
return ' '.join(old_mnemonic.mn_encode(seed))
|
||||||
|
|
||||||
def prepare_seed(self, seed):
|
def format_seed(self, seed):
|
||||||
import old_mnemonic
|
import old_mnemonic
|
||||||
# see if seed was entered as hex
|
# see if seed was entered as hex
|
||||||
seed = seed.strip()
|
seed = seed.strip()
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue