From c7f7856611147ff9626188657b9fb20e91f0da45 Mon Sep 17 00:00:00 2001 From: J08nY Date: Mon, 22 Apr 2019 18:30:36 +0200 Subject: Raise code coverage for Mod. --- pyecsca/ec/curve.py | 2 +- test/ec/test_curve.py | 12 +++++++++++- test/ec/test_mod.py | 30 ++++++++++++++++++++++++++++-- 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/pyecsca/ec/curve.py b/pyecsca/ec/curve.py index 7c30700..3c0b200 100644 --- a/pyecsca/ec/curve.py +++ b/pyecsca/ec/curve.py @@ -34,7 +34,7 @@ class EllipticCurve(object): self.parameters[name] = value def is_on_curve(self, point: Point) -> bool: - if point.coordinate_model != self.coordinate_model: + if point.coordinate_model.curve_model != self.model: return False loc = {**self.parameters, **point.to_affine().coords} return eval(compile(self.model.equation, "", mode="eval"), loc) diff --git a/test/ec/test_curve.py b/test/ec/test_curve.py index 382d144..9d4e509 100644 --- a/test/ec/test_curve.py +++ b/test/ec/test_curve.py @@ -2,7 +2,7 @@ from unittest import TestCase from pyecsca.ec.mod import Mod from pyecsca.ec.point import Point -from test.ec.curves import get_secp128r1 +from .curves import get_secp128r1 class CurveTests(TestCase): @@ -16,3 +16,13 @@ class CurveTests(TestCase): Y=Mod(0xcf5ac8395bafeb13c02da292dded7a83, self.secp128r1.curve.prime), Z=Mod(1, self.secp128r1.curve.prime)) assert self.secp128r1.curve.is_on_curve(pt) + assert self.secp128r1.curve.is_on_curve(pt.to_affine()) + other = Point(self.secp128r1.curve.coordinate_model, + X=Mod(0x161ff7528b899b2d0c28607ca52c5b86, self.secp128r1.curve.prime), + Y=Mod(0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, self.secp128r1.curve.prime), + Z=Mod(1, self.secp128r1.curve.prime)) + assert not self.secp128r1.curve.is_on_curve(other) + + def test_repr(self): + self.assertEqual(repr(self.secp128r1.curve), + "EllipticCurve([a=340282366762482138434845932244680310780, b=308990863222245658030922601041482374867] on ShortWeierstrassModel() using EFDCoordinateModel(\"projective\" on short Weierstrass curves))") diff --git a/test/ec/test_mod.py b/test/ec/test_mod.py index 6e4cfbf..59b716e 100644 --- a/test/ec/test_mod.py +++ b/test/ec/test_mod.py @@ -1,12 +1,13 @@ from unittest import TestCase -from pyecsca.ec.mod import Mod, gcd, extgcd +from pyecsca.ec.mod import Mod, gcd, extgcd, Undefined class ModTests(TestCase): def test_gcd(self): self.assertEqual(gcd(15, 20), 5) + self.assertEqual(extgcd(15, 0), (1, 0, 15)) self.assertEqual(extgcd(15, 20), (-1, 1, 5)) def test_wrong_mod(self): @@ -15,6 +16,12 @@ class ModTests(TestCase): with self.assertRaises(ValueError): a + b + def test_wrong_pow(self): + a = Mod(5, 7) + c = Mod(4, 11) + with self.assertRaises(TypeError): + a**c + def test_other(self): a = Mod(5, 7) b = Mod(3, 7) @@ -26,5 +33,24 @@ class ModTests(TestCase): self.assertEqual(a // b, Mod(4, 7)) self.assertEqual(5 / b, Mod(4, 7)) self.assertEqual(5 // b, Mod(4, 7)) + self.assertEqual(a / 3, Mod(4, 7)) + self.assertEqual(a // 3, Mod(4, 7)) self.assertEqual(divmod(a, b), (Mod(1, 7), Mod(2, 7))) - self.assertNotEqual(a, 6) \ No newline at end of file + self.assertEqual(a + b, Mod(1, 7)) + self.assertEqual(5 + b, Mod(1, 7)) + self.assertEqual(a + 3, Mod(1, 7)) + self.assertNotEqual(a, 6) + + def test_undefined(self): + u = Undefined() + for k, meth in u.__class__.__dict__.items(): + if k in ("__module__", "__init__", "__doc__", "__hash__"): + continue + args = [5 for _ in range(meth.__code__.co_argcount - 1)] + if k == "__repr__": + self.assertEqual(meth(u), "Undefined") + elif k in ("__eq__", "__ne__"): + assert not meth(u, *args) + else: + with self.assertRaises(NotImplementedError): + meth(u, *args) \ No newline at end of file -- cgit v1.2.3-70-g09d2