def ecdsa_raw_sign_one_to_one(msghash, sender_priv, receiver_pub): z = bitcoin.hash_to_int(msghash) k = bitcoin.deterministic_generate_k(msghash, sender_priv) r, y = bitcoin.fast_multiply(bitcoin.decode_pubkey(receiver_pub), k) s = bitcoin.inv(k, N) * (z + r * bitcoin.decode_privkey(sender_priv)) % N v, r, s = 27 + ((y % 2) ^ (0 if s * 2 < N else 1)), r, s if s * 2 < N else N - s return v, r, s
def donation_address(cjtx): reusable_donation_pubkey = '02be838257fbfddabaea03afbb9f16e8529dfe2de921260a5c46036d97b5eacf2a' donation_utxo_data = cjtx.input_utxos.iteritems().next() global donation_utxo donation_utxo = donation_utxo_data[0] privkey = cjtx.wallet.get_key_from_addr(donation_utxo_data[1]['address']) tx = btc.mktx(cjtx.utxo_tx, cjtx.outputs) #tx without our inputs and outputs #address = privtoaddr(privkey) #signing_tx = signature_form(tx, 0, mk_pubkey_script(address), SIGHASH_ALL) msghash = btc.bin_txhash(tx, btc.SIGHASH_ALL) #generate unpredictable k global sign_k sign_k = btc.deterministic_generate_k(msghash, privkey) c = btc.sha256(btc.multiply(reusable_donation_pubkey, sign_k)) sender_pubkey = btc.add_pubkeys(reusable_donation_pubkey, btc.multiply(btc.G, c)) sender_address = btc.pubtoaddr(sender_pubkey, get_p2pk_vbyte()) debug('sending coins to ' + sender_address) return sender_address
def sign(tx_hash: bytes, private_key: str): msg_hash = tx_hash z = bitcoin.hash_to_int(msg_hash) k = bitcoin.deterministic_generate_k(msg_hash, private_key) r, y = bitcoin.fast_multiply(bitcoin.G, k) s = bitcoin.inv(k, bitcoin.N) * ( z + r * bitcoin.decode_privkey(private_key)) % bitcoin.N v, r, s = 27 + ((y % 2) ^ (0 if s * 2 < bitcoin.N else 1) ), r, s if s * 2 < bitcoin.N else bitcoin.N - s if 'compressed' in bitcoin.get_privkey_format(private_key): v += 4 hex_str_r = hex(r)[2:] if len(hex_str_r) < 64: hex_str_r = ((64 - len(hex_str_r)) * "0") + hex_str_r hex_str_s = hex(s)[2:] if len(hex_str_s) < 64: hex_str_s = ((64 - len(hex_str_s)) * "0") + hex_str_s signature = hex_str_r + hex_str_s recovery = v - 27 return signature, recovery