diff options
| author | J08nY | 2021-01-06 17:32:27 +0100 |
|---|---|---|
| committer | J08nY | 2021-01-06 17:32:27 +0100 |
| commit | bb3ad6b5edafb26309514a0d59e9ba8bc2d5c19f (patch) | |
| tree | d93e1b469022fc5170f5b016ddf5f9e62064c7e4 | |
| parent | 9dd00af7aede2085812a65a888a7539e9a792213 (diff) | |
| download | pyecsca-bb3ad6b5edafb26309514a0d59e9ba8bc2d5c19f.tar.gz pyecsca-bb3ad6b5edafb26309514a0d59e9ba8bc2d5c19f.tar.zst pyecsca-bb3ad6b5edafb26309514a0d59e9ba8bc2d5c19f.zip | |
Fix Edwards yz/yzsquared to_model.
Fixes #10.
| -rw-r--r-- | pyecsca/ec/curve.py | 5 | ||||
| -rw-r--r-- | pyecsca/ec/point.py | 9 | ||||
| -rw-r--r-- | test/ec/test_regress.py | 12 |
3 files changed, 23 insertions, 3 deletions
diff --git a/pyecsca/ec/curve.py b/pyecsca/ec/curve.py index 7351583..e976289 100644 --- a/pyecsca/ec/curve.py +++ b/pyecsca/ec/curve.py @@ -167,7 +167,10 @@ class EllipticCurve(object): return False if self.is_neutral(point): return True - loc = {**self.parameters, **point.to_affine().coords} + if isinstance(point.coordinate_model, AffineCoordinateModel): + loc = {**self.parameters, **point.coords} + else: + loc = {**self.parameters, **point.to_affine().coords} return eval(compile(self.model.equation, "", mode="eval"), loc) def to_affine(self) -> "EllipticCurve": diff --git a/pyecsca/ec/point.py b/pyecsca/ec/point.py index 480c47f..a3c388e 100644 --- a/pyecsca/ec/point.py +++ b/pyecsca/ec/point.py @@ -103,8 +103,13 @@ class Point(object): result[var] = result[var].inverse() elif var == "Y": result[var] = self.coords["y"] - if isinstance(coordinate_model, EFDCoordinateModel) and coordinate_model.name == "inverted": - result[var] = result[var].inverse() + if isinstance(coordinate_model, EFDCoordinateModel): + if coordinate_model.name == "inverted": + result[var] = result[var].inverse() + elif coordinate_model.name == "yz": + result[var] = result[var] * curve.parameters["r"] + elif coordinate_model.name == "yzsquared": + result[var] = result[var] * curve.parameters["r"]**2 elif var.startswith("Z"): result[var] = Mod(1, curve.prime) elif var == "T": diff --git a/test/ec/test_regress.py b/test/ec/test_regress.py index e2c1799..26ef921 100644 --- a/test/ec/test_regress.py +++ b/test/ec/test_regress.py @@ -49,3 +49,15 @@ class RegressionTests(TestCase): formula = coords.formulas["dbl-1987-m-2"] res = formula(base, **curve.parameters)[0] self.assertIsNotNone(res) + + def test_issue_10(self): + model = EdwardsModel() + coords = model.coordinates["yz"] + p = 0x1d + c = Mod(1, p) + d = Mod(0x1c, p) + r = d.sqrt() + neutral = Point(coords, Y=c * r, Z=Mod(1, p)) + curve = EllipticCurve(model, coords, p, neutral, {"c": c, "d": d, "r": r}) + neutral_affine = Point(AffineCoordinateModel(model), x=Mod(0, p), y=c) + self.assertEqual(neutral, neutral_affine.to_model(coords, curve)) |
