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
|
import pytest
from pyecsca.ec.mult import LTRMultiplier
from pyecsca.sca.attack.DPA import DPA
from pyecsca.sca.attack.CPA import CPA
from pyecsca.sca.target import LeakageTarget
from pyecsca.sca.attack import HammingWeight
@pytest.fixture()
def mult(secp128r1):
return LTRMultiplier(
secp128r1.curve.coordinate_model.formulas["add-2015-rcb"],
secp128r1.curve.coordinate_model.formulas["dbl-2015-rcb"],
)
@pytest.fixture()
def target(secp128r1, mult):
target = LeakageTarget(
secp128r1.curve.model, secp128r1.curve.coordinate_model, mult, HammingWeight()
)
target.set_params(secp128r1)
return target
@pytest.mark.xfail(reason="May fail intermittently.")
def test_dpa(secp128r1, mult, target):
scalar = 5
pub = secp128r1.curve.affine_multiply(
secp128r1.generator.to_affine(), scalar
).to_model(secp128r1.curve.coordinate_model, secp128r1.curve)
points, traces = target.simulate_scalar_mult_traces(700, scalar)
dpa = DPA(points, traces, mult, secp128r1)
res = dpa.perform(3, pub)
assert res == 5
@pytest.mark.xfail(reason="May fail intermittently.")
def test_cpa(secp128r1, mult, target):
scalar = 5
pub = secp128r1.curve.affine_multiply(
secp128r1.generator.to_affine(), scalar
).to_model(secp128r1.curve.coordinate_model, secp128r1.curve)
points, traces = target.simulate_scalar_mult_traces(100, scalar)
cpa = CPA(points, traces, HammingWeight(), mult, secp128r1)
res = cpa.perform(3, pub)
assert res == 5
|