blob: 260be7edd81ff0dc29bdf6803334f2dd548a39b8 [file] [log] [blame]
Archana1f1a34a2021-11-17 08:44:07 +05301#!/usr/bin/env python3
Archanae03960e2021-12-19 09:17:04 +05302"""Generate library/psa_crypto_driver_wrappers.c
3
4 This module is invoked by the build sripts to auto generate the
5 psa_crypto_driver_wrappers.c based on template files in
6 script/data_files/driver_templates/.
7"""
8# Copyright The Mbed TLS Contributors
9# SPDX-License-Identifier: Apache-2.0
10#
11# Licensed under the Apache License, Version 2.0 (the "License"); you may
12# not use this file except in compliance with the License.
13# You may obtain a copy of the License at
14#
15# http://www.apache.org/licenses/LICENSE-2.0
16#
17# Unless required by applicable law or agreed to in writing, software
18# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
19# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20# See the License for the specific language governing permissions and
21# limitations under the License.
Archana1f1a34a2021-11-17 08:44:07 +053022
23import sys
Archana1f1a34a2021-11-17 08:44:07 +053024import os
Archanae829cd62021-12-24 12:50:36 +053025import json
Archana04cfe342022-01-09 13:28:28 +053026from jsonschema import validate
27from typing import Tuple
Archanae03960e2021-12-19 09:17:04 +053028import argparse
Archana1f1a34a2021-11-17 08:44:07 +053029import jinja2
Archanae03960e2021-12-19 09:17:04 +053030from mbedtls_dev import build_tree
Archana1f1a34a2021-11-17 08:44:07 +053031
Archanae829cd62021-12-24 12:50:36 +053032def render(template_path: str, driver_jsoncontext: list) -> str:
Archanae03960e2021-12-19 09:17:04 +053033 """
Archanae829cd62021-12-24 12:50:36 +053034 Render template from the input file and driver JSON.
Archanae03960e2021-12-19 09:17:04 +053035 """
Archana6f21e452021-11-23 14:46:51 +053036 environment = jinja2.Environment(
37 loader=jinja2.FileSystemLoader(os.path.dirname(template_path)),
38 keep_trailing_newline=True)
39 template = environment.get_template(os.path.basename(template_path))
Archanae03960e2021-12-19 09:17:04 +053040
Archanae829cd62021-12-24 12:50:36 +053041 return template.render(drivers = driver_jsoncontext)
Archana1f1a34a2021-11-17 08:44:07 +053042
Archanae829cd62021-12-24 12:50:36 +053043
44def generate_driver_wrapper_file(template_dir: str, output_dir: str, driver_jsoncontext: list ) -> None:
Archanae03960e2021-12-19 09:17:04 +053045 """
46 Generate the file psa_crypto_driver_wrapper.c.
47 """
48 driver_wrapper_template_filename = \
Archanae829cd62021-12-24 12:50:36 +053049 os.path.join(template_dir, "psa_crypto_driver_wrappers.c.jinja")
Archana1f1a34a2021-11-17 08:44:07 +053050
Archanae829cd62021-12-24 12:50:36 +053051 result = render(driver_wrapper_template_filename, driver_jsoncontext)
Archana1f1a34a2021-11-17 08:44:07 +053052
Archanae03960e2021-12-19 09:17:04 +053053 with open(os.path.join(output_dir, "psa_crypto_driver_wrappers.c"), 'w') as out_file:
54 out_file.write(result)
Archana6f21e452021-11-23 14:46:51 +053055
Archanae829cd62021-12-24 12:50:36 +053056
Archana04cfe342022-01-09 13:28:28 +053057def validate_json(driverjson_data: list, driverschema: list) -> bool:
Archanae829cd62021-12-24 12:50:36 +053058 """
Archana04cfe342022-01-09 13:28:28 +053059 Validate the Driver JSON against schema
60 """
61 try:
62 validate(instance = driverjson_data, schema = driverschema)
63 except jsonschema.exceptions.ValidationError as err:
64 print(err)
65 err = "The driver JSON data is InValid"
66 return False
67
68 message = "The driver JSON data is Valid"
69 return True
70
71def merge_driverjsonfiles(mbedtls_root: str, json_directory: str, jsondriverlistName: str) -> Tuple[bool,list]:
72 """
73 Merge driver JSON files into a single ordered JSON after validation.
Archanae829cd62021-12-24 12:50:36 +053074 """
75 result = list()
76 driverlist = list()
Archana04cfe342022-01-09 13:28:28 +053077 with open(os.path.join(mbedtls_root, 'scripts/data_files/driver_jsons/driver_transparent_schema.json'), 'r') as file:
78 transparent_driver_schema = json.load(file)
79 with open(os.path.join(mbedtls_root, 'scripts/data_files/driver_jsons/driver_opaque_schema.json'), 'r') as file:
80 opaque_driver_schema = json.load(file)
81
Archanae829cd62021-12-24 12:50:36 +053082 with open(os.path.join(json_directory, jsondriverlistName), 'r') as driverlistfile:
83 driverlist = json.load(driverlistfile)
84 for file_name in driverlist:
85 with open(os.path.join(json_directory, file_name), 'r') as infile:
Archana04cfe342022-01-09 13:28:28 +053086 json_data = json.load(infile)
87 if json_data['type'] == 'transparent':
88 ret = validate_json(json_data, transparent_driver_schema)
89 elif json_data['type'] == 'opaque':
90 ret = validate_json(json_data, opaque_driver_schema)
91 else:
92 ret = False
93 print("Unknown Driver type")
94 if ret == False:
95 return ret, []
96 result.append(json_data)
97 return True, result
Archanae829cd62021-12-24 12:50:36 +053098
99
Archanae03960e2021-12-19 09:17:04 +0530100def main() -> int:
101 """
102 Main with command line arguments.
103 """
Archana4a9e0262021-12-19 13:34:30 +0530104 def_arg_mbedtls_root = build_tree.guess_mbedtls_root()
105 def_arg_output_dir = os.path.join(def_arg_mbedtls_root, 'library')
Archanae829cd62021-12-24 12:50:36 +0530106 def_arg_template_dir = os.path.join(def_arg_mbedtls_root, 'scripts/data_files/driver_templates/')
107 def_arg_json_dir = os.path.join(def_arg_mbedtls_root, 'scripts/data_files/driver_jsons/')
Archana4a9e0262021-12-19 13:34:30 +0530108
Archanae03960e2021-12-19 09:17:04 +0530109 parser = argparse.ArgumentParser()
Archana4a9e0262021-12-19 13:34:30 +0530110 parser.add_argument('--mbedtls-root', nargs='?', default=def_arg_mbedtls_root,
Archanae03960e2021-12-19 09:17:04 +0530111 help='root directory of mbedtls source code')
Archanae829cd62021-12-24 12:50:36 +0530112 parser.add_argument('--template_dir', nargs='?', default=def_arg_template_dir,
113 help='root directory of mbedtls source code')
114 parser.add_argument('--json_dir', nargs='?', default=def_arg_json_dir,
115 help='root directory of mbedtls source code')
Archanae03960e2021-12-19 09:17:04 +0530116 parser.add_argument('output_directory', nargs='?',
Archana4a9e0262021-12-19 13:34:30 +0530117 default=def_arg_output_dir, help='output file\'s location')
Archanae03960e2021-12-19 09:17:04 +0530118 args = parser.parse_args()
Archana4a9e0262021-12-19 13:34:30 +0530119
Archanae829cd62021-12-24 12:50:36 +0530120 mbedtls_root = os.path.abspath(args.mbedtls_root)
121 output_directory = args.output_directory
122 template_directory = args.template_dir
123 json_directory = args.json_dir
Archanae03960e2021-12-19 09:17:04 +0530124
Archanae829cd62021-12-24 12:50:36 +0530125 # load list of driver jsons from driverlist.json
Archana04cfe342022-01-09 13:28:28 +0530126 ret, merged_driverjson = merge_driverjsonfiles(mbedtls_root, json_directory, 'driverlist.json')
127 if ret == False:
Archanae829cd62021-12-24 12:50:36 +0530128 return 1
Archanae829cd62021-12-24 12:50:36 +0530129 generate_driver_wrapper_file(template_directory, output_directory, merged_driverjson)
Archanae03960e2021-12-19 09:17:04 +0530130
131 return 0
132
133if __name__ == '__main__':
134 sys.exit(main())