aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJ08nY2021-01-06 17:32:27 +0100
committerJ08nY2021-01-06 17:32:27 +0100
commitbb3ad6b5edafb26309514a0d59e9ba8bc2d5c19f (patch)
treed93e1b469022fc5170f5b016ddf5f9e62064c7e4
parent9dd00af7aede2085812a65a888a7539e9a792213 (diff)
downloadpyecsca-bb3ad6b5edafb26309514a0d59e9ba8bc2d5c19f.tar.gz
pyecsca-bb3ad6b5edafb26309514a0d59e9ba8bc2d5c19f.tar.zst
pyecsca-bb3ad6b5edafb26309514a0d59e9ba8bc2d5c19f.zip
Fix Edwards yz/yzsquared to_model.
Fixes #10.
-rw-r--r--pyecsca/ec/curve.py5
-rw-r--r--pyecsca/ec/point.py9
-rw-r--r--test/ec/test_regress.py12
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))