electrum

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

commit 76439beec53e545ef33f083a0c98f27a867ff732
parent 5d6496f1f920aa70b129f1e54321ddd59c766b51
Author: thomasv <thomasv@gitorious>
Date:   Fri, 22 Feb 2013 17:27:19 +0100

simplify get_private_key, use base58

Diffstat:
Melectrum | 6+++---
Mlib/gui_qt.py | 4++--
Mlib/wallet.py | 36++++++++++--------------------------
3 files changed, 15 insertions(+), 31 deletions(-)

diff --git a/electrum b/electrum @@ -561,7 +561,7 @@ if __name__ == '__main__': else: b='' m_addr = "%34s"%addr if options.show_keys: - m_addr += ':' + str(wallet.get_private_key_base58(addr, password)) + m_addr += ':' + str(wallet.get_private_key(addr, password)) print_msg(flags, m_addr, b, label) if cmd == 'history': @@ -703,7 +703,7 @@ if __name__ == '__main__': elif cmd == 'dumpprivkey': addr = args[1] - sec = wallet.get_private_key_base58(addr, password) + sec = wallet.get_private_key(addr, password) print_msg( sec ) @@ -770,7 +770,7 @@ if __name__ == '__main__': if not private_keys: for txin in tx.inputs: addr = txin['address'] - private_keys[addr] = wallet.get_private_key_base58(addr, password) + private_keys[addr] = wallet.get_private_key(addr, password) else: pk = {} for sec in private_keys: diff --git a/lib/gui_qt.py b/lib/gui_qt.py @@ -1456,7 +1456,7 @@ class ElectrumWindow(QMainWindow): password = None try: - pk = self.wallet.get_private_key_base58(address, password) + pk = self.wallet.get_private_key(address, password) except BaseException, e: self.show_message(str(e)) return @@ -1748,7 +1748,7 @@ class ElectrumWindow(QMainWindow): for addr in self.wallet.all_addresses(): m_addr = "%34s"%addr - transaction.writerow([m_addr, str(self.wallet.get_private_key_base58(addr, password))]) + transaction.writerow([m_addr, str(self.wallet.get_private_key(addr, password))]) self.show_message(_("Private keys exported.")) diff --git a/lib/wallet.py b/lib/wallet.py @@ -174,23 +174,14 @@ class Wallet: def get_sequence(self,n,for_change): return string_to_number( Hash( "%d:%d:"%(n,for_change) + self.master_public_key.decode('hex') ) ) - def get_private_key_base58(self, address, password): - secexp, compressed = self.get_private_key(address, password) - if secexp is None: return None - pk = number_to_string( secexp, generator_secp256k1.order() ) - return SecretToASecret( pk, compressed ) - def get_private_key(self, address, password): """ Privatekey(type,n) = Master_private_key + H(n|S|type) """ - order = generator_secp256k1.order() - + + # decode seed in any case, in order to make test the password + seed = self.decode_seed(password) + if address in self.imported_keys.keys(): - sec = self.pw_decode( self.imported_keys[address], password ) - if not sec: return None, None - pkey = regenerate_key(sec) - compressed = is_compressed(sec) - secexp = pkey.secret - + return self.pw_decode( self.imported_keys[address], password ) else: if address in self.addresses: n = self.addresses.index(address) @@ -201,23 +192,16 @@ class Wallet: else: raise BaseException("unknown address", address) - seed = self.pw_decode( self.seed, password) - if not seed: return None + order = generator_secp256k1.order() secexp = self.stretch_key(seed) secexp = ( secexp + self.get_sequence(n,for_change) ) % order + pk = number_to_string( secexp, generator_secp256k1.order() ) compressed = False - pkey = EC_KEY(secexp) - - public_key = GetPubKey(pkey.pubkey, compressed) - addr = public_key_to_bc_address(public_key) - if addr != address: - print_error('Invalid password with correct decoding') - raise BaseException('Invalid password') + return SecretToASecret( pk, compressed ) - return secexp, compressed def sign_message(self, address, message, password): - sec = self.get_private_key_base58(address, password) + sec = self.get_private_key(address, password) key = regenerate_key(sec) compressed = is_compressed(sec) return key.sign_message(message, compressed, address) @@ -762,7 +746,7 @@ class Wallet: private_keys = {} for txin in tx.inputs: addr = txin['address'] - sec = self.get_private_key_base58(addr, password) + sec = self.get_private_key(addr, password) private_keys[addr] = sec tx.sign(private_keys) return str(tx)