diff options
| author | J08nY | 2020-02-19 18:29:53 +0100 |
|---|---|---|
| committer | J08nY | 2020-02-19 18:29:53 +0100 |
| commit | 5da1d167c203395103d220c450e29fece08f4198 (patch) | |
| tree | fdc8fb7f0fbf2d2aaab46c2cb8a90a8176058292 /test/test_impl.py | |
| parent | f04c640c05e9ffe894f67194832623e28a8000f5 (diff) | |
| download | pyecsca-codegen-5da1d167c203395103d220c450e29fece08f4198.tar.gz pyecsca-codegen-5da1d167c203395103d220c450e29fece08f4198.tar.zst pyecsca-codegen-5da1d167c203395103d220c450e29fece08f4198.zip | |
Flesh out client, add implementation tests.
Diffstat (limited to 'test/test_impl.py')
| -rw-r--r-- | test/test_impl.py | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/test/test_impl.py b/test/test_impl.py new file mode 100644 index 0000000..d93501d --- /dev/null +++ b/test/test_impl.py @@ -0,0 +1,77 @@ +from os.path import join +from unittest import TestCase + +from click.testing import CliRunner +from pyecsca.ec.curves import get_params +from pyecsca.ec.mult import LTRMultiplier, RTLMultiplier, CoronMultiplier + +from pyecsca.codegen.builder import build_impl +from pyecsca.codegen.client import BinaryTarget + + +class ImplementationTest(TestCase): + + def setUp(self): + self.secp128r1 = get_params("secg", "secp128r1", "projective") + self.base = self.secp128r1.generator + self.coords = self.secp128r1.curve.coordinate_model + + self.curve25519 = get_params("other", "Curve25519", "xz") + self.base25519 = self.curve25519.generator + self.coords25519 = self.curve25519.curve.coordinate_model + + def do_basic_test(self, runner, params, mult_class, formulas, mult_name, **mult_kwargs): + with runner.isolated_filesystem() as tmpdir: + runner.invoke(build_impl, + ["--platform", "HOST", "--no-ecdsa", "--no-ecdh", + params.curve.model.shortname, params.curve.coordinate_model.name, + *formulas, + f"{mult_name}({','.join(f'{key}={value}' for key, value in mult_kwargs.items())})", + "."]) + target = BinaryTarget(join(tmpdir, "pyecsca-codegen-HOST.elf"), + params.curve.model, + params.curve.coordinate_model) + target.connect() + target.set_params(params) + priv, pub = target.generate() + self.assertTrue(params.curve.is_on_curve(pub)) + formula_instances = [params.curve.coordinate_model.formulas[formula] for formula + in formulas] + mult = mult_class(*formula_instances, **mult_kwargs) + mult.init(params, params.generator) + expected = mult.multiply(priv).to_affine() + self.assertEqual(pub, expected) + target.disconnect() + + def test_ltr(self): + runner = CliRunner() + self.do_basic_test(runner, self.secp128r1, LTRMultiplier, ["add-1998-cmo", "dbl-1998-cmo"], + "ltr", + complete=False) + self.do_basic_test(runner, self.secp128r1, LTRMultiplier, ["add-1998-cmo", "dbl-1998-cmo"], + "ltr", + complete=True) + self.do_basic_test(runner, self.secp128r1, LTRMultiplier, ["add-1998-cmo", "dbl-1998-cmo"], + "ltr", + always=True, complete=False) + self.do_basic_test(runner, self.secp128r1, LTRMultiplier, ["add-1998-cmo", "dbl-1998-cmo"], + "ltr", + always=True, complete=True) + + def test_rtl(self): + runner = CliRunner() + self.do_basic_test(runner, self.secp128r1, RTLMultiplier, ["add-1998-cmo", "dbl-1998-cmo"], + "rtl", + always=False) + self.do_basic_test(runner, self.secp128r1, RTLMultiplier, ["add-1998-cmo", "dbl-1998-cmo"], + "rtl", + always=True) + + def test_coron(self): + runner = CliRunner() + self.do_basic_test(runner, self.secp128r1, CoronMultiplier, + ["add-1998-cmo", "dbl-1998-cmo"], "coron") + + # def test_ladder(self): + # runner = CliRunner() + # self.do_basic_test(runner, self.curve25519, LadderMultiplier, ["ladd-1987-m", "dbl-1987-m"], "ldr") |
