aboutsummaryrefslogtreecommitdiffhomepage
path: root/pyecsca/ec/coordinates.py
diff options
context:
space:
mode:
authorJ08nY2023-10-14 22:18:04 +0200
committerJ08nY2023-10-14 22:18:04 +0200
commit883e5b00dd6b52264d68da66d8b9268f227a8752 (patch)
tree54cbaaccda18b129a0939c9f52bd2942374cad05 /pyecsca/ec/coordinates.py
parentf1993d49f2ed28cacf5537410c0db99dc8bdeaeb (diff)
downloadpyecsca-883e5b00dd6b52264d68da66d8b9268f227a8752.tar.gz
pyecsca-883e5b00dd6b52264d68da66d8b9268f227a8752.tar.zst
pyecsca-883e5b00dd6b52264d68da66d8b9268f227a8752.zip
Make stuff picklable.
Fixes #45.
Diffstat (limited to 'pyecsca/ec/coordinates.py')
-rw-r--r--pyecsca/ec/coordinates.py23
1 files changed, 22 insertions, 1 deletions
diff --git a/pyecsca/ec/coordinates.py b/pyecsca/ec/coordinates.py
index 9b63c75..fe55d42 100644
--- a/pyecsca/ec/coordinates.py
+++ b/pyecsca/ec/coordinates.py
@@ -1,5 +1,6 @@
"""Provides a coordinate model class."""
from ast import parse, Module
+from astunparse import unparse
from importlib_resources.abc import Traversable
from importlib_resources import as_file
from typing import List, Any, MutableMapping
@@ -17,6 +18,7 @@ from .formula import (
ScalingEFDFormula,
NegationEFDFormula,
)
+from ..misc.utils import pexec
@public
@@ -52,6 +54,23 @@ class CoordinateModel:
def __repr__(self):
return f'{self.__class__.__name__}("{self.name}" on {self.curve_model.name})'
+ def __getstate__(self):
+ state = self.__dict__.copy()
+ state["satisfying"] = list(map(unparse, state["satisfying"]))
+ state["toaffine"] = list(map(unparse, state["toaffine"]))
+ state["tosystem"] = list(map(unparse, state["tosystem"]))
+ state["assumptions"] = list(map(unparse, state["assumptions"]))
+ state["neutral"] = list(map(unparse, state["neutral"]))
+ return state
+
+ def __setstate__(self, state):
+ state["satisfying"] = list(map(pexec, state["satisfying"]))
+ state["toaffine"] = list(map(pexec, state["toaffine"]))
+ state["tosystem"] = list(map(pexec, state["tosystem"]))
+ state["assumptions"] = list(map(pexec, state["assumptions"]))
+ state["neutral"] = list(map(pexec, state["neutral"]))
+ self.__dict__.update(state)
+
@public
class AffineCoordinateModel(CoordinateModel):
@@ -115,7 +134,9 @@ class EFDCoordinateModel(CoordinateModel):
"negation": NegationEFDFormula,
}
cls = formula_types.get(formula_type, EFDFormula)
- self.formulas[fpath.stem] = cls(fpath, fpath.with_suffix(".op3"), fpath.stem, self)
+ self.formulas[fpath.stem] = cls(
+ fpath, fpath.with_suffix(".op3"), fpath.stem, self
+ )
def __read_coordinates_file(self, file_path: Traversable):
with file_path.open("rb") as f: