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 | |
| 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')
| -rw-r--r-- | test/test_builder.py | 26 | ||||
| -rw-r--r-- | test/test_client.py | 13 | ||||
| -rw-r--r-- | test/test_impl.py | 77 | ||||
| -rw-r--r-- | test/test_render.py | 32 |
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) |
