aboutsummaryrefslogtreecommitdiff
path: root/pyecsca/ec/mult/fake.py
blob: 391696b28ab4700ac924e68c06593f386be04aa3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
from typing import List, Type, Callable

from pyecsca.ec.formula import Formula, AdditionFormula, DifferentialAdditionFormula, DoublingFormula, LadderFormula, \
    NegationFormula
from pyecsca.ec.formula.fake import FakeFormula
from pyecsca.ec.mult import ScalarMultiplier
from pyecsca.ec.params import DomainParameters


def fake_mult(mult_class: Type[ScalarMultiplier], mult_factory: Callable, params: DomainParameters) -> ScalarMultiplier:
    """
    Get a multiplier with `FakeFormula`s.

    :param mult_class: The class of the scalar multiplier to use.
    :param mult_factory: A callable that takes the formulas and instantiates the multiplier.
    :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))
    mult = mult_factory(*formulas, short_circuit=False)
    return mult