def get_verifying_key(serialized_msg, serialized_sig): """Attempts to recover a public key from a message and a signature. Args: serialized_msg (str): A serialized message. serialized_sig (str): A serialized signature. Returns: str: a public key. """ v, r, s = pybitcointools.decode_sig(serialized_sig) msghash = pybitcointools.electrum_sig_hash(serialized_msg) z = pybitcointools.hash_to_int(msghash) compress = True if v >= 31 else False if compress: rec = v - 31 else: rec = v - 27 try: pubkey = nativeECDSA.recover_pubkey( str(z), str(r), str(s), int(rec)) except Exception as ex: logger.warn('Unable to extract public key from signature' + ex.args[0]) return "" pubkey = pubkey.translate(None, 'h') # strip out hex indicators from opencpp pubkey = '04' + pubkey # indicate uncompressed pubkey if compress: pubkey = pybitcointools.compress(pubkey) return pubkey
def recover_pubkey(message, signature): v, r, s = pybitcointools.decode_sig(signature) msghash = pybitcointools.electrum_sig_hash(message) z = pybitcointools.hash_to_int(msghash) compress = True if v >= 31 else False if compress: rec = v - 31 else: rec = v - 27 try: pubkey = nativeECDSA.recover_pubkey(str(z), str(r), str(s), int(rec)) except ValueError as ex: LOGGER.warning('Unable to extract public key from signature' + ex.args[0]) return "" try: # pybitcointools package pubkey = pubkey.translate(None, 'h') except TypeError: # bitcoin package pubkey = pubkey.translate('h') pubkey = '04' + pubkey if compress: pubkey = pybitcointools.compress(pubkey) return pubkey
def test_compressed_keys(self): """ Tests compressed key """ msg = 'foo' priv = pbt.encode_privkey(pbt.random_key(), 'hex_compressed') sig = pbt.ecdsa_sign(msg, priv) # Force old pybitcointools to behave v, r, s = pbt.decode_sig(sig) if v < 31: v += 4 sig = pbt.encode_sig(v, r, s) pub = pbt.compress(pbt.privtopub(priv)) native_recovered = pbct_nativerecover.recover_pubkey(msg, sig) self.assertEquals(native_recovered, pub, "Priv Key that failed: {}".format(priv))
def test_compressed_keys(self): """ Tests compressed key """ msg = 'foo' self.longMessage = True priv = pbt.encode_privkey(pbt.random_key(), 'hex_compressed') sig = pbt.ecdsa_sign(msg, priv) # Force old pybitcointools to behave v, r, s = pbt.decode_sig(sig) if v < 31: v += 4 sig = pbt.encode_sig(v, r, s) pub = pbt.compress(pbt.privtopub(priv)) native_recovered = gossip.signed_object.get_verifying_key(msg, sig) self.assertEquals(native_recovered, pub, "Priv Key that failed: {}".format(priv))
def recover_pubkey(message, signature): v, r, s = pybitcointools.decode_sig(signature) msghash = pybitcointools.electrum_sig_hash(message) q = pybitcointools.ecdsa_raw_recover(msghash, (v, r, s)) # A prior implementation set the behavior that this # method should return an encoded recovered pubkey or # an empty string if there is a recovery error. This # differs from the pybitcointools implementation of # ecdsa_recover, which returns the recovered pubkey # or False, if a recovery error occurs. if not q: return "" compress = True if v >= 31 else False if compress: pubkey = pybitcointools.encode_pubkey(q, 'hex_compressed') else: pubkey = pybitcointools.encode_pubkey(q, 'hex') return pubkey
def get_verifying_key(serialized_msg, serialized_sig): """Attempts to recover a public key from a message and a signature. Args: serialized_msg (str): A serialized message. serialized_sig (str): A serialized signature. Returns: str: a public key. """ v, r, s = pybitcointools.decode_sig(serialized_sig) msghash = pybitcointools.electrum_sig_hash(serialized_msg) z = pybitcointools.hash_to_int(msghash) yBit = v - 27 try: pubkey = nativeECDSA.recover_pubkey(str(z), str(r), str(s), int(yBit)) except Exception as ex: logger.warn('Unable to extract public key from signature' + ex.args[0]) return "" pubkey = pubkey.translate(None, 'h') # strip out hex indicators from opencpp pubkey = "04" + pubkey # add header to match pybitcointools format return pubkey
def get_verifying_key(serialized_msg, serialized_sig): """Attempts to recover a public key from a message and a signature. Args: serialized_msg (str): A serialized message. serialized_sig (str): A serialized signature. Returns: str: a public key. """ v, r, s = pybitcointools.decode_sig(serialized_sig) msghash = pybitcointools.electrum_sig_hash(serialized_msg) z = pybitcointools.hash_to_int(msghash) yBit = v - 27 try: pubkey = nativeECDSA.recover_pubkey( str(z), str(r), str(s), int(yBit)) except Exception as ex: logger.warn('Unable to extract public key from signature' + ex.args[0]) return "" pubkey = pubkey.translate(None, 'h') # strip out hex indicators from opencpp pubkey = "04" + pubkey # add header to match pybitcointools format return pubkey