generate_test_cert_macros.py (4599B)
1 #!/usr/bin/env python3 2 3 """ 4 Generate `tests/src/test_certs.h` which includes certficaties/keys/certificate list for testing. 5 """ 6 7 # 8 # Copyright The Mbed TLS Contributors 9 # SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later 10 11 12 import os 13 import sys 14 import argparse 15 import jinja2 16 from mbedtls_framework.build_tree import guess_project_root 17 18 TESTS_DIR = os.path.join(guess_project_root(), 'tests') 19 FRAMEWORK_DIR = os.path.join(guess_project_root(), 'framework') 20 DATA_FILES_PATH = os.path.join(FRAMEWORK_DIR, 'data_files') 21 22 INPUT_ARGS = [ 23 ("string", "TEST_CA_CRT_EC_PEM", DATA_FILES_PATH + "/test-ca2.crt"), 24 ("binary", "TEST_CA_CRT_EC_DER", DATA_FILES_PATH + "/test-ca2.crt.der"), 25 ("string", "TEST_CA_KEY_EC_PEM", DATA_FILES_PATH + "/test-ca2.key.enc"), 26 ("password", "TEST_CA_PWD_EC_PEM", "PolarSSLTest"), 27 ("binary", "TEST_CA_KEY_EC_DER", DATA_FILES_PATH + "/test-ca2.key.der"), 28 ("string", "TEST_CA_CRT_RSA_SHA256_PEM", DATA_FILES_PATH + "/test-ca-sha256.crt"), 29 ("binary", "TEST_CA_CRT_RSA_SHA256_DER", DATA_FILES_PATH + "/test-ca-sha256.crt.der"), 30 ("string", "TEST_CA_CRT_RSA_SHA1_PEM", DATA_FILES_PATH + "/test-ca-sha1.crt"), 31 ("binary", "TEST_CA_CRT_RSA_SHA1_DER", DATA_FILES_PATH + "/test-ca-sha1.crt.der"), 32 ("string", "TEST_CA_KEY_RSA_PEM", DATA_FILES_PATH + "/test-ca.key"), 33 ("password", "TEST_CA_PWD_RSA_PEM", "PolarSSLTest"), 34 ("binary", "TEST_CA_KEY_RSA_DER", DATA_FILES_PATH + "/test-ca.key.der"), 35 ("string", "TEST_SRV_CRT_EC_PEM", DATA_FILES_PATH + "/server5.crt"), 36 ("binary", "TEST_SRV_CRT_EC_DER", DATA_FILES_PATH + "/server5.crt.der"), 37 ("string", "TEST_SRV_KEY_EC_PEM", DATA_FILES_PATH + "/server5.key"), 38 ("binary", "TEST_SRV_KEY_EC_DER", DATA_FILES_PATH + "/server5.key.der"), 39 ("string", "TEST_SRV_CRT_RSA_SHA256_PEM", DATA_FILES_PATH + "/server2-sha256.crt"), 40 ("binary", "TEST_SRV_CRT_RSA_SHA256_DER", DATA_FILES_PATH + "/server2-sha256.crt.der"), 41 ("string", "TEST_SRV_CRT_RSA_SHA1_PEM", DATA_FILES_PATH + "/server2.crt"), 42 ("binary", "TEST_SRV_CRT_RSA_SHA1_DER", DATA_FILES_PATH + "/server2.crt.der"), 43 ("string", "TEST_SRV_KEY_RSA_PEM", DATA_FILES_PATH + "/server2.key"), 44 ("binary", "TEST_SRV_KEY_RSA_DER", DATA_FILES_PATH + "/server2.key.der"), 45 ("string", "TEST_CLI_CRT_EC_PEM", DATA_FILES_PATH + "/cli2.crt"), 46 ("binary", "TEST_CLI_CRT_EC_DER", DATA_FILES_PATH + "/cli2.crt.der"), 47 ("string", "TEST_CLI_KEY_EC_PEM", DATA_FILES_PATH + "/cli2.key"), 48 ("binary", "TEST_CLI_KEY_EC_DER", DATA_FILES_PATH + "/cli2.key.der"), 49 ("string", "TEST_CLI_CRT_RSA_PEM", DATA_FILES_PATH + "/cli-rsa-sha256.crt"), 50 ("binary", "TEST_CLI_CRT_RSA_DER", DATA_FILES_PATH + "/cli-rsa-sha256.crt.der"), 51 ("string", "TEST_CLI_KEY_RSA_PEM", DATA_FILES_PATH + "/cli-rsa.key"), 52 ("binary", "TEST_CLI_KEY_RSA_DER", DATA_FILES_PATH + "/cli-rsa.key.der"), 53 ] 54 55 def main(): 56 parser = argparse.ArgumentParser() 57 default_output_path = os.path.join(TESTS_DIR, 'include', 'test', 'test_certs.h') 58 parser.add_argument('--output', type=str, default=default_output_path) 59 parser.add_argument('--list-dependencies', action='store_true') 60 args = parser.parse_args() 61 62 if args.list_dependencies: 63 files_list = [arg[2] for arg in INPUT_ARGS] 64 print(" ".join(files_list)) 65 return 66 67 generate(INPUT_ARGS, output=args.output) 68 69 #pylint: disable=dangerous-default-value, unused-argument 70 def generate(values=[], output=None): 71 """Generate C header file. 72 """ 73 template_loader = jinja2.FileSystemLoader(DATA_FILES_PATH) 74 template_env = jinja2.Environment( 75 loader=template_loader, lstrip_blocks=True, trim_blocks=True, 76 keep_trailing_newline=True) 77 78 def read_as_c_array(filename): 79 with open(filename, 'rb') as f: 80 data = f.read(12) 81 while data: 82 yield ', '.join(['{:#04x}'.format(b) for b in data]) 83 data = f.read(12) 84 85 def read_lines(filename): 86 with open(filename) as f: 87 try: 88 for line in f: 89 yield line.strip() 90 except: 91 print(filename) 92 raise 93 94 def put_to_column(value, position=0): 95 return ' '*position + value 96 97 template_env.filters['read_as_c_array'] = read_as_c_array 98 template_env.filters['read_lines'] = read_lines 99 template_env.filters['put_to_column'] = put_to_column 100 101 template = template_env.get_template('test_certs.h.jinja2') 102 103 with open(output, 'w') as f: 104 f.write(template.render(macros=values)) 105 106 107 if __name__ == '__main__': 108 sys.exit(main())