aboutsummaryrefslogtreecommitdiff
path: root/test/ec/test_mod.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/ec/test_mod.py')
-rw-r--r--test/ec/test_mod.py99
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__":