diff options
| author | J08nY | 2025-03-15 00:46:00 +0100 |
|---|---|---|
| committer | J08nY | 2025-03-15 00:46:00 +0100 |
| commit | 6ee18cad2f646a7bd05d42ef033238ae06cd9045 (patch) | |
| tree | f470a2b185e3bbcfa8451d419f72745fa856fa25 /pyecsca/ec | |
| parent | 1dfb66aa161b3236de27269f4e387e5d3ab7c79e (diff) | |
| download | pyecsca-6ee18cad2f646a7bd05d42ef033238ae06cd9045.tar.gz pyecsca-6ee18cad2f646a7bd05d42ef033238ae06cd9045.tar.zst pyecsca-6ee18cad2f646a7bd05d42ef033238ae06cd9045.zip | |
Diffstat (limited to 'pyecsca/ec')
| -rw-r--r-- | pyecsca/ec/mult/fake.py | 55 |
1 files changed, 36 insertions, 19 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 |
