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)
|