diff options
| author | Ján Jančár | 2025-10-03 14:53:42 +0200 |
|---|---|---|
| committer | GitHub | 2025-10-03 14:53:42 +0200 |
| commit | 0bdecc62992ea1da4d6fd3591aa2787608c66363 (patch) | |
| tree | 9eef9a6d23a0075a318be0e98d3f726c0bfc977e /test | |
| parent | 79d723f4ff97156b5828623b53dd58c33f16500b (diff) | |
| parent | 4382db8c501b9b9a39ff67d33ce79bd16dbf5747 (diff) | |
| download | pyecsca-0bdecc62992ea1da4d6fd3591aa2787608c66363.tar.gz pyecsca-0bdecc62992ea1da4d6fd3591aa2787608c66363.tar.zst pyecsca-0bdecc62992ea1da4d6fd3591aa2787608c66363.zip | |
Diffstat (limited to 'test')
| -rw-r--r-- | test/ec/test_countermeasures.py | 117 |
1 files changed, 103 insertions, 14 deletions
diff --git a/test/ec/test_countermeasures.py b/test/ec/test_countermeasures.py index 1bf1477..62db0d4 100644 --- a/test/ec/test_countermeasures.py +++ b/test/ec/test_countermeasures.py @@ -7,8 +7,10 @@ from pyecsca.ec.countermeasures import ( GroupScalarRandomization, AdditiveSplitting, MultiplicativeSplitting, - EuclideanSplitting, BrumleyTuveri, + EuclideanSplitting, + BrumleyTuveri, ) +from pyecsca.ec.mod import mod from pyecsca.ec.mult import * @@ -122,7 +124,10 @@ def mults(secp128r1, add, dbl): ) for combination in product(*bgmw_options.values()) ] - comb_options = {"width": (2, 3, 4, 5), "accumulation_order": tuple(AccumulationOrder)} + comb_options = { + "width": (2, 3, 4, 5), + "accumulation_order": tuple(AccumulationOrder), + } combs = [ CombMultiplier( add, dbl, scl=scale, **dict(zip(comb_options.keys(), combination)) @@ -131,18 +136,18 @@ def mults(secp128r1, add, dbl): ] return ( - ltrs - + rtls - + bnafs - + wnafs - + booths - + [CoronMultiplier(add, dbl, scale)] - + ladders - + fixeds - + slides - + precomps - + bgmws - + combs + ltrs + + rtls + + bnafs + + wnafs + + booths + + [CoronMultiplier(add, dbl, scale)] + + ladders + + fixeds + + slides + + precomps + + bgmws + + combs ) @@ -239,3 +244,87 @@ def test_brumley_tuveri(mults, secp128r1, num): bt.init(secp128r1, secp128r1.generator) masked = bt.multiply(num) assert raw.equals(masked) + + +@pytest.mark.parametrize( + "scalar", + [ + 3253857902090173296443513219124437746, + 1234567893141592653589793238464338327, + 86728612699079982903603364383639280149, + 60032993417060801067503559426926851620, + ], +) +@pytest.mark.parametrize( + "one,two", + product( + ( + GroupScalarRandomization, + AdditiveSplitting, + MultiplicativeSplitting, + EuclideanSplitting, + BrumleyTuveri, + ), + repeat=2, + ), +) +def test_combination(scalar, one, two, secp128r1): + if one == two: + pytest.skip("Skip identical combinations.") + mult = LTRMultiplier( + secp128r1.curve.coordinate_model.formulas["add-2015-rcb"], + secp128r1.curve.coordinate_model.formulas["dbl-2015-rcb"], + ) + mult.init(secp128r1, secp128r1.generator) + raw = mult.multiply(scalar) + + add = mult.formulas["add"] + + if one in (AdditiveSplitting, EuclideanSplitting): + layer_one = one(mult, add=add) + else: + layer_one = one(mult) + + if two in (AdditiveSplitting, EuclideanSplitting): + combo = two(layer_one, add=add) + else: + combo = two(layer_one) + combo.init(secp128r1, secp128r1.generator) + masked = combo.multiply(scalar) + assert raw.equals(masked) + + +@pytest.mark.parametrize( + "scalar", + [ + 3253857902090173296443513219124437746, + 1234567893141592653589793238464338327, + 86728612699079982903603364383639280149, + 60032993417060801067503559426926851620, + ], +) +@pytest.mark.parametrize( + "ctr", + ( + GroupScalarRandomization, + AdditiveSplitting, + EuclideanSplitting, + MultiplicativeSplitting, + BrumleyTuveri, + ), +) +def test_rng(scalar, ctr, secp128r1): + mult = LTRMultiplier( + secp128r1.curve.coordinate_model.formulas["add-2015-rcb"], + secp128r1.curve.coordinate_model.formulas["dbl-2015-rcb"], + ) + mult.init(secp128r1, secp128r1.generator) + raw = mult.multiply(scalar) + + def rng(n): + return mod(123456789, n) + + m = ctr(mult, rng) + m.init(secp128r1, secp128r1.generator) + masked = m.multiply(scalar) + assert raw.equals(masked) |
