aboutsummaryrefslogtreecommitdiffhomepage
path: root/test
diff options
context:
space:
mode:
authorJ08nY2024-01-25 18:59:49 +0100
committerJ08nY2024-01-25 18:59:49 +0100
commitcbfcfb3433dd6030db5a253d291985706bd0dc9a (patch)
treed32f144ed048d2803af554e53a893dc4aebfcb4d /test
parent340dd4e7cfa9a1075d1c33936ed9884234744a31 (diff)
downloadpyecsca-cbfcfb3433dd6030db5a253d291985706bd0dc9a.tar.gz
pyecsca-cbfcfb3433dd6030db5a253d291985706bd0dc9a.tar.zst
pyecsca-cbfcfb3433dd6030db5a253d291985706bd0dc9a.zip
Fix issues with pickling and equality checks of EC objects.
Diffstat (limited to 'test')
-rw-r--r--test/ec/test_formula.py8
-rw-r--r--test/ec/test_pickle.py83
2 files changed, 90 insertions, 1 deletions
diff --git a/test/ec/test_formula.py b/test/ec/test_formula.py
index 32e1cf3..ed437a5 100644
--- a/test/ec/test_formula.py
+++ b/test/ec/test_formula.py
@@ -77,6 +77,10 @@ def test_eq(add, dbl):
assert add != dbl
+def test_hashable(add):
+ assert hash(add)
+
+
def test_num_ops(add):
assert add.num_operations == 33
assert add.num_multiplications == 17
@@ -400,7 +404,9 @@ def library_formula_params(request) -> Tuple[EFDFormula, DomainParameters]:
def test_formula_graph(library_formula_params):
formula, params = library_formula_params
- do_test_formula(rename_ivs(formula), params)
+ renamed = rename_ivs(formula)
+ do_test_formula(renamed, params)
+ assert hash(renamed)
def test_switch_sign(library_formula_params):
diff --git a/test/ec/test_pickle.py b/test/ec/test_pickle.py
new file mode 100644
index 0000000..5d448b5
--- /dev/null
+++ b/test/ec/test_pickle.py
@@ -0,0 +1,83 @@
+import pickle
+import pickletools
+from multiprocessing import get_context
+from multiprocessing.context import BaseContext
+
+import pytest
+
+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 = coords.formulas["add-2007-bl"]
+ 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
+
+
+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)
+ pickletools.dis(data)
+ 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