def test_msgsign_p2pkh_2() -> None: msg = "test message" # sigs are taken from (Electrum and) Bitcoin Core wif = "Ky1XfDK2v6wHPazA6ECaD8UctEoShXdchgABjpU9GWGZDxVRDBMJ" # compressed address = "1DAag8qiPLHh6hMFVu9qJQm9ro1HtwuyK5" exp_sig = "IFqUo4/sxBEFkfK8mZeeN56V13BqOc0D90oPBChF3gTqMXtNSCTN79UxC33kZ8Mi0cHy4zYCnQfCxTyLpMVXKeA=" assert bms.verify(msg, address, exp_sig) sig = bms.sign(msg, wif, address) assert bms.verify(msg, address, sig) assert bms.serialize(*sig) == exp_sig.encode() sig = bms.sign(msg.encode(), wif) assert bms.verify(msg.encode(), address, sig) assert bms.serialize(*sig) == exp_sig.encode() wif = "5JDopdKaxz5bXVYXcAnfno6oeSL8dpipxtU1AhfKe3Z58X48srn" # uncompressed address = "19f7adDYqhHSJm2v7igFWZAqxXHj1vUa3T" exp_sig = "HFqUo4/sxBEFkfK8mZeeN56V13BqOc0D90oPBChF3gTqMXtNSCTN79UxC33kZ8Mi0cHy4zYCnQfCxTyLpMVXKeA=" assert bms.verify(msg, address, exp_sig) sig = bms.sign(msg, wif, address) assert bms.verify(msg, address, sig) assert bms.serialize(*sig) == exp_sig.encode() sig = bms.sign(msg.encode(), wif) assert bms.verify(msg.encode(), address, sig) assert bms.serialize(*sig) == exp_sig.encode()
def test_msgsign_p2pkh_2(self): msg = 'test message' # sigs are taken from (Electrum and) Bitcoin Core # second private key wif = 'Ky1XfDK2v6wHPazA6ECaD8UctEoShXdchgABjpU9GWGZDxVRDBMJ' # compressed address = '1DAag8qiPLHh6hMFVu9qJQm9ro1HtwuyK5' exp_sig = b'IFqUo4/sxBEFkfK8mZeeN56V13BqOc0D90oPBChF3gTqMXtNSCTN79UxC33kZ8Mi0cHy4zYCnQfCxTyLpMVXKeA=' self.assertTrue(bms.verify(msg, address, exp_sig)) sig = bms.sign(msg, wif, address) self.assertTrue(bms.verify(msg, address, sig)) self.assertEqual(bms.serialize(*sig), exp_sig) sig = bms.sign(msg.encode(), wif) self.assertTrue(bms.verify(msg.encode(), address, sig)) self.assertEqual(bms.serialize(*sig), exp_sig) wif = '5JDopdKaxz5bXVYXcAnfno6oeSL8dpipxtU1AhfKe3Z58X48srn' # uncompressed address = '19f7adDYqhHSJm2v7igFWZAqxXHj1vUa3T' exp_sig = b'HFqUo4/sxBEFkfK8mZeeN56V13BqOc0D90oPBChF3gTqMXtNSCTN79UxC33kZ8Mi0cHy4zYCnQfCxTyLpMVXKeA=' self.assertTrue(bms.verify(msg, address, exp_sig)) sig = bms.sign(msg, wif, address) self.assertTrue(bms.verify(msg, address, sig)) self.assertEqual(bms.serialize(*sig), exp_sig) sig = bms.sign(msg.encode(), wif) self.assertTrue(bms.verify(msg.encode(), address, sig)) self.assertEqual(bms.serialize(*sig), exp_sig)
def test_vector_python_bitcoinlib(self): """Test python-bitcoinlib test vectors https://github.com/petertodd/python-bitcoinlib/blob/master/bitcoin/tests/test_data/bms.json """ fname = "bms.json" filename = path.join(path.dirname(__file__), "test_data", fname) with open(filename, "r") as f: test_vectors = json.load(f) for vector in test_vectors[:5]: msg = vector["address"] tuplesig = bms.sign(msg, vector["wif"]) self.assertTrue(bms.verify(msg, vector["address"], tuplesig)) b64sig = bms.serialize(*tuplesig) self.assertTrue(bms.verify(msg, vector["address"], b64sig)) self.assertTrue( bms.verify(msg, vector["address"], vector["signature"])) # python-bitcoinlib has a signature different from the # one generated by Core/Electrum/btclib (which are identical) self.assertNotEqual(b64sig.decode(), vector["signature"]) # python-bitcoinlib does not use RFC6979 deterministic nonce # as proved by different r compared to Core/Electrum/btclib rf, r, s = tuplesig _, r0, _ = bms.deserialize(vector["signature"]) self.assertNotEqual(r, r0) # while Core/Electrum/btclib use "low-s" canonical signature self.assertLess(s, ec.n - s) # this is not true for python-bitcoinlib # self.assertLess(s0, ec.n - s0) # self.assertGreater(s0, ec.n - s0) # just in case you wonder, here's the malleated signature rf += 1 if rf == 31 else -1 tuplesig_malleated = rf, r, ec.n - s self.assertTrue( bms.verify(msg, vector["address"], tuplesig_malleated)) b64sig_malleated = bms.serialize(*tuplesig_malleated) self.assertTrue( bms.verify(msg, vector["address"], b64sig_malleated)) # of course, # it is not equal to the python-bitcoinlib one (different r) self.assertNotEqual(b64sig_malleated.decode(), vector["signature"])
def test_msgsign_p2pkh(self): msg = "test message" # sigs are taken from (Electrum and) Bitcoin Core q = "ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb" # uncompressed wif1u = wif_from_prvkey(q, "mainnet", False) self.assertEqual( wif1u, b"5KMWWy2d3Mjc8LojNoj8Lcz9B1aWu8bRofUgGwQk959Dw5h2iyw") pubkey1u, _ = pubkeyinfo_from_prvkey(wif1u) add1u = base58address.p2pkh(pubkey1u) self.assertEqual(add1u, b"1HUBHMij46Hae75JPdWjeZ5Q7KaL7EFRSD") sig1u = bms.sign(msg, wif1u) self.assertTrue(bms.verify(msg, add1u, sig1u)) self.assertEqual(sig1u[0], 27) exp_sig1u = ("G/iew/NhHV9V9MdUEn/LFOftaTy1ivGPKPKyMlr8OSokNC755fAxpST" "hNRivwTNsyY9vPUDTRYBPc2cmGd5d4y4=").encode() self.assertEqual(bms.serialize(*sig1u), exp_sig1u) # compressed wif1c = wif_from_prvkey(q, "mainnet", True) self.assertEqual( wif1c, b"L41XHGJA5QX43QRG3FEwPbqD5BYvy6WxUxqAMM9oQdHJ5FcRHcGk") pubkey1c, _ = pubkeyinfo_from_prvkey(wif1c) add1c = base58address.p2pkh(pubkey1c) self.assertEqual(add1c, b"14dD6ygPi5WXdwwBTt1FBZK3aD8uDem1FY") sig1c = bms.sign(msg, wif1c) self.assertTrue(bms.verify(msg, add1c, sig1c)) self.assertEqual(sig1c[0], 31) exp_sig1c = ("H/iew/NhHV9V9MdUEn/LFOftaTy1ivGPKPKyMlr8OSokNC755fAxpST" "hNRivwTNsyY9vPUDTRYBPc2cmGd5d4y4=").encode() self.assertEqual(bms.serialize(*sig1c), exp_sig1c) self.assertFalse(bms.verify(msg, add1c, sig1u)) self.assertFalse(bms.verify(msg, add1u, sig1c)) rf, r, s, = sig1c sig1c_malleated_rf = bms.serialize(rf + 1, r, s) self.assertFalse(bms.verify(msg, add1c, sig1c_malleated_rf)) sig1c_malleated_s = bms.serialize(rf, r, ec.n - s) self.assertFalse(bms.verify(msg, add1c, sig1c_malleated_s)) sig1c_malleated_rf_s = bms.serialize(rf + 1, r, ec.n - s) self.assertTrue(bms.verify(msg, add1c, sig1c_malleated_rf_s))
def test_msgsign_p2pkh(self): msg = 'test message' # sigs are taken from (Electrum and) Bitcoin Core # first private key q1 = 91634880152443617534842621287039938041581081254914058002978601050179556493499 # uncompressed wif1u = wif_from_prvkey(q1, 'mainnet', False) self.assertEqual( wif1u, b'5KMWWy2d3Mjc8LojNoj8Lcz9B1aWu8bRofUgGwQk959Dw5h2iyw') pubkey1u, _ = pubkey_info_from_prvkey(wif1u) add1u = base58address.p2pkh(pubkey1u) self.assertEqual(add1u, b'1HUBHMij46Hae75JPdWjeZ5Q7KaL7EFRSD') sig1u = bms.sign(msg, wif1u) self.assertTrue(bms.verify(msg, add1u, sig1u)) self.assertEqual(sig1u[0], 27) exp_sig1u = b'G/iew/NhHV9V9MdUEn/LFOftaTy1ivGPKPKyMlr8OSokNC755fAxpSThNRivwTNsyY9vPUDTRYBPc2cmGd5d4y4=' self.assertEqual(bms.serialize(*sig1u), exp_sig1u) # compressed wif1c = wif_from_prvkey(q1, 'mainnet', True) self.assertEqual( wif1c, b'L41XHGJA5QX43QRG3FEwPbqD5BYvy6WxUxqAMM9oQdHJ5FcRHcGk') pubkey1c, _ = pubkey_info_from_prvkey(wif1c) add1c = base58address.p2pkh(pubkey1c) self.assertEqual(add1c, b'14dD6ygPi5WXdwwBTt1FBZK3aD8uDem1FY') sig1c = bms.sign(msg, wif1c) self.assertTrue(bms.verify(msg, add1c, sig1c)) self.assertEqual(sig1c[0], 31) exp_sig1c = b'H/iew/NhHV9V9MdUEn/LFOftaTy1ivGPKPKyMlr8OSokNC755fAxpSThNRivwTNsyY9vPUDTRYBPc2cmGd5d4y4=' self.assertEqual(bms.serialize(*sig1c), exp_sig1c) self.assertFalse(bms.verify(msg, add1c, sig1u)) self.assertFalse(bms.verify(msg, add1u, sig1c)) rf, r, s, = sig1c sig1c_malleated_rf = bms.serialize(rf + 1, r, s) self.assertFalse(bms.verify(msg, add1c, sig1c_malleated_rf)) sig1c_malleated_s = bms.serialize(rf, r, ec.n - s) self.assertFalse(bms.verify(msg, add1c, sig1c_malleated_s)) sig1c_malleated_rf_s = bms.serialize(rf + 1, r, ec.n - s) self.assertTrue(bms.verify(msg, add1c, sig1c_malleated_rf_s))
def test_sign_strippable_message(self): wif = 'Ky1XfDK2v6wHPazA6ECaD8UctEoShXdchgABjpU9GWGZDxVRDBMJ' address = '1DAag8qiPLHh6hMFVu9qJQm9ro1HtwuyK5' msg = '' exp_sig = b'IFh0InGTy8lLCs03yoUIpJU6MUbi0La/4abhVxyKcCsoUiF3RM7lg51rCqyoOZ8Yt43h8LZrmj7nwwO3HIfesiw=' self.assertTrue(bms.verify(msg, address, exp_sig)) sig = bms.sign(msg, wif) self.assertTrue(bms.verify(msg, address, sig)) self.assertEqual(bms.serialize(*sig), exp_sig) # Bitcoin Core exp_sig (Electrum does strip leading/trailing spaces) msg = ' ' exp_sig = b'IEveV6CMmOk5lFP+oDbw8cir/OkhJn4S767wt+YwhzHnEYcFOb/uC6rrVmTtG3M43mzfObA0Nn1n9CRcv5IGyak=' self.assertTrue(bms.verify(msg, address, exp_sig)) sig = bms.sign(msg, wif) self.assertTrue(bms.verify(msg, address, sig)) self.assertEqual(bms.serialize(*sig), exp_sig) # Bitcoin Core exp_sig (Electrum does strip leading/trailing spaces) msg = ' ' exp_sig = b'H/QjF1V4fVI8IHX8ko0SIypmb0yxfaZLF0o56Cif9z8CX24n4petTxolH59pYVMvbTKQkGKpznSiPiQVn83eJF0=' self.assertTrue(bms.verify(msg, address, exp_sig)) sig = bms.sign(msg, wif) self.assertTrue(bms.verify(msg, address, sig)) self.assertEqual(bms.serialize(*sig), exp_sig) msg = 'test' exp_sig = b'IJUtN/2LZjh1Vx8Ekj9opnIKA6ohKhWB95PLT/3EFgLnOu9hTuYX4+tJJ60ZyddFMd6dgAYx15oP+jLw2NzgNUo=' self.assertTrue(bms.verify(msg, address, exp_sig)) sig = bms.sign(msg, wif) self.assertTrue(bms.verify(msg, address, sig)) self.assertEqual(bms.serialize(*sig), exp_sig) # Bitcoin Core exp_sig (Electrum does strip leading/trailing spaces) msg = ' test ' exp_sig = b'IA59z13/HBhvMMJtNwT6K7vJByE40lQUdqEMYhX2tnZSD+IGQIoBGE+1IYGCHCyqHvTvyGeqJTUx5ywb4StuX0s=' self.assertTrue(bms.verify(msg, address, exp_sig)) sig = bms.sign(msg, wif) self.assertTrue(bms.verify(msg, address, sig)) self.assertEqual(bms.serialize(*sig), exp_sig) # Bitcoin Core exp_sig (Electrum does strip leading/trailing spaces) msg = 'test ' exp_sig = b'IPp9l2w0LVYB4FYKBahs+k1/Oa08j+NTuzriDpPWnWQmfU0+UsJNLIPI8Q/gekrWPv6sDeYsFSG9VybUKDPGMuo=' self.assertTrue(bms.verify(msg, address, exp_sig)) sig = bms.sign(msg, wif) self.assertTrue(bms.verify(msg, address, sig)) self.assertEqual(bms.serialize(*sig), exp_sig) # Bitcoin Core exp_sig (Electrum does strip leading/trailing spaces) msg = ' test' exp_sig = b'H1nGwD/kcMSmsYU6qihV2l2+Pa+7SPP9zyViZ59VER+QL9cJsIAtu1CuxfYDAVt3kgr4t3a/Es3PV82M6z0eQAo=' self.assertTrue(bms.verify(msg, address, exp_sig)) sig = bms.sign(msg, wif) self.assertTrue(bms.verify(msg, address, sig)) self.assertEqual(bms.serialize(*sig), exp_sig)
def test_segwit(self): msg = "test" wif = "L4xAvhKR35zFcamyHME2ZHfhw5DEyeJvEMovQHQ7DttPTM8NLWCK" pubkey, _ = pubkeyinfo_from_prvkey(wif) p2pkh = base58address.p2pkh(pubkey) p2wpkh = bech32address.p2wpkh(pubkey) p2wpkh_p2sh = base58address.p2wpkh_p2sh(pubkey) # p2pkh base58 address (Core, Electrum, BIP137) exp_sig = ("IBFyn+h9m3pWYbB4fBFKlRzBD4eJKojgCIZSNdhLKKHPSV2/WkeV7R7IO" "I0dpo3uGAEpCz9eepXLrA5kF35MXuU=").encode() self.assertTrue(bms.verify(msg, p2pkh, exp_sig)) sig = bms.sign(msg, wif) # no address: p2pkh assumed self.assertTrue(bms.verify(msg, p2pkh, sig)) self.assertEqual(bms.serialize(*sig), exp_sig) # p2wpkh-p2sh base58 address (Electrum) self.assertTrue(bms.verify(msg, p2wpkh_p2sh, sig)) # p2wpkh bech32 address (Electrum) self.assertTrue(bms.verify(msg, p2wpkh, sig)) # p2wpkh-p2sh base58 address (BIP137) # different first letter in sig because of different rf exp_sig = ("JBFyn+h9m3pWYbB4fBFKlRzBD4eJKojgCIZSNdhLKKHPSV2/WkeV7R7IO" "I0dpo3uGAEpCz9eepXLrA5kF35MXuU=").encode() self.assertTrue(bms.verify(msg, p2wpkh_p2sh, exp_sig)) sig = bms.sign(msg, wif, p2wpkh_p2sh) self.assertTrue(bms.verify(msg, p2wpkh_p2sh, sig)) self.assertEqual(bms.serialize(*sig), exp_sig) # p2wpkh bech32 address (BIP137) # different first letter in sig because of different rf exp_sig = ("KBFyn+h9m3pWYbB4fBFKlRzBD4eJKojgCIZSNdhLKKHPSV2/WkeV7R7IO" "I0dpo3uGAEpCz9eepXLrA5kF35MXuU=").encode() self.assertTrue(bms.verify(msg, p2wpkh, exp_sig)) sig = bms.sign(msg, wif, p2wpkh) self.assertTrue(bms.verify(msg, p2wpkh, sig)) self.assertEqual(bms.serialize(*sig), exp_sig)
def test_msgsign_p2pkh() -> None: msg = "test message" # sigs are taken from (Electrum and) Bitcoin Core q = "ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb" # uncompressed wif1u = wif_from_prvkey(q, "mainnet", False) assert wif1u == b"5KMWWy2d3Mjc8LojNoj8Lcz9B1aWu8bRofUgGwQk959Dw5h2iyw" add1u = base58address.p2pkh(wif1u) assert add1u == b"1HUBHMij46Hae75JPdWjeZ5Q7KaL7EFRSD" sig1u = bms.sign(msg, wif1u) assert bms.verify(msg, add1u, sig1u) assert sig1u[0] == 27 exp_sig1u = "G/iew/NhHV9V9MdUEn/LFOftaTy1ivGPKPKyMlr8OSokNC755fAxpSThNRivwTNsyY9vPUDTRYBPc2cmGd5d4y4=" assert bms.serialize(*sig1u) == exp_sig1u.encode() # compressed wif1c = wif_from_prvkey(q, "mainnet", True) assert wif1c == b"L41XHGJA5QX43QRG3FEwPbqD5BYvy6WxUxqAMM9oQdHJ5FcRHcGk" add1c = base58address.p2pkh(wif1c) assert add1c == b"14dD6ygPi5WXdwwBTt1FBZK3aD8uDem1FY" sig1c = bms.sign(msg, wif1c) assert bms.verify(msg, add1c, sig1c) assert sig1c[0] == 31 exp_sig1c = "H/iew/NhHV9V9MdUEn/LFOftaTy1ivGPKPKyMlr8OSokNC755fAxpSThNRivwTNsyY9vPUDTRYBPc2cmGd5d4y4=" assert bms.serialize(*sig1c) == exp_sig1c.encode() assert not bms.verify(msg, add1c, sig1u) assert not bms.verify(msg, add1u, sig1c) rf, r, s = sig1c sig1c_malleated_rf = bms.serialize(rf + 1, r, s) assert not bms.verify(msg, add1c, sig1c_malleated_rf) sig1c_malleated_s = bms.serialize(rf, r, ec.n - s) assert not bms.verify(msg, add1c, sig1c_malleated_s) sig1c_malleated_rf_s = bms.serialize(rf + 1, r, ec.n - s) assert bms.verify(msg, add1c, sig1c_malleated_rf_s)
def test_signature(self): msg = 'test message' wif, addr = bms.gen_keys() sig = bms.sign(msg, wif) self.assertTrue(bms.verify(msg, addr, sig)) # sig taken from (Electrum and) Bitcoin Core wif, addr = bms.gen_keys( b'5KMWWy2d3Mjc8LojNoj8Lcz9B1aWu8bRofUgGwQk959Dw5h2iyw') exp_sig = b'G/iew/NhHV9V9MdUEn/LFOftaTy1ivGPKPKyMlr8OSokNC755fAxpSThNRivwTNsyY9vPUDTRYBPc2cmGd5d4y4=' sig = bms.sign(msg, wif) self.assertEqual(exp_sig, bms.serialize(*sig)) self.assertEqual(sig, bms.deserialize(sig)) self.assertTrue(bms.verify(msg, addr, sig))
def test_segwit() -> None: msg = "test" wif = "L4xAvhKR35zFcamyHME2ZHfhw5DEyeJvEMovQHQ7DttPTM8NLWCK" p2pkh = base58address.p2pkh(wif) p2wpkh = bech32address.p2wpkh(wif) p2wpkh_p2sh = base58address.p2wpkh_p2sh(wif) # p2pkh base58 address (Core, Electrum, BIP137) exp_sig = "IBFyn+h9m3pWYbB4fBFKlRzBD4eJKojgCIZSNdhLKKHPSV2/WkeV7R7IOI0dpo3uGAEpCz9eepXLrA5kF35MXuU=" assert bms.verify(msg, p2pkh, exp_sig) sig = bms.sign(msg, wif) # no address: p2pkh assumed assert bms.verify(msg, p2pkh, sig) assert bms.serialize(*sig) == exp_sig.encode() # p2wpkh-p2sh base58 address (Electrum) assert bms.verify(msg, p2wpkh_p2sh, sig) # p2wpkh bech32 address (Electrum) assert bms.verify(msg, p2wpkh, sig) # p2wpkh-p2sh base58 address (BIP137) # different first letter in sig because of different rf exp_sig = "JBFyn+h9m3pWYbB4fBFKlRzBD4eJKojgCIZSNdhLKKHPSV2/WkeV7R7IOI0dpo3uGAEpCz9eepXLrA5kF35MXuU=" assert bms.verify(msg, p2wpkh_p2sh, exp_sig) sig = bms.sign(msg, wif, p2wpkh_p2sh) assert bms.verify(msg, p2wpkh_p2sh, sig) assert bms.serialize(*sig) == exp_sig.encode() # p2wpkh bech32 address (BIP137) # different first letter in sig because of different rf exp_sig = "KBFyn+h9m3pWYbB4fBFKlRzBD4eJKojgCIZSNdhLKKHPSV2/WkeV7R7IOI0dpo3uGAEpCz9eepXLrA5kF35MXuU=" assert bms.verify(msg, p2wpkh, exp_sig) sig = bms.sign(msg, wif, p2wpkh) assert bms.verify(msg, p2wpkh, sig) assert bms.serialize(*sig) == exp_sig.encode()
def test_signature() -> None: msg = "test message" wif, addr = bms.gen_keys() sig = bms.sign(msg, wif) assert bms.verify(msg, addr, sig) assert sig == bms.deserialize(sig) # sig taken from (Electrum and) Bitcoin Core wif, addr = bms.gen_keys( "5KMWWy2d3Mjc8LojNoj8Lcz9B1aWu8bRofUgGwQk959Dw5h2iyw") sig = bms.sign(msg, wif) assert bms.verify(msg, addr, sig) exp_sig = "G/iew/NhHV9V9MdUEn/LFOftaTy1ivGPKPKyMlr8OSokNC755fAxpSThNRivwTNsyY9vPUDTRYBPc2cmGd5d4y4=" assert bms.serialize(*sig) == exp_sig.encode() # not encoded base64 signature string bms.assert_as_valid(msg, addr, exp_sig) # encoded base64 signature string bms.assert_as_valid(msg, addr, exp_sig.encode()) # hex-string of the encoded base64 signature string bms.assert_as_valid(msg, addr, exp_sig.encode().hex())
def test_exceptions(self): msg = 'test' wif = 'KwELaABegYxcKApCb3kJR9ymecfZZskL9BzVUkQhsqFiUKftb4tu' pubkey, _ = pubkey_info_from_prvkey(wif) address = base58address.p2pkh(pubkey) exp_sig = b'IHdKsFF1bUrapA8GMoQUbgI+Ad0ZXyX1c/yAZHmJn5hSNBi7J+TrI1615FG3g9JEOPGVvcfDWIFWrg2exLNtoVc=' self.assertTrue(bms.verify(msg, address, exp_sig)) # Invalid recovery flag: 26 _, r, s = bms.deserialize(exp_sig) self.assertRaises(ValueError, bms.serialize, 26, r, s) #bms.serialize(26, r, s) # short exp_sig exp_sig = b'IHdKsFF1bUrapA8GMoQUbgI+Ad0ZXyX1c/yAZHmJn5hNBi7J+TrI1615FG3g9JEOPGVvcfDWIFWrg2exLoVc=' self.assertRaises(ValueError, bms._verify, msg, address, exp_sig) self.assertFalse(bms.verify(msg, address, exp_sig)) # Invalid recovery flag: 26 exp_sig = b'GpNLHqEKSzwXV+KwwBfQthQ848mn5qSkmGDXpqshDuPYJELOnSuRYGQQgBR4PpI+w2tJdD4v+hxElvAaUSqv2eU=' self.assertRaises(ValueError, bms._verify, msg, address, exp_sig) self.assertFalse(bms.verify(msg, address, exp_sig)) #bms._verify(msg, address, exp_sig) # Invalid recovery flag: 66 exp_sig = b'QpNLHqEKSzwXV+KwwBfQthQ848mn5qSkmGDXpqshDuPYJELOnSuRYGQQgBR4PpI+w2tJdD4v+hxElvAaUSqv2eU=' self.assertRaises(ValueError, bms._verify, msg, address, exp_sig) self.assertFalse(bms.verify(msg, address, exp_sig)) #bms._verify(msg, address, exp_sig) # Pubkey mismatch: compressed wif, uncompressed address wif = 'Ky1XfDK2v6wHPazA6ECaD8UctEoShXdchgABjpU9GWGZDxVRDBMJ' address = '19f7adDYqhHSJm2v7igFWZAqxXHj1vUa3T' self.assertRaises(ValueError, bms.sign, msg, wif, address) #bms.sign(msg, wif, address) # Pubkey mismatch: uncompressed wif, compressed address wif = '5JDopdKaxz5bXVYXcAnfno6oeSL8dpipxtU1AhfKe3Z58X48srn' address = '1DAag8qiPLHh6hMFVu9qJQm9ro1HtwuyK5' self.assertRaises(ValueError, bms.sign, msg, wif, address) #bms.sign(msg, wif, address) msg = 'test' wif = 'L4xAvhKR35zFcamyHME2ZHfhw5DEyeJvEMovQHQ7DttPTM8NLWCK' pubkey, _ = pubkey_info_from_prvkey(wif) p2pkh = base58address.p2pkh(pubkey) p2wpkh = bech32address.p2wpkh(pubkey) p2wpkh_p2sh = base58address.p2wpkh_p2sh(pubkey) wif = 'Ky1XfDK2v6wHPazA6ECaD8UctEoShXdchgABjpU9GWGZDxVRDBMJ' # Mismatch between p2pkh address and key pair self.assertRaises(ValueError, bms.sign, msg, wif, p2pkh) # bms.sign(msg, wif, p2pkh) # Mismatch between p2wpkh address and key pair self.assertRaises(ValueError, bms.sign, msg, wif, p2wpkh) # bms.sign(msg, wif, p2wpkh) # Mismatch between p2wpkh_p2sh address and key pair self.assertRaises(ValueError, bms.sign, msg, wif, p2wpkh_p2sh) # bms.sign(msg, wif, p2wpkh_p2sh) # Invalid recovery flag (39) for base58 address exp_sig = b'IHdKsFF1bUrapA8GMoQUbgI+Ad0ZXyX1c/yAZHmJn5hSNBi7J+TrI1615FG3g9JEOPGVvcfDWIFWrg2exLNtoVc=' _, r, s = bms.deserialize(exp_sig) sig = bms.serialize(39, r, s) self.assertRaises(ValueError, bms._verify, msg, p2pkh, sig) #bms._verify(msg, p2pkh, sig) # Invalid recovery flag (35) for bech32 address exp_sig = b'IBFyn+h9m3pWYbB4fBFKlRzBD4eJKojgCIZSNdhLKKHPSV2/WkeV7R7IOI0dpo3uGAEpCz9eepXLrA5kF35MXuU=' _, r, s = bms.deserialize(exp_sig) sig = bms.serialize(35, r, s) self.assertRaises(ValueError, bms._verify, msg, p2wpkh, sig)
def test_exceptions() -> None: msg = "test" wif = "KwELaABegYxcKApCb3kJR9ymecfZZskL9BzVUkQhsqFiUKftb4tu" address = base58address.p2pkh(wif) exp_sig = "IHdKsFF1bUrapA8GMoQUbgI+Ad0ZXyX1c/yAZHmJn5hSNBi7J+TrI1615FG3g9JEOPGVvcfDWIFWrg2exLNtoVc=" assert bms.verify(msg, address, exp_sig) _, r, s = bms.deserialize(exp_sig) err_msg = "invalid recovery flag: " with pytest.raises(ValueError, match=err_msg): bms.serialize(26, r, s) exp_sig = "IHdKsFF1bUrapA8GMoQUbgI+Ad0ZXyX1c/yAZHmJn5hNBi7J+TrI1615FG3g9JEOPGVvcfDWIFWrg2exLoVc=" err_msg = "wrong signature length: " with pytest.raises(ValueError, match=err_msg): bms.assert_as_valid(msg, address, exp_sig) assert not bms.verify(msg, address, exp_sig) exp_sig = "GpNLHqEKSzwXV+KwwBfQthQ848mn5qSkmGDXpqshDuPYJELOnSuRYGQQgBR4PpI+w2tJdD4v+hxElvAaUSqv2eU=" err_msg = "invalid recovery flag: " with pytest.raises(ValueError, match=err_msg): bms.assert_as_valid(msg, address, exp_sig) assert not bms.verify(msg, address, exp_sig) exp_sig = "QpNLHqEKSzwXV+KwwBfQthQ848mn5qSkmGDXpqshDuPYJELOnSuRYGQQgBR4PpI+w2tJdD4v+hxElvAaUSqv2eU=" with pytest.raises(ValueError, match=err_msg): bms.assert_as_valid(msg, address, exp_sig) assert not bms.verify(msg, address, exp_sig) # compressed wif, uncompressed address wif = "Ky1XfDK2v6wHPazA6ECaD8UctEoShXdchgABjpU9GWGZDxVRDBMJ" address = b"19f7adDYqhHSJm2v7igFWZAqxXHj1vUa3T" err_msg = "mismatch between private key and address" with pytest.raises(ValueError, match=err_msg): bms.sign(msg, wif, address) # uncompressed wif, compressed address wif = "5JDopdKaxz5bXVYXcAnfno6oeSL8dpipxtU1AhfKe3Z58X48srn" address = b"1DAag8qiPLHh6hMFVu9qJQm9ro1HtwuyK5" err_msg = "not a private or compressed public key for mainnet: " # FIXME puzzling error message with pytest.raises(ValueError, match=err_msg): bms.sign(msg, wif, address) msg = "test" wif = "L4xAvhKR35zFcamyHME2ZHfhw5DEyeJvEMovQHQ7DttPTM8NLWCK" p2pkh = base58address.p2pkh(wif) p2wpkh = bech32address.p2wpkh(wif) p2wpkh_p2sh = base58address.p2wpkh_p2sh(wif) wif = "Ky1XfDK2v6wHPazA6ECaD8UctEoShXdchgABjpU9GWGZDxVRDBMJ" err_msg = "mismatch between private key and address" with pytest.raises(ValueError, match=err_msg): bms.sign(msg, wif, p2pkh) with pytest.raises(ValueError, match=err_msg): bms.sign(msg, wif, p2wpkh) with pytest.raises(ValueError, match=err_msg): bms.sign(msg, wif, p2wpkh_p2sh) # Invalid recovery flag (39) for base58 address exp_sig = "IHdKsFF1bUrapA8GMoQUbgI+Ad0ZXyX1c/yAZHmJn5hSNBi7J+TrI1615FG3g9JEOPGVvcfDWIFWrg2exLNtoVc=" _, r, s = bms.deserialize(exp_sig) sig = bms.serialize(39, r, s) err_msg = "invalid recovery flag: " with pytest.raises(ValueError, match=err_msg): bms.assert_as_valid(msg, p2pkh, sig) # Invalid recovery flag (35) for bech32 address exp_sig = "IBFyn+h9m3pWYbB4fBFKlRzBD4eJKojgCIZSNdhLKKHPSV2/WkeV7R7IOI0dpo3uGAEpCz9eepXLrA5kF35MXuU=" _, r, s = bms.deserialize(exp_sig) sig = bms.serialize(35, r, s) err_msg = "invalid recovery flag: " with pytest.raises(ValueError, match=err_msg): bms.assert_as_valid(msg, p2wpkh, sig)