# 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 )