tally
shamir's secret sharing over gf(256).
git clone https://owenrusk.dev/tally.git
tally / tests/test_gf256.py -rw-r--r-- · 1389 bytes
1 import unittest 2 3 from tally import gf256 4 5 6 def slow_mul(a: int, b: int) -> int: 7 # shift and add, reducing as we go 8 out = 0 9 while b: 10 if b & 1: 11 out ^= a 12 a <<= 1 13 if a & 0x100: 14 a ^= gf256.POLY 15 b >>= 1 16 return out 17 18 19 class FieldTest(unittest.TestCase): 20 def test_mul_matches_shift_and_add(self) -> None: 21 for a in range(256): 22 for b in range(256): 23 self.assertEqual(gf256.mul(a, b), slow_mul(a, b), (a, b)) 24 25 def test_exp_hits_every_nonzero_element(self) -> None: 26 self.assertEqual(sorted(gf256.EXP[:255]), list(range(1, 256))) 27 28 def test_every_nonzero_has_an_inverse(self) -> None: 29 for a in range(1, 256): 30 self.assertEqual(gf256.mul(a, gf256.inv(a)), 1, a) 31 32 def test_div_undoes_mul(self) -> None: 33 for a in range(256): 34 for b in range(1, 256): 35 self.assertEqual(gf256.div(gf256.mul(a, b), b), a, (a, b)) 36 37 def test_add_is_its_own_inverse(self) -> None: 38 for a in range(256): 39 self.assertEqual(gf256.add(a, a), 0) 40 41 def test_zero(self) -> None: 42 with self.assertRaises(ZeroDivisionError): 43 gf256.inv(0) 44 with self.assertRaises(ZeroDivisionError): 45 gf256.div(1, 0) 46 self.assertEqual(gf256.div(0, 7), 0) 47 48 49 if __name__ == "__main__": 50 unittest.main()