1*62c56f98SSadaf Ebrahimi#!/usr/bin/env python3 2*62c56f98SSadaf Ebrahimi 3*62c56f98SSadaf Ebrahimi"""Generate psa_constant_names_generated.c 4*62c56f98SSadaf Ebrahimiwhich is included by programs/psa/psa_constant_names.c. 5*62c56f98SSadaf EbrahimiThe code generated by this module is only meant to be used in the context 6*62c56f98SSadaf Ebrahimiof that program. 7*62c56f98SSadaf Ebrahimi 8*62c56f98SSadaf EbrahimiAn argument passed to this script will modify the output directory where the 9*62c56f98SSadaf Ebrahimifile is written: 10*62c56f98SSadaf Ebrahimi* by default (no arguments passed): writes to programs/psa/ 11*62c56f98SSadaf Ebrahimi* OUTPUT_FILE_DIR passed: writes to OUTPUT_FILE_DIR/ 12*62c56f98SSadaf Ebrahimi""" 13*62c56f98SSadaf Ebrahimi 14*62c56f98SSadaf Ebrahimi# Copyright The Mbed TLS Contributors 15*62c56f98SSadaf Ebrahimi# SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later 16*62c56f98SSadaf Ebrahimi 17*62c56f98SSadaf Ebrahimiimport os 18*62c56f98SSadaf Ebrahimiimport sys 19*62c56f98SSadaf Ebrahimi 20*62c56f98SSadaf Ebrahimifrom mbedtls_dev import build_tree 21*62c56f98SSadaf Ebrahimifrom mbedtls_dev import macro_collector 22*62c56f98SSadaf Ebrahimi 23*62c56f98SSadaf EbrahimiOUTPUT_TEMPLATE = '''\ 24*62c56f98SSadaf Ebrahimi/* Automatically generated by generate_psa_constant.py. DO NOT EDIT. */ 25*62c56f98SSadaf Ebrahimi 26*62c56f98SSadaf Ebrahimistatic const char *psa_strerror(psa_status_t status) 27*62c56f98SSadaf Ebrahimi{ 28*62c56f98SSadaf Ebrahimi switch (status) { 29*62c56f98SSadaf Ebrahimi %(status_cases)s 30*62c56f98SSadaf Ebrahimi default: return NULL; 31*62c56f98SSadaf Ebrahimi } 32*62c56f98SSadaf Ebrahimi} 33*62c56f98SSadaf Ebrahimi 34*62c56f98SSadaf Ebrahimistatic const char *psa_ecc_family_name(psa_ecc_family_t curve) 35*62c56f98SSadaf Ebrahimi{ 36*62c56f98SSadaf Ebrahimi switch (curve) { 37*62c56f98SSadaf Ebrahimi %(ecc_curve_cases)s 38*62c56f98SSadaf Ebrahimi default: return NULL; 39*62c56f98SSadaf Ebrahimi } 40*62c56f98SSadaf Ebrahimi} 41*62c56f98SSadaf Ebrahimi 42*62c56f98SSadaf Ebrahimistatic const char *psa_dh_family_name(psa_dh_family_t group) 43*62c56f98SSadaf Ebrahimi{ 44*62c56f98SSadaf Ebrahimi switch (group) { 45*62c56f98SSadaf Ebrahimi %(dh_group_cases)s 46*62c56f98SSadaf Ebrahimi default: return NULL; 47*62c56f98SSadaf Ebrahimi } 48*62c56f98SSadaf Ebrahimi} 49*62c56f98SSadaf Ebrahimi 50*62c56f98SSadaf Ebrahimistatic const char *psa_hash_algorithm_name(psa_algorithm_t hash_alg) 51*62c56f98SSadaf Ebrahimi{ 52*62c56f98SSadaf Ebrahimi switch (hash_alg) { 53*62c56f98SSadaf Ebrahimi %(hash_algorithm_cases)s 54*62c56f98SSadaf Ebrahimi default: return NULL; 55*62c56f98SSadaf Ebrahimi } 56*62c56f98SSadaf Ebrahimi} 57*62c56f98SSadaf Ebrahimi 58*62c56f98SSadaf Ebrahimistatic const char *psa_ka_algorithm_name(psa_algorithm_t ka_alg) 59*62c56f98SSadaf Ebrahimi{ 60*62c56f98SSadaf Ebrahimi switch (ka_alg) { 61*62c56f98SSadaf Ebrahimi %(ka_algorithm_cases)s 62*62c56f98SSadaf Ebrahimi default: return NULL; 63*62c56f98SSadaf Ebrahimi } 64*62c56f98SSadaf Ebrahimi} 65*62c56f98SSadaf Ebrahimi 66*62c56f98SSadaf Ebrahimistatic int psa_snprint_key_type(char *buffer, size_t buffer_size, 67*62c56f98SSadaf Ebrahimi psa_key_type_t type) 68*62c56f98SSadaf Ebrahimi{ 69*62c56f98SSadaf Ebrahimi size_t required_size = 0; 70*62c56f98SSadaf Ebrahimi switch (type) { 71*62c56f98SSadaf Ebrahimi %(key_type_cases)s 72*62c56f98SSadaf Ebrahimi default: 73*62c56f98SSadaf Ebrahimi %(key_type_code)s{ 74*62c56f98SSadaf Ebrahimi return snprintf(buffer, buffer_size, 75*62c56f98SSadaf Ebrahimi "0x%%04x", (unsigned) type); 76*62c56f98SSadaf Ebrahimi } 77*62c56f98SSadaf Ebrahimi break; 78*62c56f98SSadaf Ebrahimi } 79*62c56f98SSadaf Ebrahimi buffer[0] = 0; 80*62c56f98SSadaf Ebrahimi return (int) required_size; 81*62c56f98SSadaf Ebrahimi} 82*62c56f98SSadaf Ebrahimi 83*62c56f98SSadaf Ebrahimi#define NO_LENGTH_MODIFIER 0xfffffffflu 84*62c56f98SSadaf Ebrahimistatic int psa_snprint_algorithm(char *buffer, size_t buffer_size, 85*62c56f98SSadaf Ebrahimi psa_algorithm_t alg) 86*62c56f98SSadaf Ebrahimi{ 87*62c56f98SSadaf Ebrahimi size_t required_size = 0; 88*62c56f98SSadaf Ebrahimi psa_algorithm_t core_alg = alg; 89*62c56f98SSadaf Ebrahimi unsigned long length_modifier = NO_LENGTH_MODIFIER; 90*62c56f98SSadaf Ebrahimi if (PSA_ALG_IS_MAC(alg)) { 91*62c56f98SSadaf Ebrahimi core_alg = PSA_ALG_TRUNCATED_MAC(alg, 0); 92*62c56f98SSadaf Ebrahimi if (alg & PSA_ALG_MAC_AT_LEAST_THIS_LENGTH_FLAG) { 93*62c56f98SSadaf Ebrahimi append(&buffer, buffer_size, &required_size, 94*62c56f98SSadaf Ebrahimi "PSA_ALG_AT_LEAST_THIS_LENGTH_MAC(", 33); 95*62c56f98SSadaf Ebrahimi length_modifier = PSA_MAC_TRUNCATED_LENGTH(alg); 96*62c56f98SSadaf Ebrahimi } else if (core_alg != alg) { 97*62c56f98SSadaf Ebrahimi append(&buffer, buffer_size, &required_size, 98*62c56f98SSadaf Ebrahimi "PSA_ALG_TRUNCATED_MAC(", 22); 99*62c56f98SSadaf Ebrahimi length_modifier = PSA_MAC_TRUNCATED_LENGTH(alg); 100*62c56f98SSadaf Ebrahimi } 101*62c56f98SSadaf Ebrahimi } else if (PSA_ALG_IS_AEAD(alg)) { 102*62c56f98SSadaf Ebrahimi core_alg = PSA_ALG_AEAD_WITH_DEFAULT_LENGTH_TAG(alg); 103*62c56f98SSadaf Ebrahimi if (core_alg == 0) { 104*62c56f98SSadaf Ebrahimi /* For unknown AEAD algorithms, there is no "default tag length". */ 105*62c56f98SSadaf Ebrahimi core_alg = alg; 106*62c56f98SSadaf Ebrahimi } else if (alg & PSA_ALG_AEAD_AT_LEAST_THIS_LENGTH_FLAG) { 107*62c56f98SSadaf Ebrahimi append(&buffer, buffer_size, &required_size, 108*62c56f98SSadaf Ebrahimi "PSA_ALG_AEAD_WITH_AT_LEAST_THIS_LENGTH_TAG(", 43); 109*62c56f98SSadaf Ebrahimi length_modifier = PSA_ALG_AEAD_GET_TAG_LENGTH(alg); 110*62c56f98SSadaf Ebrahimi } else if (core_alg != alg) { 111*62c56f98SSadaf Ebrahimi append(&buffer, buffer_size, &required_size, 112*62c56f98SSadaf Ebrahimi "PSA_ALG_AEAD_WITH_SHORTENED_TAG(", 32); 113*62c56f98SSadaf Ebrahimi length_modifier = PSA_ALG_AEAD_GET_TAG_LENGTH(alg); 114*62c56f98SSadaf Ebrahimi } 115*62c56f98SSadaf Ebrahimi } else if (PSA_ALG_IS_KEY_AGREEMENT(alg) && 116*62c56f98SSadaf Ebrahimi !PSA_ALG_IS_RAW_KEY_AGREEMENT(alg)) { 117*62c56f98SSadaf Ebrahimi core_alg = PSA_ALG_KEY_AGREEMENT_GET_KDF(alg); 118*62c56f98SSadaf Ebrahimi append(&buffer, buffer_size, &required_size, 119*62c56f98SSadaf Ebrahimi "PSA_ALG_KEY_AGREEMENT(", 22); 120*62c56f98SSadaf Ebrahimi append_with_alg(&buffer, buffer_size, &required_size, 121*62c56f98SSadaf Ebrahimi psa_ka_algorithm_name, 122*62c56f98SSadaf Ebrahimi PSA_ALG_KEY_AGREEMENT_GET_BASE(alg)); 123*62c56f98SSadaf Ebrahimi append(&buffer, buffer_size, &required_size, ", ", 2); 124*62c56f98SSadaf Ebrahimi } 125*62c56f98SSadaf Ebrahimi switch (core_alg) { 126*62c56f98SSadaf Ebrahimi %(algorithm_cases)s 127*62c56f98SSadaf Ebrahimi default: 128*62c56f98SSadaf Ebrahimi %(algorithm_code)s{ 129*62c56f98SSadaf Ebrahimi append_integer(&buffer, buffer_size, &required_size, 130*62c56f98SSadaf Ebrahimi "0x%%08lx", (unsigned long) core_alg); 131*62c56f98SSadaf Ebrahimi } 132*62c56f98SSadaf Ebrahimi break; 133*62c56f98SSadaf Ebrahimi } 134*62c56f98SSadaf Ebrahimi if (core_alg != alg) { 135*62c56f98SSadaf Ebrahimi if (length_modifier != NO_LENGTH_MODIFIER) { 136*62c56f98SSadaf Ebrahimi append(&buffer, buffer_size, &required_size, ", ", 2); 137*62c56f98SSadaf Ebrahimi append_integer(&buffer, buffer_size, &required_size, 138*62c56f98SSadaf Ebrahimi "%%lu", length_modifier); 139*62c56f98SSadaf Ebrahimi } 140*62c56f98SSadaf Ebrahimi append(&buffer, buffer_size, &required_size, ")", 1); 141*62c56f98SSadaf Ebrahimi } 142*62c56f98SSadaf Ebrahimi buffer[0] = 0; 143*62c56f98SSadaf Ebrahimi return (int) required_size; 144*62c56f98SSadaf Ebrahimi} 145*62c56f98SSadaf Ebrahimi 146*62c56f98SSadaf Ebrahimistatic int psa_snprint_key_usage(char *buffer, size_t buffer_size, 147*62c56f98SSadaf Ebrahimi psa_key_usage_t usage) 148*62c56f98SSadaf Ebrahimi{ 149*62c56f98SSadaf Ebrahimi size_t required_size = 0; 150*62c56f98SSadaf Ebrahimi if (usage == 0) { 151*62c56f98SSadaf Ebrahimi if (buffer_size > 1) { 152*62c56f98SSadaf Ebrahimi buffer[0] = '0'; 153*62c56f98SSadaf Ebrahimi buffer[1] = 0; 154*62c56f98SSadaf Ebrahimi } else if (buffer_size == 1) { 155*62c56f98SSadaf Ebrahimi buffer[0] = 0; 156*62c56f98SSadaf Ebrahimi } 157*62c56f98SSadaf Ebrahimi return 1; 158*62c56f98SSadaf Ebrahimi } 159*62c56f98SSadaf Ebrahimi%(key_usage_code)s 160*62c56f98SSadaf Ebrahimi if (usage != 0) { 161*62c56f98SSadaf Ebrahimi if (required_size != 0) { 162*62c56f98SSadaf Ebrahimi append(&buffer, buffer_size, &required_size, " | ", 3); 163*62c56f98SSadaf Ebrahimi } 164*62c56f98SSadaf Ebrahimi append_integer(&buffer, buffer_size, &required_size, 165*62c56f98SSadaf Ebrahimi "0x%%08lx", (unsigned long) usage); 166*62c56f98SSadaf Ebrahimi } else { 167*62c56f98SSadaf Ebrahimi buffer[0] = 0; 168*62c56f98SSadaf Ebrahimi } 169*62c56f98SSadaf Ebrahimi return (int) required_size; 170*62c56f98SSadaf Ebrahimi} 171*62c56f98SSadaf Ebrahimi 172*62c56f98SSadaf Ebrahimi/* End of automatically generated file. */ 173*62c56f98SSadaf Ebrahimi''' 174*62c56f98SSadaf Ebrahimi 175*62c56f98SSadaf EbrahimiKEY_TYPE_FROM_CURVE_TEMPLATE = '''if (%(tester)s(type)) { 176*62c56f98SSadaf Ebrahimi append_with_curve(&buffer, buffer_size, &required_size, 177*62c56f98SSadaf Ebrahimi "%(builder)s", %(builder_length)s, 178*62c56f98SSadaf Ebrahimi PSA_KEY_TYPE_ECC_GET_FAMILY(type)); 179*62c56f98SSadaf Ebrahimi } else ''' 180*62c56f98SSadaf Ebrahimi 181*62c56f98SSadaf EbrahimiKEY_TYPE_FROM_GROUP_TEMPLATE = '''if (%(tester)s(type)) { 182*62c56f98SSadaf Ebrahimi append_with_group(&buffer, buffer_size, &required_size, 183*62c56f98SSadaf Ebrahimi "%(builder)s", %(builder_length)s, 184*62c56f98SSadaf Ebrahimi PSA_KEY_TYPE_DH_GET_FAMILY(type)); 185*62c56f98SSadaf Ebrahimi } else ''' 186*62c56f98SSadaf Ebrahimi 187*62c56f98SSadaf EbrahimiALGORITHM_FROM_HASH_TEMPLATE = '''if (%(tester)s(core_alg)) { 188*62c56f98SSadaf Ebrahimi append(&buffer, buffer_size, &required_size, 189*62c56f98SSadaf Ebrahimi "%(builder)s(", %(builder_length)s + 1); 190*62c56f98SSadaf Ebrahimi append_with_alg(&buffer, buffer_size, &required_size, 191*62c56f98SSadaf Ebrahimi psa_hash_algorithm_name, 192*62c56f98SSadaf Ebrahimi PSA_ALG_GET_HASH(core_alg)); 193*62c56f98SSadaf Ebrahimi append(&buffer, buffer_size, &required_size, ")", 1); 194*62c56f98SSadaf Ebrahimi } else ''' 195*62c56f98SSadaf Ebrahimi 196*62c56f98SSadaf EbrahimiBIT_TEST_TEMPLATE = '''\ 197*62c56f98SSadaf Ebrahimi if (%(var)s & %(flag)s) { 198*62c56f98SSadaf Ebrahimi if (required_size != 0) { 199*62c56f98SSadaf Ebrahimi append(&buffer, buffer_size, &required_size, " | ", 3); 200*62c56f98SSadaf Ebrahimi } 201*62c56f98SSadaf Ebrahimi append(&buffer, buffer_size, &required_size, "%(flag)s", %(length)d); 202*62c56f98SSadaf Ebrahimi %(var)s ^= %(flag)s; 203*62c56f98SSadaf Ebrahimi }\ 204*62c56f98SSadaf Ebrahimi''' 205*62c56f98SSadaf Ebrahimi 206*62c56f98SSadaf Ebrahimiclass CaseBuilder(macro_collector.PSAMacroCollector): 207*62c56f98SSadaf Ebrahimi """Collect PSA crypto macro definitions and write value recognition functions. 208*62c56f98SSadaf Ebrahimi 209*62c56f98SSadaf Ebrahimi 1. Call `read_file` on the input header file(s). 210*62c56f98SSadaf Ebrahimi 2. Call `write_file` to write ``psa_constant_names_generated.c``. 211*62c56f98SSadaf Ebrahimi """ 212*62c56f98SSadaf Ebrahimi 213*62c56f98SSadaf Ebrahimi def __init__(self): 214*62c56f98SSadaf Ebrahimi super().__init__(include_intermediate=True) 215*62c56f98SSadaf Ebrahimi 216*62c56f98SSadaf Ebrahimi @staticmethod 217*62c56f98SSadaf Ebrahimi def _make_return_case(name): 218*62c56f98SSadaf Ebrahimi return 'case %(name)s: return "%(name)s";' % {'name': name} 219*62c56f98SSadaf Ebrahimi 220*62c56f98SSadaf Ebrahimi @staticmethod 221*62c56f98SSadaf Ebrahimi def _make_append_case(name): 222*62c56f98SSadaf Ebrahimi template = ('case %(name)s: ' 223*62c56f98SSadaf Ebrahimi 'append(&buffer, buffer_size, &required_size, "%(name)s", %(length)d); ' 224*62c56f98SSadaf Ebrahimi 'break;') 225*62c56f98SSadaf Ebrahimi return template % {'name': name, 'length': len(name)} 226*62c56f98SSadaf Ebrahimi 227*62c56f98SSadaf Ebrahimi @staticmethod 228*62c56f98SSadaf Ebrahimi def _make_bit_test(var, flag): 229*62c56f98SSadaf Ebrahimi return BIT_TEST_TEMPLATE % {'var': var, 230*62c56f98SSadaf Ebrahimi 'flag': flag, 231*62c56f98SSadaf Ebrahimi 'length': len(flag)} 232*62c56f98SSadaf Ebrahimi 233*62c56f98SSadaf Ebrahimi def _make_status_cases(self): 234*62c56f98SSadaf Ebrahimi return '\n '.join(map(self._make_return_case, 235*62c56f98SSadaf Ebrahimi sorted(self.statuses))) 236*62c56f98SSadaf Ebrahimi 237*62c56f98SSadaf Ebrahimi def _make_ecc_curve_cases(self): 238*62c56f98SSadaf Ebrahimi return '\n '.join(map(self._make_return_case, 239*62c56f98SSadaf Ebrahimi sorted(self.ecc_curves))) 240*62c56f98SSadaf Ebrahimi 241*62c56f98SSadaf Ebrahimi def _make_dh_group_cases(self): 242*62c56f98SSadaf Ebrahimi return '\n '.join(map(self._make_return_case, 243*62c56f98SSadaf Ebrahimi sorted(self.dh_groups))) 244*62c56f98SSadaf Ebrahimi 245*62c56f98SSadaf Ebrahimi def _make_key_type_cases(self): 246*62c56f98SSadaf Ebrahimi return '\n '.join(map(self._make_append_case, 247*62c56f98SSadaf Ebrahimi sorted(self.key_types))) 248*62c56f98SSadaf Ebrahimi 249*62c56f98SSadaf Ebrahimi @staticmethod 250*62c56f98SSadaf Ebrahimi def _make_key_type_from_curve_code(builder, tester): 251*62c56f98SSadaf Ebrahimi return KEY_TYPE_FROM_CURVE_TEMPLATE % {'builder': builder, 252*62c56f98SSadaf Ebrahimi 'builder_length': len(builder), 253*62c56f98SSadaf Ebrahimi 'tester': tester} 254*62c56f98SSadaf Ebrahimi 255*62c56f98SSadaf Ebrahimi @staticmethod 256*62c56f98SSadaf Ebrahimi def _make_key_type_from_group_code(builder, tester): 257*62c56f98SSadaf Ebrahimi return KEY_TYPE_FROM_GROUP_TEMPLATE % {'builder': builder, 258*62c56f98SSadaf Ebrahimi 'builder_length': len(builder), 259*62c56f98SSadaf Ebrahimi 'tester': tester} 260*62c56f98SSadaf Ebrahimi 261*62c56f98SSadaf Ebrahimi def _make_ecc_key_type_code(self): 262*62c56f98SSadaf Ebrahimi d = self.key_types_from_curve 263*62c56f98SSadaf Ebrahimi make = self._make_key_type_from_curve_code 264*62c56f98SSadaf Ebrahimi return ''.join([make(k, d[k]) for k in sorted(d.keys())]) 265*62c56f98SSadaf Ebrahimi 266*62c56f98SSadaf Ebrahimi def _make_dh_key_type_code(self): 267*62c56f98SSadaf Ebrahimi d = self.key_types_from_group 268*62c56f98SSadaf Ebrahimi make = self._make_key_type_from_group_code 269*62c56f98SSadaf Ebrahimi return ''.join([make(k, d[k]) for k in sorted(d.keys())]) 270*62c56f98SSadaf Ebrahimi 271*62c56f98SSadaf Ebrahimi def _make_hash_algorithm_cases(self): 272*62c56f98SSadaf Ebrahimi return '\n '.join(map(self._make_return_case, 273*62c56f98SSadaf Ebrahimi sorted(self.hash_algorithms))) 274*62c56f98SSadaf Ebrahimi 275*62c56f98SSadaf Ebrahimi def _make_ka_algorithm_cases(self): 276*62c56f98SSadaf Ebrahimi return '\n '.join(map(self._make_return_case, 277*62c56f98SSadaf Ebrahimi sorted(self.ka_algorithms))) 278*62c56f98SSadaf Ebrahimi 279*62c56f98SSadaf Ebrahimi def _make_algorithm_cases(self): 280*62c56f98SSadaf Ebrahimi return '\n '.join(map(self._make_append_case, 281*62c56f98SSadaf Ebrahimi sorted(self.algorithms))) 282*62c56f98SSadaf Ebrahimi 283*62c56f98SSadaf Ebrahimi @staticmethod 284*62c56f98SSadaf Ebrahimi def _make_algorithm_from_hash_code(builder, tester): 285*62c56f98SSadaf Ebrahimi return ALGORITHM_FROM_HASH_TEMPLATE % {'builder': builder, 286*62c56f98SSadaf Ebrahimi 'builder_length': len(builder), 287*62c56f98SSadaf Ebrahimi 'tester': tester} 288*62c56f98SSadaf Ebrahimi 289*62c56f98SSadaf Ebrahimi def _make_algorithm_code(self): 290*62c56f98SSadaf Ebrahimi d = self.algorithms_from_hash 291*62c56f98SSadaf Ebrahimi make = self._make_algorithm_from_hash_code 292*62c56f98SSadaf Ebrahimi return ''.join([make(k, d[k]) for k in sorted(d.keys())]) 293*62c56f98SSadaf Ebrahimi 294*62c56f98SSadaf Ebrahimi def _make_key_usage_code(self): 295*62c56f98SSadaf Ebrahimi return '\n'.join([self._make_bit_test('usage', bit) 296*62c56f98SSadaf Ebrahimi for bit in sorted(self.key_usage_flags)]) 297*62c56f98SSadaf Ebrahimi 298*62c56f98SSadaf Ebrahimi def write_file(self, output_file): 299*62c56f98SSadaf Ebrahimi """Generate the pretty-printer function code from the gathered 300*62c56f98SSadaf Ebrahimi constant definitions. 301*62c56f98SSadaf Ebrahimi """ 302*62c56f98SSadaf Ebrahimi data = {} 303*62c56f98SSadaf Ebrahimi data['status_cases'] = self._make_status_cases() 304*62c56f98SSadaf Ebrahimi data['ecc_curve_cases'] = self._make_ecc_curve_cases() 305*62c56f98SSadaf Ebrahimi data['dh_group_cases'] = self._make_dh_group_cases() 306*62c56f98SSadaf Ebrahimi data['key_type_cases'] = self._make_key_type_cases() 307*62c56f98SSadaf Ebrahimi data['key_type_code'] = (self._make_ecc_key_type_code() + 308*62c56f98SSadaf Ebrahimi self._make_dh_key_type_code()) 309*62c56f98SSadaf Ebrahimi data['hash_algorithm_cases'] = self._make_hash_algorithm_cases() 310*62c56f98SSadaf Ebrahimi data['ka_algorithm_cases'] = self._make_ka_algorithm_cases() 311*62c56f98SSadaf Ebrahimi data['algorithm_cases'] = self._make_algorithm_cases() 312*62c56f98SSadaf Ebrahimi data['algorithm_code'] = self._make_algorithm_code() 313*62c56f98SSadaf Ebrahimi data['key_usage_code'] = self._make_key_usage_code() 314*62c56f98SSadaf Ebrahimi output_file.write(OUTPUT_TEMPLATE % data) 315*62c56f98SSadaf Ebrahimi 316*62c56f98SSadaf Ebrahimidef generate_psa_constants(header_file_names, output_file_name): 317*62c56f98SSadaf Ebrahimi collector = CaseBuilder() 318*62c56f98SSadaf Ebrahimi for header_file_name in header_file_names: 319*62c56f98SSadaf Ebrahimi with open(header_file_name, 'rb') as header_file: 320*62c56f98SSadaf Ebrahimi collector.read_file(header_file) 321*62c56f98SSadaf Ebrahimi temp_file_name = output_file_name + '.tmp' 322*62c56f98SSadaf Ebrahimi with open(temp_file_name, 'w') as output_file: 323*62c56f98SSadaf Ebrahimi collector.write_file(output_file) 324*62c56f98SSadaf Ebrahimi os.replace(temp_file_name, output_file_name) 325*62c56f98SSadaf Ebrahimi 326*62c56f98SSadaf Ebrahimiif __name__ == '__main__': 327*62c56f98SSadaf Ebrahimi build_tree.chdir_to_root() 328*62c56f98SSadaf Ebrahimi # Allow to change the directory where psa_constant_names_generated.c is written to. 329*62c56f98SSadaf Ebrahimi OUTPUT_FILE_DIR = sys.argv[1] if len(sys.argv) == 2 else "programs/psa" 330*62c56f98SSadaf Ebrahimi generate_psa_constants(['include/psa/crypto_values.h', 331*62c56f98SSadaf Ebrahimi 'include/psa/crypto_extra.h'], 332*62c56f98SSadaf Ebrahimi OUTPUT_FILE_DIR + '/psa_constant_names_generated.c') 333