75 lines
2.7 KiB
Python
75 lines
2.7 KiB
Python
import logging
|
|
|
|
from lib.BitcoinECC import BitcoinECC
|
|
from lib.pybitcointools import bitcoin as btctools
|
|
from Config import config
|
|
|
|
# Try to load openssl
|
|
try:
|
|
if not config.use_openssl:
|
|
raise Exception("Disabled by config")
|
|
from lib.opensslVerify import opensslVerify
|
|
logging.info("OpenSSL loaded, version: %s" % opensslVerify.openssl_version)
|
|
except Exception, err:
|
|
logging.info("OpenSSL load failed: %s, falling back to slow bitcoin verify" % err)
|
|
opensslVerify = None
|
|
|
|
|
|
def newPrivatekey(uncompressed=True): # Return new private key
|
|
privatekey = btctools.encode_privkey(btctools.random_key(), "wif")
|
|
return privatekey
|
|
|
|
|
|
def newSeed():
|
|
return btctools.random_key()
|
|
|
|
|
|
def hdPrivatekey(seed, child):
|
|
masterkey = btctools.bip32_master_key(seed)
|
|
childkey = btctools.bip32_ckd(masterkey, child % 100000000) # Too large child id could cause problems
|
|
key = btctools.bip32_extract_key(childkey)
|
|
return btctools.encode_privkey(key, "wif")
|
|
|
|
|
|
def privatekeyToAddress(privatekey): # Return address from private key
|
|
if privatekey.startswith("23") and len(privatekey) > 52: # Backward compatibility to broken lib
|
|
bitcoin = BitcoinECC.Bitcoin()
|
|
bitcoin.BitcoinAddressFromPrivate(privatekey)
|
|
return bitcoin.BitcoinAddresFromPublicKey()
|
|
else:
|
|
try:
|
|
return btctools.privkey_to_address(privatekey)
|
|
except Exception: # Invalid privatekey
|
|
return False
|
|
|
|
|
|
def sign(data, privatekey): # Return sign to data using private key
|
|
if privatekey.startswith("23") and len(privatekey) > 52:
|
|
return None # Old style private key not supported
|
|
sign = btctools.ecdsa_sign(data, privatekey)
|
|
return sign
|
|
|
|
|
|
def signOld(data, privatekey): # Return sign to data using private key (backward compatible old style)
|
|
bitcoin = BitcoinECC.Bitcoin()
|
|
bitcoin.BitcoinAddressFromPrivate(privatekey)
|
|
sign = bitcoin.SignECDSA(data)
|
|
return sign
|
|
|
|
|
|
def verify(data, address, sign): # Verify data using address and sign
|
|
if hasattr(sign, "endswith"):
|
|
if opensslVerify: # Use the faster method if avalible
|
|
pub = opensslVerify.getMessagePubkey(data, sign)
|
|
sign_address = btctools.pubtoaddr(pub)
|
|
else: # Use pure-python
|
|
pub = btctools.ecdsa_recover(data, sign)
|
|
sign_address = btctools.pubtoaddr(pub)
|
|
|
|
if type(address) is list: # Any address in the list
|
|
return sign_address in address
|
|
else: # One possible address
|
|
return sign_address == address
|
|
else: # Backward compatible old style
|
|
bitcoin = BitcoinECC.Bitcoin()
|
|
return bitcoin.VerifyMessageFromBitcoinAddress(address, data, sign)
|