aboutsummaryrefslogtreecommitdiffhomepage
path: root/test/ec
diff options
context:
space:
mode:
authorJ08nY2019-12-22 02:39:49 +0100
committerJ08nY2019-12-22 02:39:49 +0100
commit67fa43ddd53325a6318076356e8ab8c4d76917bc (patch)
treefa345f71ea3b226b1dde0d9c538becf9cf9af116 /test/ec
parent77c3141139be0c3f851dff92f8da6f463e29d57c (diff)
downloadpyecsca-67fa43ddd53325a6318076356e8ab8c4d76917bc.tar.gz
pyecsca-67fa43ddd53325a6318076356e8ab8c4d76917bc.tar.zst
pyecsca-67fa43ddd53325a6318076356e8ab8c4d76917bc.zip
Refactor ScalarMult.
Diffstat (limited to 'test/ec')
-rw-r--r--test/ec/test_context.py11
-rw-r--r--test/ec/test_key_agreement.py27
-rw-r--r--test/ec/test_mult.py143
-rw-r--r--test/ec/test_signature.py74
4 files changed, 130 insertions, 125 deletions
diff --git a/test/ec/test_context.py b/test/ec/test_context.py
index 77160cb..ceecf2c 100644
--- a/test/ec/test_context.py
+++ b/test/ec/test_context.py
@@ -25,12 +25,13 @@ class ContextTests(TestCase):
self.secp128r1 = get_curve("secp128r1", "projective")
self.base = self.secp128r1.generator
self.coords = self.secp128r1.curve.coordinate_model
- self.mult = LTRMultiplier(self.secp128r1, self.coords.formulas["add-1998-cmo"],
+ self.mult = LTRMultiplier(self.coords.formulas["add-1998-cmo"],
self.coords.formulas["dbl-1998-cmo"], self.coords.formulas["z"])
+ self.mult.init(self.secp128r1, self.base)
def test_null(self):
with local() as ctx:
- self.mult.multiply(59, self.base)
+ self.mult.multiply(59)
self.assertIsInstance(ctx, NullContext)
def test_default(self):
@@ -38,7 +39,7 @@ class ContextTests(TestCase):
self.addCleanup(resetcontext, token)
with local(DefaultContext()) as ctx:
- self.mult.multiply(59, self.base)
+ self.mult.multiply(59)
self.assertEqual(len(ctx.actions), 10)
self.assertEqual(len(getcontext().actions), 0)
@@ -52,9 +53,9 @@ class ContextTests(TestCase):
def test_str(self):
with local(DefaultContext()) as default:
- self.mult.multiply(59, self.base)
+ self.mult.multiply(59)
str(default)
str(default.actions)
with local(NullContext()) as null:
- self.mult.multiply(59, self.base)
+ self.mult.multiply(59)
str(null)
diff --git a/test/ec/test_key_agreement.py b/test/ec/test_key_agreement.py
index ab009e3..3acb070 100644
--- a/test/ec/test_key_agreement.py
+++ b/test/ec/test_key_agreement.py
@@ -3,7 +3,7 @@ from unittest import TestCase
from pyecsca.ec.curves import get_curve
from pyecsca.ec.key_agreement import *
from pyecsca.ec.mult import LTRMultiplier
-
+from parameterized import parameterized
class KeyAgreementTests(TestCase):
@@ -11,15 +11,22 @@ class KeyAgreementTests(TestCase):
self.secp128r1 = get_curve("secp128r1", "projective")
self.add = self.secp128r1.curve.coordinate_model.formulas["add-2007-bl"]
self.dbl = self.secp128r1.curve.coordinate_model.formulas["dbl-2007-bl"]
- self.mult = LTRMultiplier(self.secp128r1, self.add, self.dbl)
+ self.mult = LTRMultiplier(self.add, self.dbl)
self.priv_a = 0xdeadbeef
- self.pub_a = self.mult.multiply(self.priv_a, self.secp128r1.generator)
+ self.mult.init(self.secp128r1, self.secp128r1.generator)
+ self.pub_a = self.mult.multiply(self.priv_a)
self.priv_b = 0xcafebabe
- self.pub_b = self.mult.multiply(self.priv_b, self.secp128r1.generator)
- self.algos = [ECDH_NONE, ECDH_SHA1, ECDH_SHA224, ECDH_SHA256, ECDH_SHA384, ECDH_SHA512]
+ self.pub_b = self.mult.multiply(self.priv_b)
- def test_all(self):
- for algo in self.algos:
- result_ab = algo(self.mult, self.pub_a, self.priv_b).perform()
- result_ba = algo(self.mult, self.pub_b, self.priv_a).perform()
- self.assertEqual(result_ab, result_ba)
+ @parameterized.expand([
+ ("NONE", ECDH_NONE),
+ ("SHA1", ECDH_SHA1),
+ ("SHA224", ECDH_SHA224),
+ ("SHA256", ECDH_SHA256),
+ ("SHA384", ECDH_SHA384),
+ ("SHA512", ECDH_SHA512)
+ ])
+ def test_all(self, name, algo):
+ result_ab = algo(self.mult, self.secp128r1, self.pub_a, self.priv_b).perform()
+ result_ba = algo(self.mult, self.secp128r1, self.pub_b, self.priv_a).perform()
+ self.assertEqual(result_ab, result_ba)
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)
diff --git a/test/ec/test_signature.py b/test/ec/test_signature.py
index 06b6123..b7cccec 100644
--- a/test/ec/test_signature.py
+++ b/test/ec/test_signature.py
@@ -4,7 +4,7 @@ from unittest import TestCase
from pyecsca.ec.curves import get_curve
from pyecsca.ec.mult import LTRMultiplier
from pyecsca.ec.signature import *
-
+from parameterized import parameterized
class SignatureTests(TestCase):
@@ -12,55 +12,67 @@ class SignatureTests(TestCase):
self.secp128r1 = get_curve("secp128r1", "projective")
self.add = self.secp128r1.curve.coordinate_model.formulas["add-2007-bl"]
self.dbl = self.secp128r1.curve.coordinate_model.formulas["dbl-2007-bl"]
- self.mult = LTRMultiplier(self.secp128r1, self.add, self.dbl)
+ self.mult = LTRMultiplier(self.add, self.dbl)
self.msg = 0xcafebabe.to_bytes(4, byteorder="big")
self.priv = 0xdeadbeef
- self.pub = self.mult.multiply(self.priv, self.secp128r1.generator)
- self.algos = [ECDSA_SHA1, ECDSA_SHA224, ECDSA_SHA256, ECDSA_SHA384, ECDSA_SHA512]
+ self.mult.init(self.secp128r1, self.secp128r1.generator)
+ self.pub = self.mult.multiply(self.priv)
- def test_all(self):
- for algo in self.algos:
- signer = algo(self.mult, privkey=self.priv)
- assert signer.can_sign
- sig = signer.sign_data(self.msg)
- verifier = algo(self.mult, add=self.add, pubkey=self.pub)
- assert verifier.can_verify
- assert verifier.verify_data(sig, self.msg)
- none = ECDSA_NONE(self.mult, add=self.add, pubkey=self.pub, privkey=self.priv)
- digest = sha1(self.msg).digest()
- sig = none.sign_hash(digest)
- assert none.verify_hash(sig, digest)
- sig = none.sign_data(digest)
- assert none.verify_data(sig, digest)
+ @parameterized.expand([
+ ("SHA1", ECDSA_SHA1),
+ ("SHA224", ECDSA_SHA224),
+ ("SHA256", ECDSA_SHA256),
+ ("SHA384", ECDSA_SHA384),
+ ("SHA512", ECDSA_SHA512)
+ ])
+ def test_all(self, name, algo):
+ signer = algo(self.mult, self.secp128r1, privkey=self.priv)
+ assert signer.can_sign
+ sig = signer.sign_data(self.msg)
+ verifier = algo(self.mult, self.secp128r1, add=self.add, pubkey=self.pub)
+ assert verifier.can_verify
+ assert verifier.verify_data(sig, self.msg)
+ # none = ECDSA_NONE(self.mult, add=self.add, pubkey=self.pub, privkey=self.priv)
+ # digest = sha1(self.msg).digest()
+ # sig = none.sign_hash(digest)
+ # assert none.verify_hash(sig, digest)
+ # sig = none.sign_data(digest)
+ # assert none.verify_data(sig, digest)
def test_cannot(self):
- ok = ECDSA_NONE(self.mult, add=self.add, pubkey=self.pub, privkey=self.priv)
+ ok = ECDSA_NONE(self.mult, self.secp128r1, add=self.add, pubkey=self.pub, privkey=self.priv)
data = b"aaaa"
sig = ok.sign_data(data)
- no_priv = ECDSA_NONE(self.mult, pubkey=self.pub)
+ no_priv = ECDSA_NONE(self.mult, self.secp128r1, pubkey=self.pub)
with self.assertRaises(RuntimeError):
no_priv.sign_data(data)
with self.assertRaises(RuntimeError):
no_priv.sign_hash(data)
- no_pubadd = ECDSA_NONE(self.mult, privkey=self.priv)
+ no_pubadd = ECDSA_NONE(self.mult, self.secp128r1, privkey=self.priv)
with self.assertRaises(RuntimeError):
no_pubadd.verify_data(sig, data)
with self.assertRaises(RuntimeError):
no_pubadd.verify_hash(sig, data)
with self.assertRaises(ValueError):
- Signature(self.mult)
+ Signature(self.mult, self.secp128r1)
- def test_fixed_nonce(self):
- for algo in self.algos:
- signer = algo(self.mult, privkey=self.priv)
- sig_one = signer.sign_data(self.msg, nonce=0xabcdef)
- sig_other = signer.sign_data(self.msg, nonce=0xabcdef)
- verifier = algo(self.mult, add=self.add, pubkey=self.pub)
- assert verifier.verify_data(sig_one, self.msg)
- assert verifier.verify_data(sig_other, self.msg)
- self.assertEqual(sig_one, sig_other)
+ @parameterized.expand([
+ ("SHA1", ECDSA_SHA1),
+ ("SHA224", ECDSA_SHA224),
+ ("SHA256", ECDSA_SHA256),
+ ("SHA384", ECDSA_SHA384),
+ ("SHA512", ECDSA_SHA512)
+ ])
+ def test_fixed_nonce(self, name, algo):
+ signer = algo(self.mult, self.secp128r1, privkey=self.priv)
+ sig_one = signer.sign_data(self.msg, nonce=0xabcdef)
+ sig_other = signer.sign_data(self.msg, nonce=0xabcdef)
+ verifier = algo(self.mult, self.secp128r1, add=self.add, pubkey=self.pub)
+ assert verifier.verify_data(sig_one, self.msg)
+ assert verifier.verify_data(sig_other, self.msg)
+ self.assertEqual(sig_one, sig_other)
def test_der(self):
sig = SignatureResult(0xaaaaa, 0xbbbbb)