Valerio Setti | 7126ba5 | 2024-03-29 16:59:40 +0100 | [diff] [blame] | 1 | #!/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 |
| 7 | generating the required key at run time. This helps speeding up testing.""" |
| 8 | |
| 9 | import os |
| 10 | import sys |
Valerio Setti | 6bda5f5 | 2024-04-09 12:28:39 +0200 | [diff] [blame] | 11 | # pylint: disable=wrong-import-position |
| 12 | SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) + "/" |
| 13 | sys.path.append(SCRIPT_DIR + "../../scripts/") |
| 14 | from mbedtls_dev.asymmetric_key_data import ASYMMETRIC_KEY_DATA |
Valerio Setti | 8f40460 | 2024-04-15 15:09:10 +0200 | [diff] [blame^] | 15 | import scripts_path # pylint: disable=unused-import |
Valerio Setti | 7126ba5 | 2024-03-29 16:59:40 +0100 | [diff] [blame] | 16 | |
Valerio Setti | 6bda5f5 | 2024-04-09 12:28:39 +0200 | [diff] [blame] | 17 | OUTPUT_HEADER_FILE = SCRIPT_DIR + "../src/test_keys.h" |
Valerio Setti | 7126ba5 | 2024-03-29 16:59:40 +0100 | [diff] [blame] | 18 | BYTES_PER_LINE = 12 |
| 19 | |
| 20 | KEYS = { |
| 21 | # RSA keys |
Valerio Setti | 6bda5f5 | 2024-04-09 12:28:39 +0200 | [diff] [blame] | 22 | 'test_rsa_1024': ['PSA_KEY_TYPE_RSA_KEY_PAIR', 1024], |
| 23 | 'test_rsa_1026': ['PSA_KEY_TYPE_RSA_KEY_PAIR', 1026], |
| 24 | 'test_rsa_1028': ['PSA_KEY_TYPE_RSA_KEY_PAIR', 1028], |
| 25 | 'test_rsa_1030': ['PSA_KEY_TYPE_RSA_KEY_PAIR', 1030], |
| 26 | 'test_rsa_2048': ['PSA_KEY_TYPE_RSA_KEY_PAIR', 2048], |
| 27 | 'test_rsa_4096': ['PSA_KEY_TYPE_RSA_KEY_PAIR', 4096], |
Valerio Setti | 7126ba5 | 2024-03-29 16:59:40 +0100 | [diff] [blame] | 28 | # EC keys |
Valerio Setti | 6bda5f5 | 2024-04-09 12:28:39 +0200 | [diff] [blame] | 29 | 'test_ec_secp192r1_priv': ['PSA_KEY_TYPE_ECC_KEY_PAIR(PSA_ECC_FAMILY_SECP_R1)', 192], |
| 30 | 'test_ec_secp192r1_pub': ['PSA_KEY_TYPE_ECC_PUBLIC_KEY(PSA_ECC_FAMILY_SECP_R1)', 192], |
| 31 | 'test_ec_secp224r1_priv': ['PSA_KEY_TYPE_ECC_KEY_PAIR(PSA_ECC_FAMILY_SECP_R1)', 224], |
| 32 | 'test_ec_secp224r1_pub': ['PSA_KEY_TYPE_ECC_PUBLIC_KEY(PSA_ECC_FAMILY_SECP_R1)', 224], |
| 33 | 'test_ec_secp256r1_priv': ['PSA_KEY_TYPE_ECC_KEY_PAIR(PSA_ECC_FAMILY_SECP_R1)', 256], |
| 34 | 'test_ec_secp256r1_pub': ['PSA_KEY_TYPE_ECC_PUBLIC_KEY(PSA_ECC_FAMILY_SECP_R1)', 256], |
| 35 | 'test_ec_secp384r1_priv': ['PSA_KEY_TYPE_ECC_KEY_PAIR(PSA_ECC_FAMILY_SECP_R1)', 384], |
| 36 | 'test_ec_secp384r1_pub': ['PSA_KEY_TYPE_ECC_PUBLIC_KEY(PSA_ECC_FAMILY_SECP_R1)', 384], |
| 37 | 'test_ec_secp521r1_priv': ['PSA_KEY_TYPE_ECC_KEY_PAIR(PSA_ECC_FAMILY_SECP_R1)', 521], |
| 38 | 'test_ec_secp521r1_pub': ['PSA_KEY_TYPE_ECC_PUBLIC_KEY(PSA_ECC_FAMILY_SECP_R1)', 521], |
| 39 | 'test_ec_bp256r1_priv': ['PSA_KEY_TYPE_ECC_KEY_PAIR(PSA_ECC_FAMILY_BRAINPOOL_P_R1)', 256], |
| 40 | 'test_ec_bp256r1_pub': ['PSA_KEY_TYPE_ECC_PUBLIC_KEY(PSA_ECC_FAMILY_BRAINPOOL_P_R1)', 256], |
| 41 | 'test_ec_bp384r1_priv': ['PSA_KEY_TYPE_ECC_KEY_PAIR(PSA_ECC_FAMILY_BRAINPOOL_P_R1)', 384], |
| 42 | 'test_ec_bp384r1_pub': ['PSA_KEY_TYPE_ECC_PUBLIC_KEY(PSA_ECC_FAMILY_BRAINPOOL_P_R1)', 384], |
| 43 | 'test_ec_bp512r1_priv': ['PSA_KEY_TYPE_ECC_KEY_PAIR(PSA_ECC_FAMILY_BRAINPOOL_P_R1)', 512], |
| 44 | 'test_ec_bp512r1_pub': ['PSA_KEY_TYPE_ECC_PUBLIC_KEY(PSA_ECC_FAMILY_BRAINPOOL_P_R1)', 512], |
| 45 | 'test_ec_secp192k1_priv': ['PSA_KEY_TYPE_ECC_KEY_PAIR(PSA_ECC_FAMILY_SECP_K1)', 192], |
| 46 | 'test_ec_secp192k1_pub': ['PSA_KEY_TYPE_ECC_PUBLIC_KEY(PSA_ECC_FAMILY_SECP_K1)', 192], |
| 47 | 'test_ec_secp256k1_priv': ['PSA_KEY_TYPE_ECC_KEY_PAIR(PSA_ECC_FAMILY_SECP_K1)', 256], |
| 48 | 'test_ec_secp256k1_pub': ['PSA_KEY_TYPE_ECC_PUBLIC_KEY(PSA_ECC_FAMILY_SECP_K1)', 256], |
| 49 | 'test_ec_curve25519_priv': ['PSA_KEY_TYPE_ECC_KEY_PAIR(PSA_ECC_FAMILY_MONTGOMERY)', 255], |
| 50 | 'test_ec_curve25519_pub': ['PSA_KEY_TYPE_ECC_PUBLIC_KEY(PSA_ECC_FAMILY_MONTGOMERY)', 255], |
| 51 | 'test_ec_curve448_priv': ['PSA_KEY_TYPE_ECC_KEY_PAIR(PSA_ECC_FAMILY_MONTGOMERY)', 448], |
| 52 | 'test_ec_curve448_pub': ['PSA_KEY_TYPE_ECC_PUBLIC_KEY(PSA_ECC_FAMILY_MONTGOMERY)', 448], |
Valerio Setti | 7126ba5 | 2024-03-29 16:59:40 +0100 | [diff] [blame] | 53 | } |
| 54 | |
Valerio Setti | 6bda5f5 | 2024-04-09 12:28:39 +0200 | [diff] [blame] | 55 | def convert_der_to_c(array_name: str, key_data: bytearray) -> str: |
| 56 | """Convert a DER content to a C array.""" |
Valerio Setti | 7126ba5 | 2024-03-29 16:59:40 +0100 | [diff] [blame] | 57 | output_text = "const unsigned char {}[] = {{\n".format(array_name) |
| 58 | |
Valerio Setti | 6bda5f5 | 2024-04-09 12:28:39 +0200 | [diff] [blame] | 59 | def get_data_chunk(data): |
| 60 | for index in range(0, len(data), BYTES_PER_LINE): |
| 61 | yield data[index : index + BYTES_PER_LINE] |
Valerio Setti | 7126ba5 | 2024-03-29 16:59:40 +0100 | [diff] [blame] | 62 | |
Valerio Setti | 6bda5f5 | 2024-04-09 12:28:39 +0200 | [diff] [blame] | 63 | for bytes_chunk in get_data_chunk(key_data): |
| 64 | new_line = ' ' + ', '.join(['{:#04x}'.format(b) for b in bytes_chunk]) |
| 65 | output_text = output_text + new_line + ",\n" |
| 66 | |
| 67 | output_text = output_text + "};" |
Valerio Setti | 7126ba5 | 2024-03-29 16:59:40 +0100 | [diff] [blame] | 68 | |
| 69 | return output_text |
| 70 | |
Valerio Setti | 7126ba5 | 2024-03-29 16:59:40 +0100 | [diff] [blame] | 71 | def main(): |
Valerio Setti | 6bda5f5 | 2024-04-09 12:28:39 +0200 | [diff] [blame] | 72 | # Remove output file if already existing. |
Valerio Setti | 7126ba5 | 2024-03-29 16:59:40 +0100 | [diff] [blame] | 73 | if os.path.exists(OUTPUT_HEADER_FILE): |
| 74 | os.remove(OUTPUT_HEADER_FILE) |
Valerio Setti | 7126ba5 | 2024-03-29 16:59:40 +0100 | [diff] [blame] | 75 | |
| 76 | output_file = open(OUTPUT_HEADER_FILE, 'at') |
Valerio Setti | 3e22bf2 | 2024-04-03 13:42:20 +0200 | [diff] [blame] | 77 | output_file.write( |
| 78 | "/*********************************************************************************\n" + |
| 79 | " * This file was automatically generated from tests/scripts/generate_test_keys.py.\n" + |
| 80 | " * Please do not edit it manually.\n" + |
Valerio Setti | 6bda5f5 | 2024-04-09 12:28:39 +0200 | [diff] [blame] | 81 | " *********************************************************************************/\n" |
Valerio Setti | 3e22bf2 | 2024-04-03 13:42:20 +0200 | [diff] [blame] | 82 | ) |
Valerio Setti | 7126ba5 | 2024-03-29 16:59:40 +0100 | [diff] [blame] | 83 | |
Valerio Setti | 7126ba5 | 2024-03-29 16:59:40 +0100 | [diff] [blame] | 84 | for key in KEYS: |
Valerio Setti | 6bda5f5 | 2024-04-09 12:28:39 +0200 | [diff] [blame] | 85 | key_type = KEYS[key][0] |
| 86 | key_bitsize = KEYS[key][1] |
| 87 | c_array = convert_der_to_c(key, ASYMMETRIC_KEY_DATA[key_type][key_bitsize]) |
| 88 | output_file.write("\n") |
| 89 | output_file.write(c_array) |
| 90 | output_file.write("\n") |
Valerio Setti | 7126ba5 | 2024-03-29 16:59:40 +0100 | [diff] [blame] | 91 | |
| 92 | if __name__ == '__main__': |
| 93 | sys.exit(main()) |