aboutsummaryrefslogtreecommitdiff
path: root/test/ec/test_mult.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/ec/test_mult.py')
-rw-r--r--test/ec/test_mult.py88
1 files changed, 61 insertions, 27 deletions
diff --git a/test/ec/test_mult.py b/test/ec/test_mult.py
index e477b07..e65dfdd 100644
--- a/test/ec/test_mult.py
+++ b/test/ec/test_mult.py
@@ -3,6 +3,7 @@ from typing import Sequence, List
import pytest
+from pyecsca.ec.context import local, DefaultContext
from pyecsca.ec.mod import Mod, mod
from pyecsca.ec.mult import (
DoubleAndAddMultiplier,
@@ -22,9 +23,11 @@ from pyecsca.ec.mult import (
BGMWMultiplier,
CombMultiplier,
WindowBoothMultiplier,
+ SwapLadderMultiplier,
)
from pyecsca.ec.mult.fixed import FullPrecompMultiplier
from pyecsca.ec.point import InfinityPoint, Point
+from pyecsca.sca import MultipleContext
def get_formulas(coords, *names):
@@ -54,7 +57,7 @@ def do_basic_test(mult_class, params, base, add, dbl, scale, neg=None, **kwargs)
except NotImplementedError:
pass
mult.init(params, base)
- assert InfinityPoint(params.curve.coordinate_model) == mult.multiply(0)
+ assert params.curve.neutral == mult.multiply(0)
return res
@@ -186,7 +189,7 @@ def test_ladder(curve25519):
29893438142586401087946310744922998080771935139441267052026283852717044358472,
48084050389777770101701157326923977117307187144965043058462938058489685090437,
40694087602335028385342029955981451169449898924211721351135404099078471497195,
- )
+ ),
],
)
def test_ladder_full(curve25519, scalar, x, res):
@@ -194,24 +197,19 @@ def test_ladder_full(curve25519, scalar, x, res):
point = Point(curve25519.curve.coordinate_model, X=mod(x, p), Z=mod(1, p))
result = Point(curve25519.curve.coordinate_model, X=mod(res, p), Z=mod(1, p))
- mult = LadderMultiplier(
- curve25519.curve.coordinate_model.formulas["ladd-1987-m"],
- curve25519.curve.coordinate_model.formulas["dbl-1987-m"],
- # complete=False
- )
- fixed = int(mod(scalar, curve25519.order))
-
- mult.init(curve25519, point)
- computed = mult.multiply(fixed)
+ for complete in (True, False):
+ mult = LadderMultiplier(
+ curve25519.curve.coordinate_model.formulas["ladd-1987-m"],
+ curve25519.curve.coordinate_model.formulas["dbl-1987-m"],
+ complete=complete,
+ )
- point_aff = list(curve25519.curve.affine_lift_x(mod(x, p)))[0]
- result_aff = list(curve25519.curve.affine_lift_x(mod(res, p)))[0]
- computed_aff = curve25519.curve.affine_multiply(point_aff, scalar)
+ mult.init(curve25519, point)
+ computed = mult.multiply(scalar)
- scale = curve25519.curve.coordinate_model.formulas["scale"]
- converted = scale(p, computed, **curve25519.curve.parameters)[0]
- assert computed_aff.x == result_aff.x
- assert converted.X == result.X
+ scale = curve25519.curve.coordinate_model.formulas["scale"]
+ converted = scale(p, computed, **curve25519.curve.parameters)[0]
+ assert converted.X == result.X
@pytest.mark.parametrize(
@@ -229,35 +227,71 @@ def test_simple_ladder(secp128r1, add, dbl, scale):
@pytest.mark.parametrize(
- "num,complete",
+ "num",
+ [
+ 15,
+ 2355498743,
+ 325385790209017329644351321912443757746,
+ 0x1000000000000000000000000000000014DEF9DEA2F79CD65812631A5CF5D3ED - 1,
+ ],
+)
+@pytest.mark.parametrize("complete", [True, False])
+@pytest.mark.parametrize("short_circuit", [True, False])
+def test_ladder_swap(curve25519, num, complete, short_circuit):
+ ladder = LadderMultiplier(
+ curve25519.curve.coordinate_model.formulas["ladd-1987-m"],
+ curve25519.curve.coordinate_model.formulas["dbl-1987-m"],
+ curve25519.curve.coordinate_model.formulas["scale"],
+ complete=complete,
+ short_circuit=short_circuit,
+ )
+ swap = SwapLadderMultiplier(
+ curve25519.curve.coordinate_model.formulas["ladd-1987-m"],
+ curve25519.curve.coordinate_model.formulas["dbl-1987-m"],
+ curve25519.curve.coordinate_model.formulas["scale"],
+ complete=complete,
+ short_circuit=short_circuit,
+ )
+ ladder.init(curve25519, curve25519.generator)
+ res_ladder = ladder.multiply(num)
+ swap.init(curve25519, curve25519.generator)
+ res_swap = swap.multiply(num)
+ assert res_ladder == res_swap
+ assert curve25519.curve.neutral == swap.multiply(0)
+
+
+@pytest.mark.parametrize(
+ "num",
[
- (15, True),
- (15, False),
- (2355498743, True),
- (2355498743, False),
- (325385790209017329644351321912443757746, True),
- (325385790209017329644351321912443757746, False),
+ 15,
+ 2355498743,
+ 325385790209017329644351321912443757746,
+ 0x1000000000000000000000000000000014DEF9DEA2F79CD65812631A5CF5D3ED - 1,
],
)
-def test_ladder_differential(curve25519, num, complete):
+@pytest.mark.parametrize("complete", [True, False])
+@pytest.mark.parametrize("short_circuit", [True, False])
+def test_ladder_differential(curve25519, num, complete, short_circuit):
ladder = LadderMultiplier(
curve25519.curve.coordinate_model.formulas["ladd-1987-m"],
curve25519.curve.coordinate_model.formulas["dbl-1987-m"],
curve25519.curve.coordinate_model.formulas["scale"],
complete=complete,
+ short_circuit=short_circuit,
)
differential = DifferentialLadderMultiplier(
curve25519.curve.coordinate_model.formulas["dadd-1987-m"],
curve25519.curve.coordinate_model.formulas["dbl-1987-m"],
curve25519.curve.coordinate_model.formulas["scale"],
complete=complete,
+ short_circuit=short_circuit,
)
ladder.init(curve25519, curve25519.generator)
res_ladder = ladder.multiply(num)
differential.init(curve25519, curve25519.generator)
res_differential = differential.multiply(num)
assert res_ladder == res_differential
- assert InfinityPoint(curve25519.curve.coordinate_model) == differential.multiply(0)
+ assert curve25519.curve.neutral == differential.multiply(0)
@pytest.mark.parametrize(