aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pyecsca/ec/mult/fake.py55
-rw-r--r--pyecsca/sca/re/rpa.py13
2 files changed, 47 insertions, 21 deletions
diff --git a/pyecsca/ec/mult/fake.py b/pyecsca/ec/mult/fake.py
index d3f5b09..e0c8610 100644
--- a/pyecsca/ec/mult/fake.py
+++ b/pyecsca/ec/mult/fake.py
@@ -1,18 +1,30 @@
-from typing import List, Type, Callable
+from typing import Type, Callable
+from copy import deepcopy
from pyecsca.ec.formula import (
- Formula,
AdditionFormula,
DifferentialAdditionFormula,
DoublingFormula,
LadderFormula,
NegationFormula,
+ ScalingFormula,
)
-from pyecsca.ec.formula.fake import FakeFormula
+from pyecsca.ec.formula.fake import FakeAdditionFormula, FakeDifferentialAdditionFormula, \
+ FakeDoublingFormula, FakeLadderFormula, FakeNegationFormula, FakeScalingFormula
from pyecsca.ec.mult import ScalarMultiplier
from pyecsca.ec.params import DomainParameters
+fake_map = {
+ AdditionFormula: FakeAdditionFormula,
+ DifferentialAdditionFormula: FakeDifferentialAdditionFormula,
+ DoublingFormula: FakeDoublingFormula,
+ LadderFormula: FakeLadderFormula,
+ NegationFormula: FakeNegationFormula,
+ ScalingFormula: FakeScalingFormula,
+}
+
+
def fake_mult(
mult_class: Type[ScalarMultiplier], mult_factory: Callable, params: DomainParameters
) -> ScalarMultiplier:
@@ -24,22 +36,27 @@ def fake_mult(
:param params: The domain parameters to use.
:return: The multiplier.
"""
- formula_classes: List[Type[Formula]] = list(
- filter(
- lambda klass: klass in mult_class.requires,
- [
- AdditionFormula,
- DifferentialAdditionFormula,
- DoublingFormula,
- LadderFormula,
- NegationFormula,
- ],
- )
- )
formulas = []
- for formula in formula_classes:
- for subclass in formula.__subclasses__():
- if issubclass(subclass, FakeFormula):
- formulas.append(subclass(params.curve.coordinate_model))
+ for formula, fake_formula in fake_map.items():
+ if formula in mult_class.requires:
+ formulas.append(fake_formula(params.curve.coordinate_model))
mult = mult_factory(*formulas, short_circuit=False)
return mult
+
+
+def turn_fake(mult: ScalarMultiplier) -> ScalarMultiplier:
+ """
+ Turn a multiplier into a fake multiplier.
+
+ :param mult: The multiplier to turn into a fake multiplier.
+ :return: The multiplier with fake formulas.
+ """
+ copy = deepcopy(mult)
+ copy.short_circuit = False
+ formulas = {}
+ for key, formula in copy.formulas.items():
+ for real, fake in fake_map.items():
+ if isinstance(formula, real):
+ formulas[key] = fake(formula.coordinate_model)
+ copy.formulas = formulas
+ return copy
diff --git a/pyecsca/sca/re/rpa.py b/pyecsca/sca/re/rpa.py
index 10071b0..dbfb844 100644
--- a/pyecsca/sca/re/rpa.py
+++ b/pyecsca/sca/re/rpa.py
@@ -32,7 +32,7 @@ from pyecsca.ec.formula import (
TriplingFormula,
NegationFormula,
DifferentialAdditionFormula,
- LadderFormula,
+ LadderFormula, ScalingFormula,
)
from pyecsca.ec.mod import Mod, mod
from pyecsca.ec.mult import (
@@ -151,6 +151,12 @@ class MultipleContext(Context):
self.points[dbl] = 2 * self.points[one]
self.parents[dbl] = [one]
self.formulas[dbl] = action.formula.shortname
+ elif isinstance(action.formula, ScalingFormula):
+ inp = action.input_points[0]
+ out = action.output_points[0]
+ self.points[out] = self.points[inp]
+ self.parents[out] = [inp]
+ self.formulas[out] = action.formula.shortname
def __repr__(self):
return f"{self.__class__.__name__}({self.base!r}, multiples={self.points.values()!r})"
@@ -426,7 +432,7 @@ def multiples_computed(
params: DomainParameters,
mult_class: Type[ScalarMultiplier],
mult_factory: Callable,
- use_init: bool = False,
+ use_init: bool = True,
use_multiply: bool = True,
kind: Union[
Literal["all"],
@@ -448,6 +454,9 @@ def multiples_computed(
:return: A list of tuples, where the first element is the formula shortname (e.g. "add") and the second is a tuple of the dlog
relationships to the input of the input points to the formula.
"""
+ if kind != "all" and not use_init:
+ raise ValueError("Cannot use kind other than 'all' with use_init=False.")
+
mult = _cached_fake_mult(mult_class, mult_factory, params)
ctx = MultipleContext(keep_base=True)
if use_init: