You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
47 lines
1.7 KiB
47 lines
1.7 KiB
#! /usr/bin/env python |
|
'''Test ECDSA signing and other key operations, including legacy message |
|
signature conversion.''' |
|
|
|
import jmbitcoin as btc |
|
import binascii |
|
from jmbase import bintohex |
|
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"]) |
|
res = btc.ecdsa_raw_sign(msg, priv, rawmsg=True)+ b'\x01' |
|
if not sig == res: |
|
print("failed on sig {} from msg {} with priv {}".format(bintohex(sig), bintohex(msg), bintohex(priv))) |
|
print("we got instead: {}".format(bintohex(res))) |
|
assert False |
|
# 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) |