diff options
| -rw-r--r-- | pyecsca/ec/mult/fake.py | 55 | ||||
| -rw-r--r-- | pyecsca/sca/re/rpa.py | 13 |
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: |
