1MBEDTLS_TEST_PATH = . 2include ../scripts/common.make 3 4# Set this to -v to see the details of failing test cases 5TEST_FLAGS ?= $(if $(filter-out 0 OFF Off off NO No no FALSE False false N n,$(CTEST_OUTPUT_ON_FAILURE)),-v,) 6 7# Also include library headers, for the sake of invasive tests. 8LOCAL_CFLAGS += -I../library 9 10# Enable definition of various functions used throughout the testsuite 11# (gethostname, strdup, fileno...) even when compiling with -std=c99. Harmless 12# on non-POSIX platforms. 13LOCAL_CFLAGS += -D_POSIX_C_SOURCE=200809L 14 15ifdef RECORD_PSA_STATUS_COVERAGE_LOG 16LOCAL_CFLAGS += -Werror -DRECORD_PSA_STATUS_COVERAGE_LOG 17endif 18 19.PHONY: generated_files 20GENERATED_BIGNUM_DATA_FILES := $(patsubst tests/%,%,$(shell \ 21 $(PYTHON) scripts/generate_bignum_tests.py --list || \ 22 echo FAILED \ 23)) 24ifeq ($(GENERATED_BIGNUM_DATA_FILES),FAILED) 25$(error "$(PYTHON) scripts/generate_bignum_tests.py --list" failed) 26endif 27GENERATED_ECP_DATA_FILES := $(patsubst tests/%,%,$(shell \ 28 $(PYTHON) scripts/generate_ecp_tests.py --list || \ 29 echo FAILED \ 30)) 31ifeq ($(GENERATED_ECP_DATA_FILES),FAILED) 32$(error "$(PYTHON) scripts/generate_ecp_tests.py --list" failed) 33endif 34GENERATED_PSA_DATA_FILES := $(patsubst tests/%,%,$(shell \ 35 $(PYTHON) scripts/generate_psa_tests.py --list || \ 36 echo FAILED \ 37)) 38ifeq ($(GENERATED_PSA_DATA_FILES),FAILED) 39$(error "$(PYTHON) scripts/generate_psa_tests.py --list" failed) 40endif 41GENERATED_FILES := $(GENERATED_PSA_DATA_FILES) $(GENERATED_ECP_DATA_FILES) $(GENERATED_BIGNUM_DATA_FILES) 42generated_files: $(GENERATED_FILES) 43 44# generate_bignum_tests.py and generate_psa_tests.py spend more time analyzing 45# inputs than generating outputs. Its inputs are the same no matter which files 46# are being generated. 47# It's rare not to want all the outputs. So always generate all of its outputs. 48# Use an intermediate phony dependency so that parallel builds don't run 49# a separate instance of the recipe for each output file. 50.SECONDARY: generated_bignum_test_data generated_ecp_test_data generated_psa_test_data 51$(GENERATED_BIGNUM_DATA_FILES): $(gen_file_dep) generated_bignum_test_data 52generated_bignum_test_data: scripts/generate_bignum_tests.py 53generated_bignum_test_data: ../scripts/mbedtls_dev/bignum_common.py 54generated_bignum_test_data: ../scripts/mbedtls_dev/bignum_core.py 55generated_bignum_test_data: ../scripts/mbedtls_dev/bignum_mod_raw.py 56generated_bignum_test_data: ../scripts/mbedtls_dev/bignum_mod.py 57generated_bignum_test_data: ../scripts/mbedtls_dev/test_case.py 58generated_bignum_test_data: ../scripts/mbedtls_dev/test_data_generation.py 59generated_bignum_test_data: 60 echo " Gen $(GENERATED_BIGNUM_DATA_FILES)" 61 $(PYTHON) scripts/generate_bignum_tests.py 62 63$(GENERATED_ECP_DATA_FILES): $(gen_file_dep) generated_ecp_test_data 64generated_ecp_test_data: scripts/generate_ecp_tests.py 65generated_ecp_test_data: ../scripts/mbedtls_dev/bignum_common.py 66generated_ecp_test_data: ../scripts/mbedtls_dev/ecp.py 67generated_ecp_test_data: ../scripts/mbedtls_dev/test_case.py 68generated_ecp_test_data: ../scripts/mbedtls_dev/test_data_generation.py 69generated_ecp_test_data: 70 echo " Gen $(GENERATED_ECP_DATA_FILES)" 71 $(PYTHON) scripts/generate_ecp_tests.py 72 73$(GENERATED_PSA_DATA_FILES): $(gen_file_dep) generated_psa_test_data 74generated_psa_test_data: scripts/generate_psa_tests.py 75generated_psa_test_data: ../scripts/mbedtls_dev/crypto_data_tests.py 76generated_psa_test_data: ../scripts/mbedtls_dev/crypto_knowledge.py 77generated_psa_test_data: ../scripts/mbedtls_dev/macro_collector.py 78generated_psa_test_data: ../scripts/mbedtls_dev/psa_information.py 79generated_psa_test_data: ../scripts/mbedtls_dev/psa_storage.py 80generated_psa_test_data: ../scripts/mbedtls_dev/test_case.py 81generated_psa_test_data: ../scripts/mbedtls_dev/test_data_generation.py 82## The generated file only depends on the options that are present in 83## crypto_config.h, not on which options are set. To avoid regenerating this 84## file all the time when switching between configurations, don't declare 85## crypto_config.h as a dependency. Remove this file from your working tree 86## if you've just added or removed an option in crypto_config.h. 87#generated_psa_test_data: ../include/psa/crypto_config.h 88generated_psa_test_data: ../include/psa/crypto_values.h 89generated_psa_test_data: ../include/psa/crypto_extra.h 90generated_psa_test_data: suites/test_suite_psa_crypto_metadata.data 91generated_psa_test_data: 92 echo " Gen $(GENERATED_PSA_DATA_FILES) ..." 93 $(PYTHON) scripts/generate_psa_tests.py 94 95# A test application is built for each suites/test_suite_*.data file. 96# Application name is same as .data file's base name and can be 97# constructed by stripping path 'suites/' and extension .data. 98DATA_FILES := $(wildcard suites/test_suite_*.data) 99# Make sure that generated data files are included even if they don't 100# exist yet when the makefile is parsed. 101DATA_FILES += $(filter-out $(DATA_FILES),$(GENERATED_FILES)) 102APPS = $(basename $(subst suites/,,$(DATA_FILES))) 103 104# Construct executable name by adding OS specific suffix $(EXEXT). 105BINARIES := $(addsuffix $(EXEXT),$(APPS)) 106 107.SILENT: 108 109.PHONY: all check test clean 110 111all: $(BINARIES) 112 113mbedtls_test: $(MBEDTLS_TEST_OBJS) 114 115TEST_OBJS_DEPS = $(wildcard include/test/*.h include/test/*/*.h) 116ifdef RECORD_PSA_STATUS_COVERAGE_LOG 117# Explicitly depend on this header because on a clean copy of the source tree, 118# it doesn't exist yet and must be generated as part of the build, and 119# therefore the wildcard enumeration above doesn't include it. 120TEST_OBJS_DEPS += include/test/instrument_record_status.h 121endif 122 123# Rule to compile common test C files in src folder 124src/%.o : src/%.c $(TEST_OBJS_DEPS) 125 echo " CC $<" 126 $(CC) $(LOCAL_CFLAGS) $(CFLAGS) -o $@ -c $< 127 128src/drivers/%.o : src/drivers/%.c 129 echo " CC $<" 130 $(CC) $(LOCAL_CFLAGS) $(CFLAGS) -o $@ -c $< 131 132src/test_helpers/%.o : src/test_helpers/%.c 133 echo " CC $<" 134 $(CC) $(LOCAL_CFLAGS) $(CFLAGS) -o $@ -c $< 135 136C_FILES := $(addsuffix .c,$(APPS)) 137c: $(C_FILES) 138 139# Wildcard target for test code generation: 140# A .c file is generated for each .data file in the suites/ directory. Each .c 141# file depends on a .data and .function file from suites/ directory. Following 142# nameing convention is followed: 143# 144# C file | Depends on 145#----------------------------------------------------------------------------- 146# foo.c | suites/foo.function suites/foo.data 147# foo.bar.c | suites/foo.function suites/foo.bar.data 148# 149# Note above that .c and .data files have same base name. 150# However, corresponding .function file's base name is the word before first 151# dot in .c file's base name. 152# 153.SECONDEXPANSION: 154%.c: suites/$$(firstword $$(subst ., ,$$*)).function suites/%.data scripts/generate_test_code.py suites/helpers.function suites/main_test.function suites/host_test.function 155 echo " Gen $@" 156 $(PYTHON) scripts/generate_test_code.py -f suites/$(firstword $(subst ., ,$*)).function \ 157 -d suites/$*.data \ 158 -t suites/main_test.function \ 159 -p suites/host_test.function \ 160 -s suites \ 161 --helpers-file suites/helpers.function \ 162 -o . 163 164 165$(BINARIES): %$(EXEXT): %.c $(MBEDLIBS) $(TEST_OBJS_DEPS) $(MBEDTLS_TEST_OBJS) 166 echo " CC $<" 167 $(CC) $(LOCAL_CFLAGS) $(CFLAGS) $< $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@ 168 169clean: 170ifndef WINDOWS 171 rm -rf $(BINARIES) *.c *.datax 172 rm -f src/*.o src/drivers/*.o src/test_helpers/*.o src/libmbed* 173 rm -f include/test/instrument_record_status.h 174 rm -f include/alt-extra/*/*_alt.h 175 rm -rf libtestdriver1 176 rm -f ../library/libtestdriver1.a 177else 178 if exist *.c del /Q /F *.c 179 if exist *.exe del /Q /F *.exe 180 if exist *.datax del /Q /F *.datax 181 if exist src/*.o del /Q /F src/*.o 182 if exist src/drivers/*.o del /Q /F src/drivers/*.o 183 if exist src/test_helpers/*.o del /Q /F src/test_helpers/*.o 184 if exist src/libmbed* del /Q /F src/libmed* 185 if exist include/test/instrument_record_status.h del /Q /F include/test/instrument_record_status.h 186endif 187 188# Test suites caught by SKIP_TEST_SUITES are built but not executed. 189check: $(BINARIES) 190 perl scripts/run-test-suites.pl $(TEST_FLAGS) --skip=$(SKIP_TEST_SUITES) 191 192test: check 193 194# Generate variants of some headers for testing 195include/alt-extra/%_alt.h: ../include/%.h 196 perl -p -e 's/^(# *(define|ifndef) +\w+_)H\b/$${1}ALT_H/' $< >$@ 197 198# Generate test library 199 200# Perl code that is executed to transform each original line from a library 201# source file into the corresponding line in the test driver copy of the 202# library. Add a LIBTESTDRIVER1_/libtestdriver1_ to mbedtls_xxx and psa_xxx 203# symbols. 204define libtestdriver1_rewrite := 205 s!^(\s*#\s*include\s*[\"<])(mbedtls|psa)/!$${1}libtestdriver1/include/$${2}/!; \ 206 next if /^\s*#\s*include/; \ 207 s/\b(?=MBEDTLS_|PSA_)/LIBTESTDRIVER1_/g; \ 208 s/\b(?=mbedtls_|psa_)/libtestdriver1_/g; 209endef 210 211libtestdriver1.a: export MBEDTLS_PATH := $(patsubst ../..//%,/%,../../$(MBEDTLS_PATH)) 212libtestdriver1.a: 213 # Copy the library and fake a 3rdparty Makefile include. 214 rm -Rf ./libtestdriver1 215 mkdir ./libtestdriver1 216 cp -Rf ../library ./libtestdriver1 217 cp -Rf ../include ./libtestdriver1 218 cp -Rf ../scripts ./libtestdriver1 219 mkdir ./libtestdriver1/3rdparty 220 touch ./libtestdriver1/3rdparty/Makefile.inc 221 222 # Set the test driver base (minimal) configuration. 223 cp ./include/test/drivers/config_test_driver.h ./libtestdriver1/include/mbedtls/mbedtls_config.h 224 225 # Set the PSA cryptography configuration for the test library. 226 # It is set from the copied include/psa/crypto_config.h of the Mbed TLS 227 # library the test library is intended to be linked with extended by 228 # ./include/test/drivers/crypto_config_test_driver_extension.h to 229 # mirror the PSA_ACCEL_* macros. 230 mv ./libtestdriver1/include/psa/crypto_config.h ./libtestdriver1/include/psa/crypto_config.h.bak 231 head -n -1 ./libtestdriver1/include/psa/crypto_config.h.bak > ./libtestdriver1/include/psa/crypto_config.h 232 cat ./include/test/drivers/crypto_config_test_driver_extension.h >> ./libtestdriver1/include/psa/crypto_config.h 233 echo "#endif /* PSA_CRYPTO_CONFIG_H */" >> ./libtestdriver1/include/psa/crypto_config.h 234 235 # Prefix MBEDTLS_* PSA_* symbols with LIBTESTDRIVER1_ as well as 236 # mbedtls_* psa_* symbols with libtestdriver1_ to avoid symbol clash 237 # when this test driver library is linked with the Mbed TLS library. 238 perl -pi -e '$(libtestdriver1_rewrite)' ./libtestdriver1/library/*.[ch] 239 perl -pi -e '$(libtestdriver1_rewrite)' ./libtestdriver1/include/*/*.h 240 241 $(MAKE) -C ./libtestdriver1/library CFLAGS="-I../../ $(CFLAGS)" LDFLAGS="$(LDFLAGS)" libmbedcrypto.a 242 cp ./libtestdriver1/library/libmbedcrypto.a ../library/libtestdriver1.a 243 244ifdef RECORD_PSA_STATUS_COVERAGE_LOG 245include/test/instrument_record_status.h: ../include/psa/crypto.h Makefile 246 echo " Gen $@" 247 sed <../include/psa/crypto.h >$@ -n 's/^psa_status_t \([A-Za-z0-9_]*\)(.*/#define \1(...) RECORD_STATUS("\1", \1(__VA_ARGS__))/p' 248endif 249