trustedcoin: use 12-word seeds with separate derivations

This commit is contained in:
ThomasV 2016-09-27 13:21:25 +02:00
parent 997dd17933
commit 296f30b924
3 changed files with 28 additions and 19 deletions

View File

@ -814,3 +814,10 @@ def bip32_private_key(sequence, k, chain):
for i in sequence:
k, chain = CKD_priv(k, chain, i)
return SecretToASecret(k, True)
def xkeys_from_seed(seed, derivation):
from mnemonic import Mnemonic
xprv, xpub = bip32_root(Mnemonic.mnemonic_to_seed(seed, ''))
xprv, xpub = bip32_private_derivation(xprv, "m/", derivation)
return xprv, xpub

View File

@ -710,16 +710,6 @@ def from_xprv(xprv):
k.xpub = xpub
return k
def xprv_from_seed(seed):
# do not store the seed, only the master xprv
xprv, xpub = bip32_root(Mnemonic.mnemonic_to_seed(seed, ''))
return from_xprv(xprv)
def xpub_from_seed(seed):
# store only master xpub
xprv, xpub = bip32_root(Mnemonic.mnemonic_to_seed(seed,''))
return from_xpub(xpub)
def from_keys(text):
if is_xprv(text):
k = from_xprv(text)

View File

@ -330,7 +330,7 @@ class TrustedCoinPlugin(BasePlugin):
return True
def make_seed(self):
return Mnemonic('english').make_seed(num_bits=256, prefix=SEED_PREFIX)
return Mnemonic('english').make_seed(num_bits=128, prefix=SEED_PREFIX)
@hook
def do_clear(self, window):
@ -357,13 +357,26 @@ class TrustedCoinPlugin(BasePlugin):
f = lambda x: wizard.confirm_seed(seed, '')
wizard.show_seed_dialog(run_next=f, seed_text=seed)
def xkeys_from_seed(self, seed):
words = seed.split()
n = len(words)
# old version use long seed phrases
if n == 24:
xprv1, xpub1 = keystore.xkeys_from_seed(' '.join(words[0:12]), "m/")
xprv2, xpub2 = keystore.xkeys_from_seed(' '.join(words[12:]), "m/")
elif n==12:
xprv1, xpub1 = keystore.xkeys_from_seed(seed, "m/0'/")
xprv2, xpub2 = keystore.xkeys_from_seed(seed, "m/1'/")
else:
raise BaseException('unrecognized seed length')
return xprv1, xpub1, xprv2, xpub2
def create_keystore(self, wizard, seed, passphrase):
assert passphrase == ''
# this overloads the wizard's method
words = seed.split()
n = len(words)/2
k1 = keystore.xprv_from_seed(' '.join(words[0:n]))
k2 = keystore.xpub_from_seed(' '.join(words[n:]))
xprv1, xpub1, xprv2, xpub2 = self.xkeys_from_seed(seed)
k1 = keystore.from_xprv(xprv1)
k2 = keystore.from_xpub(xpub2)
wizard.request_password(run_next=lambda pw: self.on_password(wizard, pw, k1, k2))
def on_password(self, wizard, password, k1, k2):
@ -396,10 +409,9 @@ class TrustedCoinPlugin(BasePlugin):
def on_restore_pw(self, wizard, seed, password):
storage = wizard.storage
words = seed.split()
n = len(words)/2
k1 = keystore.xprv_from_seed(' '.join(words[0:n]))
k2 = keystore.xprv_from_seed(' '.join(words[n:]))
xprv1, xpub1, xprv2, xpub2 = self.xkeys_from_seed(seed)
k1 = keystore.from_xprv(xprv1)
k2 = keystore.from_xprv(xprv2)
k1.add_seed(seed)
k1.update_password(None, password)
k2.update_password(None, password)