aboutsummaryrefslogtreecommitdiffhomepage
path: root/test/test_impl.py
diff options
context:
space:
mode:
authorJ08nY2020-02-19 18:29:53 +0100
committerJ08nY2020-02-19 18:29:53 +0100
commit5da1d167c203395103d220c450e29fece08f4198 (patch)
treefdc8fb7f0fbf2d2aaab46c2cb8a90a8176058292 /test/test_impl.py
parentf04c640c05e9ffe894f67194832623e28a8000f5 (diff)
downloadpyecsca-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.py77
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")