1
0

use dumpprivkeys to efficiently dump private keys

This commit is contained in:
thomasv
2013-02-26 16:03:04 +01:00
parent f58e541384
commit 96d459ab88
4 changed files with 40 additions and 24 deletions

View File

@@ -435,13 +435,16 @@ class DeterministicSequence:
public_key2 = ecdsa.VerifyingKey.from_public_point( pubkey_point, curve = SECP256k1 )
return '04' + public_key2.to_string().encode('hex')
def get_private_key(self, n, for_change, seed):
def get_private_key_from_stretched_exponent(self, n, for_change, secexp):
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
return SecretToASecret( pk, compressed )
def get_private_key(self, n, for_change, seed):
secexp = self.stretch_key(seed)
return self.get_private_key_from_stretched_exponent(n, for_change, secexp)
def check_seed(self, seed):
curve = SECP256k1

View File

@@ -22,7 +22,7 @@ from bitcoin import *
from decimal import Decimal
import bitcoin
protected_commands = ['payto', 'password', 'mktx', 'get_seed', 'importprivkey','signmessage', 'signrawtransaction','dumpprivkey' ]
protected_commands = ['payto', 'password', 'mktx', 'get_seed', 'importprivkey','signmessage', 'signrawtransaction', 'dumpprivkey', 'dumpprivkeys' ]
class Commands:
@@ -135,8 +135,11 @@ class Commands:
print_msg(self.wallet.unprioritize(addr))
def dumpprivkey(self, addr):
sec = self.wallet.get_private_key(addr, self.password)
print_msg( sec )
print_msg( self.wallet.get_private_key(addr, self.password) )
def dumpprivkeys(self, addresses):
print_json( self.wallet.get_private_keys(addresses, self.password) )
def validateaddress(self,addr):
is_valid = self.wallet.is_valid(addr)

View File

@@ -213,23 +213,29 @@ class Wallet:
return seed
def get_private_key(self, address, password):
return self.get_private_keys([address], password)[address]
def get_private_keys(self, addresses, password):
# decode seed in any case, in order to test the password
seed = self.decode_seed(password)
if address in self.imported_keys.keys():
return pw_decode( self.imported_keys[address], password )
else:
if address in self.addresses:
n = self.addresses.index(address)
for_change = False
elif address in self.change_addresses:
n = self.change_addresses.index(address)
for_change = True
secexp = self.sequence.stretch_key(seed)
out = {}
for address in addresses:
if address in self.imported_keys.keys():
pk = pw_decode( self.imported_keys[address], password )
else:
raise BaseException("unknown address", address)
if address in self.addresses:
n = self.addresses.index(address)
for_change = False
elif address in self.change_addresses:
n = self.change_addresses.index(address)
for_change = True
else:
raise BaseException("unknown address", address)
pk = self.sequence.get_private_key_from_stretched_exponent(n, for_change, secexp)
out[address] = pk
return out
return self.sequence.get_private_key(n, for_change, seed)
def sign_message(self, address, message, password):