diff options
| author | J08nY | 2024-07-12 15:11:55 +0200 |
|---|---|---|
| committer | J08nY | 2024-07-12 15:11:55 +0200 |
| commit | 3ed8338d53e7bcfcecfddb55452882dfce34b609 (patch) | |
| tree | 4e72447445947ef949cc22d1b74c963ff624b3b1 | |
| parent | ee3f3db5008b982e7a1c12639dee0c9f98abddf5 (diff) | |
| download | pyecsca-3ed8338d53e7bcfcecfddb55452882dfce34b609.tar.gz pyecsca-3ed8338d53e7bcfcecfddb55452882dfce34b609.tar.zst pyecsca-3ed8338d53e7bcfcecfddb55452882dfce34b609.zip | |
| -rw-r--r-- | pyecsca/ec/curve.py | 4 | ||||
| -rw-r--r-- | pyecsca/ec/formula/base.py | 7 | ||||
| -rw-r--r-- | test/ec/test_formula.py | 25 |
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 |
