aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJ08nY2025-03-11 13:41:35 +0100
committerJ08nY2025-03-11 13:41:35 +0100
commit414c78a620d9bfcd730c0729c8d26fca58cac977 (patch)
tree75760db3e345bde8464d2f6cdbf502146b0962dd
parent3a03c3569b054571c924138a315f0bc826a05f13 (diff)
downloadpyecsca-414c78a620d9bfcd730c0729c8d26fca58cac977.tar.gz
pyecsca-414c78a620d9bfcd730c0729c8d26fca58cac977.tar.zst
pyecsca-414c78a620d9bfcd730c0729c8d26fca58cac977.zip
Fix lint.
-rw-r--r--pyecsca/ec/countermeasures.py21
-rw-r--r--test/ec/test_countermeasures.py59
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)