|
3 | 3 | from pactus.crypto.bls import PrivateKey as BLSPrivateKey |
4 | 4 | from pactus.crypto.bls import PublicKey as BLSPublicKey |
5 | 5 | from pactus.crypto.bls import Signature as BLSSignature |
| 6 | +from pactus.crypto import Address |
6 | 7 |
|
7 | 8 |
|
8 | 9 | class TestBLSCrypto(unittest.TestCase): |
9 | | - def test_private_key_to_public_key(self): |
10 | | - prv_str = "SECRET1PDRWTLP5PX0FAHDX39GXZJP7FKZFALML0D5U9TT9KVQHDUC99CMGQQJVK67" |
11 | | - expected_pub_str = "public1p4u8hfytl2pj6l9rj0t54gxcdmna4hq52ncqkkqjf3arha5mlk3x4mzpyjkhmdl20jae7f65aamjrvqcvf4sudcapz52ctcwc8r9wz3z2gwxs38880cgvfy49ta5ssyjut05myd4zgmjqstggmetyuyg7v5jhx47a" |
| 10 | + def test_encoding(self): |
| 11 | + prv_data = "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" |
| 12 | + pub_data = "a7290fc800d2d14f2dc5e5cb416bebf3267dfed1c6c3a79c6edc4ebd1e657d956daa06a2fcaafd42c94b65b32d4d43ea1368f861006829c475b7d54763a502dfd717e9d51c5cc7deae2981e56090a821c9c5bcafc129b8599203ab99031f4ce7" |
| 13 | + val_addr_data = "01c40b914373d4fc9c1e4611ad0acd5f23abf58a0d" |
| 14 | + acc_addr_data = "02c40b914373d4fc9c1e4611ad0acd5f23abf58a0d" |
| 15 | + |
| 16 | + prv_str = "SECRET1PQQQSYQCYQ5RQWZQFPG9SCRGWPUGPZYSNZS23V9CCRYDPK8QARC0SEZYD4L" |
| 17 | + pub_str = "public1p5u5sljqq6tg57tw9uh95z6lt7vn8mlk3cmp608rwm38t68n90k2km2sx5t724l2ze99ktvedf4p75ymglpssq6pfc36m0428vwjs9h7hzl5a28zucl02u2vpu4sfp2ppe8zmet7p9xu9nysr4wvsx86vuujrva2z" |
| 18 | + val_addr_str = "pc1pcs9ezsmn6n7fc8jxzxks4n2lyw4ltzsdc9v8qn" |
| 19 | + acc_addr_str = "pc1zcs9ezsmn6n7fc8jxzxks4n2lyw4ltzsd9wu6hw" |
12 | 20 |
|
13 | 21 | prv = BLSPrivateKey.from_string(prv_str) |
14 | | - pub = prv.public_key() |
15 | | - pub_str = pub.string() |
| 22 | + pub = BLSPublicKey.from_string(pub_str) |
| 23 | + val_addr = Address.from_string(val_addr_str) |
| 24 | + acc_addr = Address.from_string(acc_addr_str) |
16 | 25 |
|
17 | | - self.assertEqual(pub_str, expected_pub_str) |
| 26 | + self.assertEqual(prv_data, prv.raw_bytes().hex()) |
| 27 | + self.assertEqual(pub_data, pub.raw_bytes().hex()) |
| 28 | + self.assertEqual(val_addr_data, val_addr.raw_bytes().hex()) |
| 29 | + self.assertEqual(acc_addr_data, acc_addr.raw_bytes().hex()) |
18 | 30 |
|
19 | | - def test_public_key_to_address(self): |
20 | | - pub_str = "public1p4u8hfytl2pj6l9rj0t54gxcdmna4hq52ncqkkqjf3arha5mlk3x4mzpyjkhmdl20jae7f65aamjrvqcvf4sudcapz52ctcwc8r9wz3z2gwxs38880cgvfy49ta5ssyjut05myd4zgmjqstggmetyuyg7v5jhx47a" |
21 | | - expected_acc_addr_str = "pc1z5x2a0lkt5nrrdqe0rkcv6r4pfkmdhrr3mawvua" |
22 | | - expected_val_addr_str = "pc1p5x2a0lkt5nrrdqe0rkcv6r4pfkmdhrr3xk73tq" |
| 31 | + msg = b"pactus" |
| 32 | + sig = BLSSignature.from_string( |
| 33 | + "8bdda74336efdf43b428a3811d3d6867a19e20889c91261b02a6b950b130f5bb22621394667c27660bfed2a8719d9c52" |
| 34 | + ) |
23 | 35 |
|
24 | | - pub = BLSPublicKey.from_string(pub_str) |
25 | | - acc_add_str = pub.account_address().string() |
26 | | - val_add_str = pub.validator_address().string() |
| 36 | + self.assertTrue(pub.verify(msg, sig)) |
| 37 | + self.assertEqual(sig.raw_bytes(), prv.sign(msg).raw_bytes()) |
| 38 | + self.assertEqual(pub.raw_bytes(), prv.public_key().raw_bytes()) |
| 39 | + self.assertEqual(val_addr.raw_bytes(), pub.validator_address().raw_bytes()) |
| 40 | + self.assertEqual(acc_addr.raw_bytes(), pub.account_address().raw_bytes()) |
27 | 41 |
|
28 | | - self.assertEqual(acc_add_str, expected_acc_addr_str) |
29 | | - self.assertEqual(val_add_str, expected_val_addr_str) |
| 42 | + def test_sign_and_verify(self): |
| 43 | + prv1 = BLSPrivateKey.random() |
| 44 | + prv2 = BLSPrivateKey.random() |
| 45 | + pub1 = prv1.public_key() |
| 46 | + pub2 = prv2.public_key() |
30 | 47 |
|
31 | | - def test_sign(self): |
32 | | - prv_str = "SECRET1PDRWTLP5PX0FAHDX39GXZJP7FKZFALML0D5U9TT9KVQHDUC99CMGQQJVK67" |
33 | | - prv = BLSPrivateKey.from_string(prv_str) |
34 | | - prv.public_key() |
35 | 48 | msg = b"pactus" |
36 | | - prv.sign(msg) |
37 | | - BLSSignature.from_string( |
38 | | - "923d67a8624cbb7972b29328e15ec76cc846076ccf00a9e94d991c677846f334ae4ba4551396fbcd6d1cab7593baf3b7" |
39 | | - ) |
| 49 | + sig1 = prv1.sign(msg) |
| 50 | + sig2 = prv2.sign(msg) |
| 51 | + |
| 52 | + self.assertTrue(pub1.verify(msg, sig1)) |
| 53 | + self.assertTrue(pub2.verify(msg, sig2)) |
| 54 | + self.assertFalse(pub1.verify(msg, sig2)) |
| 55 | + self.assertFalse(pub2.verify(msg, sig1)) |
| 56 | + |
| 57 | + # Verify a signature for a different message is rejected |
| 58 | + different_msg = b"different" |
| 59 | + sig3 = prv1.sign(different_msg) |
| 60 | + self.assertFalse(pub1.verify(msg, sig3)) |
| 61 | + |
| 62 | + def test_multiple_signatures(self): |
| 63 | + # Test that multiple signatures for the same message and key are deterministic |
| 64 | + prv = BLSPrivateKey.random() |
| 65 | + pub = prv.public_key() |
| 66 | + |
| 67 | + msg = b"pactus" |
| 68 | + sig1 = prv.sign(msg) |
| 69 | + sig2 = prv.sign(msg) |
| 70 | + |
| 71 | + # Both signatures should verify |
| 72 | + self.assertTrue(pub.verify(msg, sig1)) |
| 73 | + self.assertTrue(pub.verify(msg, sig2)) |
40 | 74 |
|
41 | | - # self.assertEqual(sig.string(), expected_sig.string()) |
42 | | - # self.assertTrue(pub.verify(msg, sig)) |
43 | | - # self.assertFalse(pub.verify(b"foo", sig)) |
| 75 | + self.assertEqual(sig1.raw_bytes(), sig2.raw_bytes()) |
44 | 76 |
|
45 | 77 | def test_key_gen(self): |
46 | 78 | tests = [ |
|
0 commit comments