mirror of
https://github.com/dashpay/dash.git
synced 2024-12-25 03:52:49 +01:00
merge bitcoin#27653: add unit test coverage for Python ECDSA implementation
This commit is contained in:
parent
9f476c6775
commit
32500f2acd
@ -287,24 +287,33 @@ def sign_schnorr(key, msg, aux=None, flip_p=False, flip_r=False):
|
|||||||
|
|
||||||
|
|
||||||
class TestFrameworkKey(unittest.TestCase):
|
class TestFrameworkKey(unittest.TestCase):
|
||||||
def test_schnorr(self):
|
def test_ecdsa_and_schnorr(self):
|
||||||
"""Test the Python Schnorr implementation."""
|
"""Test the Python ECDSA and Schnorr implementations."""
|
||||||
|
def random_bitflip(sig):
|
||||||
|
sig = list(sig)
|
||||||
|
sig[random.randrange(len(sig))] ^= (1 << (random.randrange(8)))
|
||||||
|
return bytes(sig)
|
||||||
|
|
||||||
byte_arrays = [generate_privkey() for _ in range(3)] + [v.to_bytes(32, 'big') for v in [0, ORDER - 1, ORDER, 2**256 - 1]]
|
byte_arrays = [generate_privkey() for _ in range(3)] + [v.to_bytes(32, 'big') for v in [0, ORDER - 1, ORDER, 2**256 - 1]]
|
||||||
keys = {}
|
keys = {}
|
||||||
for privkey in byte_arrays: # build array of key/pubkey pairs
|
for privkey_bytes in byte_arrays: # build array of key/pubkey pairs
|
||||||
pubkey, _ = compute_xonly_pubkey(privkey)
|
privkey = ECKey()
|
||||||
if pubkey is not None:
|
privkey.set(privkey_bytes, compressed=True)
|
||||||
keys[privkey] = pubkey
|
if privkey.is_valid:
|
||||||
|
keys[privkey] = privkey.get_pubkey()
|
||||||
for msg in byte_arrays: # test every combination of message, signing key, verification key
|
for msg in byte_arrays: # test every combination of message, signing key, verification key
|
||||||
for sign_privkey, _ in keys.items():
|
for sign_privkey, _ in keys.items():
|
||||||
sig = sign_schnorr(sign_privkey, msg)
|
sig_ecdsa = sign_privkey.sign_ecdsa(msg)
|
||||||
|
sig_schnorr = sign_schnorr(sign_privkey.get_bytes(), msg)
|
||||||
for verify_privkey, verify_pubkey in keys.items():
|
for verify_privkey, verify_pubkey in keys.items():
|
||||||
|
verify_xonly_pubkey = verify_pubkey.get_bytes()[1:]
|
||||||
if verify_privkey == sign_privkey:
|
if verify_privkey == sign_privkey:
|
||||||
self.assertTrue(verify_schnorr(verify_pubkey, sig, msg))
|
self.assertTrue(verify_pubkey.verify_ecdsa(sig_ecdsa, msg))
|
||||||
sig = list(sig)
|
self.assertTrue(verify_schnorr(verify_xonly_pubkey, sig_schnorr, msg))
|
||||||
sig[random.randrange(64)] ^= (1 << (random.randrange(8))) # damaging signature should break things
|
sig_ecdsa = random_bitflip(sig_ecdsa) # damaging signature should break things
|
||||||
sig = bytes(sig)
|
sig_schnorr = random_bitflip(sig_schnorr)
|
||||||
self.assertFalse(verify_schnorr(verify_pubkey, sig, msg))
|
self.assertFalse(verify_pubkey.verify_ecdsa(sig_ecdsa, msg))
|
||||||
|
self.assertFalse(verify_schnorr(verify_xonly_pubkey, sig_schnorr, msg))
|
||||||
|
|
||||||
def test_schnorr_testvectors(self):
|
def test_schnorr_testvectors(self):
|
||||||
"""Implement the BIP340 test vectors (read from bip340_test_vectors.csv)."""
|
"""Implement the BIP340 test vectors (read from bip340_test_vectors.csv)."""
|
||||||
|
Loading…
Reference in New Issue
Block a user