47 lines
1.2 KiB
Python
47 lines
1.2 KiB
Python
|
|
# public and private key utilities
|
|
# also addresses and hashes
|
|
|
|
from hashlib import new as newhash
|
|
from hashlib import sha256
|
|
from os import urandom
|
|
|
|
import base58
|
|
import ecdsa
|
|
from util import *
|
|
|
|
# configurable wif version byte
|
|
# 0x80 - bitcoin
|
|
# 0x9e - dogecoin
|
|
WIF_VER = b'\x9e' if DOGE_MODE else b'\x80'
|
|
|
|
# configurable pub addr version byte
|
|
# 0x00 - bitcoin
|
|
# 0x1e - dogecoin
|
|
ADDR_VER = b'\x1e' if DOGE_MODE else b'\x00'
|
|
|
|
# gen random 256bit prvkey bytes
|
|
def genRandPrvKey(): return urandom( 32 )
|
|
|
|
# get base58 wif privkey from raw privkey bytes
|
|
def getPrvKeyWIF( prv ):
|
|
return base58.encodeCheck( WIF_VER, prv + b'\x01' )
|
|
|
|
# get hash160 bytes of pubkey bytes. base58Check this for addr
|
|
# also used for bip32 ext key identifier. first 32bits of id is the fingerprint
|
|
def getPubKeyHash( pub ):
|
|
rmd = newhash( 'ripemd160' )
|
|
rmd.update( sha256( pub ).digest() )
|
|
return rmd.digest()
|
|
|
|
# pubkey bytes to address, aka base58Check( pubKeyHash )
|
|
def getPubKeyAddr( pub ):
|
|
return base58.encodeCheck( ADDR_VER, getPubKeyHash( pub ) )
|
|
|
|
# get the compressed point pubkey bytes from prvkey bytes
|
|
def getPubKey( prv ):
|
|
# multiplies ecdsa generator point by prvkey
|
|
pub = ecdsa.getPoint( int( prv.hex(), 16 ) )
|
|
return ecdsa.compressPoint( pub )
|
|
|