#! /usr/bin/env python '''Test ECDSA signing and other key operations, including legacy message signature conversion.''' import jmbitcoin as btc import binascii import json import pytest import os testdir = os.path.dirname(os.path.realpath(__file__)) vectors = None def test_valid_sigs(setup_ecc): for v in vectors['vectors']: msg, sig, priv = (binascii.unhexlify( v[a]) for a in ["msg", "sig", "privkey"]) assert sig == btc.ecdsa_raw_sign(msg, priv, rawmsg=True)+ b'\x01' # check that the signature verifies against the key(pair) pubkey = btc.privkey_to_pubkey(priv) assert btc.ecdsa_raw_verify(msg, pubkey, sig[:-1], rawmsg=True) # check that it fails to verify against corrupted signatures for i in [0,1,2,4,7,25,55]: # corrupt one byte checksig = sig[:i] + chr( (ord(sig[i:i+1])+1) %256).encode() + sig[i+1:-1] # this kind of corruption will sometimes lead to an assert # failure (if the DER format is corrupted) and sometimes lead # to a signature verification failure. try: res = btc.ecdsa_raw_verify(msg, pubkey, checksig, rawmsg=True) except: continue assert res==False @pytest.fixture(scope='module') def setup_ecc(): global vectors with open(os.path.join(testdir, "ecc_sigs_rfc6979_valid.json"), "r") as f: json_data = f.read() vectors = json.loads(json_data)