aboutsummaryrefslogtreecommitdiff
path: root/test/ec/test_mult.py
blob: 1a2bc7e90f4702bce673b6da866ff524d8f10cfc (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
73
74
75
from unittest import TestCase

from pyecsca.ec.curve import EllipticCurve
from pyecsca.ec.mod import Mod
from pyecsca.ec.model import ShortWeierstrassModel, MontgomeryModel
from pyecsca.ec.mult import LTRMultiplier, RTLMultiplier, LadderMultiplier
from pyecsca.ec.point import Point


class ScalarMultiplierTests(TestCase):

    def setUp(self):
        self.p = 0xfffffffdffffffffffffffffffffffff
        self.coords = ShortWeierstrassModel().coordinates["projective"]
        self.base = Point(self.coords, X=Mod(0x161ff7528b899b2d0c28607ca52c5b86, self.p),
                          Y=Mod(0xcf5ac8395bafeb13c02da292dded7a83, self.p),
                          Z=Mod(1, self.p))
        self.secp128r1 = EllipticCurve(ShortWeierstrassModel(), self.coords,
                                       dict(a=0xfffffffdfffffffffffffffffffffffc,
                                            b=0xe87579c11079f43dd824993c2cee5ed3),
                                       Point(self.coords, X=Mod(0, self.p), Y=Mod(1, self.p),
                                             Z=Mod(0, self.p)))

        self.coords25519 = MontgomeryModel().coordinates["xz"]
        self.p25519 = 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed
        self.base25519 = Point(self.coords25519, X=Mod(9, self.p25519),
                               Z=Mod(1, self.p25519))
        self.curve25519 = EllipticCurve(MontgomeryModel(), self.coords25519,
                                        dict(a=486662, b=1),
                                        Point(self.coords25519,
                                              X=Mod(0, self.p25519), Z=Mod(1, self.p25519)))

    def test_rtl_simple(self):
        mult = RTLMultiplier(self.secp128r1, self.coords.formulas["add-1998-cmo"],
                             self.coords.formulas["dbl-1998-cmo"], self.coords.formulas["z"])
        res = mult.multiply(10, self.base)
        other = mult.multiply(5, self.base)
        other = mult.multiply(2, other)
        self.assertEqual(res, other)

    def test_ltr_simple(self):
        mult = LTRMultiplier(self.secp128r1, self.coords.formulas["add-1998-cmo"],
                             self.coords.formulas["dbl-1998-cmo"], self.coords.formulas["z"])
        res = mult.multiply(10, self.base)
        other = mult.multiply(5, self.base)
        other = mult.multiply(2, other)
        self.assertEqual(res, other)

    def test_ladder_simple(self):
        mult = LadderMultiplier(self.curve25519, self.coords25519.formulas["ladd-1987-m"],
                                self.coords25519.formulas["scale"])
        res = mult.multiply(15, self.base25519)
        other = mult.multiply(3, self.base25519)
        other = mult.multiply(5, other)
        self.assertEqual(res, other)

    def test_basic_multipliers(self):
        ltr = LTRMultiplier(self.secp128r1, self.coords.formulas["add-1998-cmo"],
                            self.coords.formulas["dbl-1998-cmo"], self.coords.formulas["z"])
        res_ltr = ltr.multiply(10, self.base)
        rtl = RTLMultiplier(self.secp128r1, self.coords.formulas["add-1998-cmo"],
                            self.coords.formulas["dbl-1998-cmo"], self.coords.formulas["z"])
        res_rtl = rtl.multiply(10, self.base)
        self.assertEqual(res_ltr, res_rtl)

        ltr_always = LTRMultiplier(self.secp128r1, 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"],
                                   self.coords.formulas["dbl-1998-cmo"], self.coords.formulas["z"],
                                   always=True)
        res_ltr_always = ltr_always.multiply(10, self.base)
        res_rtl_always = rtl_always.multiply(10, self.base)
        self.assertEqual(res_ltr, res_ltr_always)
        self.assertEqual(res_rtl, res_rtl_always)