1import unittest
2from util import *
3
4ENTROPY_LEN_128, ENTROPY_LEN_256, ENTROPY_LEN_512 = 16, 32, 64
5HMAC_SHA512_LEN = 64
6
7class SymmetricTests(unittest.TestCase):
8
9    def test_symmetric_key(self):
10        seed128, seed128_len = make_cbuffer('01' * ENTROPY_LEN_128)
11        seed256, seed256_len = make_cbuffer('01' * ENTROPY_LEN_256)
12        seed512, seed512_len = make_cbuffer('01' * ENTROPY_LEN_512)
13        label, label_len = make_cbuffer('0f0000')
14        key_out, key_out_len = make_cbuffer('00' * HMAC_SHA512_LEN)
15
16        # wally_symmetric_key_from_seed
17        # Invalid args
18        cases = [
19            (None,    seed128_len,   key_out, key_out_len),   # Null bytes
20            (seed128, 0,             key_out, key_out_len),   # 0 Length bytes
21            (seed128, seed128_len-1, key_out, key_out_len),   # Bad bytes length
22            (seed128, seed128_len,   None,    key_out_len),   # Null dest
23            (seed128, seed128_len,   key_out, 0),             # 0 length dest
24            (seed128, seed128_len,   key_out, key_out_len+1), # Bad dest length
25        ]
26        for bytes_in, bytes_len, out, out_len in cases:
27            ret = wally_symmetric_key_from_seed(bytes_in, bytes_len, out, out_len)
28            self.assertEqual(ret, WALLY_EINVAL)
29
30        # Valid args
31        for bytes_in, bytes_len in [(seed128, seed128_len),
32                                    (seed256, seed256_len),
33                                    (seed512, seed512_len)]:
34            ret = wally_symmetric_key_from_seed(bytes_in, bytes_len, key_out, key_out_len)
35            self.assertEqual(ret, WALLY_OK)
36
37        # wally_symmetric_key_from_parent
38        key_in, key_len = make_cbuffer('01' * HMAC_SHA512_LEN)
39        # Invalid args
40        cases = [
41            (None,   key_len,   0, label, label_len, key_out, key_out_len),   # Null key
42            (key_in, 0,         0, label, label_len, key_out, key_out_len),   # 0 Length key
43            (key_in, key_len-1, 1, label, label_len, key_out, key_out_len),   # Bad key length
44            (key_in, key_len,   1, label, label_len, key_out, key_out_len),   # Bad version
45            (key_in, key_len,   0, None,  label_len, key_out, key_out_len),   # Null label
46            (key_in, key_len,   0, label, 0,         key_out, key_out_len),   # Bad label length
47            (key_in, key_len,   0, label, label_len, None,    key_out_len),   # Null dest
48            (key_in, key_len,   0, label, label_len, key_out, 0),             # 0 length dest
49            (key_in, key_len,   0, label, label_len, key_out, key_out_len+1), # Bad dest length
50        ]
51        for bytes_in, bytes_len, ver, l, l_len, out, out_len in cases:
52            ret = wally_symmetric_key_from_parent(bytes_in, bytes_len, ver, l, l_len, out, out_len)
53            self.assertEqual(ret, WALLY_EINVAL)
54
55        # Valid args
56        ret = wally_symmetric_key_from_parent(key_in, key_len, 0, label, label_len, key_out, key_out_len)
57        self.assertEqual(ret, WALLY_OK)
58
59        # Check labels around length LABEL_SIZE (64)
60        label, label_len = make_cbuffer('0f' * 65)
61        for l_len in (label_len-1, label_len, label_len+1):
62            ret = wally_symmetric_key_from_parent(key_in, key_len, 0, label, l_len, key_out, key_out_len)
63            self.assertEqual(ret, WALLY_OK)
64
65
66if __name__ == '__main__':
67    unittest.main()
68