aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pyecsca/ec/curve.py4
-rw-r--r--pyecsca/ec/formula/base.py7
-rw-r--r--test/ec/test_formula.py25
3 files changed, 24 insertions, 12 deletions
diff --git a/pyecsca/ec/curve.py b/pyecsca/ec/curve.py
index f274683..fedf65f 100644
--- a/pyecsca/ec/curve.py
+++ b/pyecsca/ec/curve.py
@@ -120,8 +120,8 @@ class EllipticCurve:
lhs, rhs = assumption_string.split(" = ")
expr = sympify(f"{rhs} - {lhs}")
for symbol in expr.free_symbols:
- if (value := self.parameters.get(str(symbol), None)) is not None:
- expr = expr.subs(symbol, value)
+ if (val := self.parameters.get(str(symbol), None)) is not None:
+ expr = expr.subs(symbol, val)
if len(expr.free_symbols) > 0:
raise ValueError(
f"Missing necessary coordinate model parameter ({assumption_string})."
diff --git a/pyecsca/ec/formula/base.py b/pyecsca/ec/formula/base.py
index 7e6c1ad..22148cb 100644
--- a/pyecsca/ec/formula/base.py
+++ b/pyecsca/ec/formula/base.py
@@ -187,15 +187,18 @@ class Formula(ABC):
params[lhs] = SymbolicMod(expr, field)
else:
expr = sympify(f"{rhs} - {lhs}", evaluate=False)
+ remaining = []
for symbol in expr.free_symbols:
if (value := params.get(str(symbol), None)) is not None:
if isinstance(value, SymbolicMod):
expr = expr.subs(symbol, value.x)
else:
expr = expr.subs(symbol, int(value))
+ else:
+ remaining.append(symbol)
if (
- len(expr.free_symbols) > 1
- or (param := str(expr.free_symbols.pop())) not in self.parameters
+ len(remaining) > 1
+ or (param := str(remaining[0])) not in self.parameters
):
raise ValueError(
f"This formula couldn't be executed due to an unsupported assumption ({assumption_string})."
diff --git a/test/ec/test_formula.py b/test/ec/test_formula.py
index f8434fd..c066a7f 100644
--- a/test/ec/test_formula.py
+++ b/test/ec/test_formula.py
@@ -26,7 +26,7 @@ from pyecsca.misc.cfg import TemporaryConfig
from pyecsca.ec.error import UnsatisfiedAssumptionError
from pyecsca.ec.params import get_params, DomainParameters
from pyecsca.ec.point import Point
-from pyecsca.ec.model import ShortWeierstrassModel, MontgomeryModel, TwistedEdwardsModel
+from pyecsca.ec.model import ShortWeierstrassModel, MontgomeryModel, TwistedEdwardsModel, EdwardsModel
from pyecsca.ec.formula.efd import (
AdditionEFDFormula,
DoublingEFDFormula,
@@ -109,14 +109,23 @@ def test_assumptions(secp128r1, mdbl):
assert pt is not None
-def test_parameters():
- jac_secp128r1 = get_params("secg", "secp128r1", "jacobian")
- jac_dbl = jac_secp128r1.curve.coordinate_model.formulas["dbl-1998-hnm"]
+@pytest.mark.parametrize(
+ "formula,category,curve,coords",
+ [("dbl-1998-hnm", "secg", "secp128r1", "jacobian"),
+ ("add-2015-rcb", "secg", "secp128r1", "projective"),
+ ("dbl-1987-m-2", "other", "Curve25519", "xz"),
+ ("add-20090311-hwcd", "other", "E-222", "projective")]
+)
+def test_eval(formula, category, curve, coords):
+ params = get_params(category, curve, coords)
+ f = params.curve.coordinate_model.formulas[formula]
+
+ points = [params.curve.affine_random().to_model(params.curve.coordinate_model, params.curve) for _ in range(f.num_inputs)]
- res = jac_dbl(
- jac_secp128r1.curve.prime,
- jac_secp128r1.generator,
- **jac_secp128r1.curve.parameters,
+ res = f(
+ params.curve.prime,
+ *points,
+ **params.curve.parameters,
)
assert res is not None