diff options
Diffstat (limited to 'test/test_simulator.py')
| -rw-r--r-- | test/test_simulator.py | 330 |
1 files changed, 182 insertions, 148 deletions
diff --git a/test/test_simulator.py b/test/test_simulator.py index d741cf4..e5a1c9d 100644 --- a/test/test_simulator.py +++ b/test/test_simulator.py @@ -1,10 +1,9 @@ from copy import copy from os.path import join -from unittest import TestCase +import pytest -from click.testing import CliRunner from pyecsca.ec.key_agreement import ECDH_SHA1 -from pyecsca.ec.mult import LTRMultiplier, RTLMultiplier, CoronMultiplier, BinaryNAFMultiplier +from pyecsca.ec.mult import LTRMultiplier, RTLMultiplier from pyecsca.ec.signature import ECDSA_SHA1, SignatureResult from pyecsca.codegen.builder import build_impl @@ -18,177 +17,212 @@ from pyecsca.ec.point import InfinityPoint, Point import gc -class SimulatorTest(TestCase): +@pytest.fixture(scope="module") +def curve32(): + model = ShortWeierstrassModel() + coords = model.coordinates["projective"] + p = 0xD7D1247F + a = Mod(0xA4A44016, p) + b = Mod(0x73F76716, p) + n = 0xD7D2A475 + h = 1 + gx, gy, gz = Mod(0x54EED6D7, p), Mod(0x6F1E55AC, p), Mod(1, p) + generator = Point(coords, X=gx, Y=gy, Z=gz) + neutral = InfinityPoint(coords) - def setUp(self): - model = ShortWeierstrassModel() - coords = model.coordinates["projective"] - p = 0xd7d1247f - a = Mod(0xa4a44016, p) - b = Mod(0x73f76716, p) - n = 0xd7d2a475 - h = 1 - gx, gy, gz = Mod(0x54eed6d7, p), Mod(0x6f1e55ac, p), Mod(1, p) - generator = Point(coords, X=gx, Y=gy, Z=gz) - neutral = InfinityPoint(coords) + curve = EllipticCurve(model, coords, p, neutral, {"a": a, "b": b}) + params = DomainParameters(curve, generator, n, h) + return params - curve = EllipticCurve(model, coords, p, neutral, {"a": a, "b": b}) - self.curve32 = DomainParameters(curve, generator, n, h) - self.base = self.curve32.generator - self.coords = self.curve32.curve.coordinate_model - def do_basic_test(self, callback, runner, params, mult_class, formulas, mult_name, - ecdsa, ecdh): - with runner.isolated_filesystem() as tmpdir: - runner.invoke(build_impl, - ["--platform", "STM32F3", - "--ecdsa" if ecdsa else "--no-ecdsa", - "--ecdh" if ecdh else "--no-ecdh", - params.curve.model.shortname, params.curve.coordinate_model.name, - *formulas, - f"{mult_name}()", - "."]) - target = SimulatorTarget(params.curve.model, params.curve.coordinate_model) - target.connect(binary=join(tmpdir, "pyecsca-codegen-CW308_STM32F3.elf")) - target.set_params(params) - formula_instances = [params.curve.coordinate_model.formulas[formula] for formula - in formulas] - mult = mult_class(*formula_instances) - mult.init(params, params.generator) - callback(target, mult, params) - target.disconnect() - del target - gc.collect() +def do_basic_test( + callback, runner, params, mult_class, formulas, mult_name, ecdsa, ecdh +): + with runner.isolated_filesystem() as tmpdir: + runner.invoke( + build_impl, + [ + "--platform", + "STM32F3", + "--ecdsa" if ecdsa else "--no-ecdsa", + "--ecdh" if ecdh else "--no-ecdh", + params.curve.model.shortname, + params.curve.coordinate_model.name, + *formulas, + f"{mult_name}()", + ".", + ], + ) + target = SimulatorTarget(params.curve.model, params.curve.coordinate_model) + target.connect(binary=join(tmpdir, "pyecsca-codegen-CW308_STM32F3.elf")) + target.set_params(params) + formula_instances = [ + params.curve.coordinate_model.formulas[formula] for formula in formulas + ] + mult = mult_class(*formula_instances) + mult.init(params, params.generator) + callback(target, mult, params) + target.disconnect() + del target + gc.collect() -class PRNGTests(SimulatorTest): +def test_init(cli_runner, curve32): + def callback(target, mult, params): + target.init_prng(bytes([0x12, 0x34, 0x56, 0x78])) - def test_init(self): - runner = CliRunner() + do_basic_test( + callback, + cli_runner, + curve32, + LTRMultiplier, + ["add-1998-cmo", "dbl-1998-cmo"], + "ltr", + False, + False, + ) - def callback(target, mult, params): - target.init_prng(bytes([0x12, 0x34, 0x56, 0x78])) - self.do_basic_test(callback, runner, self.curve32, LTRMultiplier, - ["add-1998-cmo", "dbl-1998-cmo"], "ltr", False, False) +def test_setup(cli_runner, curve32): + def callback(target, mult, params): + priv = 57 + pub = mult.multiply(priv).to_affine() + target.set_privkey(priv) + target.set_pubkey(pub) + do_basic_test( + callback, + cli_runner, + curve32, + LTRMultiplier, + ["add-1998-cmo", "dbl-1998-cmo"], + "ltr", + False, + False, + ) -class SetupTests(SimulatorTest): - def test_setup(self): - runner = CliRunner() +def test_debug(cli_runner, curve32): + def callback(target, mult, params): + model, coords = target.debug() + assert model == params.curve.model.shortname + assert coords == params.curve.coordinate_model.name - def callback(target, mult, params): - priv = 57 - pub = mult.multiply(priv).to_affine() - target.set_privkey(priv) - target.set_pubkey(pub) + do_basic_test( + callback, + cli_runner, + curve32, + LTRMultiplier, + ["add-1998-cmo", "dbl-1998-cmo"], + "ltr", + False, + False, + ) - self.do_basic_test(callback, runner, self.curve32, LTRMultiplier, - ["add-1998-cmo", "dbl-1998-cmo"], "ltr", False, False) - def test_debug(self): - runner = CliRunner() +@pytest.mark.parametrize( + "mult_name,mult_class", [("ltr", LTRMultiplier), ("rtl", RTLMultiplier)] +) +def test_keygen(mult_name, mult_class, cli_runner, curve32): + def callback(target, mult, params): + priv, pub = target.generate() + assert params.curve.is_on_curve(pub) + expected = mult.multiply(priv).to_affine() + assert pub == expected - def callback(target, mult, params): - model, coords = target.debug() - self.assertEqual(model, params.curve.model.shortname) - self.assertEqual(coords, params.curve.coordinate_model.name) + do_basic_test( + callback, + cli_runner, + curve32, + mult_class, + ["add-1998-cmo", "dbl-1998-cmo"], + mult_name, + False, + False, + ) - self.do_basic_test(callback, runner, self.curve32, LTRMultiplier, - ["add-1998-cmo", "dbl-1998-cmo"], "ltr", False, False) +@pytest.mark.parametrize( + "mult_name,mult_class", [("ltr", LTRMultiplier), ("rtl", RTLMultiplier)] +) +def test_scalarmult(mult_name, mult_class, cli_runner, curve32): + values = [2355498743] -class KeyGenerationTests(SimulatorTest): + def callback(target, mult, params): + for value in values: + result = target.scalar_mult(value, params.generator) + expected = mult.multiply(value) + assert result == expected - def do_keygen_test(self, runner, params, mult_class, formulas, mult_name): - def callback(target, mult, params): - priv, pub = target.generate() - self.assertTrue(params.curve.is_on_curve(pub)) - expected = mult.multiply(priv).to_affine() - self.assertEqual(pub, expected) - - self.do_basic_test(callback, runner, params, mult_class, formulas, mult_name, False, False) - - def test_ltr(self): - runner = CliRunner() - self.do_keygen_test(runner, self.curve32, LTRMultiplier, ["add-1998-cmo", "dbl-1998-cmo"], - "ltr") - - def test_rtl(self): - runner = CliRunner() - self.do_keygen_test(runner, self.curve32, RTLMultiplier, ["add-1998-cmo", "dbl-1998-cmo"], - "rtl") - - -class ScalarMultiplicationTests(SimulatorTest): - - def do_mult_test(self, runner, params, mult_class, formulas, mult_name): - values = [2355498743] - - def callback(target, mult, params): - for value in values: - result = target.scalar_mult(value, params.generator) - expected = mult.multiply(value) - self.assertEqual(result, expected) + do_basic_test( + callback, + cli_runner, + curve32, + mult_class, + ["add-1998-cmo", "dbl-1998-cmo"], + mult_name, + False, + False, + ) - self.do_basic_test(callback, runner, params, mult_class, formulas, mult_name, False, False) - def test_ltr(self): - runner = CliRunner() - self.do_mult_test(runner, self.curve32, LTRMultiplier, ["add-1998-cmo", "dbl-1998-cmo"], - "ltr") +@pytest.mark.parametrize( + "mult_name,mult_class", [("ltr", LTRMultiplier), ("rtl", RTLMultiplier)] +) +def test_ecdh(mult_name, mult_class, cli_runner, curve32): + other_privs = [2355498743] - def test_rtl(self): - runner = CliRunner() - self.do_mult_test(runner, self.curve32, RTLMultiplier, ["add-1998-cmo", "dbl-1998-cmo"], - "rtl") - - -class ECDHTests(SimulatorTest): - def do_ecdh_test(self, runner, params, mult_class, formulas, mult_name): - other_privs = [2355498743] - - def callback(target, mult, params): - for other_priv in other_privs: - priv, pub = target.generate() - other_pub = mult.multiply(other_priv) - ecdh = ECDH_SHA1(copy(mult), params, other_pub, priv) - result = target.ecdh(other_pub) - expected = ecdh.perform() - self.assertEqual(result, expected) - - self.do_basic_test(callback, runner, params, mult_class, formulas, mult_name, False, True) - - def test_ltr(self): - runner = CliRunner() - self.do_ecdh_test(runner, self.curve32, LTRMultiplier, ["add-1998-cmo", "dbl-1998-cmo"], - "ltr") - - def test_rtl(self): - runner = CliRunner() - self.do_ecdh_test(runner, self.curve32, RTLMultiplier, ["add-1998-cmo", "dbl-1998-cmo"], - "rtl") + def callback(target, mult, params): + for other_priv in other_privs: + priv, pub = target.generate() + other_pub = mult.multiply(other_priv) + ecdh = ECDH_SHA1(copy(mult), params, other_pub, priv) + result = target.ecdh(other_pub) + expected = ecdh.perform() + assert result == expected + do_basic_test( + callback, + cli_runner, + curve32, + mult_class, + ["add-1998-cmo", "dbl-1998-cmo"], + mult_name, + False, + True, + ) -class ECDSATests(SimulatorTest): - def do_ecdsa_test(self, runner, params, mult_class, formulas, mult_name): - data = b"something" - def callback(target, mult, params): - priv, pub = target.generate() - ecdsa = ECDSA_SHA1(copy(mult), params, mult.formulas["add"], - pub.to_model(params.curve.coordinate_model, params.curve), priv) +@pytest.mark.parametrize( + "mult_name,mult_class", [("ltr", LTRMultiplier), ("rtl", RTLMultiplier)] +) +def test_ecdsa(mult_name, mult_class, cli_runner, curve32): + data = b"something" - signature_data = target.ecdsa_sign(data) - result = SignatureResult.from_DER(bytes(signature_data)) - self.assertTrue(ecdsa.verify_data(result, data)) + def callback(target, mult, params): + priv, pub = target.generate() + ecdsa = ECDSA_SHA1( + copy(mult), + params, + mult.formulas["add"], + pub.to_model(params.curve.coordinate_model, params.curve), + priv, + ) - expected = ecdsa.sign_data(data).to_DER() - self.assertTrue(target.ecdsa_verify(data, expected)) + signature_data = target.ecdsa_sign(data) + result = SignatureResult.from_DER(bytes(signature_data)) + assert ecdsa.verify_data(result, data) - self.do_basic_test(callback, runner, params, mult_class, formulas, mult_name, True, False) + expected = ecdsa.sign_data(data).to_DER() + assert target.ecdsa_verify(data, expected) - def test_ltr(self): - runner = CliRunner() - self.do_ecdsa_test(runner, self.curve32, LTRMultiplier, ["add-1998-cmo", "dbl-1998-cmo"], "ltr")
\ No newline at end of file + do_basic_test( + callback, + cli_runner, + curve32, + mult_class, + ["add-1998-cmo", "dbl-1998-cmo"], + mult_name, + True, + False, + ) |
