diff options
Diffstat (limited to 'test')
| -rw-r--r-- | test/ec/test_formula.py | 18 | ||||
| -rw-r--r-- | test/ec/test_mod.py | 33 |
2 files changed, 50 insertions, 1 deletions
diff --git a/test/ec/test_formula.py b/test/ec/test_formula.py index a7ef691..ec585ad 100644 --- a/test/ec/test_formula.py +++ b/test/ec/test_formula.py @@ -1,5 +1,8 @@ from unittest import TestCase +from sympy import FF, symbols + +from pyecsca.ec.mod import SymbolicMod, Mod from pyecsca.misc.cfg import TemporaryConfig from pyecsca.ec.error import UnsatisfiedAssumptionError from pyecsca.ec.params import get_params @@ -59,3 +62,18 @@ class FormulaTests(TestCase): def test_parameters(self): res = self.jac_dbl(self.secp128r1.curve.prime, self.jac_secp128r1.generator, **self.jac_secp128r1.curve.parameters) self.assertIsNotNone(res) + + def test_symbolic(self): + p = self.secp128r1.curve.prime + k = FF(p) + coords = self.secp128r1.curve.coordinate_model + sympy_params = {key: SymbolicMod(k(int(value)), p) for key, value in self.secp128r1.curve.parameters.items()} + symbolic_point = Point(coords, **{key: SymbolicMod(symbols(key), p) for key in coords.variables}) + symbolic_double = self.dbl(p, symbolic_point, **sympy_params)[0] + generator_double = self.dbl(p, self.secp128r1.generator, **self.secp128r1.curve.parameters)[0] + for outer_var in coords.variables: + symbolic_val = getattr(symbolic_double, outer_var).x + generator_val = getattr(generator_double, outer_var).x + for inner_var in coords.variables: + symbolic_val = symbolic_val.subs(inner_var, k(getattr(self.secp128r1.generator, inner_var).x)) + self.assertEqual(Mod(int(symbolic_val), p), Mod(generator_val, p)) diff --git a/test/ec/test_mod.py b/test/ec/test_mod.py index 24b3302..d21238b 100644 --- a/test/ec/test_mod.py +++ b/test/ec/test_mod.py @@ -1,6 +1,7 @@ +from sympy import FF, symbols from unittest import TestCase -from pyecsca.ec.mod import Mod, gcd, extgcd, Undefined, miller_rabin, has_gmp, RawMod +from pyecsca.ec.mod import Mod, gcd, extgcd, Undefined, miller_rabin, has_gmp, RawMod, SymbolicMod from pyecsca.ec.error import NonInvertibleError, NonResidueError, NonInvertibleWarning, NonResidueWarning from pyecsca.misc.cfg import getconfig, TemporaryConfig @@ -105,6 +106,7 @@ class ModTests(TestCase): self.assertEqual(5 + b, Mod(1, 7)) self.assertEqual(a + 3, Mod(1, 7)) self.assertNotEqual(a, 6) + self.assertIsNotNone(hash(a)) def test_undefined(self): u = Undefined() @@ -126,3 +128,32 @@ class ModTests(TestCase): with TemporaryConfig() as cfg: cfg.ec.mod_implementation = "python" self.assertIsInstance(Mod(5, 7), RawMod) + + def test_symbolic(self): + x, y = symbols("x y") + p = 13 + k = FF(p) + sx = SymbolicMod(x, p) + a = k(3) + b = k(5) + r = sx * a + b + self.assertIsInstance(r, SymbolicMod) + self.assertEqual(r.n, p) + sa = SymbolicMod(a, p) + sb = SymbolicMod(b, p) + self.assertEqual(sa, 3) + self.assertEqual(sa.inverse(), SymbolicMod(k(9), p)) + self.assertEqual(1 / sa, SymbolicMod(k(9), p)) + self.assertEqual(sa + sb, 8) + self.assertEqual(1 + sa, 4) + self.assertEqual(sa - 1, 2) + self.assertEqual(1 - sa, 11) + self.assertEqual(sa + 1, 4) + self.assertEqual(-sa, 10) + self.assertEqual(sa / 2, 8) + self.assertEqual(2 / sa, 5) + self.assertEqual(sa // 2, 8) + self.assertEqual(2 // sa, 5) + self.assertEqual(int(sa), 3) + self.assertNotEqual(sa, sb) + self.assertIsNotNone(hash(sa)) |
