aboutsummaryrefslogtreecommitdiff
path: root/test/sca/test_rpa.py
blob: 0c96e86ca1a15c8434d2cbc7e56c0f749d433cc7 (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
from unittest import TestCase

from parameterized import parameterized

from pyecsca.ec.context import local
from pyecsca.ec.mult import LTRMultiplier, BinaryNAFMultiplier, WindowNAFMultiplier, LadderMultiplier, \
    DifferentialLadderMultiplier
from pyecsca.ec.params import get_params
from pyecsca.sca.re.rpa import MultipleContext


class MultipleContextTests(TestCase):

    def setUp(self):
        self.secp128r1 = get_params("secg", "secp128r1", "projective")
        self.base = self.secp128r1.generator
        self.coords = self.secp128r1.curve.coordinate_model
        self.add = self.coords.formulas["add-1998-cmo"]
        self.dbl = self.coords.formulas["dbl-1998-cmo"]
        self.neg = self.coords.formulas["neg"]
        self.scale = self.coords.formulas["z"]

    @parameterized.expand([
        ("10", 10),
        ("2355498743", 2355498743),
        ("325385790209017329644351321912443757746", 325385790209017329644351321912443757746),
        ("13613624287328732", 13613624287328732)
    ])
    def test_basic(self, name, scalar):
        mult = LTRMultiplier(self.add, self.dbl, self.scale, always=False, complete=False, short_circuit=True)
        with local(MultipleContext()) as ctx:
            mult.init(self.secp128r1, self.base)
            mult.multiply(scalar)
        muls = list(ctx.points.values())
        self.assertEqual(muls[-1], scalar)

    def test_precomp(self):
        bnaf = BinaryNAFMultiplier(self.add, self.dbl, self.neg, self.scale)
        with local(MultipleContext()) as ctx:
            bnaf.init(self.secp128r1, self.base)
        muls = list(ctx.points.values())
        self.assertListEqual(muls, [1, -1])

        wnaf = WindowNAFMultiplier(self.add, self.dbl, self.neg, 3, self.scale)
        with local(MultipleContext()) as ctx:
            wnaf.init(self.secp128r1, self.base)
        muls = list(ctx.points.values())
        self.assertListEqual(muls, [1, 2, 3, 5])

    def test_ladder(self):
        curve25519 = get_params("other", "Curve25519", "xz")
        base = curve25519.generator
        coords = curve25519.curve.coordinate_model
        ladd = coords.formulas["ladd-1987-m"]
        dadd = coords.formulas["dadd-1987-m"]
        dbl = coords.formulas["dbl-1987-m"]
        scale = coords.formulas["scale"]
        ladd_mult = LadderMultiplier(ladd, dbl, scale)
        with local(MultipleContext()) as ctx:
            ladd_mult.init(curve25519, base)
            ladd_mult.multiply(1339278426732672313)
        muls = list(ctx.points.values())
        self.assertEqual(muls[-2], 1339278426732672313)
        dadd_mult = DifferentialLadderMultiplier(dadd, dbl, scale)
        with local(MultipleContext()) as ctx:
            dadd_mult.init(curve25519, base)
            dadd_mult.multiply(1339278426732672313)
        muls = list(ctx.points.values())
        self.assertEqual(muls[-2], 1339278426732672313)