diff options
| author | J08nY | 2025-03-11 13:41:35 +0100 |
|---|---|---|
| committer | J08nY | 2025-03-11 13:41:35 +0100 |
| commit | 414c78a620d9bfcd730c0729c8d26fca58cac977 (patch) | |
| tree | 75760db3e345bde8464d2f6cdbf502146b0962dd | |
| parent | 3a03c3569b054571c924138a315f0bc826a05f13 (diff) | |
| download | pyecsca-414c78a620d9bfcd730c0729c8d26fca58cac977.tar.gz pyecsca-414c78a620d9bfcd730c0729c8d26fca58cac977.tar.zst pyecsca-414c78a620d9bfcd730c0729c8d26fca58cac977.zip | |
Fix lint.
| -rw-r--r-- | pyecsca/ec/countermeasures.py | 21 | ||||
| -rw-r--r-- | test/ec/test_countermeasures.py | 59 |
2 files changed, 58 insertions, 22 deletions
diff --git a/pyecsca/ec/countermeasures.py b/pyecsca/ec/countermeasures.py index ee07c2b..d6af799 100644 --- a/pyecsca/ec/countermeasures.py +++ b/pyecsca/ec/countermeasures.py @@ -20,9 +20,10 @@ class ScalarMultiplierCountermeasure(ABC): This class behaves like a scalar multiplier, in fact it wraps one and provides some scalar-splitting countermeasure. """ + mult: ScalarMultiplier params: Optional[DomainParameters] - point: Optional[Point] + point: Optional[Point] def __init__(self, mult: ScalarMultiplier): self.mult = mult @@ -45,12 +46,15 @@ class GroupScalarRandomization(ScalarMultiplierCountermeasure): self.rand_bits = rand_bits def multiply(self, scalar: int) -> Point: + if self.params is None or self.point is None: + raise ValueError("Not initialized.") self.mult.init(self.params, self.point) order = self.params.order mask = int(Mod.random(1 << self.rand_bits)) masked_scalar = scalar + mask * order return self.mult.multiply(masked_scalar) + @public class AdditiveSplitting(ScalarMultiplierCountermeasure): add: Optional[AdditionFormula] @@ -60,6 +64,8 @@ class AdditiveSplitting(ScalarMultiplierCountermeasure): self.add = add def multiply(self, scalar: int) -> Point: + if self.params is None or self.point is None: + raise ValueError("Not initialized.") self.mult.init(self.params, self.point) order = self.params.order @@ -70,7 +76,9 @@ class AdditiveSplitting(ScalarMultiplierCountermeasure): if self.add is None: return self.mult._add(R, S) # noqa: This is OK. else: - return self.add(self.params.curve.prime, R, S, **self.params.curve.parameters)[0] + return self.add( + self.params.curve.prime, R, S, **self.params.curve.parameters + )[0] @public @@ -82,6 +90,8 @@ class MultiplicativeSplitting(ScalarMultiplierCountermeasure): self.rand_bits = rand_bits def multiply(self, scalar: int) -> Point: + if self.params is None or self.point is None: + raise ValueError("Not initialized.") self.mult.init(self.params, self.point) r = Mod.random(1 << self.rand_bits) R = self.mult.multiply(int(r)) @@ -90,6 +100,7 @@ class MultiplicativeSplitting(ScalarMultiplierCountermeasure): kr_inv = scalar * mod(int(r), self.params.order).inverse() return self.mult.multiply(int(kr_inv)) + @public class EuclideanSplitting(ScalarMultiplierCountermeasure): add: Optional[AdditionFormula] @@ -99,6 +110,8 @@ class EuclideanSplitting(ScalarMultiplierCountermeasure): self.add = add def multiply(self, scalar: int) -> Point: + if self.params is None or self.point is None: + raise ValueError("Not initialized.") order = self.params.order half_bits = order.bit_length() // 2 r = Mod.random(1 << half_bits) @@ -115,4 +128,6 @@ class EuclideanSplitting(ScalarMultiplierCountermeasure): if self.add is None: return self.mult._add(S, T) # noqa: This is OK. else: - return self.add(self.params.curve.prime, S, T, **self.params.curve.parameters)[0]
\ No newline at end of file + return self.add( + self.params.curve.prime, S, T, **self.params.curve.parameters + )[0] diff --git a/test/ec/test_countermeasures.py b/test/ec/test_countermeasures.py index 35ac5e8..3f78f74 100644 --- a/test/ec/test_countermeasures.py +++ b/test/ec/test_countermeasures.py @@ -1,8 +1,12 @@ import pytest from pyecsca.ec.mult import LTRMultiplier -from pyecsca.ec.countermeasures import GroupScalarRandomization, AdditiveSplitting, MultiplicativeSplitting, \ - EuclideanSplitting +from pyecsca.ec.countermeasures import ( + GroupScalarRandomization, + AdditiveSplitting, + MultiplicativeSplitting, + EuclideanSplitting, +) @pytest.fixture(params=["add-1998-cmo-2", "add-2015-rcb"]) @@ -14,15 +18,20 @@ def add(secp128r1, request): def dbl(secp128r1, request): return secp128r1.curve.coordinate_model.formulas[request.param] + @pytest.fixture() def mult(secp128r1, add, dbl): return LTRMultiplier(add, dbl, complete=False) + @pytest.mark.parametrize( - "num", [325385790209017329644351321912443757746, - 123456789314159265358979323846264338327, - 987654321314159265358979323846264338327, - 786877845665557891354654531354008066400] + "num", + [ + 325385790209017329644351321912443757746, + 123456789314159265358979323846264338327, + 987654321314159265358979323846264338327, + 786877845665557891354654531354008066400, + ], ) def test_group_scalar_rand(mult, secp128r1, num): mult.init(secp128r1, secp128r1.generator) @@ -33,11 +42,15 @@ def test_group_scalar_rand(mult, secp128r1, num): masked = gsr.multiply(num) assert raw.equals(masked) + @pytest.mark.parametrize( - "num", [325385790209017329644351321912443757746, - 123456789314159265358979323846264338327, - 987654321314159265358979323846264338327, - 786877845665557891354654531354008066400] + "num", + [ + 325385790209017329644351321912443757746, + 123456789314159265358979323846264338327, + 987654321314159265358979323846264338327, + 786877845665557891354654531354008066400, + ], ) def test_additive_splitting(mult, secp128r1, num): mult.init(secp128r1, secp128r1.generator) @@ -48,11 +61,15 @@ def test_additive_splitting(mult, secp128r1, num): masked = asplit.multiply(num) assert raw.equals(masked) + @pytest.mark.parametrize( - "num", [325385790209017329644351321912443757746, - 123456789314159265358979323846264338327, - 987654321314159265358979323846264338327, - 786877845665557891354654531354008066400] + "num", + [ + 325385790209017329644351321912443757746, + 123456789314159265358979323846264338327, + 987654321314159265358979323846264338327, + 786877845665557891354654531354008066400, + ], ) def test_multiplicative_splitting(mult, secp128r1, num): mult.init(secp128r1, secp128r1.generator) @@ -63,11 +80,15 @@ def test_multiplicative_splitting(mult, secp128r1, num): masked = msplit.multiply(num) assert raw.equals(masked) + @pytest.mark.parametrize( - "num", [325385790209017329644351321912443757746, - 123456789314159265358979323846264338327, - 987654321314159265358979323846264338327, - 786877845665557891354654531354008066400] + "num", + [ + 325385790209017329644351321912443757746, + 123456789314159265358979323846264338327, + 987654321314159265358979323846264338327, + 786877845665557891354654531354008066400, + ], ) def test_euclidean_splitting(mult, secp128r1, num): mult.init(secp128r1, secp128r1.generator) @@ -76,4 +97,4 @@ def test_euclidean_splitting(mult, secp128r1, num): esplit = EuclideanSplitting(mult) esplit.init(secp128r1, secp128r1.generator) masked = esplit.multiply(num) - assert raw.equals(masked)
\ No newline at end of file + assert raw.equals(masked) |
