aboutsummaryrefslogtreecommitdiff
path: root/test/ec/test_regress.py
blob: ef593fc802c6f162e0ff35803a142440b4bd8e83 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
from unittest import TestCase

from pyecsca.ec.coordinates import AffineCoordinateModel
from pyecsca.ec.curve import EllipticCurve
from pyecsca.ec.mod import Mod
from pyecsca.ec.model import MontgomeryModel, EdwardsModel
from pyecsca.ec.params import get_params
from pyecsca.ec.mult import LTRMultiplier
from pyecsca.ec.point import Point


class RegressionTests(TestCase):

    def test_issue_7(self):
        secp128r1 = get_params("secg", "secp128r1", "projective")
        base = secp128r1.generator
        coords = secp128r1.curve.coordinate_model
        add = coords.formulas["add-1998-cmo"]
        dbl = coords.formulas["dbl-1998-cmo"]
        scl = coords.formulas["z"]
        mult = LTRMultiplier(add, dbl, scl, always=False, complete=False, short_circuit=True)
        mult.init(secp128r1, base)
        pt = mult.multiply(13613624287328732)
        self.assertIsInstance(pt.coords["X"], Mod)
        self.assertIsInstance(pt.coords["Y"], Mod)
        self.assertIsInstance(pt.coords["Z"], Mod)
        mult.init(secp128r1, pt)
        a = mult.multiply(1)
        self.assertNotIsInstance(a.coords["X"].x, float)
        self.assertNotIsInstance(a.coords["Y"].x, float)
        self.assertNotIsInstance(a.coords["Z"].x, float)

    def test_issue_8(self):
        e222 = get_params("other", "E-222", "projective")
        base = e222.generator
        affine_base = base.to_affine()
        affine_double = e222.curve.affine_double(affine_base)
        affine_triple = e222.curve.affine_add(affine_base, affine_double)
        self.assertIsNotNone(affine_double)
        self.assertIsNotNone(affine_triple)

    def test_issue_9(self):
        model = MontgomeryModel()
        coords = model.coordinates["xz"]
        p = 19
        neutral = Point(coords, X=Mod(1, p), Z=Mod(0, p))
        curve = EllipticCurve(model, coords, p, neutral, {"a": Mod(8, p), "b": Mod(1, p)})
        base = Point(coords, X=Mod(12, p), Z=Mod(1, p))
        formula = coords.formulas["dbl-1987-m-2"]
        res = formula(p, base, **curve.parameters)[0]
        self.assertIsNotNone(res)
        affine_base = Point(AffineCoordinateModel(model), x=Mod(12, p), y=Mod(2, p))
        dbase = curve.affine_double(affine_base).to_model(coords, curve)
        ladder = coords.formulas["ladd-1987-m-3"]
        one, other = ladder(p, base, dbase, base, **curve.parameters)
        self.assertIsNotNone(one)
        self.assertIsNotNone(other)

    def test_issue_10(self):
        model = EdwardsModel()
        coords = model.coordinates["yz"]
        coords_sqr = model.coordinates["yzsquared"]
        p = 0x1d
        c = Mod(1, p)
        d = Mod(0x1c, p)
        r = d.sqrt()
        neutral = Point(coords, Y=c * r, Z=Mod(1, p))
        curve = EllipticCurve(model, coords, p, neutral, {"c": c, "d": d, "r": r})
        neutral_affine = Point(AffineCoordinateModel(model), x=Mod(0, p), y=c)
        self.assertEqual(neutral, neutral_affine.to_model(coords, curve))
        neutral_sqr = Point(coords_sqr, Y=c**2 * r, Z=Mod(1, p))
        self.assertEqual(neutral_sqr, neutral_affine.to_model(coords_sqr, curve))