| #!/usr/bin/env python3 |
| # SPDX-License-Identifier: BSD-2-Clause |
| # |
| # Copyright 2024 NXP |
| # |
| |
| import json |
| |
| modes = {'encrypt': 0, 'decrypt': 1} |
| |
| |
| def to_compound_str(name, val): |
| assert len(val) % 2 == 0, "Only even sized values supported" |
| if len(val) > 0: |
| import re |
| a = re.findall('..', val) |
| b = name + " = (const uint8_t []){ " |
| for s in a: |
| b += "0x" + s + ", " |
| b += "},\n\t" + name + "_len = " + repr((int)(len(val) / 2)) + "," |
| else: |
| b = name + " = NULL,\n\t" + name + "_len = 0," |
| return b |
| |
| |
| def generate_case(outf, tv, mode): |
| outf.write('{\n\t.algo = TEE_ALG_AES_GCM, .mode = ' + mode + |
| ', .key_type = TEE_TYPE_AES,\n') |
| outf.write('\t' + to_compound_str('.key', tv['key']) + '\n') |
| outf.write('\t' + to_compound_str('.nonce', tv['iv']) + '\n') |
| outf.write('\t.aad_incr = 0,\n') |
| outf.write('\t' + to_compound_str('.aad', tv['aad']) + '\n') |
| outf.write('\t.in_incr = 0,\n') |
| outf.write('\t' + to_compound_str('.ptx', tv['msg']) + '\n') |
| outf.write('\t' + to_compound_str('.ctx', tv['ct']) + '\n') |
| outf.write('\t' + to_compound_str('.tag', tv['tag']) + '\n') |
| outf.write('\t.line = __LINE__,\n') |
| outf.write('\t.id = ' + repr(tv['tcId']) + '\n},\n') |
| |
| |
| def get_args(): |
| import argparse |
| |
| parser = argparse.ArgumentParser() |
| |
| parser.add_argument('--inf', required=True, |
| type=argparse.FileType('r'), |
| help='Name of input json file') |
| |
| parser.add_argument('--outf', required=True, |
| type=argparse.FileType('w'), |
| help='Name of output C file') |
| |
| parser.add_argument('--mode', required=True, choices=modes.keys(), |
| help='mode: encrypt or decrypt') |
| |
| return parser.parse_args() |
| |
| |
| # Convert google/wycheproof AES GCM test vectors to xtest AE test cases |
| def main(): |
| args = get_args() |
| inf = args.inf |
| outf = args.outf |
| |
| outf.write("/* SPDX-License-Identifier: Apache-2.0 */\n") |
| outf.write("/*\n") |
| outf.write(" * Copyright 2024 NXP\n") |
| outf.write(" */\n\n") |
| |
| if args.mode == "encrypt": |
| mode = "TEE_MODE_ENCRYPT" |
| else: |
| mode = "TEE_MODE_DECRYPT" |
| |
| data = json.load(inf) |
| |
| for tg in data['testGroups']: |
| for tv in tg['tests']: |
| if tv['result'] == 'valid' and 'CounterWrap' in tv['flags']: |
| generate_case(outf, tv, mode) |
| |
| |
| if __name__ == "__main__": |
| main() |