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