|
|
|
@@ -63,11 +63,15 @@ def create_shares(data, k, nshares): |
|
|
|
|
|
|
|
data = bytes(data) |
|
|
|
|
|
|
|
powers = (None, ) + tuple(GF2p8(x).powerseries(k - 1) for x in range(1, nshares + 1)) |
|
|
|
powers = (None, ) + tuple(GF2p8(x).powerseries(k - 1) for x in |
|
|
|
range(1, nshares + 1)) |
|
|
|
|
|
|
|
coeffs = [ [ x ] + [ random.randint(1, 255) for y in range(k - 1) ] for idx, x in enumerate(data) ] |
|
|
|
coeffs = [ [ x ] + [ random.randint(1, 255) for y in |
|
|
|
range(k - 1) ] for idx, x in enumerate(data) ] |
|
|
|
|
|
|
|
return [ (x, bytes([ int(evalpoly(coeffs[idx], powers[x])) for idx, val in enumerate(data) ])) for x in range(1, nshares + 1) ] |
|
|
|
return [ (x, bytes([ int(evalpoly(coeffs[idx], |
|
|
|
powers[x])) for idx, val in enumerate(data) ])) for x in |
|
|
|
range(1, nshares + 1) ] |
|
|
|
|
|
|
|
def recover_data(shares, k): |
|
|
|
'''Recover the value given shares, where k is needed. |
|
|
|
@@ -190,10 +194,12 @@ class TestShamirSS(unittest.TestCase): |
|
|
|
vals = [ GF2p8(random.randint(0, 255)) for x in range(5) ] |
|
|
|
|
|
|
|
r = evalpoly(vals, powers) |
|
|
|
self.assertEqual(r, vals[0] + vals[1] * powers[1] + vals[2] * powers[2] + vals[3] * powers[3] + vals[4] * powers[4]) |
|
|
|
self.assertEqual(r, vals[0] + vals[1] * powers[1] + vals[2] * |
|
|
|
powers[2] + vals[3] * powers[3] + vals[4] * powers[4]) |
|
|
|
|
|
|
|
r = evalpoly(vals[:3], powers) |
|
|
|
self.assertEqual(r, vals[0] + vals[1] * powers[1] + vals[2] * powers[2]) |
|
|
|
self.assertEqual(r, vals[0] + vals[1] * powers[1] + vals[2] * |
|
|
|
powers[2]) |
|
|
|
|
|
|
|
def test_create_shares(self): |
|
|
|
self.assertRaises(TypeError, create_shares, '', 1, 1) |
|
|
|
@@ -222,7 +228,8 @@ class TestShamirSS(unittest.TestCase): |
|
|
|
|
|
|
|
self.assertEqual(a * ainv, 1) |
|
|
|
|
|
|
|
invcache = (None, ) + tuple(int(GF2p8(x) ** -1) for x in range(1, 256)) |
|
|
|
invcache = (None, ) + \ |
|
|
|
tuple(int(GF2p8(x) ** -1) for x in range(1, 256)) |
|
|
|
|
|
|
|
if GF2p8._invcache != invcache: # pragma: no cover |
|
|
|
print('inv cache:', repr(invcache)) |
|
|
|
@@ -279,7 +286,9 @@ class TestShamirSS(unittest.TestCase): |
|
|
|
|
|
|
|
# Basic mul |
|
|
|
self.assertEqual(GF2p8(0x80) * 2, 0x87) |
|
|
|
self.assertEqual(GF2p8(0x80) * 6, (0x80 * 6) ^ (0x187 << 1)) |
|
|
|
self.assertEqual(GF2p8(0x80) * 8, (0x80 * 8) ^ (0x187 << 2) ^ (0x187 << 1) ^ 0x187) |
|
|
|
self.assertEqual(GF2p8(0x80) * 6, |
|
|
|
(0x80 * 6) ^ (0x187 << 1)) |
|
|
|
self.assertEqual(GF2p8(0x80) * 8, |
|
|
|
(0x80 * 8) ^ (0x187 << 2) ^ (0x187 << 1) ^ 0x187) |
|
|
|
|
|
|
|
self.assertEqual(a + b - b, a) |