def multiply_privkeys(p1, p2, n): f1, f2 = get_privkey_format(p1), get_privkey_format(p2) p = decode_privkey(p1, f1) while n > 0: p = (p + decode_privkey(p2, f2)) % N n -= 1 return encode_privkey(p, f1)
def create_wallet(self, method, input, aes_pw): privkey = '' if method == 'wif': fmt = bc.get_privkey_format(input) if fmt == 'wif': privkey = bc.encode_privkey(input, 'hex') elif fmt == 'wif_compressed': privkey = bc.encode_privkey(input, 'hex_compressed') else: raise Exception('Unrecoginized format for private key.') elif method == 'random': privkey = bc.random_key() else: raise Exception('Unsupported method: {0}.'.format(method)) wal_addr = bc.privtoaddr(privkey, self.magic_byte) encr_privkey = wallet.encrypt_privkey(privkey, aes_pw) wallet.create_wallet_file(self.wallet_filename, encr_privkey, wal_addr) # Read back from wallet to ensure consistency encr_privkey2, wal_addr2 = wallet.read_from_wallet_file(self.wallet_filename) privkey2 = wallet.decrypt_privkey(encr_privkey2, aes_pw) if encr_privkey2 != encr_privkey or wal_addr2 != wal_addr: raise Exception('Inconsistency in reading from/writing to wallet!') if privkey2 != privkey: raise Exception('Inconsistency in encrypting/decrypting private key!') return
def is_wif_privkey_valid(self, privkey): try: frm = bc.get_privkey_format(privkey) except: return False if frm == 'wif' or frm == 'wif_compressed': return True else: return False
def __init__(self, private_key=None, compressed=False): """ Takes in a private key/secret exponent. """ self._compressed = compressed if not private_key: secret_exponent = random_secret_exponent(self._curve.order) else: secret_exponent = encode_privkey(private_key, 'decimal') if get_privkey_format(private_key).endswith('compressed'): self._compressed = True # make sure that: 1 <= secret_exponent < curve_order if not is_secret_exponent(secret_exponent, self._curve.order): raise IndexError(_errors["EXPONENT_OUTSIDE_CURVE_ORDER"]) self._ecdsa_private_key = ecdsa.keys.SigningKey.from_secret_exponent( secret_exponent, self._curve, self._hash_function )
def get_wif_privkey(self, pw): if not self.is_wallet_loaded: raise Exception('Tried getting private key when wallet not loaded.') prv = '' try: prv = wallet.decrypt_privkey(self.encr_privkey, pw) except: raise PasswordError("Wrong password!") frm = bc.get_privkey_format(prv) if frm == 'hex': wif_privkey = bc.encode_privkey(prv, 'wif', self.magic_byte) elif frm == 'hex_compressed': wif_privkey = bc.encode_privkey(prv, 'wif_compressed', self.magic_byte) else: raise Exception('Unrecognized private key format: ' + frm) return wif_privkey