aboutsummaryrefslogtreecommitdiff
path: root/pyecsca/ec/formula.py
diff options
context:
space:
mode:
Diffstat (limited to 'pyecsca/ec/formula.py')
-rw-r--r--pyecsca/ec/formula.py65
1 files changed, 65 insertions, 0 deletions
diff --git a/pyecsca/ec/formula.py b/pyecsca/ec/formula.py
new file mode 100644
index 0000000..42f73a7
--- /dev/null
+++ b/pyecsca/ec/formula.py
@@ -0,0 +1,65 @@
+from ast import parse, Expression, Module
+from pkg_resources import resource_stream
+from typing import List, Any
+
+
+class Formula(object):
+ name: str
+ coordinate_model: Any
+ source: str
+ parameters: List[str]
+ assumptions: List[Expression]
+ code: Module
+
+ def __init__(self, path: str, name: str, coordinate_model: Any):
+ self.name = name
+ self.coordinate_model = coordinate_model
+ self.parameters = []
+ self.assumptions = []
+ self.__read_meta_file(path)
+ self.__read_op3_file(path + ".op3")
+
+ def __read_meta_file(self, path):
+ with resource_stream(__name__, path) as f:
+ line = f.readline().decode("ascii")
+ while line:
+ line = line[:-1]
+ if line.startswith("source"):
+ self.source = line[7:]
+ elif line.startswith("parameter"):
+ self.parameters.append(line[10:])
+ elif line.startswith("assume"):
+ self.assumptions.append(
+ parse(line[7:].replace("=", "==").replace("^", "**"), mode="eval"))
+ line = f.readline().decode("ascii")
+
+ def __read_op3_file(self, path):
+ with resource_stream(__name__, path) as f:
+ self.code = parse(f.read(), path, mode="exec")
+
+ def __repr__(self):
+ return self.__class__.__name__ + "({} for {})".format(self.name, self.coordinate_model)
+
+
+class AdditionFormula(Formula):
+ pass
+
+
+class DoublingFormula(Formula):
+ pass
+
+
+class TriplingFormula(Formula):
+ pass
+
+
+class ScalingFormula(Formula):
+ pass
+
+
+class DifferentialAdditionFormula(Formula):
+ pass
+
+
+class LadderFormula(Formula):
+ pass