aboutsummaryrefslogtreecommitdiff
path: root/pyecsca/ec/mult/fake.py
diff options
context:
space:
mode:
Diffstat (limited to 'pyecsca/ec/mult/fake.py')
-rw-r--r--pyecsca/ec/mult/fake.py21
1 files changed, 19 insertions, 2 deletions
diff --git a/pyecsca/ec/mult/fake.py b/pyecsca/ec/mult/fake.py
index e0c8610..f18d695 100644
--- a/pyecsca/ec/mult/fake.py
+++ b/pyecsca/ec/mult/fake.py
@@ -1,3 +1,4 @@
+from functools import lru_cache
from typing import Type, Callable
from copy import deepcopy
@@ -9,8 +10,14 @@ from pyecsca.ec.formula import (
NegationFormula,
ScalingFormula,
)
-from pyecsca.ec.formula.fake import FakeAdditionFormula, FakeDifferentialAdditionFormula, \
- FakeDoublingFormula, FakeLadderFormula, FakeNegationFormula, FakeScalingFormula
+from pyecsca.ec.formula.fake import (
+ FakeAdditionFormula,
+ FakeDifferentialAdditionFormula,
+ FakeDoublingFormula,
+ FakeLadderFormula,
+ FakeNegationFormula,
+ FakeScalingFormula,
+)
from pyecsca.ec.mult import ScalarMultiplier
from pyecsca.ec.params import DomainParameters
@@ -60,3 +67,13 @@ def turn_fake(mult: ScalarMultiplier) -> ScalarMultiplier:
formulas[key] = fake(formula.coordinate_model)
copy.formulas = formulas
return copy
+
+
+@lru_cache(maxsize=256, typed=True)
+def cached_fake_mult(
+ mult_class: Type[ScalarMultiplier], mult_factory: Callable, params: DomainParameters
+) -> ScalarMultiplier:
+ fm = fake_mult(mult_class, mult_factory, params)
+ if getattr(fm, "short_circuit", False):
+ raise ValueError("The multiplier must not short-circuit.")
+ return fm