diff options
Diffstat (limited to 'pyecsca/ec/mult.py')
| -rw-r--r-- | pyecsca/ec/mult.py | 66 |
1 files changed, 30 insertions, 36 deletions
diff --git a/pyecsca/ec/mult.py b/pyecsca/ec/mult.py index 2576d7a..ab6cf7b 100644 --- a/pyecsca/ec/mult.py +++ b/pyecsca/ec/mult.py @@ -1,31 +1,26 @@ from copy import copy -from public import public from typing import Mapping, Tuple, Optional, MutableMapping, Union -from pyecsca.ec.naf import naf, wnaf -from .context import Context -from .curve import EllipticCurve +from public import public + +from .context import getcontext +from .formula import (Formula, AdditionFormula, DoublingFormula, DifferentialAdditionFormula, + ScalingFormula, LadderFormula, NegationFormula) from .group import AbelianGroup -from .formula import (Formula, AdditionFormula, DoublingFormula, ScalingFormula, LadderFormula, - NegationFormula, DifferentialAdditionFormula) +from .naf import naf, wnaf from .point import Point class ScalarMultiplier(object): group: AbelianGroup formulas: Mapping[str, Formula] - context: Context _point: Point = None - def __init__(self, group: AbelianGroup, ctx: Context = None, **formulas: Optional[Formula]): + def __init__(self, group: AbelianGroup, **formulas: Optional[Formula]): for formula in formulas.values(): if formula is not None and formula.coordinate_model is not group.curve.coordinate_model: raise ValueError self.group = group - if ctx: - self.context = ctx - else: - self.context = Context() self.formulas = dict(filter(lambda pair: pair[1] is not None, formulas.items())) def _add(self, one: Point, other: Point) -> Point: @@ -35,24 +30,25 @@ class ScalarMultiplier(object): return copy(other) if other == self.group.neutral: return copy(one) - return self.context.execute(self.formulas["add"], one, other, **self.group.curve.parameters)[0] + return \ + getcontext().execute(self.formulas["add"], one, other, **self.group.curve.parameters)[0] def _dbl(self, point: Point) -> Point: if "dbl" not in self.formulas: raise NotImplementedError if point == self.group.neutral: return copy(point) - return self.context.execute(self.formulas["dbl"], point, **self.group.curve.parameters)[0] + return getcontext().execute(self.formulas["dbl"], point, **self.group.curve.parameters)[0] def _scl(self, point: Point) -> Point: if "scl" not in self.formulas: raise NotImplementedError - return self.context.execute(self.formulas["scl"], point, **self.group.curve.parameters)[0] + return getcontext().execute(self.formulas["scl"], point, **self.group.curve.parameters)[0] def _ladd(self, start: Point, to_dbl: Point, to_add: Point) -> Tuple[Point, ...]: if "ladd" not in self.formulas: raise NotImplementedError - return self.context.execute(self.formulas["ladd"], start, to_dbl, to_add, + return getcontext().execute(self.formulas["ladd"], start, to_dbl, to_add, **self.group.curve.parameters) def _dadd(self, start: Point, one: Point, other: Point) -> Point: @@ -62,13 +58,13 @@ class ScalarMultiplier(object): return copy(other) if other == self.group.neutral: return copy(one) - return self.context.execute(self.formulas["dadd"], start, one, other, + return getcontext().execute(self.formulas["dadd"], start, one, other, **self.group.curve.parameters)[0] def _neg(self, point: Point) -> Point: if "neg" not in self.formulas: raise NotImplementedError - return self.context.execute(self.formulas["neg"], point, **self.group.curve.parameters)[0] + return getcontext().execute(self.formulas["neg"], point, **self.group.curve.parameters)[0] def init(self, point: Point): self._point = point @@ -96,9 +92,8 @@ class LTRMultiplier(ScalarMultiplier): always: bool def __init__(self, group: AbelianGroup, add: AdditionFormula, dbl: DoublingFormula, - scl: ScalingFormula = None, - ctx: Context = None, always: bool = False): - super().__init__(group, ctx, add=add, dbl=dbl, scl=scl) + scl: ScalingFormula = None, always: bool = False): + super().__init__(group, add=add, dbl=dbl, scl=scl) self.always = always def multiply(self, scalar: int, point: Optional[Point] = None) -> Point: @@ -127,9 +122,8 @@ class RTLMultiplier(ScalarMultiplier): always: bool def __init__(self, group: AbelianGroup, add: AdditionFormula, dbl: DoublingFormula, - scl: ScalingFormula = None, - ctx: Context = None, always: bool = False): - super().__init__(group, ctx, add=add, dbl=dbl, scl=scl) + scl: ScalingFormula = None, always: bool = False): + super().__init__(group, add=add, dbl=dbl, scl=scl) self.always = always def multiply(self, scalar: int, point: Optional[Point] = None) -> Point: @@ -159,8 +153,8 @@ class CoronMultiplier(ScalarMultiplier): """ def __init__(self, group: AbelianGroup, add: AdditionFormula, dbl: DoublingFormula, - scl: ScalingFormula = None, ctx: Context = None): - super().__init__(group, ctx, add=add, dbl=dbl, scl=scl) + scl: ScalingFormula = None): + super().__init__(group, add=add, dbl=dbl, scl=scl) def multiply(self, scalar: int, point: Optional[Point] = None): if scalar == 0: @@ -183,9 +177,9 @@ class LadderMultiplier(ScalarMultiplier): Montgomery ladder multiplier, using a three input, two output ladder formula. """ - def __init__(self, group: AbelianGroup, ladd: LadderFormula, dbl: DoublingFormula, scl: ScalingFormula = None, - ctx: Context = None): - super().__init__(group, ctx, ladd=ladd, dbl=dbl, scl=scl) + def __init__(self, group: AbelianGroup, ladd: LadderFormula, dbl: DoublingFormula, + scl: ScalingFormula = None): + super().__init__(group, ladd=ladd, dbl=dbl, scl=scl) def multiply(self, scalar: int, point: Optional[Point] = None) -> Point: if scalar == 0: @@ -212,11 +206,11 @@ class SimpleLadderMultiplier(ScalarMultiplier): def __init__(self, group: AbelianGroup, add: Union[AdditionFormula, DifferentialAdditionFormula], dbl: DoublingFormula, - scl: ScalingFormula = None, ctx: Context = None): + scl: ScalingFormula = None): if isinstance(add, AdditionFormula): - super().__init__(group, ctx, add=add, dbl=dbl, scl=scl) + super().__init__(group, add=add, dbl=dbl, scl=scl) elif isinstance(add, DifferentialAdditionFormula): - super().__init__(group, ctx, dadd=add, dbl=dbl, scl=scl) + super().__init__(group, dadd=add, dbl=dbl, scl=scl) self._differential = True else: raise ValueError @@ -253,8 +247,8 @@ class BinaryNAFMultiplier(ScalarMultiplier): _point_neg: Point def __init__(self, group: AbelianGroup, add: AdditionFormula, dbl: DoublingFormula, - neg: NegationFormula, scl: ScalingFormula = None, ctx: Context = None): - super().__init__(group, ctx, add=add, dbl=dbl, neg=neg, scl=scl) + neg: NegationFormula, scl: ScalingFormula = None): + super().__init__(group, add=add, dbl=dbl, neg=neg, scl=scl) def init(self, point: Point): super().init(point) @@ -288,9 +282,9 @@ class WindowNAFMultiplier(ScalarMultiplier): _width: int def __init__(self, group: AbelianGroup, add: AdditionFormula, dbl: DoublingFormula, - neg: NegationFormula, width: int, scl: ScalingFormula = None, ctx: Context = None, + neg: NegationFormula, width: int, scl: ScalingFormula = None, precompute_negation: bool = False): - super().__init__(group, ctx, add=add, dbl=dbl, neg=neg, scl=scl) + super().__init__(group, add=add, dbl=dbl, neg=neg, scl=scl) self._width = width self._precompute_neg = precompute_negation |
