blob: 1c13e0d6312c836486374ed10185ba41815ca2c0 [file] [log] [blame]
Olivier Masse9d566212024-01-30 09:18:34 +01001# importing the module
2import json
3
4modes = {'encrypt': 0, 'decrypt': 1}
5
6
7def to_compound_str(name, val):
8 assert len(val) % 2 == 0, "Only even sized values supported"
9 if len(val) > 0:
10 import re
11 a = re.findall('..', val)
12 b = name + " = (const uint8_t []){ "
13 for s in a:
14 b += "0x" + s + ", "
15 b += "},\n\t" + name + "_len = " + repr((int)(len(val) / 2)) + ","
16 else:
17 b = name + " = NULL,\n\t" + name + "_len = 0,"
18 return b
19
20
21def generate_case(outf, tv, mode):
22 outf.write('{\n\t.algo = TEE_ALG_AES_GCM, .mode = ' + mode +
23 ', .key_type = TEE_TYPE_AES,\n')
24 outf.write('\t' + to_compound_str('.key', tv['key']) + '\n')
25 outf.write('\t' + to_compound_str('.nonce', tv['iv']) + '\n')
26 outf.write('\t.aad_incr = 0,\n')
27 outf.write('\t' + to_compound_str('.aad', tv['aad']) + '\n')
28 outf.write('\t.in_incr = 0,\n')
29 outf.write('\t' + to_compound_str('.ptx', tv['msg']) + '\n')
30 outf.write('\t' + to_compound_str('.ctx', tv['ct']) + '\n')
31 outf.write('\t' + to_compound_str('.tag', tv['tag']) + '\n')
32 outf.write('\t.line = __LINE__,\n')
33 outf.write('\t.id = ' + repr(tv['tcId']) + '\n},\n')
34
35
36def get_args():
37 import argparse
38
39 parser = argparse.ArgumentParser()
40
41 parser.add_argument('--inf', required=True,
42 type=argparse.FileType('r'),
43 help='Name of input json file')
44
45 parser.add_argument('--outf', required=True,
46 type=argparse.FileType('w'),
47 help='Name of output C file')
48
49 parser.add_argument('--mode', required=True, choices=modes.keys(),
50 help='mode: encrypt or decrypt')
51
52 return parser.parse_args()
53
54
55# Convert google/wycheproof AES GCM test vectors to xtest AE test cases
56def main():
57 args = get_args()
58 inf = args.inf
59 outf = args.outf
60
61 outf.write("/* SPDX-License-Identifier: Apache-2.0 */\n")
62 outf.write("/*\n")
63 outf.write(" * Copyright 2024 NXP\n")
64 outf.write(" */\n\n")
65
66 if args.mode == "encrypt":
67 mode = "TEE_MODE_ENCRYPT"
68 else:
69 mode = "TEE_MODE_DECRYPT"
70
71 data = json.load(inf)
72
73 for tg in data['testGroups']:
74 for tv in tg['tests']:
75 if tv['result'] == 'valid' and 'CounterWrap' in tv['flags']:
76 generate_case(outf, tv, mode)
77
78
79if __name__ == "__main__":
80 main()