aboutsummaryrefslogtreecommitdiffhomepage
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/ec/test_formula.py18
-rw-r--r--test/ec/test_mod.py33
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))