예제 #1
0
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
예제 #2
0
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
예제 #3
0
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
예제 #4
0
 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))
예제 #6
0
 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))
예제 #7
0
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
예제 #8
0
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