Skip to content

Commit

Permalink
Merge pull request #8523 from tom-daubney-arm/modify_check_generated_…
Browse files Browse the repository at this point in the history
…files_script

Modify check generated files script to work with TF PSA Crypto too
  • Loading branch information
gilles-peskine-arm authored Dec 11, 2023
2 parents a211bb7 + f05b768 commit b4362d2
Show file tree
Hide file tree
Showing 5 changed files with 112 additions and 39 deletions.
29 changes: 16 additions & 13 deletions scripts/generate_driver_wrappers.py
Original file line number Diff line number Diff line change
Expand Up @@ -108,17 +108,17 @@ def load_driver(schemas: Dict[str, Any], driver_file: str) -> Any:
return json_data


def load_schemas(mbedtls_root: str) -> Dict[str, Any]:
def load_schemas(project_root: str) -> Dict[str, Any]:
"""
Load schemas map
"""
schema_file_paths = {
'transparent': os.path.join(mbedtls_root,
'transparent': os.path.join(project_root,
'scripts',
'data_files',
'driver_jsons',
'driver_transparent_schema.json'),
'opaque': os.path.join(mbedtls_root,
'opaque': os.path.join(project_root,
'scripts',
'data_files',
'driver_jsons',
Expand All @@ -131,13 +131,13 @@ def load_schemas(mbedtls_root: str) -> Dict[str, Any]:
return driver_schema


def read_driver_descriptions(mbedtls_root: str,
def read_driver_descriptions(project_root: str,
json_directory: str,
jsondriver_list: str) -> list:
"""
Merge driver JSON files into a single ordered JSON after validation.
"""
driver_schema = load_schemas(mbedtls_root)
driver_schema = load_schemas(project_root)

with open(file=os.path.join(json_directory, jsondriver_list),
mode='r',
Expand All @@ -163,11 +163,11 @@ def main() -> int:
"""
Main with command line arguments.
"""
def_arg_mbedtls_root = build_tree.guess_mbedtls_root()
def_arg_project_root = build_tree.guess_project_root()

parser = argparse.ArgumentParser()
parser.add_argument('--mbedtls-root', default=def_arg_mbedtls_root,
help='root directory of mbedtls source code')
parser.add_argument('--project-root', default=def_arg_project_root,
help='root directory of repo source code')
parser.add_argument('--template-dir',
help='directory holding the driver templates')
parser.add_argument('--json-dir',
Expand All @@ -176,24 +176,27 @@ def main() -> int:
help='output file\'s location')
args = parser.parse_args()

mbedtls_root = os.path.abspath(args.mbedtls_root)
project_root = os.path.abspath(args.project_root)

crypto_core_directory = build_tree.crypto_core_directory(project_root)

output_directory = args.output_directory if args.output_directory is not None else \
os.path.join(mbedtls_root, 'library')
crypto_core_directory

template_directory = args.template_dir if args.template_dir is not None else \
os.path.join(mbedtls_root,
os.path.join(project_root,
'scripts',
'data_files',
'driver_templates')
json_directory = args.json_dir if args.json_dir is not None else \
os.path.join(mbedtls_root,
os.path.join(project_root,
'scripts',
'data_files',
'driver_jsons')

try:
# Read and validate list of driver jsons from driverlist.json
merged_driver_json = read_driver_descriptions(mbedtls_root,
merged_driver_json = read_driver_descriptions(project_root,
json_directory,
'driverlist.json')
except DriverReaderException as e:
Expand Down
4 changes: 2 additions & 2 deletions scripts/lcov.sh
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@ set -eu

# Repository detection
in_mbedtls_build_dir () {
test -d library
}
test -d library
}

# Collect stats and build a HTML report.
lcov_library_report () {
Expand Down
71 changes: 64 additions & 7 deletions scripts/mbedtls_dev/build_tree.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

import os
import inspect
from typing import Optional

def looks_like_tf_psa_crypto_root(path: str) -> bool:
"""Whether the given directory looks like the root of the PSA Crypto source tree."""
Expand All @@ -21,9 +22,40 @@ def looks_like_mbedtls_root(path: str) -> bool:
def looks_like_root(path: str) -> bool:
return looks_like_tf_psa_crypto_root(path) or looks_like_mbedtls_root(path)

def check_repo_path():
def crypto_core_directory(root: Optional[str] = None, relative: Optional[bool] = False) -> str:
"""
Return the path of the directory containing the PSA crypto core
for either TF-PSA-Crypto or Mbed TLS.
Returns either the full path or relative path depending on the
"relative" boolean argument.
"""
Check that the current working directory is the project root, and throw
if root is None:
root = guess_project_root()
if looks_like_tf_psa_crypto_root(root):
if relative:
return "core"
return os.path.join(root, "core")
elif looks_like_mbedtls_root(root):
if relative:
return "library"
return os.path.join(root, "library")
else:
raise Exception('Neither Mbed TLS nor TF-PSA-Crypto source tree found')

def crypto_library_filename(root: Optional[str] = None) -> str:
"""Return the crypto library filename for either TF-PSA-Crypto or Mbed TLS."""
if root is None:
root = guess_project_root()
if looks_like_tf_psa_crypto_root(root):
return "tfpsacrypto"
elif looks_like_mbedtls_root(root):
return "mbedcrypto"
else:
raise Exception('Neither Mbed TLS nor TF-PSA-Crypto source tree found')

def check_repo_path():
"""Check that the current working directory is the project root, and throw
an exception if not.
"""
if not all(os.path.isdir(d) for d in ["include", "library", "tests"]):
Expand All @@ -43,11 +75,10 @@ def chdir_to_root() -> None:
return
raise Exception('Mbed TLS source tree not found')

def guess_project_root():
"""Guess project source code directory.
def guess_mbedtls_root():
"""Guess mbedTLS source code directory.
Return the first possible mbedTLS root directory
Return the first possible project root directory.
"""
dirs = set({})
for frame in inspect.stack():
Expand All @@ -60,4 +91,30 @@ def guess_mbedtls_root():
dirs.add(d)
if looks_like_root(d):
return d
raise Exception('Mbed TLS source tree not found')
raise Exception('Neither Mbed TLS nor TF-PSA-Crypto source tree found')

def guess_mbedtls_root(root: Optional[str] = None) -> str:
"""Guess Mbed TLS source code directory.
Return the first possible Mbed TLS root directory.
Raise an exception if we are not in Mbed TLS.
"""
if root is None:
root = guess_project_root()
if looks_like_mbedtls_root(root):
return root
else:
raise Exception('Mbed TLS source tree not found')

def guess_tf_psa_crypto_root(root: Optional[str] = None) -> str:
"""Guess TF-PSA-Crypto source code directory.
Return the first possible TF-PSA-Crypto root directory.
Raise an exception if we are not in TF-PSA-Crypto.
"""
if root is None:
root = guess_project_root()
if looks_like_tf_psa_crypto_root(root):
return root
else:
raise Exception('TF-PSA-Crypto source tree not found')
39 changes: 28 additions & 11 deletions tests/scripts/check-generated-files.sh
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,20 @@ EOF
exit
fi

if [ -d library -a -d include -a -d tests ]; then :; else
echo "Must be run from Mbed TLS root" >&2
in_mbedtls_repo () {
test -d include -a -d library -a -d programs -a -d tests
}

in_tf_psa_crypto_repo () {
test -d include -a -d core -a -d drivers -a -d programs -a -d tests
}

if in_mbedtls_repo; then
library_dir='library'
elif in_tf_psa_crypto_repo; then
library_dir='core'
else
echo "Must be run from Mbed TLS root or TF-PSA-Crypto root" >&2
exit 1
fi

Expand Down Expand Up @@ -114,16 +126,21 @@ check()
# - **/CMakeLists.txt (to (re)build them with cmake)
# - scripts/make_generated_files.bat (to generate them under Windows)

check scripts/generate_errors.pl library/error.c
check scripts/generate_query_config.pl programs/test/query_config.c
check scripts/generate_driver_wrappers.py library/psa_crypto_driver_wrappers.h library/psa_crypto_driver_wrappers_no_static.c
check scripts/generate_features.pl library/version_features.c
check scripts/generate_ssl_debug_helpers.py library/ssl_debug_helpers_generated.c
# generate_visualc_files enumerates source files (library/*.c). It doesn't
# care about their content, but the files must exist. So it must run after
# the step that creates or updates these files.
check scripts/generate_visualc_files.pl visualc/VS2013
# These checks are common to Mbed TLS and TF-PSA-Crypto
check scripts/generate_psa_constants.py programs/psa/psa_constant_names_generated.c
check tests/scripts/generate_bignum_tests.py $(tests/scripts/generate_bignum_tests.py --list)
check tests/scripts/generate_ecp_tests.py $(tests/scripts/generate_ecp_tests.py --list)
check tests/scripts/generate_psa_tests.py $(tests/scripts/generate_psa_tests.py --list)
check scripts/generate_driver_wrappers.py $library_dir/psa_crypto_driver_wrappers.h $library_dir/psa_crypto_driver_wrappers_no_static.c

# Additional checks for Mbed TLS only
if in_mbedtls_repo; then
check scripts/generate_errors.pl library/error.c
check scripts/generate_query_config.pl programs/test/query_config.c
check scripts/generate_features.pl library/version_features.c
check scripts/generate_ssl_debug_helpers.py library/ssl_debug_helpers_generated.c
# generate_visualc_files enumerates source files (library/*.c). It doesn't
# care about their content, but the files must exist. So it must run after
# the step that creates or updates these files.
check scripts/generate_visualc_files.pl visualc/VS2013
fi
8 changes: 2 additions & 6 deletions tests/scripts/test_psa_compliance.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,12 +50,8 @@ def main(library_build_dir: str):

in_tf_psa_crypto_repo = build_tree.looks_like_tf_psa_crypto_root(root_dir)

if in_tf_psa_crypto_repo:
crypto_name = 'tfpsacrypto'
library_subdir = 'core'
else:
crypto_name = 'mbedcrypto'
library_subdir = 'library'
crypto_name = build_tree.crypto_library_filename(root_dir)
library_subdir = build_tree.crypto_core_directory(root_dir, relative=True)

crypto_lib_filename = (library_build_dir + '/' +
library_subdir + '/' +
Expand Down

0 comments on commit b4362d2

Please sign in to comment.