diff options
Diffstat (limited to 'test/ec/test_mod.py')
| -rw-r--r-- | test/ec/test_mod.py | 99 |
1 files changed, 77 insertions, 22 deletions
diff --git a/test/ec/test_mod.py b/test/ec/test_mod.py index a21ef06..2c45447 100644 --- a/test/ec/test_mod.py +++ b/test/ec/test_mod.py @@ -1,13 +1,27 @@ from sympy import FF, symbols from unittest import TestCase -from pyecsca.ec.mod import Mod, gcd, extgcd, Undefined, miller_rabin, has_gmp, RawMod, SymbolicMod, jacobi -from pyecsca.ec.error import NonInvertibleError, NonResidueError, NonInvertibleWarning, NonResidueWarning +from pyecsca.ec.mod import ( + Mod, + gcd, + extgcd, + Undefined, + miller_rabin, + has_gmp, + RawMod, + SymbolicMod, + jacobi, +) +from pyecsca.ec.error import ( + NonInvertibleError, + NonResidueError, + NonInvertibleWarning, + NonResidueWarning, +) from pyecsca.misc.cfg import getconfig, TemporaryConfig class ModTests(TestCase): - def test_gcd(self): self.assertEqual(gcd(15, 20), 5) self.assertEqual(extgcd(15, 0), (1, 0, 15)) @@ -15,20 +29,33 @@ class ModTests(TestCase): def test_jacobi(self): self.assertEqual(jacobi(5, 1153486465415345646578465454655646543248656451), 1) - self.assertEqual(jacobi(564786456646845, 46874698564153465453246546545456849797895547657), -1) - self.assertEqual(jacobi(564786456646845, 46874698564153465453246546545456849797895), 0) + self.assertEqual( + jacobi(564786456646845, 46874698564153465453246546545456849797895547657), -1 + ) + self.assertEqual( + jacobi(564786456646845, 46874698564153465453246546545456849797895), 0 + ) def test_miller_rabin(self): self.assertTrue(miller_rabin(2)) self.assertTrue(miller_rabin(3)) self.assertTrue(miller_rabin(5)) self.assertFalse(miller_rabin(8)) - self.assertTrue(miller_rabin(0xe807561107ccf8fa82af74fd492543a918ca2e9c13750233a9)) - self.assertFalse(miller_rabin(0x6f6889deb08da211927370810f026eb4c17b17755f72ea005)) + self.assertTrue( + miller_rabin(0xE807561107CCF8FA82AF74FD492543A918CA2E9C13750233A9) + ) + self.assertFalse( + miller_rabin(0x6F6889DEB08DA211927370810F026EB4C17B17755F72EA005) + ) def test_inverse(self): - p = 0xffffffff00000001000000000000000000000000ffffffffffffffffffffffff - self.assertEqual(Mod(0x702bdafd3c1c837b23a1cb196ed7f9fadb333c5cfe4a462be32adcd67bfb6ac1, p).inverse(), Mod(0x1cb2e5274bba085c4ca88eede75ae77949e7a410c80368376e97ab22eb590f9d, p)) + p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF + self.assertEqual( + Mod( + 0x702BDAFD3C1C837B23A1CB196ED7F9FADB333C5CFE4A462BE32ADCD67BFB6AC1, p + ).inverse(), + Mod(0x1CB2E5274BBA085C4CA88EEDE75AE77949E7A410C80368376E97AB22EB590F9D, p), + ) with self.assertRaises(NonInvertibleError): Mod(0, p).inverse() with self.assertRaises(NonInvertibleError): @@ -50,22 +77,42 @@ class ModTests(TestCase): self.assertTrue(Mod(1, 2).is_residue()) def test_sqrt(self): - p = 0xffffffff00000001000000000000000000000000ffffffffffffffffffffffff - self.assertIn(Mod(0xffffffff00000001000000000000000000000000fffffffffffffffffffffffc, p).sqrt(), (0x9add512515b70d9ec471151c1dec46625cd18b37bde7ca7fb2c8b31d7033599d, 0x6522aed9ea48f2623b8eeae3e213b99da32e74c9421835804d374ce28fcca662)) + p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF + self.assertIn( + Mod( + 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC, p + ).sqrt(), + ( + 0x9ADD512515B70D9EC471151C1DEC46625CD18B37BDE7CA7FB2C8B31D7033599D, + 0x6522AED9EA48F2623B8EEAE3E213B99DA32E74C9421835804D374CE28FCCA662, + ), + ) with self.assertRaises(NonResidueError): - Mod(0x702bdafd3c1c837b23a1cb196ed7f9fadb333c5cfe4a462be32adcd67bfb6ac1, p).sqrt() + Mod( + 0x702BDAFD3C1C837B23A1CB196ED7F9FADB333C5CFE4A462BE32ADCD67BFB6AC1, p + ).sqrt() getconfig().ec.non_residue_action = "warning" with self.assertRaises(NonResidueWarning): - Mod(0x702bdafd3c1c837b23a1cb196ed7f9fadb333c5cfe4a462be32adcd67bfb6ac1, p).sqrt() + Mod( + 0x702BDAFD3C1C837B23A1CB196ED7F9FADB333C5CFE4A462BE32ADCD67BFB6AC1, p + ).sqrt() getconfig().ec.non_residue_action = "ignore" - Mod(0x702bdafd3c1c837b23a1cb196ed7f9fadb333c5cfe4a462be32adcd67bfb6ac1, p).sqrt() + Mod( + 0x702BDAFD3C1C837B23A1CB196ED7F9FADB333C5CFE4A462BE32ADCD67BFB6AC1, p + ).sqrt() with TemporaryConfig() as cfg: cfg.ec.non_residue_action = "warning" with self.assertRaises(NonResidueWarning): - Mod(0x702bdafd3c1c837b23a1cb196ed7f9fadb333c5cfe4a462be32adcd67bfb6ac1, p).sqrt() + Mod( + 0x702BDAFD3C1C837B23A1CB196ED7F9FADB333C5CFE4A462BE32ADCD67BFB6AC1, + p, + ).sqrt() self.assertEqual(Mod(0, p).sqrt(), Mod(0, p)) - q = 0x75d44fee9a71841ae8403c0c251fbad - self.assertIn(Mod(0x591e0db18cf1bd81a11b2985a821eb3, q).sqrt(), (0x113b41a1a2b73f636e73be3f9a3716e, 0x64990e4cf7ba44b779cc7dcc8ae8a3f)) + q = 0x75D44FEE9A71841AE8403C0C251FBAD + self.assertIn( + Mod(0x591E0DB18CF1BD81A11B2985A821EB3, q).sqrt(), + (0x113B41A1A2B73F636E73BE3F9A3716E, 0x64990E4CF7BA44B779CC7DCC8AE8A3F), + ) getconfig().ec.non_residue_action = "error" def test_eq(self): @@ -77,9 +124,9 @@ class ModTests(TestCase): def test_pow(self): a = Mod(5, 7) - self.assertEqual(a**(-1), a.inverse()) - self.assertEqual(a**0, Mod(1, 7)) - self.assertEqual(a**(-2), a.inverse()**2) + self.assertEqual(a ** (-1), a.inverse()) + self.assertEqual(a ** 0, Mod(1, 7)) + self.assertEqual(a ** (-2), a.inverse() ** 2) def test_wrong_mod(self): a = Mod(5, 7) @@ -91,7 +138,7 @@ class ModTests(TestCase): a = Mod(5, 7) c = Mod(4, 11) with self.assertRaises(TypeError): - a**c + a ** c def test_other(self): a = Mod(5, 7) @@ -116,7 +163,15 @@ class ModTests(TestCase): def test_undefined(self): u = Undefined() for k, meth in u.__class__.__dict__.items(): - if k in ("__module__", "__new__", "__init__", "__doc__", "__hash__", "__abstractmethods__", "_abc_impl"): + if k in ( + "__module__", + "__new__", + "__init__", + "__doc__", + "__hash__", + "__abstractmethods__", + "_abc_impl", + ): continue args = [5 for _ in range(meth.__code__.co_argcount - 1)] if k == "__repr__": |
