blob: 75e85cefcc5ef458ac7c9765e5cb614b1a0e2927 [file] [log] [blame]
Valerio Setti7126ba52024-03-29 16:59:40 +01001#!/usr/bin/env python3
2
3# Copyright The Mbed TLS Contributors
4# SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
5
6"""Module generating EC and RSA keys to be used in test_suite_pk instead of
7generating the required key at run time. This helps speeding up testing."""
8
9import os
10import sys
Valerio Setti862d14e2024-04-15 17:58:43 +020011from typing import Iterator
Valerio Setti7031a4e2024-04-16 10:31:15 +020012import re
Valerio Setti6bda5f52024-04-09 12:28:39 +020013# pylint: disable=wrong-import-position
14SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) + "/"
15sys.path.append(SCRIPT_DIR + "../../scripts/")
16from mbedtls_dev.asymmetric_key_data import ASYMMETRIC_KEY_DATA
Valerio Setti8f404602024-04-15 15:09:10 +020017import scripts_path # pylint: disable=unused-import
Valerio Setti7126ba52024-03-29 16:59:40 +010018
Valerio Setti6bda5f52024-04-09 12:28:39 +020019OUTPUT_HEADER_FILE = SCRIPT_DIR + "../src/test_keys.h"
Valerio Setti862d14e2024-04-15 17:58:43 +020020BYTES_PER_LINE = 16
Valerio Setti7126ba52024-03-29 16:59:40 +010021
Valerio Setti862d14e2024-04-15 17:58:43 +020022def c_byte_array_literal_content(array_name: str, key_data: bytes) -> Iterator[str]:
23 yield 'const unsigned char '
24 yield array_name
25 yield '[] = {'
26 for index in range(0, len(key_data), BYTES_PER_LINE):
27 yield '\n '
28 for b in key_data[index:index + BYTES_PER_LINE]:
29 yield ' {:#04x},'.format(b)
30 yield '\n};'
31
Valerio Setti7031a4e2024-04-16 10:31:15 +020032def convert_der_to_c(array_name: str, key_data: bytes) -> str:
Valerio Setti862d14e2024-04-15 17:58:43 +020033 return ''.join(c_byte_array_literal_content(array_name, key_data))
Valerio Setti7126ba52024-03-29 16:59:40 +010034
Valerio Setti7031a4e2024-04-16 10:31:15 +020035EC_NAME_CONVERSION = {
36 'PSA_ECC_FAMILY_SECP_K1': ['secp', 'k1'],
37 'PSA_ECC_FAMILY_SECP_R1': ['secp', 'r1'],
38 'PSA_ECC_FAMILY_BRAINPOOL_P_R1': ['bp', 'r1'],
39 'PSA_ECC_FAMILY_MONTGOMERY': ['curve', ''],
40}
41
42def get_key_type(key: str) -> str:
43 if re.match('PSA_KEY_TYPE_RSA_.*', key):
44 return "rsa"
45 elif re.match('PSA_KEY_TYPE_ECC_.*', key):
46 return "ec"
47 else:
48 print("Unhandled key type {}".format(key))
49 return "unknown"
50
51def get_ec_key_family(key: str) -> str:
52 match = re.search(r'.*\((.*)\)', key)
53 if match is None:
54 raise Exception("Unable to get EC family from {}".format(key))
55 return match.group(1)
56
57def get_key_role(key_type: str) -> str:
58 if re.match('PSA_KEY_TYPE_.*_KEY_PAIR', key_type):
59 return "priv"
60 else:
61 return "pub"
62
Valerio Setti862d14e2024-04-15 17:58:43 +020063def main() -> None:
Valerio Setti6bda5f52024-04-09 12:28:39 +020064 # Remove output file if already existing.
Valerio Setti7126ba52024-03-29 16:59:40 +010065 if os.path.exists(OUTPUT_HEADER_FILE):
66 os.remove(OUTPUT_HEADER_FILE)
Valerio Setti7126ba52024-03-29 16:59:40 +010067
68 output_file = open(OUTPUT_HEADER_FILE, 'at')
Valerio Setti3e22bf22024-04-03 13:42:20 +020069 output_file.write(
70 "/*********************************************************************************\n" +
71 " * This file was automatically generated from tests/scripts/generate_test_keys.py.\n" +
72 " * Please do not edit it manually.\n" +
Valerio Setti6bda5f52024-04-09 12:28:39 +020073 " *********************************************************************************/\n"
Valerio Setti3e22bf22024-04-03 13:42:20 +020074 )
Valerio Setti7126ba52024-03-29 16:59:40 +010075
Valerio Setti7031a4e2024-04-16 10:31:15 +020076 for key in ASYMMETRIC_KEY_DATA:
77 key_type = get_key_type(key)
78 # Ignore keys which are not EC or RSA
79 if key_type == "unknown":
80 continue
81 # Ignore undesired EC keys
82 if key_type == "ec":
83 ec_family = get_ec_key_family(key)
84 if not ec_family in EC_NAME_CONVERSION:
85 continue
86 role = get_key_role(key)
87
88 for bits in ASYMMETRIC_KEY_DATA[key]:
89 # Create output array name
90 if key_type == "rsa":
91 array_name = "_".join(["test", key_type, str(bits), role])
92 else:
93 prefix = EC_NAME_CONVERSION[ec_family][0]
94 suffix = EC_NAME_CONVERSION[ec_family][1]
95 curve = "".join([prefix, str(bits), suffix])
96 array_name = "_".join(["test", key_type, curve, role])
97 # Convert bytearray to C array
98 c_array = convert_der_to_c(array_name, ASYMMETRIC_KEY_DATA[key][bits])
99 # Write the C array to the output file
100 output_file.write("\n")
101 output_file.write(c_array)
102 output_file.write("\n")
Valerio Setti7126ba52024-03-29 16:59:40 +0100103
104if __name__ == '__main__':
Valerio Setti862d14e2024-04-15 17:58:43 +0200105 main()