aboutsummaryrefslogtreecommitdiff
path: root/pyecsca/ec/mult.py
diff options
context:
space:
mode:
Diffstat (limited to 'pyecsca/ec/mult.py')
-rw-r--r--pyecsca/ec/mult.py66
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