aboutsummaryrefslogtreecommitdiffhomepage
path: root/test
diff options
context:
space:
mode:
authorJ08nY2020-02-19 18:29:53 +0100
committerJ08nY2020-02-19 18:29:53 +0100
commit5da1d167c203395103d220c450e29fece08f4198 (patch)
treefdc8fb7f0fbf2d2aaab46c2cb8a90a8176058292 /test
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')
-rw-r--r--test/test_builder.py26
-rw-r--r--test/test_client.py13
-rw-r--r--test/test_impl.py77
-rw-r--r--test/test_render.py32
4 files changed, 117 insertions, 31 deletions
diff --git a/test/test_builder.py b/test/test_builder.py
index a16f714..3d1651a 100644
--- a/test/test_builder.py
+++ b/test/test_builder.py
@@ -1,38 +1,12 @@
from unittest import TestCase
-import tempfile
from click.testing import CliRunner
-from pyecsca.ec.curves import get_params
-from pyecsca.ec.mult import LTRMultiplier
-from pyecsca.ec.configuration import HashType, RandomMod, Multiplication, Squaring, Reduction
-from pyecsca.codegen.common import Platform, DeviceConfiguration
-from pyecsca.codegen.render import render_and_build
from pyecsca.codegen.builder import build_impl, list_impl
class BuilderTests(TestCase):
- def test_basic_build(self):
- platform = Platform.HOST
- hash_type = HashType.SHA1
- mod_rand = RandomMod.REDUCE
- mult = Multiplication.BASE
- sqr = Squaring.BASE
- red = Reduction.BASE
- params = get_params("secg", "secp128r1", "projective")
- model = params.curve.model
- coords = params.curve.coordinate_model
- add = coords.formulas["add-1998-cmo"]
- dbl = coords.formulas["dbl-1998-cmo"]
- scl = coords.formulas["z"]
- formulas = [add, dbl, scl]
- scalarmult = LTRMultiplier(add, dbl, scl)
- config = DeviceConfiguration(model, coords, formulas, scalarmult, hash_type, mod_rand, mult,
- sqr, red, platform, True, True, True)
- temp = tempfile.mkdtemp()
- render_and_build(config, temp, True)
-
def test_cli_build(self):
runner = CliRunner()
with runner.isolated_filesystem():
diff --git a/test/test_client.py b/test/test_client.py
index 93f7a82..f854a5c 100644
--- a/test/test_client.py
+++ b/test/test_client.py
@@ -1,3 +1,4 @@
+from os.path import join
from unittest import TestCase
from click.testing import CliRunner
@@ -6,7 +7,8 @@ from pyecsca.ec.mod import Mod
from pyecsca.codegen.builder import build_impl
from pyecsca.codegen.client import (encode_data, decode_data, encode_scalar, cmd_init_prng,
- cmd_set_curve, cmd_set_pubkey, cmd_set_privkey, cmd_scalar_mult,
+ cmd_set_params, cmd_set_pubkey, cmd_set_privkey,
+ cmd_scalar_mult,
cmd_ecdh, cmd_ecdsa_sign, cmd_ecdsa_verify, cmd_generate,
cmd_debug, main)
@@ -35,7 +37,7 @@ class CommandTest(TestCase):
cmd_init_prng(bytes([0xca, 0xfe, 0xba, 0xbe]))
def test_set_curve(self):
- cmd_set_curve(self.curve)
+ cmd_set_params(self.curve)
def test_generate(self):
cmd_generate()
@@ -66,11 +68,12 @@ class ClientTests(TestCase):
def test_generate(self):
runner = CliRunner()
- with runner.isolated_filesystem():
+ with runner.isolated_filesystem() as tmpdir:
runner.invoke(build_impl,
["--platform", "HOST", "-v", "shortw", "projective",
"add-1998-cmo", "dbl-1998-cmo", "z", "ltr(complete=False)", "."])
result = runner.invoke(main,
- ["--platform", "HOST", "--binary", "./pyecsca-codegen-HOST.elf",
- "gen", "shortw", "projective", "secg/secp128r1"])
+ ["--platform", "HOST", "--binary",
+ join(tmpdir, "pyecsca-codegen-HOST.elf"),
+ "shortw", "projective", "gen", "secg/secp128r1"])
self.assertEqual(result.exit_code, 0)
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")
diff --git a/test/test_render.py b/test/test_render.py
new file mode 100644
index 0000000..eefa626
--- /dev/null
+++ b/test/test_render.py
@@ -0,0 +1,32 @@
+import tempfile
+from unittest import TestCase
+
+from pyecsca.ec.configuration import HashType, RandomMod, Multiplication, Squaring, Reduction
+from pyecsca.ec.curves import get_params
+from pyecsca.ec.mult import LTRMultiplier
+
+from pyecsca.codegen.common import Platform, DeviceConfiguration
+from pyecsca.codegen.render import render_and_build
+
+
+class RenderTests(TestCase):
+
+ def test_basic_build(self):
+ platform = Platform.HOST
+ hash_type = HashType.SHA1
+ mod_rand = RandomMod.REDUCE
+ mult = Multiplication.BASE
+ sqr = Squaring.BASE
+ red = Reduction.BASE
+ params = get_params("secg", "secp128r1", "projective")
+ model = params.curve.model
+ coords = params.curve.coordinate_model
+ add = coords.formulas["add-1998-cmo"]
+ dbl = coords.formulas["dbl-1998-cmo"]
+ scl = coords.formulas["z"]
+ formulas = [add, dbl, scl]
+ scalarmult = LTRMultiplier(add, dbl, scl)
+ config = DeviceConfiguration(model, coords, formulas, scalarmult, hash_type, mod_rand, mult,
+ sqr, red, platform, True, True, True)
+ temp = tempfile.mkdtemp()
+ render_and_build(config, temp, True)