#!/usr/bin/env python3
|
|
modes = {'encrypt': 0, 'decrypt': 1}
|
|
limited = False
|
|
|
def to_compound_str(val):
|
assert len(val) % 2 == 0, "Only even sized values supported"
|
if len(val) > 0:
|
import re
|
a = re.findall('..', val)
|
b = "(const uint8_t []){"
|
for s in a:
|
b += "0x" + s + ", "
|
b += "}, " + repr(len(val) / 2) + ","
|
else:
|
b = "NULL, 0,"
|
return b
|
|
|
def generate_case(outf, myvars, mode):
|
if 'PT' not in myvars:
|
myvars['PT'] = ''
|
if 'FAIL' in myvars:
|
return
|
if limited and myvars['Count'] != '0':
|
return
|
# Skip cases not supported by GP
|
if len(myvars['Tag']) / 2 < 96 / 8:
|
return
|
|
outf.write('{ TEE_ALG_AES_GCM, ' + mode + ', TEE_TYPE_AES,\n')
|
outf.write('/* Key */ ' + to_compound_str(myvars['Key']) + '\n')
|
outf.write('/* IV */ ' + to_compound_str(myvars['IV']) + '\n')
|
outf.write('0,\n')
|
outf.write('/* AAD */ ' + to_compound_str(myvars['AAD']) + '\n')
|
outf.write('0,\n')
|
outf.write('/* PT */ ' + to_compound_str(myvars['PT']) + '\n')
|
outf.write('/* CT */ ' + to_compound_str(myvars['CT']) + '\n')
|
outf.write('/* Tag */ ' + to_compound_str(myvars['Tag']) + '\n')
|
outf.write(repr(myvars['Line']) + '},\n')
|
|
|
def get_args():
|
import argparse
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument('--inf', required=True,
|
type=argparse.FileType('r'),
|
help='Name of input RSP 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')
|
|
parser.add_argument('--limited', action="store_true",
|
help='Only run one test case from each group')
|
|
return parser.parse_args()
|
|
|
def main():
|
import re
|
global limited
|
args = get_args()
|
inf = args.inf
|
outf = args.outf
|
myvars = {}
|
line_num = 0
|
|
if args.mode == "encrypt":
|
mode = "TEE_MODE_ENCRYPT"
|
else:
|
mode = "TEE_MODE_DECRYPT"
|
|
limited = args.limited
|
|
for line in inf:
|
line_num += 1
|
myl = line.strip()
|
if len(myl) == 0:
|
continue
|
if re.match('^#', myl):
|
continue
|
if re.match('^\[', myl):
|
continue
|
s = re.split('\W+', myl)
|
if len(s) == 0:
|
continue
|
name = s[0]
|
if name == 'Count':
|
if len(myvars) > 1:
|
generate_case(outf, myvars, mode)
|
myvars = {}
|
myvars['Line'] = line_num
|
|
if len(s) < 2:
|
myvars[s[0]] = ''
|
else:
|
myvars[s[0]] = s[1]
|
|
if len(s) < 2:
|
continue
|
val = s[1]
|
|
if len(myvars) > 1:
|
generate_case(outf, myvars, mode)
|
|
|
if __name__ == "__main__":
|
main()
|