owenrusk.dev

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()