aboutsummaryrefslogtreecommitdiff
path: root/test/ec/test_pickle.py
blob: 5af3625586edaad7356330cef8d8b98d3031c819 (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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import pickle
from multiprocessing import get_context
from multiprocessing.context import BaseContext

import pytest

from pyecsca.ec.formula.efd import EFDFormula
from pyecsca.ec.formula.graph import FormulaGraph
from pyecsca.ec.model import ShortWeierstrassModel
from pyecsca.ec.params import get_params


@pytest.fixture()
def ctx() -> BaseContext:
    return get_context("spawn")


def model_target(obj):
    return obj._loaded


def test_model_loads(ctx):
    # Test that the unpickling of EFDCurveModel triggers a reload that loads the EFD data for that model.
    sw = ShortWeierstrassModel()
    with ctx.Pool(processes=1) as pool:
        res = pool.apply(model_target, args=(sw,))
        assert res


def test_model():
    sw = ShortWeierstrassModel()
    data = pickle.dumps(sw)
    back = pickle.loads(data)
    assert sw == back


def test_coords():
    sw = ShortWeierstrassModel()
    coords = sw.coordinates["projective"]
    data = pickle.dumps(coords)
    back = pickle.loads(data)
    assert coords == back


def test_formula():
    sw = ShortWeierstrassModel()
    coords = sw.coordinates["projective"]
    formula: EFDFormula = coords.formulas["add-2007-bl"]  # type: ignore
    data = pickle.dumps(formula)
    back = pickle.loads(data)
    assert formula == back
    formulas = tuple(coords.formulas.values())
    data = pickle.dumps(formulas)
    back = pickle.loads(data)
    assert formulas == back
    code_formula = formula.to_code()
    assert formula != code_formula
    back_code = pickle.loads(pickle.dumps(code_formula))
    assert code_formula == back_code


def formula_target(formula):
    return hasattr(formula, "coordinate_model")


def test_formula_loads(ctx):
    sw = ShortWeierstrassModel()
    coords = sw.coordinates["projective"]
    formula: EFDFormula = coords.formulas["add-2007-bl"]  # type: ignore
    with ctx.Pool(processes=1) as pool:
        res = pool.apply(formula_target, args=(formula,))
        assert res
    formula = formula.to_code()  # type: ignore
    with ctx.Pool(processes=1) as pool:
        res = pool.apply(formula_target, args=(formula,))
        assert res


def test_code_formula():
    sw = ShortWeierstrassModel()
    coords = sw.coordinates["projective"]
    formula = coords.formulas["add-2007-bl"]
    graph = FormulaGraph(formula)
    code = graph.to_formula()
    data = pickle.dumps(code)
    back = pickle.loads(data)
    assert code == back


def test_params(secp128r1):
    secp256r1 = get_params("secg", "secp256r1", "projective")
    params = (secp128r1, secp256r1)
    data = pickle.dumps(params)
    back = pickle.loads(data)
    assert params == back


def test_op(secp128r1):
    formula = secp128r1.curve.coordinate_model.formulas["add-2007-bl"]
    op = formula.code[0]
    data = pickle.dumps(op)
    back = pickle.loads(data)
    assert op == back