8
from pytest.Tiab import TiabTest
10
from random import shuffle
13
from armoryengine.ArmoryUtils import FiniteField, FiniteFieldError, SplitSecret, \
14
hex_to_binary, RightNow, binary_to_hex, ReconstructSecret
17
sys.argv.append('--nologging')
18
sys.argv.append('--nologging')
24
TEST_MULT_RESULT = 171
26
TEST_MTRX = [[1, 2, 3], [3,4,5], [6,7,8] ]
27
TEST_VECTER = [1, 2, 3]
28
TEST_3_BY_2_MTRX = [[1, 2, 3], [3,4,5]]
29
TEST_2_BY_3_MTRX = [[1, 2], [3,4], [5, 6]]
30
TEST_RMROW1CO1L_RESULT = [[1, 3], [6, 8]]
32
TEST_MULT_VECT_RESULT = [14, 26, 44]
33
TEST_MULT_VECT_RESULT2 = [5, 11, 17]
34
TEST_MULT_VECT_RESULT3 = [[7, 10], [15, 22], [23, 34]]
35
TEST_MULT_VECT_RESULT4 = [[248, 5, 249], [6, 241, 4], [248, 5, 249]]
36
TEST_MULT_VECT_RESULT5 = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
38
class SplitSecretTest(TiabTest):
41
def testFiniteFieldTest(self):
43
self.assertRaises(FiniteFieldError, FiniteField, 257)
45
self.assertEqual(ff1.add(TEST_A, TEST_B), TEST_ADD_RESULT)
46
self.assertEqual(ff1.subtract(TEST_A, TEST_B), TEST_SUB_RESULT)
47
self.assertEqual(ff1.mult(TEST_A, TEST_B), TEST_MULT_RESULT)
48
self.assertEqual(ff1.divide(TEST_A, TEST_B), TEST_DIV_RESULT)
49
self.assertEqual(ff1.mtrxrmrowcol(TEST_MTRX, 1, 1), TEST_RMROW1CO1L_RESULT)
50
self.assertEqual(ff1.mtrxrmrowcol(TEST_3_BY_2_MTRX, 1, 1), [])
51
self.assertEqual(ff1.mtrxdet([[1]]), 1)
52
self.assertEqual(ff1.mtrxdet(TEST_3_BY_2_MTRX), -1)
53
self.assertEqual(ff1.mtrxdet(TEST_MTRX), TEST_DET_RESULT)
54
self.assertEqual(ff1.mtrxmultvect(TEST_MTRX, TEST_VECTER), TEST_MULT_VECT_RESULT)
55
self.assertEqual(ff1.mtrxmultvect(TEST_3_BY_2_MTRX, TEST_VECTER), TEST_MULT_VECT_RESULT[:2])
56
self.assertEqual(ff1.mtrxmultvect(TEST_2_BY_3_MTRX, TEST_VECTER), TEST_MULT_VECT_RESULT2)
57
self.assertEqual(ff1.mtrxmult(TEST_2_BY_3_MTRX, TEST_3_BY_2_MTRX), TEST_MULT_VECT_RESULT3)
58
self.assertEqual(ff1.mtrxmult(TEST_2_BY_3_MTRX, TEST_2_BY_3_MTRX), TEST_MULT_VECT_RESULT3)
59
self.assertEqual(ff1.mtrxadjoint(TEST_MTRX), TEST_MULT_VECT_RESULT4)
60
self.assertEqual(ff1.mtrxinv(TEST_MTRX), TEST_MULT_VECT_RESULT5)
62
def testSplitSecret(self):
63
self.callSplitSecret('9f', 2,3)
64
self.callSplitSecret('9f', 3,5)
65
self.callSplitSecret('9f', 4,7)
66
self.callSplitSecret('9f', 5,9)
67
self.callSplitSecret('9f', 6,7)
68
self.callSplitSecret('9f'*16, 3,5, 16)
69
self.callSplitSecret('9f'*16, 7,10, 16)
70
self.assertRaises(FiniteFieldError, SplitSecret, '9f'*16, 3, 5, 8)
71
self.assertRaises(FiniteFieldError, SplitSecret, '9f', 5,4)
72
self.assertRaises(FiniteFieldError, SplitSecret, '9f', 1,1)
75
def callSplitSecret(self, secretHex, M, N, nbytes=1):
76
secret = hex_to_binary(secretHex)
77
print '\nSplitting secret into %d-of-%d: secret=%s' % (M,N,secretHex)
79
out = SplitSecret(secret, M, N)
80
tsplit = RightNow() - tstart
82
for i in range(len(out)):
83
x = binary_to_hex(out[i][0])
84
y = binary_to_hex(out[i][1])
85
print ' Fragment %d: [%s, %s]' % (i+1,x,y)
87
print 'Reconstructing secret from various subsets of fragments...'
91
reconstruct = ReconstructSecret(out, M, nbytes)
92
trecon += RightNow() - tstart
93
print ' The reconstructed secret is:', binary_to_hex(reconstruct)
94
self.assertEqual(binary_to_hex(reconstruct), secretHex)
95
print 'Splitting secret took: %0.5f sec' % tsplit
96
print 'Reconstructing takes: %0.5f sec' % (trecon/10)
98
# Running tests with "python <module name>" will NOT work for any Armory tests
99
# You must run tests with "python -m unittest <module name>" or run all tests with "python -m unittest discover"
100
# if __name__ == "__main__":
b'\\ No newline at end of file'