regression 4005: Add GCM counter overflow test vectors

Add all counter wrap test vectors from google/wycheproof repo [1]
to the xtest regression 4005 test suite.

To create a link between xtest and wycheproof test cases,
tcId is printed as an extra information in the result log.

Link: [1] https://github.com/google/wycheproof/blob/master/testvectors_v1/aes_gcm_test.json

Signed-off-by: Olivier Masse <olivier.masse@nxp.com>
Reviewed-by: Jerome Forissier <jerome.forissier@linaro.org>
Acked-by: Etienne Carriere <etienne.carriere@foss.st.com>
diff --git a/scripts/aes_gcm_test.py b/scripts/aes_gcm_test.py
new file mode 100644
index 0000000..1c13e0d
--- /dev/null
+++ b/scripts/aes_gcm_test.py
@@ -0,0 +1,80 @@
+# importing the module
+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()