Browse Source

fixes for old keystore

283
ThomasV 8 years ago
parent
commit
d471d4b905
  1. 34
      lib/keystore.py

34
lib/keystore.py

@ -170,7 +170,7 @@ class Deterministic_KeyStore(Software_KeyStore):
def add_seed(self, seed): def add_seed(self, seed):
if self.seed: if self.seed:
raise Exception("a seed exists") raise Exception("a seed exists")
self.seed_version, self.seed = self.format_seed(seed) self.seed = self.format_seed(seed)
def get_seed(self, password): def get_seed(self, password):
return pw_decode(self.seed, password).encode('utf8') return pw_decode(self.seed, password).encode('utf8')
@ -233,7 +233,7 @@ class BIP32_KeyStore(Deterministic_KeyStore, Xpub):
self.xprv = d.get('xprv') self.xprv = d.get('xprv')
def format_seed(self, seed): def format_seed(self, seed):
return NEW_SEED_VERSION, ' '.join(seed.split()) return ' '.join(seed.split())
def dump(self): def dump(self):
d = Deterministic_KeyStore.dump(self) d = Deterministic_KeyStore.dump(self)
@ -325,19 +325,20 @@ class Old_KeyStore(Deterministic_KeyStore):
def __init__(self, d): def __init__(self, d):
Deterministic_KeyStore.__init__(self, d) Deterministic_KeyStore.__init__(self, d)
self.mpk = d.get('mpk').decode('hex') self.mpk = d.get('mpk')
def dump(self): def dump(self):
d = Deterministic_KeyStore.dump(self) d = Deterministic_KeyStore.dump(self)
d['mpk'] = self.mpk.encode('hex') d['mpk'] = self.mpk
d['type'] = 'old'
return d return d
def add_seed(self, seed): def add_seed(self, seedphrase):
Deterministic_KeyStore.add_seed(self, seed) Deterministic_KeyStore.add_seed(self, seedphrase)
self.mpk = self.mpk_from_seed(seed) self.mpk = self.mpk_from_seed(self.seed)
def add_master_public_key(self, mpk): def add_master_public_key(self, mpk):
self.mpk = mpk.decode('hex') self.mpk = mpk
def format_seed(self, seed): def format_seed(self, seed):
import old_mnemonic import old_mnemonic
@ -353,7 +354,7 @@ class Old_KeyStore(Deterministic_KeyStore):
seed = old_mnemonic.mn_decode(words) seed = old_mnemonic.mn_decode(words)
if not seed: if not seed:
raise Exception("Invalid seed") raise Exception("Invalid seed")
return OLD_SEED_VERSION, seed return seed
def get_mnemonic(self, password): def get_mnemonic(self, password):
import old_mnemonic import old_mnemonic
@ -365,7 +366,7 @@ class Old_KeyStore(Deterministic_KeyStore):
secexp = klass.stretch_key(seed) secexp = klass.stretch_key(seed)
master_private_key = ecdsa.SigningKey.from_secret_exponent(secexp, curve = SECP256k1) master_private_key = ecdsa.SigningKey.from_secret_exponent(secexp, curve = SECP256k1)
master_public_key = master_private_key.get_verifying_key().to_string() master_public_key = master_private_key.get_verifying_key().to_string()
return master_public_key return master_public_key.encode('hex')
@classmethod @classmethod
def stretch_key(self, seed): def stretch_key(self, seed):
@ -376,7 +377,7 @@ class Old_KeyStore(Deterministic_KeyStore):
@classmethod @classmethod
def get_sequence(self, mpk, for_change, n): def get_sequence(self, mpk, for_change, n):
return string_to_number(Hash("%d:%d:"%(n, for_change) + mpk)) return string_to_number(Hash("%d:%d:"%(n, for_change) + mpk.decode('hex')))
def get_address(self, for_change, n): def get_address(self, for_change, n):
pubkey = self.get_pubkey(for_change, n) pubkey = self.get_pubkey(for_change, n)
@ -386,7 +387,7 @@ class Old_KeyStore(Deterministic_KeyStore):
@classmethod @classmethod
def get_pubkey_from_mpk(self, mpk, for_change, n): def get_pubkey_from_mpk(self, mpk, for_change, n):
z = self.get_sequence(mpk, for_change, n) z = self.get_sequence(mpk, for_change, n)
master_public_key = ecdsa.VerifyingKey.from_string(mpk, curve = SECP256k1) master_public_key = ecdsa.VerifyingKey.from_string(mpk.decode('hex'), curve = SECP256k1)
pubkey_point = master_public_key.pubkey.point + z*SECP256k1.generator pubkey_point = master_public_key.pubkey.point + z*SECP256k1.generator
public_key2 = ecdsa.VerifyingKey.from_public_point(pubkey_point, curve = SECP256k1) public_key2 = ecdsa.VerifyingKey.from_public_point(pubkey_point, curve = SECP256k1)
return '04' + public_key2.to_string().encode('hex') return '04' + public_key2.to_string().encode('hex')
@ -413,8 +414,8 @@ class Old_KeyStore(Deterministic_KeyStore):
secexp = self.stretch_key(seed) secexp = self.stretch_key(seed)
master_private_key = ecdsa.SigningKey.from_secret_exponent( secexp, curve = SECP256k1 ) master_private_key = ecdsa.SigningKey.from_secret_exponent( secexp, curve = SECP256k1 )
master_public_key = master_private_key.get_verifying_key().to_string() master_public_key = master_private_key.get_verifying_key().to_string()
if master_public_key != self.mpk: if master_public_key != self.mpk.decode('hex'):
print_error('invalid password (mpk)', self.mpk.encode('hex'), master_public_key.encode('hex')) print_error('invalid password (mpk)', self.mpk, master_public_key.encode('hex'))
raise InvalidPassword() raise InvalidPassword()
def check_password(self, password): def check_password(self, password):
@ -422,12 +423,11 @@ class Old_KeyStore(Deterministic_KeyStore):
self.check_seed(seed) self.check_seed(seed)
def get_master_public_key(self): def get_master_public_key(self):
return self.mpk.encode('hex') return self.mpk
def get_xpubkey(self, for_change, n): def get_xpubkey(self, for_change, n):
s = ''.join(map(lambda x: bitcoin.int_to_hex(x,2), (for_change, n))) s = ''.join(map(lambda x: bitcoin.int_to_hex(x,2), (for_change, n)))
mpk = self.mpk.encode('hex') x_pubkey = 'fe' + self.mpk + s
x_pubkey = 'fe' + mpk + s
return x_pubkey return x_pubkey
@classmethod @classmethod

Loading…
Cancel
Save