diff options
| author | J08nY | 2025-10-01 14:22:49 +0200 |
|---|---|---|
| committer | J08nY | 2025-10-01 14:22:49 +0200 |
| commit | b20d20c05f5fdc45e2a81bbbfa8cc8f0cd807500 (patch) | |
| tree | 5a52e574df68f19bf6035c5b04a62aa5c1c55d49 | |
| parent | 262bc2c9e33b00fc4073be79804e554f12d3ba13 (diff) | |
| download | pyecsca-codegen-b20d20c05f5fdc45e2a81bbbfa8cc8f0cd807500.tar.gz pyecsca-codegen-b20d20c05f5fdc45e2a81bbbfa8cc8f0cd807500.tar.zst pyecsca-codegen-b20d20c05f5fdc45e2a81bbbfa8cc8f0cd807500.zip | |
Add wider tests of implementation correctness.
| -rw-r--r-- | test/conftest.py | 92 | ||||
| -rw-r--r-- | test/test_impl.py | 202 |
2 files changed, 103 insertions, 191 deletions
diff --git a/test/conftest.py b/test/conftest.py index 1c1449a..ca32485 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -1,5 +1,6 @@ import pytest +from pyecsca.ec.mult import * from pyecsca.ec.params import get_params, DomainParameters @@ -11,3 +12,94 @@ def secp128r1() -> DomainParameters: @pytest.fixture(scope="session") def curve25519() -> DomainParameters: return get_params("other", "Curve25519", "xz") + + +# fmt: off +window_mults = [ + (SlidingWindowMultiplier, dict(width=2, recoding_direction=ProcessingDirection.LTR)), + (SlidingWindowMultiplier, dict(width=3, recoding_direction=ProcessingDirection.LTR)), + (SlidingWindowMultiplier, dict(width=4, recoding_direction=ProcessingDirection.LTR)), + (SlidingWindowMultiplier, dict(width=5, recoding_direction=ProcessingDirection.LTR)), + (SlidingWindowMultiplier, dict(width=6, recoding_direction=ProcessingDirection.LTR)), + (SlidingWindowMultiplier, dict(width=2, recoding_direction=ProcessingDirection.RTL)), + (SlidingWindowMultiplier, dict(width=3, recoding_direction=ProcessingDirection.RTL)), + (SlidingWindowMultiplier, dict(width=4, recoding_direction=ProcessingDirection.RTL)), + (SlidingWindowMultiplier, dict(width=5, recoding_direction=ProcessingDirection.RTL)), + (SlidingWindowMultiplier, dict(width=6, recoding_direction=ProcessingDirection.RTL)), + (FixedWindowLTRMultiplier, dict(m=2**1)), + (FixedWindowLTRMultiplier, dict(m=2**2)), + (FixedWindowLTRMultiplier, dict(m=2**3)), + (FixedWindowLTRMultiplier, dict(m=2**4)), + (FixedWindowLTRMultiplier, dict(m=2**5)), + (FixedWindowLTRMultiplier, dict(m=2**6)), + (WindowBoothMultiplier, dict(width=2)), + (WindowBoothMultiplier, dict(width=3)), + (WindowBoothMultiplier, dict(width=4)), + (WindowBoothMultiplier, dict(width=5)), + (WindowBoothMultiplier, dict(width=6)) +] + +naf_mults = [ + (WindowNAFMultiplier, dict(width=2)), + (WindowNAFMultiplier, dict(width=3)), + (WindowNAFMultiplier, dict(width=4)), + (WindowNAFMultiplier, dict(width=5)), + (WindowNAFMultiplier, dict(width=6)), + (BinaryNAFMultiplier, dict(always=False, direction=ProcessingDirection.LTR)), + (BinaryNAFMultiplier, dict(always=False, direction=ProcessingDirection.RTL)), + (BinaryNAFMultiplier, dict(always=True, direction=ProcessingDirection.LTR)), + (BinaryNAFMultiplier, dict(always=True, direction=ProcessingDirection.RTL)) +] +comb_mults = [ + (CombMultiplier, dict(width=2, always=True)), + (CombMultiplier, dict(width=3, always=True)), + (CombMultiplier, dict(width=4, always=True)), + (CombMultiplier, dict(width=5, always=True)), + (CombMultiplier, dict(width=6, always=True)), + (CombMultiplier, dict(width=2, always=False)), + (CombMultiplier, dict(width=3, always=False)), + (CombMultiplier, dict(width=4, always=False)), + (CombMultiplier, dict(width=5, always=False)), + (CombMultiplier, dict(width=6, always=False)), + (BGMWMultiplier, dict(width=2, direction=ProcessingDirection.LTR)), + (BGMWMultiplier, dict(width=3, direction=ProcessingDirection.LTR)), + (BGMWMultiplier, dict(width=4, direction=ProcessingDirection.LTR)), + (BGMWMultiplier, dict(width=5, direction=ProcessingDirection.LTR)), + (BGMWMultiplier, dict(width=6, direction=ProcessingDirection.LTR)), + (BGMWMultiplier, dict(width=2, direction=ProcessingDirection.RTL)), + (BGMWMultiplier, dict(width=3, direction=ProcessingDirection.RTL)), + (BGMWMultiplier, dict(width=4, direction=ProcessingDirection.RTL)), + (BGMWMultiplier, dict(width=5, direction=ProcessingDirection.RTL)), + (BGMWMultiplier, dict(width=6, direction=ProcessingDirection.RTL)) +] +binary_mults = [ + (LTRMultiplier, dict(always=False, complete=True)), + (LTRMultiplier, dict(always=True, complete=True)), + (LTRMultiplier, dict(always=False, complete=False)), + (LTRMultiplier, dict(always=True, complete=False)), + (RTLMultiplier, dict(always=False, complete=True)), + (RTLMultiplier, dict(always=True, complete=True)), + (RTLMultiplier, dict(always=False, complete=False)), + (RTLMultiplier, dict(always=True, complete=False)), + (CoronMultiplier, dict()) +] +other_mults = [ + (FullPrecompMultiplier, dict(always=False, complete=True)), + (FullPrecompMultiplier, dict(always=True, complete=True)), + (FullPrecompMultiplier, dict(always=False, complete=False)), + (FullPrecompMultiplier, dict(always=True, complete=False)), + (SimpleLadderMultiplier, dict(complete=True)), + (SimpleLadderMultiplier, dict(complete=False)) +] +# fmt: on + + +@pytest.fixture( + scope="session", + params=window_mults + naf_mults + comb_mults + binary_mults + other_mults, + ids=lambda p: "{}-{}".format( + p[0].__name__, ":".join(f"{k}={v}" for k, v in p[1].items()) + ), +) +def simple_multiplier(request): + return request.param diff --git a/test/test_impl.py b/test/test_impl.py index 34f427b..fc1dcad 100644 --- a/test/test_impl.py +++ b/test/test_impl.py @@ -1,8 +1,11 @@ from copy import copy from os.path import join +from typing import Any, Generator + import pytest from click.testing import CliRunner +from pyecsca.ec.formula import NegationFormula from pyecsca.ec.key_agreement import ECDH_SHA1 from pyecsca.ec.mod import mod from pyecsca.ec.mult import ( @@ -23,7 +26,7 @@ from pyecsca.ec.mult import ( from pyecsca.ec.signature import ECDSA_SHA1, SignatureResult from pyecsca.codegen.builder import build_impl -from pyecsca.codegen.client import HostTarget, ImplTarget +from pyecsca.codegen.client import HostTarget @pytest.fixture( @@ -39,195 +42,13 @@ def additional(request): return request.param -@pytest.fixture( - scope="module", - params=[ - pytest.param( - ( - LTRMultiplier, - "ltr", - ["add-1998-cmo", "dbl-1998-cmo"], - {"complete": False}, - ), - id="LTR1", - ), - pytest.param( - ( - LTRMultiplier, - "ltr", - ["add-1998-cmo", "dbl-1998-cmo"], - {"complete": True}, - ), - id="LTR2", - ), - pytest.param( - ( - LTRMultiplier, - "ltr", - ["add-1998-cmo", "dbl-1998-cmo"], - {"complete": False, "always": True}, - ), - id="LTR3", - ), - pytest.param( - ( - LTRMultiplier, - "ltr", - ["add-1998-cmo", "dbl-1998-cmo"], - {"complete": True, "always": True}, - ), - id="LTR4", - ), - pytest.param( - ( - LTRMultiplier, - "ltr", - ["add-1998-cmo", "dbl-1998-cmo"], - {"complete": False, "accumulation_order": AccumulationOrder.PeqRP}, - ), - id="LTR5", - ), - pytest.param( - (RTLMultiplier, "rtl", ["add-1998-cmo", "dbl-1998-cmo"], {"always": False}), - id="RTL1", - ), - pytest.param( - (RTLMultiplier, "rtl", ["add-1998-cmo", "dbl-1998-cmo"], {"always": True}), - id="RTL2", - ), - pytest.param( - (CoronMultiplier, "coron", ["add-1998-cmo", "dbl-1998-cmo"], {}), id="Coron" - ), - pytest.param( - ( - BinaryNAFMultiplier, - "bnaf", - ["add-1998-cmo", "dbl-1998-cmo", "neg"], - {"direction": ProcessingDirection.LTR}, - ), - id="BNAF1", - ), - pytest.param( - ( - BinaryNAFMultiplier, - "bnaf", - ["add-1998-cmo", "dbl-1998-cmo", "neg"], - {"direction": ProcessingDirection.RTL}, - ), - id="BNAF2", - ), - pytest.param( - ( - WindowNAFMultiplier, - "wnaf", - ["add-1998-cmo", "dbl-1998-cmo", "neg"], - {"width": 3}, - ), - id="WNAF1", - ), - pytest.param( - ( - WindowNAFMultiplier, - "wnaf", - ["add-1998-cmo", "dbl-1998-cmo", "neg"], - {"width": 3, "precompute_negation": True}, - ), - id="WNAF2", - ), - pytest.param( - ( - SlidingWindowMultiplier, - "sliding", - ["add-1998-cmo", "dbl-1998-cmo"], - {"width": 3}, - ), - id="SLI1", - ), - pytest.param( - ( - SlidingWindowMultiplier, - "sliding", - ["add-1998-cmo", "dbl-1998-cmo"], - {"width": 3, "recoding_direction": ProcessingDirection.RTL}, - ), - id="SLI2", - ), - pytest.param( - ( - FixedWindowLTRMultiplier, - "fixed", - ["add-1998-cmo", "dbl-1998-cmo"], - {"m": 4}, - ), - id="FIX1", - ), - pytest.param( - ( - FixedWindowLTRMultiplier, - "fixed", - ["add-1998-cmo", "dbl-1998-cmo"], - {"m": 5}, - ), - id="FIX2", - ), - pytest.param( - ( - FullPrecompMultiplier, - "precomp", - ["add-1998-cmo", "dbl-1998-cmo"], - {"direction": ProcessingDirection.LTR}, - ), - id="PRE1", - ), - pytest.param( - ( - FullPrecompMultiplier, - "precomp", - ["add-1998-cmo", "dbl-1998-cmo"], - {"direction": ProcessingDirection.RTL}, - ), - id="PRE2", - ), - pytest.param( - ( - BGMWMultiplier, - "bgmw", - ["add-1998-cmo", "dbl-1998-cmo"], - {"width": 3, "direction": ProcessingDirection.LTR}, - ), - id="BGMW1", - ), - pytest.param( - ( - BGMWMultiplier, - "bgmw", - ["add-1998-cmo", "dbl-1998-cmo"], - {"width": 5, "direction": ProcessingDirection.RTL}, - ), - id="BGMW2", - ), - pytest.param( - ( - CombMultiplier, - "comb", - ["add-1998-cmo", "dbl-1998-cmo"], - {"width": 3}, - ), - id="Comb1", - ), - pytest.param( - ( - CombMultiplier, - "comb", - ["add-1998-cmo", "dbl-1998-cmo"], - {"width": 5}, - ), - id="Comb2", - ), - ], -) -def target(request, additional, secp128r1) -> ImplTarget: - mult_class, mult_name, formulas, mult_kwargs = request.param +@pytest.fixture(scope="module") +def target(simple_multiplier, additional, secp128r1) -> Generator[HostTarget, Any, None]: + mult_class, mult_kwargs = simple_multiplier + mult_name = mult_class.__name__ + formulas = ["add-1998-cmo", "dbl-1998-cmo"] + if NegationFormula in mult_class.requires: + formulas.append("neg") runner = CliRunner() with runner.isolated_filesystem() as tmpdir: res = runner.invoke( @@ -235,7 +56,6 @@ def target(request, additional, secp128r1) -> ImplTarget: [ "--platform", "HOST", - *additional, "--ecdsa", "--ecdh", secp128r1.curve.model.shortname, |
