aboutsummaryrefslogtreecommitdiff
path: root/test/ec/test_countermeasures.py
blob: 35ac5e890a421f9dd2afd13f75f6eb606b866875 (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
76
77
78
79
import pytest

from pyecsca.ec.mult import LTRMultiplier
from pyecsca.ec.countermeasures import GroupScalarRandomization, AdditiveSplitting, MultiplicativeSplitting, \
    EuclideanSplitting


@pytest.fixture(params=["add-1998-cmo-2", "add-2015-rcb"])
def add(secp128r1, request):
    return secp128r1.curve.coordinate_model.formulas[request.param]


@pytest.fixture(params=["dbl-1998-cmo-2", "dbl-2015-rcb"])
def dbl(secp128r1, request):
    return secp128r1.curve.coordinate_model.formulas[request.param]

@pytest.fixture()
def mult(secp128r1, add, dbl):
    return LTRMultiplier(add, dbl, complete=False)

@pytest.mark.parametrize(
    "num", [325385790209017329644351321912443757746,
            123456789314159265358979323846264338327,
            987654321314159265358979323846264338327,
            786877845665557891354654531354008066400]
)
def test_group_scalar_rand(mult, secp128r1, num):
    mult.init(secp128r1, secp128r1.generator)
    raw = mult.multiply(num)

    gsr = GroupScalarRandomization(mult)
    gsr.init(secp128r1, secp128r1.generator)
    masked = gsr.multiply(num)
    assert raw.equals(masked)

@pytest.mark.parametrize(
    "num", [325385790209017329644351321912443757746,
            123456789314159265358979323846264338327,
            987654321314159265358979323846264338327,
            786877845665557891354654531354008066400]
)
def test_additive_splitting(mult, secp128r1, num):
    mult.init(secp128r1, secp128r1.generator)
    raw = mult.multiply(num)

    asplit = AdditiveSplitting(mult)
    asplit.init(secp128r1, secp128r1.generator)
    masked = asplit.multiply(num)
    assert raw.equals(masked)

@pytest.mark.parametrize(
    "num", [325385790209017329644351321912443757746,
            123456789314159265358979323846264338327,
            987654321314159265358979323846264338327,
            786877845665557891354654531354008066400]
)
def test_multiplicative_splitting(mult, secp128r1, num):
    mult.init(secp128r1, secp128r1.generator)
    raw = mult.multiply(num)

    msplit = MultiplicativeSplitting(mult)
    msplit.init(secp128r1, secp128r1.generator)
    masked = msplit.multiply(num)
    assert raw.equals(masked)

@pytest.mark.parametrize(
    "num", [325385790209017329644351321912443757746,
            123456789314159265358979323846264338327,
            987654321314159265358979323846264338327,
            786877845665557891354654531354008066400]
)
def test_euclidean_splitting(mult, secp128r1, num):
    mult.init(secp128r1, secp128r1.generator)
    raw = mult.multiply(num)

    esplit = EuclideanSplitting(mult)
    esplit.init(secp128r1, secp128r1.generator)
    masked = esplit.multiply(num)
    assert raw.equals(masked)