diff options
| -rw-r--r-- | test/data/ec/ecdsa_tv.json | 13 | ||||
| -rw-r--r-- | test/ec/test_regress.py | 1 | ||||
| -rw-r--r-- | test/ec/test_signature.py | 33 |
3 files changed, 46 insertions, 1 deletions
diff --git a/test/data/ec/ecdsa_tv.json b/test/data/ec/ecdsa_tv.json new file mode 100644 index 0000000..dce0790 --- /dev/null +++ b/test/data/ec/ecdsa_tv.json @@ -0,0 +1,13 @@ +{ + "msg": "608079423f12421de616b7493ebe551cf4d65b92", + "priv": "e14f37b3d1374ff8b03f41b9b3fdd2f0ebccf275d660d7f3", + "pub": { + "x": "07008ea40b08dbe76432096e80a2494c94982d2d5bcf98e6", + "y": "76fab681d00b414ea636ba215de26d98c41bd7f2e4d65477" + }, + "k": "cb0abc7043a10783684556fb12c4154d57bc31a289685f25", + "signature": { + "r": "6994d962bdd0d793ffddf855ec5bf2f91a9698b46258a63e", + "s": "02ba6465a234903744ab02bc8521405b73cf5fc00e1a9f41" + } +} diff --git a/test/ec/test_regress.py b/test/ec/test_regress.py index 886d7cc..af67096 100644 --- a/test/ec/test_regress.py +++ b/test/ec/test_regress.py @@ -1,5 +1,4 @@ from typing import cast -from unittest import TestCase import pytest from sympy import symbols diff --git a/test/ec/test_signature.py b/test/ec/test_signature.py index 433d405..c5abf74 100644 --- a/test/ec/test_signature.py +++ b/test/ec/test_signature.py @@ -1,6 +1,13 @@ +import json + import pytest +from importlib_resources import files +import test.data.ec +from pyecsca.ec.coordinates import AffineCoordinateModel from pyecsca.ec.mod import Mod from pyecsca.ec.mult import LTRMultiplier +from pyecsca.ec.params import get_params +from pyecsca.ec.point import Point from pyecsca.ec.signature import ( Signature, SignatureResult, @@ -108,3 +115,29 @@ def test_der(): sig = SignatureResult(0xAAAAA, 0xBBBBB) assert sig == SignatureResult.from_DER(sig.to_DER()) assert sig != "abc" + + +def test_ecdsa_nist(): + with files(test.data.ec).joinpath("ecdsa_tv.json").open("r") as f: + nist_data = json.load(f) + + P192 = get_params("nist", "P-192", "projective") + affine_model = AffineCoordinateModel(P192.curve.model) + add = P192.curve.coordinate_model.formulas["add-2016-rcb"] + dbl = P192.curve.coordinate_model.formulas["dbl-2016-rcb"] + mult = LTRMultiplier(add, dbl) + priv = Mod(int(nist_data["priv"], 16), P192.order) + + pub_affine = Point(affine_model, + x=Mod(int(nist_data["pub"]["x"], 16), P192.curve.prime), + y=Mod(int(nist_data["pub"]["y"], 16), P192.curve.prime)) + pub = pub_affine.to_model(P192.curve.coordinate_model, P192.curve) + + signer = ECDSA_SHA1(mult, P192, add, pub, priv) + + nonce = int(nist_data["k"], 16) + data = bytes.fromhex(nist_data["msg"]) + signature = signer.sign_hash(data, nonce=nonce) + assert signature.r == int(nist_data["signature"]["r"], 16) + assert signature.s == int(nist_data["signature"]["s"], 16) + assert signer.verify_hash(signature, data) |
