aboutsummaryrefslogtreecommitdiff
path: root/test/ec/test_mult.py
diff options
context:
space:
mode:
authorJ08nY2019-12-22 02:39:49 +0100
committerJ08nY2019-12-22 02:39:49 +0100
commit67fa43ddd53325a6318076356e8ab8c4d76917bc (patch)
treefa345f71ea3b226b1dde0d9c538becf9cf9af116 /test/ec/test_mult.py
parent77c3141139be0c3f851dff92f8da6f463e29d57c (diff)
downloadpyecsca-67fa43ddd53325a6318076356e8ab8c4d76917bc.tar.gz
pyecsca-67fa43ddd53325a6318076356e8ab8c4d76917bc.tar.zst
pyecsca-67fa43ddd53325a6318076356e8ab8c4d76917bc.zip
Diffstat (limited to 'test/ec/test_mult.py')
-rw-r--r--test/ec/test_mult.py143
1 files changed, 64 insertions, 79 deletions
diff --git a/test/ec/test_mult.py b/test/ec/test_mult.py
index 3abc72c..ffdbf7f 100644
--- a/test/ec/test_mult.py
+++ b/test/ec/test_mult.py
@@ -28,94 +28,73 @@ class ScalarMultiplierTests(TestCase):
else:
assert one.equals(other)
+ def do_basic_test(self, mult_class, group, base, add, dbl, scale, neg=None):
+ mult = mult_class(*self.get_formulas(group.curve.coordinate_model, add, dbl, neg, scale))
+ mult.init(group, base)
+ res = mult.multiply(314)
+ other = mult.multiply(157)
+ mult.init(group, other)
+ other = mult.multiply(2)
+ self.assertPointEquality(res, other, scale)
+ mult.init(group, base)
+ self.assertEqual(InfinityPoint(group.curve.coordinate_model), mult.multiply(0))
+
@parameterized.expand([
("scaled", "add-1998-cmo", "dbl-1998-cmo", "z"),
("none", "add-1998-cmo", "dbl-1998-cmo", None)
])
def test_rtl(self, name, add, dbl, scale):
- mult = RTLMultiplier(self.secp128r1, *self.get_formulas(self.coords, add, dbl, scale))
- res = mult.multiply(10, self.base)
- other = mult.multiply(5, self.base)
- other = mult.multiply(2, other)
- self.assertPointEquality(res, other, scale)
- self.assertEqual(InfinityPoint(self.coords), mult.multiply(0, self.base))
+ self.do_basic_test(RTLMultiplier, self.secp128r1, self.base, add, dbl, scale)
@parameterized.expand([
("scaled", "add-1998-cmo", "dbl-1998-cmo", "z"),
("none", "add-1998-cmo", "dbl-1998-cmo", None)
])
def test_ltr(self, name, add, dbl, scale):
- mult = LTRMultiplier(self.secp128r1, *self.get_formulas(self.coords, add, dbl, scale))
- res = mult.multiply(10, self.base)
- other = mult.multiply(5, self.base)
- other = mult.multiply(2, other)
- self.assertPointEquality(res, other, scale)
- self.assertEqual(InfinityPoint(self.coords), mult.multiply(0, self.base))
+ self.do_basic_test(LTRMultiplier, self.secp128r1, self.base, add, dbl, scale)
@parameterized.expand([
("scaled", "add-1998-cmo", "dbl-1998-cmo", "z"),
("none", "add-1998-cmo", "dbl-1998-cmo", None)
])
def test_coron(self, name, add, dbl, scale):
- mult = CoronMultiplier(self.secp128r1, *self.get_formulas(self.coords, add, dbl, scale))
- res = mult.multiply(10, self.base)
- other = mult.multiply(5, self.base)
- other = mult.multiply(2, other)
- self.assertPointEquality(res, other, scale)
- self.assertEqual(InfinityPoint(self.coords), mult.multiply(0, self.base))
+ self.do_basic_test(CoronMultiplier, self.secp128r1, self.base, add, dbl, scale)
def test_ladder(self):
- mult = LadderMultiplier(self.curve25519, self.coords25519.formulas["ladd-1987-m"],
- self.coords25519.formulas["dbl-1987-m"],
- self.coords25519.formulas["scale"])
- res = mult.multiply(15, self.base25519)
- other = mult.multiply(5, self.base25519)
- other = mult.multiply(3, other)
- self.assertEqual(res, other)
- self.assertEqual(InfinityPoint(self.coords25519), mult.multiply(0, self.base25519))
+ self.do_basic_test(LadderMultiplier, self.curve25519, self.base25519, "ladd-1987-m",
+ "dbl-1987-m", "scale")
@parameterized.expand([
("scaled", "add-1998-cmo", "dbl-1998-cmo", "z"),
("none", "add-1998-cmo", "dbl-1998-cmo", None)
])
def test_simple_ladder(self, name, add, dbl, scale):
- mult = SimpleLadderMultiplier(self.secp128r1,
- *self.get_formulas(self.coords, add, dbl, scale))
- res = mult.multiply(10, self.base)
- other = mult.multiply(5, self.base)
- other = mult.multiply(2, other)
- self.assertPointEquality(res, other, scale)
- self.assertEqual(InfinityPoint(self.coords), mult.multiply(0, self.base))
+ self.do_basic_test(SimpleLadderMultiplier, self.secp128r1, self.base, add, dbl, scale)
@parameterized.expand([
("10", 15),
("2355498743", 2355498743,)
])
def test_ladder_differential(self, name, num):
- ladder = LadderMultiplier(self.curve25519, self.coords25519.formulas["ladd-1987-m"],
+ ladder = LadderMultiplier(self.coords25519.formulas["ladd-1987-m"],
self.coords25519.formulas["dbl-1987-m"],
self.coords25519.formulas["scale"])
- differential = SimpleLadderMultiplier(self.curve25519,
- self.coords25519.formulas["dadd-1987-m"],
+ differential = SimpleLadderMultiplier(self.coords25519.formulas["dadd-1987-m"],
self.coords25519.formulas["dbl-1987-m"],
self.coords25519.formulas["scale"])
- res_ladder = ladder.multiply(num, self.base25519)
- res_differential = differential.multiply(num, self.base25519)
+ ladder.init(self.curve25519, self.base25519)
+ res_ladder = ladder.multiply(num)
+ differential.init(self.curve25519, self.base25519)
+ res_differential = differential.multiply(num)
self.assertEqual(res_ladder, res_differential)
- self.assertEqual(InfinityPoint(self.coords25519), differential.multiply(0, self.base25519))
+ self.assertEqual(InfinityPoint(self.coords25519), differential.multiply(0))
@parameterized.expand([
("scaled", "add-1998-cmo", "dbl-1998-cmo", "neg", "z"),
("none", "add-1998-cmo", "dbl-1998-cmo", "neg", None)
])
def test_binary_naf(self, name, add, dbl, neg, scale):
- mult = BinaryNAFMultiplier(self.secp128r1,
- *self.get_formulas(self.coords, add, dbl, neg, scale))
- res = mult.multiply(10, self.base)
- other = mult.multiply(5, self.base)
- other = mult.multiply(2, other)
- self.assertPointEquality(res, other, scale)
- self.assertEqual(InfinityPoint(self.coords), mult.multiply(0, self.base))
+ 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"),
@@ -123,16 +102,20 @@ class ScalarMultiplierTests(TestCase):
])
def test_window_naf(self, name, add, dbl, neg, width, scale):
formulas = self.get_formulas(self.coords, add, dbl, neg, scale)
- mult = WindowNAFMultiplier(self.secp128r1, *formulas[:3], width, *formulas[3:])
- res = mult.multiply(10, self.base)
- other = mult.multiply(5, self.base)
- other = mult.multiply(2, other)
+ mult = WindowNAFMultiplier(*formulas[:3], width, *formulas[3:])
+ mult.init(self.secp128r1, self.base)
+ res = mult.multiply(10)
+ other = mult.multiply(5)
+ mult.init(self.secp128r1, other)
+ other = mult.multiply(2)
self.assertPointEquality(res, other, scale)
- self.assertEqual(InfinityPoint(self.coords), mult.multiply(0, self.base))
+ mult.init(self.secp128r1, self.base)
+ self.assertEqual(InfinityPoint(self.coords), mult.multiply(0))
- mult = WindowNAFMultiplier(self.secp128r1, *formulas[:3], width, *formulas[3:],
+ mult = WindowNAFMultiplier(*formulas[:3], width, *formulas[3:],
precompute_negation=True)
- res_precompute = mult.multiply(10, self.base)
+ mult.init(self.secp128r1, self.base)
+ res_precompute = mult.multiply(10)
self.assertPointEquality(res_precompute, res, scale)
@parameterized.expand([
@@ -140,58 +123,60 @@ class ScalarMultiplierTests(TestCase):
("2355498743", 2355498743,)
])
def test_basic_multipliers(self, name, num):
- ltr = LTRMultiplier(self.secp128r1, self.coords.formulas["add-1998-cmo"],
+ ltr = LTRMultiplier(self.coords.formulas["add-1998-cmo"],
self.coords.formulas["dbl-1998-cmo"], self.coords.formulas["z"])
- res_ltr = ltr.multiply(num, self.base)
- rtl = RTLMultiplier(self.secp128r1, self.coords.formulas["add-1998-cmo"],
+ ltr.init(self.secp128r1, self.base)
+ res_ltr = ltr.multiply(num)
+ rtl = RTLMultiplier(self.coords.formulas["add-1998-cmo"],
self.coords.formulas["dbl-1998-cmo"], self.coords.formulas["z"])
- res_rtl = rtl.multiply(num, self.base)
+ rtl.init(self.secp128r1, self.base)
+ res_rtl = rtl.multiply(num)
self.assertEqual(res_ltr, res_rtl)
- ltr_always = LTRMultiplier(self.secp128r1, self.coords.formulas["add-1998-cmo"],
+ ltr_always = LTRMultiplier(self.coords.formulas["add-1998-cmo"],
self.coords.formulas["dbl-1998-cmo"], self.coords.formulas["z"],
always=True)
- rtl_always = RTLMultiplier(self.secp128r1, self.coords.formulas["add-1998-cmo"],
+ rtl_always = RTLMultiplier(self.coords.formulas["add-1998-cmo"],
self.coords.formulas["dbl-1998-cmo"], self.coords.formulas["z"],
always=True)
- res_ltr_always = ltr_always.multiply(num, self.base)
- res_rtl_always = rtl_always.multiply(num, self.base)
+ ltr_always.init(self.secp128r1, self.base)
+ rtl_always.init(self.secp128r1, self.base)
+ res_ltr_always = ltr_always.multiply(num)
+ res_rtl_always = rtl_always.multiply(num)
self.assertEqual(res_ltr, res_ltr_always)
self.assertEqual(res_rtl, res_rtl_always)
- bnaf = BinaryNAFMultiplier(self.secp128r1, self.coords.formulas["add-1998-cmo"],
+ bnaf = BinaryNAFMultiplier(self.coords.formulas["add-1998-cmo"],
self.coords.formulas["dbl-1998-cmo"],
self.coords.formulas["neg"], self.coords.formulas["z"])
- res_bnaf = bnaf.multiply(num, self.base)
+ bnaf.init(self.secp128r1, self.base)
+ res_bnaf = bnaf.multiply(num)
self.assertEqual(res_bnaf, res_ltr)
- wnaf = WindowNAFMultiplier(self.secp128r1, self.coords.formulas["add-1998-cmo"],
+ wnaf = WindowNAFMultiplier(self.coords.formulas["add-1998-cmo"],
self.coords.formulas["dbl-1998-cmo"],
self.coords.formulas["neg"], 3, self.coords.formulas["z"])
- res_wnaf = wnaf.multiply(num, self.base)
+ wnaf.init(self.secp128r1, self.base)
+ res_wnaf = wnaf.multiply(num)
self.assertEqual(res_wnaf, res_ltr)
- ladder = SimpleLadderMultiplier(self.secp128r1, self.coords.formulas["add-1998-cmo"],
+ ladder = SimpleLadderMultiplier(self.coords.formulas["add-1998-cmo"],
self.coords.formulas["dbl-1998-cmo"],
self.coords.formulas["z"])
- res_ladder = ladder.multiply(num, self.base)
+ ladder.init(self.secp128r1, self.base)
+ res_ladder = ladder.multiply(num)
self.assertEqual(res_ladder, res_ltr)
- coron = CoronMultiplier(self.secp128r1, self.coords.formulas["add-1998-cmo"],
+ coron = CoronMultiplier(self.coords.formulas["add-1998-cmo"],
self.coords.formulas["dbl-1998-cmo"],
self.coords.formulas["z"])
- res_coron = coron.multiply(num, self.base)
+ coron.init(self.secp128r1, self.base)
+ res_coron = coron.multiply(num)
self.assertEqual(res_coron, res_ltr)
def test_init_fail(self):
+ mult = SimpleLadderMultiplier(self.coords25519.formulas["dadd-1987-m"],
+ self.coords25519.formulas["dbl-1987-m"],
+ self.coords25519.formulas["scale"])
with self.assertRaises(ValueError):
- SimpleLadderMultiplier(self.secp128r1,
- self.coords25519.formulas["dadd-1987-m"],
- self.coords25519.formulas["dbl-1987-m"],
- self.coords25519.formulas["scale"])
-
- def test_mult_fail(self):
- mult = LTRMultiplier(self.secp128r1, self.coords.formulas["add-1998-cmo"],
- self.coords.formulas["dbl-1998-cmo"], self.coords.formulas["z"])
- with self.assertRaises(ValueError):
- mult.multiply(15)
+ mult.init(self.secp128r1, self.base)