electrum

Electrum Bitcoin wallet
git clone https://git.parazyd.org/electrum
Log | Files | Refs | Submodules

commit 296f30b92468ccd19ec8ea9bed0998b9f036256d
parent 997dd17933feb5c5ac2afd2fada7d4af0674f444
Author: ThomasV <thomasv@electrum.org>
Date:   Tue, 27 Sep 2016 13:21:25 +0200

trustedcoin: use 12-word seeds with separate derivations

Diffstat:
Mlib/bitcoin.py | 7+++++++
Mlib/keystore.py | 10----------
Mplugins/trustedcoin/trustedcoin.py | 30+++++++++++++++++++++---------
3 files changed, 28 insertions(+), 19 deletions(-)

diff --git a/lib/bitcoin.py b/lib/bitcoin.py @@ -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 diff --git a/lib/keystore.py b/lib/keystore.py @@ -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) diff --git a/plugins/trustedcoin/trustedcoin.py b/plugins/trustedcoin/trustedcoin.py @@ -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)