aboutsummaryrefslogtreecommitdiff
path: root/test/ec/test_mult.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/ec/test_mult.py')
-rw-r--r--test/ec/test_mult.py312
1 files changed, 205 insertions, 107 deletions
diff --git a/test/ec/test_mult.py b/test/ec/test_mult.py
index 19db2b2..5200520 100644
--- a/test/ec/test_mult.py
+++ b/test/ec/test_mult.py
@@ -3,16 +3,21 @@ from unittest import TestCase
from parameterized import parameterized
from pyecsca.ec.params import get_params
-from pyecsca.ec.mult import (LTRMultiplier, RTLMultiplier, LadderMultiplier, BinaryNAFMultiplier,
- WindowNAFMultiplier, SimpleLadderMultiplier,
- DifferentialLadderMultiplier,
- CoronMultiplier)
+from pyecsca.ec.mult import (
+ LTRMultiplier,
+ RTLMultiplier,
+ LadderMultiplier,
+ BinaryNAFMultiplier,
+ WindowNAFMultiplier,
+ SimpleLadderMultiplier,
+ DifferentialLadderMultiplier,
+ CoronMultiplier,
+)
from pyecsca.ec.point import InfinityPoint
from .utils import cartesian
class ScalarMultiplierTests(TestCase):
-
def setUp(self):
self.secp128r1 = get_params("secg", "secp128r1", "projective")
self.base = self.secp128r1.generator
@@ -31,9 +36,13 @@ class ScalarMultiplierTests(TestCase):
else:
assert one.equals(other)
- def do_basic_test(self, mult_class, params, base, add, dbl, scale, neg=None, **kwargs):
- mult = mult_class(*self.get_formulas(params.curve.coordinate_model, add, dbl, neg, scale),
- **kwargs)
+ def do_basic_test(
+ self, mult_class, params, base, add, dbl, scale, neg=None, **kwargs
+ ):
+ mult = mult_class(
+ *self.get_formulas(params.curve.coordinate_model, add, dbl, neg, scale),
+ **kwargs
+ )
mult.init(params, base)
res = mult.multiply(314)
other = mult.multiply(157)
@@ -44,71 +53,120 @@ class ScalarMultiplierTests(TestCase):
self.assertEqual(InfinityPoint(params.curve.coordinate_model), mult.multiply(0))
return res
- @parameterized.expand([
- ("scaled", "add-1998-cmo", "dbl-1998-cmo", "z"),
- ("complete", "add-2016-rcb", "dbl-2016-rcb", None),
- ("none", "add-1998-cmo", "dbl-1998-cmo", None)
- ])
+ @parameterized.expand(
+ [
+ ("scaled", "add-1998-cmo", "dbl-1998-cmo", "z"),
+ ("complete", "add-2016-rcb", "dbl-2016-rcb", None),
+ ("none", "add-1998-cmo", "dbl-1998-cmo", None),
+ ]
+ )
def test_rtl(self, name, add, dbl, scale):
self.do_basic_test(RTLMultiplier, self.secp128r1, self.base, add, dbl, scale)
- @parameterized.expand([
- ("scaled", "add-1998-cmo", "dbl-1998-cmo", "z"),
- ("complete", "add-2016-rcb", "dbl-2016-rcb", None),
- ("none", "add-1998-cmo", "dbl-1998-cmo", None)
- ])
+ @parameterized.expand(
+ [
+ ("scaled", "add-1998-cmo", "dbl-1998-cmo", "z"),
+ ("complete", "add-2016-rcb", "dbl-2016-rcb", None),
+ ("none", "add-1998-cmo", "dbl-1998-cmo", None),
+ ]
+ )
def test_ltr(self, name, add, dbl, scale):
- a = self.do_basic_test(LTRMultiplier, self.secp128r1, self.base, add, dbl, scale)
- b = self.do_basic_test(LTRMultiplier, self.secp128r1, self.base, add, dbl, scale,
- always=True)
- c = self.do_basic_test(LTRMultiplier, self.secp128r1, self.base, add, dbl, scale,
- complete=False)
- d = self.do_basic_test(LTRMultiplier, self.secp128r1, self.base, add, dbl, scale,
- always=True,
- complete=False)
+ a = self.do_basic_test(
+ LTRMultiplier, self.secp128r1, self.base, add, dbl, scale
+ )
+ b = self.do_basic_test(
+ LTRMultiplier, self.secp128r1, self.base, add, dbl, scale, always=True
+ )
+ c = self.do_basic_test(
+ LTRMultiplier, self.secp128r1, self.base, add, dbl, scale, complete=False
+ )
+ d = self.do_basic_test(
+ LTRMultiplier,
+ self.secp128r1,
+ self.base,
+ add,
+ dbl,
+ scale,
+ always=True,
+ complete=False,
+ )
self.assertPointEquality(a, b, scale)
self.assertPointEquality(b, c, scale)
self.assertPointEquality(c, d, scale)
- @parameterized.expand([
- ("scaled", "add-1998-cmo", "dbl-1998-cmo", "z"),
- ("complete", "add-2016-rcb", "dbl-2016-rcb", None),
- ("none", "add-1998-cmo", "dbl-1998-cmo", None)
- ])
+ @parameterized.expand(
+ [
+ ("scaled", "add-1998-cmo", "dbl-1998-cmo", "z"),
+ ("complete", "add-2016-rcb", "dbl-2016-rcb", None),
+ ("none", "add-1998-cmo", "dbl-1998-cmo", None),
+ ]
+ )
def test_coron(self, name, add, dbl, scale):
self.do_basic_test(CoronMultiplier, self.secp128r1, self.base, add, dbl, scale)
def test_ladder(self):
- a = self.do_basic_test(LadderMultiplier, self.curve25519, self.base25519, "ladd-1987-m",
- "dbl-1987-m", "scale")
- b = self.do_basic_test(LadderMultiplier, self.curve25519, self.base25519, "ladd-1987-m",
- "dbl-1987-m", "scale", complete=False)
+ a = self.do_basic_test(
+ LadderMultiplier,
+ self.curve25519,
+ self.base25519,
+ "ladd-1987-m",
+ "dbl-1987-m",
+ "scale",
+ )
+ b = self.do_basic_test(
+ LadderMultiplier,
+ self.curve25519,
+ self.base25519,
+ "ladd-1987-m",
+ "dbl-1987-m",
+ "scale",
+ complete=False,
+ )
self.assertPointEquality(a, b, True)
- @parameterized.expand([
- ("scaled", "add-1998-cmo", "dbl-1998-cmo", "z"),
- ("complete", "add-2016-rcb", "dbl-2016-rcb", None),
- ("none", "add-1998-cmo", "dbl-1998-cmo", None)
- ])
+ @parameterized.expand(
+ [
+ ("scaled", "add-1998-cmo", "dbl-1998-cmo", "z"),
+ ("complete", "add-2016-rcb", "dbl-2016-rcb", None),
+ ("none", "add-1998-cmo", "dbl-1998-cmo", None),
+ ]
+ )
def test_simple_ladder(self, name, add, dbl, scale):
- self.do_basic_test(SimpleLadderMultiplier, self.secp128r1, self.base, add, dbl, scale)
+ self.do_basic_test(
+ SimpleLadderMultiplier, self.secp128r1, self.base, add, dbl, scale
+ )
- @parameterized.expand([
- ("15", 15, True),
- ("15", 15, False),
- ("2355498743", 2355498743, True),
- ("2355498743", 2355498743, False),
- ("325385790209017329644351321912443757746", 325385790209017329644351321912443757746, True),
- ("325385790209017329644351321912443757746", 325385790209017329644351321912443757746, False)
- ])
+ @parameterized.expand(
+ [
+ ("15", 15, True),
+ ("15", 15, False),
+ ("2355498743", 2355498743, True),
+ ("2355498743", 2355498743, False),
+ (
+ "325385790209017329644351321912443757746",
+ 325385790209017329644351321912443757746,
+ True,
+ ),
+ (
+ "325385790209017329644351321912443757746",
+ 325385790209017329644351321912443757746,
+ False,
+ ),
+ ]
+ )
def test_ladder_differential(self, name, num, complete):
- ladder = LadderMultiplier(self.coords25519.formulas["ladd-1987-m"],
- self.coords25519.formulas["dbl-1987-m"],
- self.coords25519.formulas["scale"], complete=complete)
- differential = DifferentialLadderMultiplier(self.coords25519.formulas["dadd-1987-m"],
- self.coords25519.formulas["dbl-1987-m"],
- self.coords25519.formulas["scale"],
- complete=complete)
+ ladder = LadderMultiplier(
+ self.coords25519.formulas["ladd-1987-m"],
+ self.coords25519.formulas["dbl-1987-m"],
+ self.coords25519.formulas["scale"],
+ complete=complete,
+ )
+ differential = DifferentialLadderMultiplier(
+ self.coords25519.formulas["dadd-1987-m"],
+ self.coords25519.formulas["dbl-1987-m"],
+ self.coords25519.formulas["scale"],
+ complete=complete,
+ )
ladder.init(self.curve25519, self.base25519)
res_ladder = ladder.multiply(num)
differential.init(self.curve25519, self.base25519)
@@ -116,22 +174,28 @@ class ScalarMultiplierTests(TestCase):
self.assertEqual(res_ladder, res_differential)
self.assertEqual(InfinityPoint(self.coords25519), differential.multiply(0))
- @parameterized.expand([
- ("scaled", "add-1998-cmo", "dbl-1998-cmo", "neg", "z"),
- ("complete", "add-2016-rcb", "dbl-2016-rcb", "neg", None),
- ("none", "add-1998-cmo", "dbl-1998-cmo", "neg", None)
- ])
+ @parameterized.expand(
+ [
+ ("scaled", "add-1998-cmo", "dbl-1998-cmo", "neg", "z"),
+ ("complete", "add-2016-rcb", "dbl-2016-rcb", "neg", None),
+ ("none", "add-1998-cmo", "dbl-1998-cmo", "neg", None),
+ ]
+ )
def test_binary_naf(self, name, add, dbl, neg, scale):
- self.do_basic_test(BinaryNAFMultiplier, self.secp128r1, self.base, add, dbl, scale, neg)
+ self.do_basic_test(
+ BinaryNAFMultiplier, self.secp128r1, self.base, add, dbl, scale, neg
+ )
- @parameterized.expand([
- ("scaled3", "add-1998-cmo", "dbl-1998-cmo", "neg", 3, "z"),
- ("none3", "add-1998-cmo", "dbl-1998-cmo", "neg", 3, None),
- ("complete3", "add-2016-rcb", "dbl-2016-rcb", "neg", 3, None),
- ("scaled5", "add-1998-cmo", "dbl-1998-cmo", "neg", 5, "z"),
- ("none5", "add-1998-cmo", "dbl-1998-cmo", "neg", 5, None),
- ("complete5", "add-2016-rcb", "dbl-2016-rcb", "neg", 5, None),
- ])
+ @parameterized.expand(
+ [
+ ("scaled3", "add-1998-cmo", "dbl-1998-cmo", "neg", 3, "z"),
+ ("none3", "add-1998-cmo", "dbl-1998-cmo", "neg", 3, None),
+ ("complete3", "add-2016-rcb", "dbl-2016-rcb", "neg", 3, None),
+ ("scaled5", "add-1998-cmo", "dbl-1998-cmo", "neg", 5, "z"),
+ ("none5", "add-1998-cmo", "dbl-1998-cmo", "neg", 5, None),
+ ("complete5", "add-2016-rcb", "dbl-2016-rcb", "neg", 5, None),
+ ]
+ )
def test_window_naf(self, name, add, dbl, neg, width, scale):
formulas = self.get_formulas(self.coords, add, dbl, neg, scale)
mult = WindowNAFMultiplier(*formulas[:3], width, *formulas[3:])
@@ -144,41 +208,59 @@ class ScalarMultiplierTests(TestCase):
mult.init(self.secp128r1, self.base)
self.assertEqual(InfinityPoint(self.coords), mult.multiply(0))
- mult = WindowNAFMultiplier(*formulas[:3], width, *formulas[3:],
- precompute_negation=True)
+ mult = WindowNAFMultiplier(
+ *formulas[:3], width, *formulas[3:], precompute_negation=True
+ )
mult.init(self.secp128r1, self.base)
res_precompute = mult.multiply(157 * 789)
self.assertPointEquality(res_precompute, res, scale)
- @parameterized.expand(cartesian([
- ("10", 10),
- ("2355498743", 2355498743),
- ("325385790209017329644351321912443757746", 325385790209017329644351321912443757746)
- ], [
- ("add-1998-cmo", "dbl-1998-cmo"),
- ("add-2016-rcb", "dbl-2016-rcb")
- ]))
+ @parameterized.expand(
+ cartesian(
+ [
+ ("10", 10),
+ ("2355498743", 2355498743),
+ (
+ "325385790209017329644351321912443757746",
+ 325385790209017329644351321912443757746,
+ ),
+ ],
+ [("add-1998-cmo", "dbl-1998-cmo"), ("add-2016-rcb", "dbl-2016-rcb")],
+ )
+ )
def test_basic_multipliers(self, name, num, add, dbl):
- ltr = LTRMultiplier(self.coords.formulas[add],
- self.coords.formulas[dbl], self.coords.formulas["z"])
+ ltr = LTRMultiplier(
+ self.coords.formulas[add],
+ self.coords.formulas[dbl],
+ self.coords.formulas["z"],
+ )
with self.assertRaises(ValueError):
ltr.multiply(1)
ltr.init(self.secp128r1, self.base)
res_ltr = ltr.multiply(num)
- rtl = RTLMultiplier(self.coords.formulas[add],
- self.coords.formulas["dbl-1998-cmo"], self.coords.formulas["z"])
+ rtl = RTLMultiplier(
+ self.coords.formulas[add],
+ self.coords.formulas["dbl-1998-cmo"],
+ self.coords.formulas["z"],
+ )
with self.assertRaises(ValueError):
rtl.multiply(1)
rtl.init(self.secp128r1, self.base)
res_rtl = rtl.multiply(num)
self.assertEqual(res_ltr, res_rtl)
- ltr_always = LTRMultiplier(self.coords.formulas[add],
- self.coords.formulas[dbl], self.coords.formulas["z"],
- always=True)
- rtl_always = RTLMultiplier(self.coords.formulas[add],
- self.coords.formulas[dbl], self.coords.formulas["z"],
- always=True)
+ ltr_always = LTRMultiplier(
+ self.coords.formulas[add],
+ self.coords.formulas[dbl],
+ self.coords.formulas["z"],
+ always=True,
+ )
+ rtl_always = RTLMultiplier(
+ self.coords.formulas[add],
+ self.coords.formulas[dbl],
+ self.coords.formulas["z"],
+ always=True,
+ )
ltr_always.init(self.secp128r1, self.base)
rtl_always.init(self.secp128r1, self.base)
res_ltr_always = ltr_always.multiply(num)
@@ -186,36 +268,47 @@ class ScalarMultiplierTests(TestCase):
self.assertEqual(res_ltr, res_ltr_always)
self.assertEqual(res_rtl, res_rtl_always)
- bnaf = BinaryNAFMultiplier(self.coords.formulas[add],
- self.coords.formulas[dbl],
- self.coords.formulas["neg"], self.coords.formulas["z"])
+ bnaf = BinaryNAFMultiplier(
+ self.coords.formulas[add],
+ self.coords.formulas[dbl],
+ self.coords.formulas["neg"],
+ self.coords.formulas["z"],
+ )
with self.assertRaises(ValueError):
bnaf.multiply(1)
bnaf.init(self.secp128r1, self.base)
res_bnaf = bnaf.multiply(num)
self.assertEqual(res_bnaf, res_ltr)
- wnaf = WindowNAFMultiplier(self.coords.formulas[add],
- self.coords.formulas[dbl],
- self.coords.formulas["neg"], 3, self.coords.formulas["z"])
+ wnaf = WindowNAFMultiplier(
+ self.coords.formulas[add],
+ self.coords.formulas[dbl],
+ self.coords.formulas["neg"],
+ 3,
+ self.coords.formulas["z"],
+ )
with self.assertRaises(ValueError):
wnaf.multiply(1)
wnaf.init(self.secp128r1, self.base)
res_wnaf = wnaf.multiply(num)
self.assertEqual(res_wnaf, res_ltr)
- ladder = SimpleLadderMultiplier(self.coords.formulas[add],
- self.coords.formulas[dbl],
- self.coords.formulas["z"])
+ ladder = SimpleLadderMultiplier(
+ self.coords.formulas[add],
+ self.coords.formulas[dbl],
+ self.coords.formulas["z"],
+ )
with self.assertRaises(ValueError):
ladder.multiply(1)
ladder.init(self.secp128r1, self.base)
res_ladder = ladder.multiply(num)
self.assertEqual(res_ladder, res_ltr)
- coron = CoronMultiplier(self.coords.formulas[add],
- self.coords.formulas[dbl],
- self.coords.formulas["z"])
+ coron = CoronMultiplier(
+ self.coords.formulas[add],
+ self.coords.formulas[dbl],
+ self.coords.formulas["z"],
+ )
with self.assertRaises(ValueError):
coron.multiply(1)
coron.init(self.secp128r1, self.base)
@@ -223,12 +316,17 @@ class ScalarMultiplierTests(TestCase):
self.assertEqual(res_coron, res_ltr)
def test_init_fail(self):
- mult = DifferentialLadderMultiplier(self.coords25519.formulas["dadd-1987-m"],
- self.coords25519.formulas["dbl-1987-m"],
- self.coords25519.formulas["scale"])
+ mult = DifferentialLadderMultiplier(
+ self.coords25519.formulas["dadd-1987-m"],
+ self.coords25519.formulas["dbl-1987-m"],
+ self.coords25519.formulas["scale"],
+ )
with self.assertRaises(ValueError):
mult.init(self.secp128r1, self.base)
with self.assertRaises(ValueError):
- LadderMultiplier(self.coords25519.formulas["ladd-1987-m"],
- scl=self.coords25519.formulas["scale"], complete=False)
+ LadderMultiplier(
+ self.coords25519.formulas["ladd-1987-m"],
+ scl=self.coords25519.formulas["scale"],
+ complete=False,
+ )