blob: d63a948a34f6defe8319d79d86e3c8b283d55c6f [file] [log] [blame]
Andres AG31f9b5b2016-10-04 17:14:38 +01001#! /usr/bin/env sh
Manuel Pégourié-Gonnard80955ee2014-03-19 18:29:01 +01002
Simon Butcher3ea7f522016-03-07 23:22:10 +00003# all.sh
4#
SimonB2e23c822016-04-16 21:54:39 +01005# This file is part of mbed TLS (https://tls.mbed.org)
6#
Gilles Peskine192c72f2017-12-21 15:59:21 +01007# Copyright (c) 2014-2017, ARM Limited, All Rights Reserved
8
9
10
11################################################################
12#### Documentation
13################################################################
14
Simon Butcher3ea7f522016-03-07 23:22:10 +000015# Purpose
Gilles Peskine192c72f2017-12-21 15:59:21 +010016# -------
Simon Butcher3ea7f522016-03-07 23:22:10 +000017#
SimonB2e23c822016-04-16 21:54:39 +010018# To run all tests possible or available on the platform.
Manuel Pégourié-Gonnard80955ee2014-03-19 18:29:01 +010019#
Gilles Peskine192c72f2017-12-21 15:59:21 +010020# Notes for users
21# ---------------
22#
SimonB2e23c822016-04-16 21:54:39 +010023# Warning: the test is destructive. It includes various build modes and
24# configurations, and can and will arbitrarily change the current CMake
Gilles Peskine192c72f2017-12-21 15:59:21 +010025# configuration. The following files must be committed into git:
26# * include/mbedtls/config.h
27# * Makefile, library/Makefile, programs/Makefile, tests/Makefile
28# After running this script, the CMake cache will be lost and CMake
29# will no longer be initialised.
Manuel Pégourié-Gonnard3895f5a2014-03-27 14:44:04 +010030#
Gilles Peskine192c72f2017-12-21 15:59:21 +010031# The script assumes the presence of a number of tools:
32# * Basic Unix tools (Windows users note: a Unix-style find must be before
33# the Windows find in the PATH)
34# * Perl
35# * GNU Make
36# * CMake
37# * GCC and Clang (recent enough for using ASan with gcc and MemSan with clang, or valgrind)
Andrzej Kurek05be06c2018-06-28 04:41:50 -040038# * G++
Gilles Peskine192c72f2017-12-21 15:59:21 +010039# * arm-gcc and mingw-gcc
40# * ArmCC 5 and ArmCC 6, unless invoked with --no-armcc
Gilles Peskine192c72f2017-12-21 15:59:21 +010041# * OpenSSL and GnuTLS command line tools, recent enough for the
42# interoperability tests. If they don't support SSLv3 then a legacy
43# version of these tools must be present as well (search for LEGACY
44# below).
45# See the invocation of check_tools below for details.
46#
47# This script must be invoked from the toplevel directory of a git
48# working copy of Mbed TLS.
49#
50# Note that the output is not saved. You may want to run
51# script -c tests/scripts/all.sh
52# or
53# tests/scripts/all.sh >all.log 2>&1
54#
55# Notes for maintainers
56# ---------------------
57#
Gilles Peskine8f073122018-11-27 15:58:47 +010058# The bulk of the code is organized into functions that follow one of the
59# following naming conventions:
60# * pre_XXX: things to do before running the tests, in order.
61# * component_XXX: independent components. They can be run in any order.
62# * component_check_XXX: quick tests that aren't worth parallelizing
63# * component_build_XXX: build things but don't run them
64# * component_test_XXX: build and test
65# * post_XXX: things to do after running the tests.
66# * other: miscellaneous support functions.
67#
Gilles Peskine192c72f2017-12-21 15:59:21 +010068# The tests are roughly in order from fastest to slowest. This doesn't
69# have to be exact, but in general you should add slower tests towards
70# the end and fast checks near the beginning.
71#
72# Sanity checks have the following form:
73# 1. msg "short description of what is about to be done"
74# 2. run sanity check (failure stops the script)
75#
76# Build or build-and-test steps have the following form:
77# 1. msg "short description of what is about to be done"
78# 2. cleanup
79# 3. preparation (config.pl, cmake, ...) (failure stops the script)
80# 4. make
81# 5. Run tests if relevant. All tests must be prefixed with
82# if_build_successful for the sake of --keep-going.
83
84
85
86################################################################
87#### Initialization and command line parsing
88################################################################
Manuel Pégourié-Gonnard80955ee2014-03-19 18:29:01 +010089
SimonB2e23c822016-04-16 21:54:39 +010090# Abort on errors (and uninitialised variables)
Manuel Pégourié-Gonnard80955ee2014-03-19 18:29:01 +010091set -eu
92
Gilles Peskine8f073122018-11-27 15:58:47 +010093pre_check_environment () {
94 if [ "$( uname )" != "Linux" ]; then
95 echo "This script only works in Linux" >&2
96 exit 1
97 elif [ -d library -a -d include -a -d tests ]; then :; else
98 echo "Must be run from mbed TLS root" >&2
99 exit 1
100 fi
101}
Manuel Pégourié-Gonnard80955ee2014-03-19 18:29:01 +0100102
Gilles Peskine8f073122018-11-27 15:58:47 +0100103pre_initialize_variables () {
104 CONFIG_H='include/mbedtls/config.h'
105 CONFIG_BAK="$CONFIG_H.bak"
Manuel Pégourié-Gonnarde73b2632014-07-12 04:00:00 +0200106
Gilles Peskine92525112018-11-27 18:15:35 +0100107 COMPONENTS=
Gilles Peskine81b96ed2018-11-27 21:37:53 +0100108 ALL_EXCEPT=0
Gilles Peskine8f073122018-11-27 15:58:47 +0100109 MEMORY=0
110 FORCE=0
Gilles Peskine348fb9a2018-11-27 17:04:29 +0100111 INTROSPECTION_MODE=
Gilles Peskine8f073122018-11-27 15:58:47 +0100112 KEEP_GOING=0
113 RUN_ARMCC=1
Manuel Pégourié-Gonnard80955ee2014-03-19 18:29:01 +0100114
Gilles Peskine8f073122018-11-27 15:58:47 +0100115 # Default commands, can be overriden by the environment
116 : ${OPENSSL:="openssl"}
117 : ${OPENSSL_LEGACY:="$OPENSSL"}
118 : ${OPENSSL_NEXT:="$OPENSSL"}
119 : ${GNUTLS_CLI:="gnutls-cli"}
120 : ${GNUTLS_SERV:="gnutls-serv"}
121 : ${GNUTLS_LEGACY_CLI:="$GNUTLS_CLI"}
122 : ${GNUTLS_LEGACY_SERV:="$GNUTLS_SERV"}
123 : ${OUT_OF_SOURCE_DIR:=./mbedtls_out_of_source_build}
124 : ${ARMC5_BIN_DIR:=/usr/bin}
125 : ${ARMC6_BIN_DIR:=/usr/bin}
Andres AGdc192212016-08-31 17:33:13 +0100126
Gilles Peskine8f073122018-11-27 15:58:47 +0100127 # if MAKEFLAGS is not set add the -j option to speed up invocations of make
128 if [ -n "${MAKEFLAGS+set}" ]; then
129 export MAKEFLAGS="-j"
130 fi
131}
Andres AG38495a32016-07-12 16:54:33 +0100132
Gilles Peskine81b96ed2018-11-27 21:37:53 +0100133# Test whether $1 is excluded via $COMPONENTS (a space-separated list of
134# wildcard patterns).
135component_is_excluded()
136{
137 set -f
138 for pattern in $COMPONENTS; do
139 set +f
140 case ${1#component_} in $pattern) return 0;; esac
141 done
142 set +f
143 return 1
144}
145
Simon Butcher41eeccf2016-09-07 00:07:09 +0100146usage()
SimonB2e23c822016-04-16 21:54:39 +0100147{
Gilles Peskine709346a2017-12-10 23:43:39 +0100148 cat <<EOF
Gilles Peskine92525112018-11-27 18:15:35 +0100149Usage: $0 [OPTION]... [COMPONENT]...
Gilles Peskine348fb9a2018-11-27 17:04:29 +0100150Run mbedtls release validation tests.
Gilles Peskine92525112018-11-27 18:15:35 +0100151By default, run all tests. With one or more COMPONENT, run only those.
Gilles Peskine348fb9a2018-11-27 17:04:29 +0100152
153Special options:
154 -h|--help Print this help and exit.
155 --list-components List available test components and exit.
Gilles Peskine709346a2017-12-10 23:43:39 +0100156
157General options:
158 -f|--force Force the tests to overwrite any modified files.
Gilles Peskine7c652162017-12-11 00:01:40 +0100159 -k|--keep-going Run all tests and report errors at the end.
Gilles Peskine709346a2017-12-10 23:43:39 +0100160 -m|--memory Additional optional memory tests.
Gilles Peskinebca6ab92017-12-19 18:24:31 +0100161 --armcc Run ARM Compiler builds (on by default).
Gilles Peskine81b96ed2018-11-27 21:37:53 +0100162 --except If some components are passed on the command line,
163 run all the tests except for these components. In
164 this mode, you can pass shell wildcard patterns as
165 component names, e.g. "$0 --except 'test_*'" to
166 exclude all components that run tests.
Gilles Peskinebca6ab92017-12-19 18:24:31 +0100167 --no-armcc Skip ARM Compiler builds.
Gilles Peskine38d81652018-03-21 08:40:26 +0100168 --no-force Refuse to overwrite modified files (default).
169 --no-keep-going Stop at the first error (default).
170 --no-memory No additional memory tests (default).
Gilles Peskine709346a2017-12-10 23:43:39 +0100171 --out-of-source-dir=<path> Directory used for CMake out-of-source build tests.
Gilles Peskine38d81652018-03-21 08:40:26 +0100172 --random-seed Use a random seed value for randomized tests (default).
Gilles Peskine709346a2017-12-10 23:43:39 +0100173 -r|--release-test Run this script in release mode. This fixes the seed value to 1.
174 -s|--seed Integer seed value to use for this test run.
175
176Tool path options:
177 --armc5-bin-dir=<ARMC5_bin_dir_path> ARM Compiler 5 bin directory.
178 --armc6-bin-dir=<ARMC6_bin_dir_path> ARM Compiler 6 bin directory.
179 --gnutls-cli=<GnuTLS_cli_path> GnuTLS client executable to use for most tests.
180 --gnutls-serv=<GnuTLS_serv_path> GnuTLS server executable to use for most tests.
181 --gnutls-legacy-cli=<GnuTLS_cli_path> GnuTLS client executable to use for legacy tests.
182 --gnutls-legacy-serv=<GnuTLS_serv_path> GnuTLS server executable to use for legacy tests.
183 --openssl=<OpenSSL_path> OpenSSL executable to use for most tests.
184 --openssl-legacy=<OpenSSL_path> OpenSSL executable to use for legacy tests e.g. SSLv3.
Manuel Pégourié-Gonnard6b368922018-02-20 12:02:07 +0100185 --openssl-next=<OpenSSL_path> OpenSSL executable to use for recent things like ARIA
Gilles Peskine709346a2017-12-10 23:43:39 +0100186EOF
SimonB2e23c822016-04-16 21:54:39 +0100187}
Manuel Pégourié-Gonnard80955ee2014-03-19 18:29:01 +0100188
189# remove built files as well as the cmake cache/config
190cleanup()
191{
Gilles Peskinea71d64c2018-03-21 12:16:57 +0100192 if [ -n "${MBEDTLS_ROOT_DIR+set}" ]; then
193 cd "$MBEDTLS_ROOT_DIR"
194 fi
195
Gilles Peskine7c652162017-12-11 00:01:40 +0100196 command make clean
Manuel Pégourié-Gonnarde73b2632014-07-12 04:00:00 +0200197
Gilles Peskine31b07e22018-03-21 12:15:06 +0100198 # Remove CMake artefacts
Simon Butcher3ad2efd2018-05-02 14:49:38 +0100199 find . -name .git -prune \
Gilles Peskine31b07e22018-03-21 12:15:06 +0100200 -iname CMakeFiles -exec rm -rf {} \+ -o \
201 \( -iname cmake_install.cmake -o \
202 -iname CTestTestfile.cmake -o \
203 -iname CMakeCache.txt \) -exec rm {} \+
204 # Recover files overwritten by in-tree CMake builds
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +0000205 rm -f include/Makefile include/mbedtls/Makefile programs/*/Makefile
Paul Bakkerfe0984d2014-06-13 00:13:45 +0200206 git update-index --no-skip-worktree Makefile library/Makefile programs/Makefile tests/Makefile
207 git checkout -- Makefile library/Makefile programs/Makefile tests/Makefile
Manuel Pégourié-Gonnarde73b2632014-07-12 04:00:00 +0200208
209 if [ -f "$CONFIG_BAK" ]; then
210 mv "$CONFIG_BAK" "$CONFIG_H"
211 fi
Manuel Pégourié-Gonnard80955ee2014-03-19 18:29:01 +0100212}
213
Gilles Peskine7c652162017-12-11 00:01:40 +0100214# Executed on exit. May be redefined depending on command line options.
215final_report () {
216 :
217}
218
219fatal_signal () {
220 cleanup
221 final_report $1
222 trap - $1
223 kill -$1 $$
224}
225
226trap 'fatal_signal HUP' HUP
227trap 'fatal_signal INT' INT
228trap 'fatal_signal TERM' TERM
Manuel Pégourié-Gonnarde73b2632014-07-12 04:00:00 +0200229
Manuel Pégourié-Gonnard3895f5a2014-03-27 14:44:04 +0100230msg()
231{
Gilles Peskineffcdeff2018-12-04 12:49:28 +0100232 if [ -n "${current_component:-}" ]; then
233 current_section="${current_component#component_}: $1"
234 else
235 current_section="$1"
236 fi
Manuel Pégourié-Gonnard3895f5a2014-03-27 14:44:04 +0100237 echo ""
238 echo "******************************************************************"
Gilles Peskineffcdeff2018-12-04 12:49:28 +0100239 echo "* $current_section "
Manuel Pégourié-Gonnard392d3dd2015-01-26 14:03:56 +0000240 printf "* "; date
Manuel Pégourié-Gonnard3895f5a2014-03-27 14:44:04 +0100241 echo "******************************************************************"
242}
Manuel Pégourié-Gonnard80955ee2014-03-19 18:29:01 +0100243
Gilles Peskine8f073122018-11-27 15:58:47 +0100244armc6_build_test()
245{
246 FLAGS="$1"
Andres AGa5cd9732016-10-17 15:23:10 +0100247
Gilles Peskine8f073122018-11-27 15:58:47 +0100248 msg "build: ARM Compiler 6 ($FLAGS), make"
249 ARM_TOOL_VARIANT="ult" CC="$ARMC6_CC" AR="$ARMC6_AR" CFLAGS="$FLAGS" \
250 WARNING_CFLAGS='-xc -std=c99' make lib
251 make clean
252}
Andres AGa5cd9732016-10-17 15:23:10 +0100253
Andres AGd9eba4b2016-08-26 14:42:14 +0100254err_msg()
255{
256 echo "$1" >&2
257}
258
259check_tools()
260{
261 for TOOL in "$@"; do
Andres AG98393602017-01-31 17:04:45 +0000262 if ! `type "$TOOL" >/dev/null 2>&1`; then
Andres AGd9eba4b2016-08-26 14:42:14 +0100263 err_msg "$TOOL not found!"
264 exit 1
265 fi
266 done
267}
268
Andrzej Kurek991f9fe2018-07-02 09:08:21 -0400269check_headers_in_cpp () {
270 ls include/mbedtls >headers.txt
271 <programs/test/cpp_dummy_build.cpp sed -n 's/"$//; s!^#include "mbedtls/!!p' |
272 sort |
273 diff headers.txt -
274 rm headers.txt
275}
276
Gilles Peskine8f073122018-11-27 15:58:47 +0100277pre_parse_command_line () {
278 while [ $# -gt 0 ]; do
279 case "$1" in
280 --armcc) RUN_ARMCC=1;;
281 --armc5-bin-dir) shift; ARMC5_BIN_DIR="$1";;
282 --armc6-bin-dir) shift; ARMC6_BIN_DIR="$1";;
Gilles Peskine81b96ed2018-11-27 21:37:53 +0100283 --except) ALL_EXCEPT=1;;
Gilles Peskine8f073122018-11-27 15:58:47 +0100284 --force|-f) FORCE=1;;
285 --gnutls-cli) shift; GNUTLS_CLI="$1";;
286 --gnutls-legacy-cli) shift; GNUTLS_LEGACY_CLI="$1";;
287 --gnutls-legacy-serv) shift; GNUTLS_LEGACY_SERV="$1";;
288 --gnutls-serv) shift; GNUTLS_SERV="$1";;
289 --help|-h) usage; exit;;
290 --keep-going|-k) KEEP_GOING=1;;
Gilles Peskine348fb9a2018-11-27 17:04:29 +0100291 --list-components) INTROSPECTION_MODE=list_components;;
Gilles Peskine8f073122018-11-27 15:58:47 +0100292 --memory|-m) MEMORY=1;;
293 --no-armcc) RUN_ARMCC=0;;
294 --no-force) FORCE=0;;
295 --no-keep-going) KEEP_GOING=0;;
296 --no-memory) MEMORY=0;;
297 --openssl) shift; OPENSSL="$1";;
298 --openssl-legacy) shift; OPENSSL_LEGACY="$1";;
299 --openssl-next) shift; OPENSSL_NEXT="$1";;
300 --out-of-source-dir) shift; OUT_OF_SOURCE_DIR="$1";;
301 --random-seed) unset SEED;;
302 --release-test|-r) SEED=1;;
303 --seed|-s) shift; SEED="$1";;
Gilles Peskine92525112018-11-27 18:15:35 +0100304 -*)
Gilles Peskine8f073122018-11-27 15:58:47 +0100305 echo >&2 "Unknown option: $1"
306 echo >&2 "Run $0 --help for usage."
307 exit 120
308 ;;
Gilles Peskine92525112018-11-27 18:15:35 +0100309 *)
310 COMPONENTS="$COMPONENTS $1";;
Gilles Peskine8f073122018-11-27 15:58:47 +0100311 esac
312 shift
313 done
314}
SimonB2e23c822016-04-16 21:54:39 +0100315
Gilles Peskine8f073122018-11-27 15:58:47 +0100316pre_check_git () {
317 if [ $FORCE -eq 1 ]; then
318 git checkout-index -f -q $CONFIG_H
319 cleanup
320 else
SimonB2e23c822016-04-16 21:54:39 +0100321
Gilles Peskine8f073122018-11-27 15:58:47 +0100322 if [ -d "$OUT_OF_SOURCE_DIR" ]; then
323 echo "Warning - there is an existing directory at '$OUT_OF_SOURCE_DIR'" >&2
324 echo "You can either delete this directory manually, or force the test by rerunning"
325 echo "the script as: $0 --force --out-of-source-dir $OUT_OF_SOURCE_DIR"
326 exit 1
327 fi
328
329 if ! git diff-files --quiet include/mbedtls/config.h; then
330 err_msg "Warning - the configuration file 'include/mbedtls/config.h' has been edited. "
331 echo "You can either delete or preserve your work, or force the test by rerunning the"
332 echo "script as: $0 --force"
333 exit 1
334 fi
Andres AGdc192212016-08-31 17:33:13 +0100335 fi
Gilles Peskine8f073122018-11-27 15:58:47 +0100336}
Andres AGdc192212016-08-31 17:33:13 +0100337
Gilles Peskine8f073122018-11-27 15:58:47 +0100338pre_setup_keep_going () {
Gilles Peskine7c652162017-12-11 00:01:40 +0100339 failure_summary=
340 failure_count=0
341 start_red=
342 end_color=
343 if [ -t 1 ]; then
Gilles Peskine9736b9d2018-01-02 21:54:17 +0100344 case "${TERM:-}" in
Gilles Peskine7c652162017-12-11 00:01:40 +0100345 *color*|cygwin|linux|rxvt*|screen|[Eex]term*)
346 start_red=$(printf '\033[31m')
347 end_color=$(printf '\033[0m')
348 ;;
349 esac
350 fi
351 record_status () {
352 if "$@"; then
353 last_status=0
354 else
355 last_status=$?
356 text="$current_section: $* -> $last_status"
357 failure_summary="$failure_summary
358$text"
359 failure_count=$((failure_count + 1))
360 echo "${start_red}^^^^$text^^^^${end_color}"
361 fi
362 }
363 make () {
364 case "$*" in
365 *test|*check)
366 if [ $build_status -eq 0 ]; then
367 record_status command make "$@"
368 else
369 echo "(skipped because the build failed)"
370 fi
371 ;;
372 *)
373 record_status command make "$@"
374 build_status=$last_status
375 ;;
376 esac
377 }
378 final_report () {
379 if [ $failure_count -gt 0 ]; then
380 echo
381 echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
382 echo "${start_red}FAILED: $failure_count${end_color}$failure_summary"
383 echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
Jaeden Amero7c1258d2018-07-20 16:42:14 +0100384 exit 1
Gilles Peskine7c652162017-12-11 00:01:40 +0100385 elif [ -z "${1-}" ]; then
386 echo "SUCCESS :)"
387 fi
388 if [ -n "${1-}" ]; then
389 echo "Killed by SIG$1."
390 fi
391 }
Gilles Peskine8f073122018-11-27 15:58:47 +0100392}
393
Gilles Peskine7c652162017-12-11 00:01:40 +0100394if_build_succeeded () {
395 if [ $build_status -eq 0 ]; then
396 record_status "$@"
397 fi
398}
399
Manuel Pégourié-Gonnard2adb3752018-06-07 10:51:44 +0200400# to be used instead of ! for commands run with
401# record_status or if_build_succeeded
402not() {
403 ! "$@"
404}
405
Gilles Peskine8f073122018-11-27 15:58:47 +0100406pre_print_configuration () {
407 msg "info: $0 configuration"
408 echo "MEMORY: $MEMORY"
409 echo "FORCE: $FORCE"
410 echo "SEED: ${SEED-"UNSET"}"
411 echo "OPENSSL: $OPENSSL"
412 echo "OPENSSL_LEGACY: $OPENSSL_LEGACY"
413 echo "OPENSSL_NEXT: $OPENSSL_NEXT"
414 echo "GNUTLS_CLI: $GNUTLS_CLI"
415 echo "GNUTLS_SERV: $GNUTLS_SERV"
416 echo "GNUTLS_LEGACY_CLI: $GNUTLS_LEGACY_CLI"
417 echo "GNUTLS_LEGACY_SERV: $GNUTLS_LEGACY_SERV"
418 echo "ARMC5_BIN_DIR: $ARMC5_BIN_DIR"
419 echo "ARMC6_BIN_DIR: $ARMC6_BIN_DIR"
420}
Andres AG87bb5772016-09-27 15:05:15 +0100421
Gilles Peskine8f073122018-11-27 15:58:47 +0100422pre_check_tools () {
423 ARMC5_CC="$ARMC5_BIN_DIR/armcc"
424 ARMC5_AR="$ARMC5_BIN_DIR/armar"
425 ARMC6_CC="$ARMC6_BIN_DIR/armclang"
426 ARMC6_AR="$ARMC6_BIN_DIR/armar"
Andres AGd9eba4b2016-08-26 14:42:14 +0100427
Gilles Peskine8f073122018-11-27 15:58:47 +0100428 # To avoid setting OpenSSL and GnuTLS for each call to compat.sh and ssl-opt.sh
429 # we just export the variables they require
430 export OPENSSL_CMD="$OPENSSL"
431 export GNUTLS_CLI="$GNUTLS_CLI"
432 export GNUTLS_SERV="$GNUTLS_SERV"
Andres AGb2fdd042016-09-22 14:17:46 +0100433
Gilles Peskine8f073122018-11-27 15:58:47 +0100434 # Avoid passing --seed flag in every call to ssl-opt.sh
435 if [ -n "${SEED-}" ]; then
436 export SEED
437 fi
Andres AG7770ea82016-10-10 15:46:20 +0100438
Gilles Peskine8f073122018-11-27 15:58:47 +0100439 # Make sure the tools we need are available.
440 check_tools "$OPENSSL" "$OPENSSL_LEGACY" "$OPENSSL_NEXT" \
441 "$GNUTLS_CLI" "$GNUTLS_SERV" \
442 "$GNUTLS_LEGACY_CLI" "$GNUTLS_LEGACY_SERV" "doxygen" "dot" \
443 "arm-none-eabi-gcc" "i686-w64-mingw32-gcc" "gdb"
444 if [ $RUN_ARMCC -ne 0 ]; then
445 check_tools "$ARMC5_CC" "$ARMC5_AR" "$ARMC6_CC" "$ARMC6_AR"
446 fi
447}
Gilles Peskine192c72f2017-12-21 15:59:21 +0100448
449
450################################################################
451#### Basic checks
452################################################################
Andres AGd9eba4b2016-08-26 14:42:14 +0100453
SimonB2e23c822016-04-16 21:54:39 +0100454#
455# Test Suites to be executed
456#
Manuel Pégourié-Gonnard57255b12014-06-09 11:21:49 +0200457# The test ordering tries to optimize for the following criteria:
Manuel Pégourié-Gonnard89d69b32014-11-20 13:48:53 +0100458# 1. Catch possible problems early, by running first tests that run quickly
Manuel Pégourié-Gonnard61bc57a2014-08-14 11:29:06 +0200459# and/or are more likely to fail than others (eg I use Clang most of the
460# time, so start with a GCC build).
Manuel Pégourié-Gonnard57255b12014-06-09 11:21:49 +0200461# 2. Minimize total running time, by avoiding useless rebuilds
462#
463# Indicative running times are given for reference.
Manuel Pégourié-Gonnard80955ee2014-03-19 18:29:01 +0100464
Gilles Peskine8f073122018-11-27 15:58:47 +0100465pre_print_tools () {
466 msg "info: output_env.sh"
467 OPENSSL="$OPENSSL" OPENSSL_LEGACY="$OPENSSL_LEGACY" GNUTLS_CLI="$GNUTLS_CLI" \
468 GNUTLS_SERV="$GNUTLS_SERV" GNUTLS_LEGACY_CLI="$GNUTLS_LEGACY_CLI" \
469 GNUTLS_LEGACY_SERV="$GNUTLS_LEGACY_SERV" ARMC5_CC="$ARMC5_CC" \
470 ARMC6_CC="$ARMC6_CC" RUN_ARMCC="$RUN_ARMCC" scripts/output_env.sh
471}
Janos Follathb72c6782016-07-19 14:54:17 +0100472
Gilles Peskine8f073122018-11-27 15:58:47 +0100473component_check_recursion () {
474 msg "test: recursion.pl" # < 1s
475 record_status tests/scripts/recursion.pl library/*.c
476}
Manuel Pégourié-Gonnardea29d152014-11-20 17:32:33 +0100477
Gilles Peskine8f073122018-11-27 15:58:47 +0100478component_check_generated_files () {
479 msg "test: freshness of generated source files" # < 1s
480 record_status tests/scripts/check-generated-files.sh
481}
Manuel Pégourié-Gonnardb3b8e432015-02-13 14:52:19 +0000482
Gilles Peskine8f073122018-11-27 15:58:47 +0100483component_check_doxy_blocks () {
484 msg "test: doxygen markup outside doxygen blocks" # < 1s
485 record_status tests/scripts/check-doxy-blocks.pl
486}
Manuel Pégourié-Gonnardd09a6b52015-04-09 17:19:23 +0200487
Gilles Peskine8f073122018-11-27 15:58:47 +0100488component_check_files () {
489 msg "test: check-files.py" # < 1s
Gilles Peskine8f073122018-11-27 15:58:47 +0100490 record_status tests/scripts/check-files.py
491}
Darryl Greena07039c2018-03-13 16:48:16 +0000492
Gilles Peskine8f073122018-11-27 15:58:47 +0100493component_check_names () {
494 msg "test/build: declared and exported names" # < 3s
Gilles Peskine8f073122018-11-27 15:58:47 +0100495 record_status tests/scripts/check-names.sh
496}
Manuel Pégourié-Gonnarda687baf2015-04-09 11:09:03 +0200497
Gilles Peskine8f073122018-11-27 15:58:47 +0100498component_check_doxygen_warnings () {
499 msg "test: doxygen warnings" # ~ 3s
Gilles Peskine8f073122018-11-27 15:58:47 +0100500 record_status tests/scripts/doxygen.sh
501}
Manuel Pégourié-Gonnard1d552e72016-01-04 16:49:09 +0100502
Gilles Peskine192c72f2017-12-21 15:59:21 +0100503
504
505################################################################
506#### Build and test many configurations and targets
507################################################################
508
Gilles Peskine8f073122018-11-27 15:58:47 +0100509component_test_default_cmake_gcc_asan () {
510 msg "build: cmake, gcc, ASan" # ~ 1 min 50s
Gilles Peskine8f073122018-11-27 15:58:47 +0100511 CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
512 make
Manuel Pégourié-Gonnard3895f5a2014-03-27 14:44:04 +0100513
Gilles Peskine8f073122018-11-27 15:58:47 +0100514 msg "test: main suites (inc. selftests) (ASan build)" # ~ 50s
515 make test
Manuel Pégourié-Gonnard57255b12014-06-09 11:21:49 +0200516
Gilles Peskine8f073122018-11-27 15:58:47 +0100517 msg "test: ssl-opt.sh (ASan build)" # ~ 1 min
518 if_build_succeeded tests/ssl-opt.sh
Manuel Pégourié-Gonnard57255b12014-06-09 11:21:49 +0200519
Gilles Peskine8f073122018-11-27 15:58:47 +0100520 msg "test: compat.sh (ASan build)" # ~ 6 min
521 if_build_succeeded tests/compat.sh
522}
Manuel Pégourié-Gonnard57255b12014-06-09 11:21:49 +0200523
Gilles Peskine782f4112018-11-27 16:11:09 +0100524component_test_ref_configs () {
525 msg "test/build: ref-configs (ASan build)" # ~ 6 min 20s
526 CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
527 record_status tests/scripts/test-ref-configs.pl
528}
529
Gilles Peskine8f073122018-11-27 15:58:47 +0100530component_test_sslv3 () {
531 msg "build: Default + SSLv3 (ASan build)" # ~ 6 min
Gilles Peskine8f073122018-11-27 15:58:47 +0100532 scripts/config.pl set MBEDTLS_SSL_PROTO_SSL3
533 CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
534 make
Simon Butcher3ea7f522016-03-07 23:22:10 +0000535
Gilles Peskine8f073122018-11-27 15:58:47 +0100536 msg "test: SSLv3 - main suites (inc. selftests) (ASan build)" # ~ 50s
537 make test
Simon Butcher3ea7f522016-03-07 23:22:10 +0000538
Gilles Peskine8f073122018-11-27 15:58:47 +0100539 msg "build: SSLv3 - compat.sh (ASan build)" # ~ 6 min
540 if_build_succeeded tests/compat.sh -m 'tls1 tls1_1 tls1_2 dtls1 dtls1_2'
541 if_build_succeeded env OPENSSL_CMD="$OPENSSL_LEGACY" tests/compat.sh -m 'ssl3'
Simon Butcher3ea7f522016-03-07 23:22:10 +0000542
Gilles Peskine8f073122018-11-27 15:58:47 +0100543 msg "build: SSLv3 - ssl-opt.sh (ASan build)" # ~ 6 min
544 if_build_succeeded tests/ssl-opt.sh
545}
Simon Butcher3ea7f522016-03-07 23:22:10 +0000546
Gilles Peskine8f073122018-11-27 15:58:47 +0100547component_test_no_renegotiation () {
548 msg "build: Default + !MBEDTLS_SSL_RENEGOTIATION (ASan build)" # ~ 6 min
Gilles Peskine8f073122018-11-27 15:58:47 +0100549 scripts/config.pl unset MBEDTLS_SSL_RENEGOTIATION
550 CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
551 make
Hanno Becker134c2ab2017-10-12 15:29:50 +0100552
Gilles Peskine8f073122018-11-27 15:58:47 +0100553 msg "test: !MBEDTLS_SSL_RENEGOTIATION - main suites (inc. selftests) (ASan build)" # ~ 50s
554 make test
Hanno Becker134c2ab2017-10-12 15:29:50 +0100555
Gilles Peskine8f073122018-11-27 15:58:47 +0100556 msg "test: !MBEDTLS_SSL_RENEGOTIATION - ssl-opt.sh (ASan build)" # ~ 6 min
557 if_build_succeeded tests/ssl-opt.sh
558}
Manuel Pégourié-Gonnard246978d2014-11-20 13:29:53 +0100559
Gilles Peskine8f073122018-11-27 15:58:47 +0100560component_test_rsa_no_crt () {
561 msg "build: Default + RSA_NO_CRT (ASan build)" # ~ 6 min
Gilles Peskine8f073122018-11-27 15:58:47 +0100562 scripts/config.pl set MBEDTLS_RSA_NO_CRT
563 CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
564 make
Hanno Beckerd5ba5ef2017-09-28 12:53:51 +0100565
Gilles Peskine8f073122018-11-27 15:58:47 +0100566 msg "test: RSA_NO_CRT - main suites (inc. selftests) (ASan build)" # ~ 50s
567 make test
Hanno Beckerd5ba5ef2017-09-28 12:53:51 +0100568
Gilles Peskine8f073122018-11-27 15:58:47 +0100569 msg "test: RSA_NO_CRT - RSA-related part of ssl-opt.sh (ASan build)" # ~ 5s
570 if_build_succeeded tests/ssl-opt.sh -f RSA
Hanno Beckerd5ba5ef2017-09-28 12:53:51 +0100571
Gilles Peskine8f073122018-11-27 15:58:47 +0100572 msg "test: RSA_NO_CRT - RSA-related part of compat.sh (ASan build)" # ~ 3 min
573 if_build_succeeded tests/compat.sh -t RSA
574}
Hanno Beckerd5ba5ef2017-09-28 12:53:51 +0100575
Gilles Peskine8f073122018-11-27 15:58:47 +0100576component_test_small_ssl_out_content_len () {
577 msg "build: small SSL_OUT_CONTENT_LEN (ASan build)"
Gilles Peskine8f073122018-11-27 15:58:47 +0100578 scripts/config.pl set MBEDTLS_SSL_IN_CONTENT_LEN 16384
579 scripts/config.pl set MBEDTLS_SSL_OUT_CONTENT_LEN 4096
580 CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
581 make
Angus Grattonc4dd0732018-04-11 16:28:39 +1000582
Gilles Peskine8f073122018-11-27 15:58:47 +0100583 msg "test: small SSL_OUT_CONTENT_LEN - ssl-opt.sh MFL and large packet tests"
584 if_build_succeeded tests/ssl-opt.sh -f "Max fragment\|Large packet"
585}
Angus Grattonc4dd0732018-04-11 16:28:39 +1000586
Gilles Peskine8f073122018-11-27 15:58:47 +0100587component_test_small_ssl_in_content_len () {
588 msg "build: small SSL_IN_CONTENT_LEN (ASan build)"
Gilles Peskine8f073122018-11-27 15:58:47 +0100589 scripts/config.pl set MBEDTLS_SSL_IN_CONTENT_LEN 4096
590 scripts/config.pl set MBEDTLS_SSL_OUT_CONTENT_LEN 16384
591 CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
592 make
Angus Grattonc4dd0732018-04-11 16:28:39 +1000593
Gilles Peskine8f073122018-11-27 15:58:47 +0100594 msg "test: small SSL_IN_CONTENT_LEN - ssl-opt.sh MFL tests"
595 if_build_succeeded tests/ssl-opt.sh -f "Max fragment"
596}
Angus Grattonc4dd0732018-04-11 16:28:39 +1000597
Gilles Peskine8f073122018-11-27 15:58:47 +0100598component_test_small_ssl_dtls_max_buffering () {
599 msg "build: small MBEDTLS_SSL_DTLS_MAX_BUFFERING #0"
Gilles Peskine8f073122018-11-27 15:58:47 +0100600 scripts/config.pl set MBEDTLS_SSL_DTLS_MAX_BUFFERING 1000
601 CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
602 make
Hanno Becker2f5aa4c2018-08-24 14:43:44 +0100603
Gilles Peskine8f073122018-11-27 15:58:47 +0100604 msg "test: small MBEDTLS_SSL_DTLS_MAX_BUFFERING #0 - ssl-opt.sh specific reordering test"
605 if_build_succeeded tests/ssl-opt.sh -f "DTLS reordering: Buffer out-of-order hs msg before reassembling next, free buffered msg"
606}
Hanno Becker2f5aa4c2018-08-24 14:43:44 +0100607
Gilles Peskine8f073122018-11-27 15:58:47 +0100608component_test_small_mbedtls_ssl_dtls_max_buffering () {
609 msg "build: small MBEDTLS_SSL_DTLS_MAX_BUFFERING #1"
Gilles Peskine8f073122018-11-27 15:58:47 +0100610 scripts/config.pl set MBEDTLS_SSL_DTLS_MAX_BUFFERING 240
611 CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
612 make
Hanno Becker2f5aa4c2018-08-24 14:43:44 +0100613
Gilles Peskine8f073122018-11-27 15:58:47 +0100614 msg "test: small MBEDTLS_SSL_DTLS_MAX_BUFFERING #1 - ssl-opt.sh specific reordering test"
615 if_build_succeeded tests/ssl-opt.sh -f "DTLS reordering: Buffer encrypted Finished message, drop for fragmented NewSessionTicket"
616}
Hanno Becker2f5aa4c2018-08-24 14:43:44 +0100617
Gilles Peskine8f073122018-11-27 15:58:47 +0100618component_test_full_cmake_clang () {
619 msg "build: cmake, full config, clang" # ~ 50s
Gilles Peskine8f073122018-11-27 15:58:47 +0100620 scripts/config.pl full
621 scripts/config.pl unset MBEDTLS_MEMORY_BACKTRACE # too slow for tests
622 CC=clang cmake -D CMAKE_BUILD_TYPE:String=Check -D ENABLE_TESTING=On .
623 make
Manuel Pégourié-Gonnard3895f5a2014-03-27 14:44:04 +0100624
Gilles Peskine8f073122018-11-27 15:58:47 +0100625 msg "test: main suites (full config)" # ~ 5s
626 make test
Manuel Pégourié-Gonnarde73b2632014-07-12 04:00:00 +0200627
Gilles Peskine8f073122018-11-27 15:58:47 +0100628 msg "test: ssl-opt.sh default, ECJPAKE, SSL async (full config)" # ~ 1s
629 if_build_succeeded tests/ssl-opt.sh -f 'Default\|ECJPAKE\|SSL async private'
Manuel Pégourié-Gonnarde73b2632014-07-12 04:00:00 +0200630
Gilles Peskine8f073122018-11-27 15:58:47 +0100631 msg "test: compat.sh RC4, DES & NULL (full config)" # ~ 2 min
632 if_build_succeeded env OPENSSL_CMD="$OPENSSL_LEGACY" GNUTLS_CLI="$GNUTLS_LEGACY_CLI" GNUTLS_SERV="$GNUTLS_LEGACY_SERV" tests/compat.sh -e '3DES\|DES-CBC3' -f 'NULL\|DES\|RC4\|ARCFOUR'
Manuel Pégourié-Gonnarde73b2632014-07-12 04:00:00 +0200633
Gilles Peskine8f073122018-11-27 15:58:47 +0100634 msg "test: compat.sh ARIA + ChachaPoly"
635 if_build_succeeded env OPENSSL_CMD="$OPENSSL_NEXT" tests/compat.sh -e '^$' -f 'ARIA\|CHACHA'
636}
Manuel Pégourié-Gonnard6b368922018-02-20 12:02:07 +0100637
Gilles Peskine8f073122018-11-27 15:58:47 +0100638component_build_deprecated () {
639 msg "build: make, full config + DEPRECATED_WARNING, gcc -O" # ~ 30s
Gilles Peskine8f073122018-11-27 15:58:47 +0100640 scripts/config.pl full
641 scripts/config.pl set MBEDTLS_DEPRECATED_WARNING
642 # Build with -O -Wextra to catch a maximum of issues.
643 make CC=gcc CFLAGS='-O -Werror -Wall -Wextra' lib programs
644 make CC=gcc CFLAGS='-O -Werror -Wall -Wextra -Wno-unused-function' tests
Gilles Peskineb4ef45b2018-03-01 22:23:50 +0100645
Gilles Peskine8f073122018-11-27 15:58:47 +0100646 msg "build: make, full config + DEPRECATED_REMOVED, clang -O" # ~ 30s
647 # No cleanup, just tweak the configuration and rebuild
648 make clean
649 scripts/config.pl unset MBEDTLS_DEPRECATED_WARNING
650 scripts/config.pl set MBEDTLS_DEPRECATED_REMOVED
651 # Build with -O -Wextra to catch a maximum of issues.
652 make CC=clang CFLAGS='-O -Werror -Wall -Wextra' lib programs
653 make CC=clang CFLAGS='-O -Werror -Wall -Wextra -Wno-unused-function' tests
654}
Gilles Peskine0afe6242018-02-21 19:28:12 +0100655
Manuel Pégourié-Gonnarde73b2632014-07-12 04:00:00 +0200656
Gilles Peskine8f073122018-11-27 15:58:47 +0100657component_test_depends_curves () {
658 msg "test/build: curves.pl (gcc)" # ~ 4 min
Gilles Peskine8f073122018-11-27 15:58:47 +0100659 record_status tests/scripts/curves.pl
660}
Manuel Pégourié-Gonnard1fe6bb92017-06-06 11:36:16 +0200661
Gilles Peskine8f073122018-11-27 15:58:47 +0100662component_test_depends_hashes () {
663 msg "test/build: depends-hashes.pl (gcc)" # ~ 2 min
Gilles Peskine8f073122018-11-27 15:58:47 +0100664 record_status tests/scripts/depends-hashes.pl
665}
Manuel Pégourié-Gonnard43be6cd2017-06-20 09:53:42 +0200666
Gilles Peskine8f073122018-11-27 15:58:47 +0100667component_test_depends_pkalgs () {
668 msg "test/build: depends-pkalgs.pl (gcc)" # ~ 2 min
Gilles Peskine8f073122018-11-27 15:58:47 +0100669 record_status tests/scripts/depends-pkalgs.pl
670}
Manuel Pégourié-Gonnard503a5ef2015-10-23 09:04:45 +0200671
Gilles Peskine8f073122018-11-27 15:58:47 +0100672component_build_key_exchanges () {
673 msg "test/build: key-exchanges (gcc)" # ~ 1 min
Gilles Peskine8f073122018-11-27 15:58:47 +0100674 record_status tests/scripts/key-exchanges.pl
675}
Manuel Pégourié-Gonnard80955ee2014-03-19 18:29:01 +0100676
Gilles Peskine8f073122018-11-27 15:58:47 +0100677component_build_default_make_gcc_and_cxx () {
678 msg "build: Unix make, -Os (gcc)" # ~ 30s
Gilles Peskine8f073122018-11-27 15:58:47 +0100679 make CC=gcc CFLAGS='-Werror -Wall -Wextra -Os'
Andrzej Kurek991f9fe2018-07-02 09:08:21 -0400680
Gilles Peskine8f073122018-11-27 15:58:47 +0100681 msg "test: verify header list in cpp_dummy_build.cpp"
682 record_status check_headers_in_cpp
Andrzej Kurek991f9fe2018-07-02 09:08:21 -0400683
Gilles Peskine8f073122018-11-27 15:58:47 +0100684 msg "build: Unix make, incremental g++"
685 make TEST_CPP=1
686}
Manuel Pégourié-Gonnarda71780e2015-02-13 13:56:55 +0000687
Gilles Peskine8f073122018-11-27 15:58:47 +0100688component_test_no_platform () {
689 # Full configuration build, without platform support, file IO and net sockets.
690 # This should catch missing mbedtls_printf definitions, and by disabling file
691 # IO, it should catch missing '#include <stdio.h>'
692 msg "build: full config except platform/fsio/net, make, gcc, C99" # ~ 30s
Gilles Peskine8f073122018-11-27 15:58:47 +0100693 scripts/config.pl full
694 scripts/config.pl unset MBEDTLS_PLATFORM_C
695 scripts/config.pl unset MBEDTLS_NET_C
696 scripts/config.pl unset MBEDTLS_PLATFORM_MEMORY
697 scripts/config.pl unset MBEDTLS_PLATFORM_PRINTF_ALT
698 scripts/config.pl unset MBEDTLS_PLATFORM_FPRINTF_ALT
699 scripts/config.pl unset MBEDTLS_PLATFORM_SNPRINTF_ALT
700 scripts/config.pl unset MBEDTLS_PLATFORM_TIME_ALT
701 scripts/config.pl unset MBEDTLS_PLATFORM_EXIT_ALT
702 scripts/config.pl unset MBEDTLS_ENTROPY_NV_SEED
703 scripts/config.pl unset MBEDTLS_MEMORY_BUFFER_ALLOC_C
704 scripts/config.pl unset MBEDTLS_FS_IO
705 # Note, _DEFAULT_SOURCE needs to be defined for platforms using glibc version >2.19,
706 # to re-enable platform integration features otherwise disabled in C99 builds
707 make CC=gcc CFLAGS='-Werror -Wall -Wextra -std=c99 -pedantic -O0 -D_DEFAULT_SOURCE' lib programs
708 make CC=gcc CFLAGS='-Werror -Wall -Wextra -O0' test
709}
Manuel Pégourié-Gonnarddccb80b2015-06-03 10:20:33 +0100710
Gilles Peskine8f073122018-11-27 15:58:47 +0100711component_build_no_std_function () {
712 # catch compile bugs in _uninit functions
713 msg "build: full config with NO_STD_FUNCTION, make, gcc" # ~ 30s
Gilles Peskine8f073122018-11-27 15:58:47 +0100714 scripts/config.pl full
715 scripts/config.pl set MBEDTLS_PLATFORM_NO_STD_FUNCTIONS
716 scripts/config.pl unset MBEDTLS_ENTROPY_NV_SEED
717 make CC=gcc CFLAGS='-Werror -Wall -Wextra -O0'
718}
Manuel Pégourié-Gonnard66b8e952015-05-20 11:13:56 +0200719
Gilles Peskine8f073122018-11-27 15:58:47 +0100720component_build_no_ssl_srv () {
721 msg "build: full config except ssl_srv.c, make, gcc" # ~ 30s
Gilles Peskine8f073122018-11-27 15:58:47 +0100722 scripts/config.pl full
723 scripts/config.pl unset MBEDTLS_SSL_SRV_C
724 make CC=gcc CFLAGS='-Werror -Wall -Wextra -O0'
725}
Manuel Pégourié-Gonnard66b8e952015-05-20 11:13:56 +0200726
Gilles Peskine8f073122018-11-27 15:58:47 +0100727component_build_no_ssl_cli () {
728 msg "build: full config except ssl_cli.c, make, gcc" # ~ 30s
Gilles Peskine8f073122018-11-27 15:58:47 +0100729 scripts/config.pl full
730 scripts/config.pl unset MBEDTLS_SSL_CLI_C
731 make CC=gcc CFLAGS='-Werror -Wall -Wextra -O0'
732}
Manuel Pégourié-Gonnard009a2642015-05-29 10:31:13 +0200733
Gilles Peskine8f073122018-11-27 15:58:47 +0100734component_build_no_sockets () {
735 # Note, C99 compliance can also be tested with the sockets support disabled,
736 # as that requires a POSIX platform (which isn't the same as C99).
737 msg "build: full config except net_sockets.c, make, gcc -std=c99 -pedantic" # ~ 30s
Gilles Peskine8f073122018-11-27 15:58:47 +0100738 scripts/config.pl full
739 scripts/config.pl unset MBEDTLS_NET_C # getaddrinfo() undeclared, etc.
740 scripts/config.pl set MBEDTLS_NO_PLATFORM_ENTROPY # uses syscall() on GNU/Linux
741 make CC=gcc CFLAGS='-Werror -Wall -Wextra -O0 -std=c99 -pedantic' lib
742}
Hanno Becker5175ac62017-09-18 15:36:25 +0100743
Gilles Peskine8f073122018-11-27 15:58:47 +0100744component_test_no_max_fragment_length () {
745 # Run max fragment length tests with MFL disabled
746 msg "build: default config except MFL extension (ASan build)" # ~ 30s
Gilles Peskine8f073122018-11-27 15:58:47 +0100747 scripts/config.pl unset MBEDTLS_SSL_MAX_FRAGMENT_LENGTH
748 CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
749 make
Manuel Pégourié-Gonnardedb2dc92015-02-10 14:36:31 +0000750
Gilles Peskine8f073122018-11-27 15:58:47 +0100751 msg "test: ssl-opt.sh, MFL-related tests"
752 if_build_succeeded tests/ssl-opt.sh -f "Max fragment length"
753}
Angus Grattonc4dd0732018-04-11 16:28:39 +1000754
Gilles Peskine8f073122018-11-27 15:58:47 +0100755component_test_no_max_fragment_length_small_ssl_out_content_len () {
756 msg "build: no MFL extension, small SSL_OUT_CONTENT_LEN (ASan build)"
Gilles Peskine8f073122018-11-27 15:58:47 +0100757 scripts/config.pl unset MBEDTLS_SSL_MAX_FRAGMENT_LENGTH
758 scripts/config.pl set MBEDTLS_SSL_IN_CONTENT_LEN 16384
759 scripts/config.pl set MBEDTLS_SSL_OUT_CONTENT_LEN 4096
760 CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
761 make
Angus Grattonc4dd0732018-04-11 16:28:39 +1000762
Gilles Peskine8f073122018-11-27 15:58:47 +0100763 msg "test: MFL tests (disabled MFL extension case) & large packet tests"
764 if_build_succeeded tests/ssl-opt.sh -f "Max fragment length\|Large buffer"
765}
Janos Follath06c54002016-06-09 13:57:40 +0100766
Gilles Peskine8f073122018-11-27 15:58:47 +0100767component_test_null_entropy () {
768 msg "build: default config with MBEDTLS_TEST_NULL_ENTROPY (ASan build)"
Gilles Peskine8f073122018-11-27 15:58:47 +0100769 scripts/config.pl set MBEDTLS_TEST_NULL_ENTROPY
770 scripts/config.pl set MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES
771 scripts/config.pl set MBEDTLS_ENTROPY_C
772 scripts/config.pl unset MBEDTLS_ENTROPY_NV_SEED
773 scripts/config.pl unset MBEDTLS_ENTROPY_HARDWARE_ALT
774 scripts/config.pl unset MBEDTLS_HAVEGE_C
775 CC=gcc cmake -D UNSAFE_BUILD=ON -D CMAKE_C_FLAGS:String="-fsanitize=address -fno-common -O3" .
776 make
Janos Follath06c54002016-06-09 13:57:40 +0100777
Gilles Peskine8f073122018-11-27 15:58:47 +0100778 msg "test: MBEDTLS_TEST_NULL_ENTROPY - main suites (inc. selftests) (ASan build)"
779 make test
780}
Hanno Beckere5fecec2018-10-11 11:02:52 +0100781
Gilles Peskine8f073122018-11-27 15:58:47 +0100782component_test_platform_calloc_macro () {
783 msg "build: MBEDTLS_PLATFORM_{CALLOC/FREE}_MACRO enabled (ASan build)"
Gilles Peskine8f073122018-11-27 15:58:47 +0100784 scripts/config.pl set MBEDTLS_PLATFORM_MEMORY
785 scripts/config.pl set MBEDTLS_PLATFORM_CALLOC_MACRO calloc
786 scripts/config.pl set MBEDTLS_PLATFORM_FREE_MACRO free
787 CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
788 make
Hanno Beckere5fecec2018-10-11 11:02:52 +0100789
Gilles Peskine8f073122018-11-27 15:58:47 +0100790 msg "test: MBEDTLS_PLATFORM_{CALLOC/FREE}_MACRO enabled (ASan build)"
791 make test
792}
Hanno Becker83ebf782017-07-07 12:29:15 +0100793
Gilles Peskine8f073122018-11-27 15:58:47 +0100794component_test_aes_fewer_tables () {
795 msg "build: default config with AES_FEWER_TABLES enabled"
Gilles Peskine8f073122018-11-27 15:58:47 +0100796 scripts/config.pl set MBEDTLS_AES_FEWER_TABLES
797 make CC=gcc CFLAGS='-Werror -Wall -Wextra'
Hanno Becker83ebf782017-07-07 12:29:15 +0100798
Gilles Peskine8f073122018-11-27 15:58:47 +0100799 msg "test: AES_FEWER_TABLES"
800 make test
801}
Hanno Becker83ebf782017-07-07 12:29:15 +0100802
Gilles Peskine8f073122018-11-27 15:58:47 +0100803component_test_aes_rom_tables () {
804 msg "build: default config with AES_ROM_TABLES enabled"
Gilles Peskine8f073122018-11-27 15:58:47 +0100805 scripts/config.pl set MBEDTLS_AES_ROM_TABLES
806 make CC=gcc CFLAGS='-Werror -Wall -Wextra'
Hanno Becker83ebf782017-07-07 12:29:15 +0100807
Gilles Peskine8f073122018-11-27 15:58:47 +0100808 msg "test: AES_ROM_TABLES"
809 make test
810}
Hanno Becker83ebf782017-07-07 12:29:15 +0100811
Gilles Peskine8f073122018-11-27 15:58:47 +0100812component_test_aes_fewer_tables_and_rom_tables () {
813 msg "build: default config with AES_ROM_TABLES and AES_FEWER_TABLES enabled"
Gilles Peskine8f073122018-11-27 15:58:47 +0100814 scripts/config.pl set MBEDTLS_AES_FEWER_TABLES
815 scripts/config.pl set MBEDTLS_AES_ROM_TABLES
816 make CC=gcc CFLAGS='-Werror -Wall -Wextra'
Hanno Becker83ebf782017-07-07 12:29:15 +0100817
Gilles Peskine8f073122018-11-27 15:58:47 +0100818 msg "test: AES_FEWER_TABLES + AES_ROM_TABLES"
819 make test
820}
821
822component_test_make_shared () {
Gilles Peskine7ad603e2017-12-10 23:22:20 +0100823 msg "build/test: make shared" # ~ 40s
Gilles Peskine7ad603e2017-12-10 23:22:20 +0100824 make SHARED=1 all check
Gilles Peskine8f073122018-11-27 15:58:47 +0100825}
Manuel Pégourié-Gonnard9b06abe2015-06-25 09:56:07 +0200826
Gilles Peskine8f073122018-11-27 15:58:47 +0100827component_test_m32_o0 () {
Simon Butcher8e6a22a2018-07-20 21:27:33 +0100828 # Build once with -O0, to compile out the i386 specific inline assembly
829 msg "build: i386, make, gcc -O0 (ASan build)" # ~ 30s
Simon Butcher7a6da6e2018-06-27 21:52:54 +0100830 scripts/config.pl full
Simon Butcher8e6a22a2018-07-20 21:27:33 +0100831 make CC=gcc CFLAGS='-O0 -Werror -Wall -Wextra -m32 -fsanitize=address'
Andres Amaya Garcia84e6ce82017-05-04 11:35:51 +0100832
Simon Butcher8e6a22a2018-07-20 21:27:33 +0100833 msg "test: i386, make, gcc -O0 (ASan build)"
834 make test
Gilles Peskine8f073122018-11-27 15:58:47 +0100835}
Simon Butcher8e6a22a2018-07-20 21:27:33 +0100836
Gilles Peskine8f073122018-11-27 15:58:47 +0100837component_test_m32_o1 () {
Simon Butcher8e6a22a2018-07-20 21:27:33 +0100838 # Build again with -O1, to compile in the i386 specific inline assembly
839 msg "build: i386, make, gcc -O1 (ASan build)" # ~ 30s
Simon Butcher8e6a22a2018-07-20 21:27:33 +0100840 scripts/config.pl full
841 make CC=gcc CFLAGS='-O1 -Werror -Wall -Wextra -m32 -fsanitize=address'
842
843 msg "test: i386, make, gcc -O1 (ASan build)"
Andres Amaya Garciaf4fbdda2017-05-08 11:19:19 +0100844 make test
Gilles Peskine8f073122018-11-27 15:58:47 +0100845}
Andres Amaya Garciaf4fbdda2017-05-08 11:19:19 +0100846
Gilles Peskine8f073122018-11-27 15:58:47 +0100847component_test_mx32 () {
Andres Amaya Garciaf4fbdda2017-05-08 11:19:19 +0100848 msg "build: 64-bit ILP32, make, gcc" # ~ 30s
Simon Butcher7a6da6e2018-06-27 21:52:54 +0100849 scripts/config.pl full
Andres Amaya Garciaf4fbdda2017-05-08 11:19:19 +0100850 make CC=gcc CFLAGS='-Werror -Wall -Wextra -mx32'
851
852 msg "test: 64-bit ILP32, make, gcc"
853 make test
Gilles Peskine8f073122018-11-27 15:58:47 +0100854}
Manuel Pégourié-Gonnardedb2dc92015-02-10 14:36:31 +0000855
Gilles Peskine8f073122018-11-27 15:58:47 +0100856component_test_have_int32 () {
857 msg "build: gcc, force 32-bit bignum limbs"
Gilles Peskine8f073122018-11-27 15:58:47 +0100858 scripts/config.pl unset MBEDTLS_HAVE_ASM
859 scripts/config.pl unset MBEDTLS_AESNI_C
860 scripts/config.pl unset MBEDTLS_PADLOCK_C
861 make CC=gcc CFLAGS='-Werror -Wall -Wextra -DMBEDTLS_HAVE_INT32'
Andres Amaya Garcia84e6ce82017-05-04 11:35:51 +0100862
Gilles Peskine8f073122018-11-27 15:58:47 +0100863 msg "test: gcc, force 32-bit bignum limbs"
864 make test
865}
Andres Amaya Garciafe843a32017-07-20 13:21:34 +0100866
Gilles Peskine8f073122018-11-27 15:58:47 +0100867component_test_have_int64 () {
868 msg "build: gcc, force 64-bit bignum limbs"
Gilles Peskine8f073122018-11-27 15:58:47 +0100869 scripts/config.pl unset MBEDTLS_HAVE_ASM
870 scripts/config.pl unset MBEDTLS_AESNI_C
871 scripts/config.pl unset MBEDTLS_PADLOCK_C
872 make CC=gcc CFLAGS='-Werror -Wall -Wextra -DMBEDTLS_HAVE_INT64'
Gilles Peskine14c3c062018-01-29 21:25:12 +0100873
Gilles Peskine8f073122018-11-27 15:58:47 +0100874 msg "test: gcc, force 64-bit bignum limbs"
875 make test
876}
Manuel Pégourié-Gonnardedb2dc92015-02-10 14:36:31 +0000877
Gilles Peskine8f073122018-11-27 15:58:47 +0100878component_test_no_udbl_division () {
879 msg "build: MBEDTLS_NO_UDBL_DIVISION native" # ~ 10s
Gilles Peskine8f073122018-11-27 15:58:47 +0100880 scripts/config.pl full
881 scripts/config.pl unset MBEDTLS_MEMORY_BACKTRACE # too slow for tests
882 scripts/config.pl set MBEDTLS_NO_UDBL_DIVISION
883 make CFLAGS='-Werror -O1'
Manuel Pégourié-Gonnard2adb3752018-06-07 10:51:44 +0200884
Gilles Peskine8f073122018-11-27 15:58:47 +0100885 msg "test: MBEDTLS_NO_UDBL_DIVISION native" # ~ 10s
886 make test
887}
Manuel Pégourié-Gonnard2adb3752018-06-07 10:51:44 +0200888
Gilles Peskine8f073122018-11-27 15:58:47 +0100889component_test_no_64bit_multiplication () {
890 msg "build: MBEDTLS_NO_64BIT_MULTIPLICATION native" # ~ 10s
Gilles Peskine8f073122018-11-27 15:58:47 +0100891 scripts/config.pl full
892 scripts/config.pl unset MBEDTLS_MEMORY_BACKTRACE # too slow for tests
893 scripts/config.pl set MBEDTLS_NO_64BIT_MULTIPLICATION
894 make CFLAGS='-Werror -O1'
Manuel Pégourié-Gonnard2adb3752018-06-07 10:51:44 +0200895
Gilles Peskine8f073122018-11-27 15:58:47 +0100896 msg "test: MBEDTLS_NO_64BIT_MULTIPLICATION native" # ~ 10s
897 make test
898}
Manuel Pégourié-Gonnard2adb3752018-06-07 10:51:44 +0200899
Gilles Peskine8f073122018-11-27 15:58:47 +0100900component_build_arm_none_eabi_gcc () {
901 msg "build: arm-none-eabi-gcc, make" # ~ 10s
Gilles Peskine8f073122018-11-27 15:58:47 +0100902 scripts/config.pl full
903 scripts/config.pl unset MBEDTLS_NET_C
904 scripts/config.pl unset MBEDTLS_TIMING_C
905 scripts/config.pl unset MBEDTLS_FS_IO
906 scripts/config.pl unset MBEDTLS_ENTROPY_NV_SEED
907 scripts/config.pl set MBEDTLS_NO_PLATFORM_ENTROPY
908 # following things are not in the default config
909 scripts/config.pl unset MBEDTLS_HAVEGE_C # depends on timing.c
910 scripts/config.pl unset MBEDTLS_THREADING_PTHREAD
911 scripts/config.pl unset MBEDTLS_THREADING_C
912 scripts/config.pl unset MBEDTLS_MEMORY_BACKTRACE # execinfo.h
913 scripts/config.pl unset MBEDTLS_MEMORY_BUFFER_ALLOC_C # calls exit
914 make CC=arm-none-eabi-gcc AR=arm-none-eabi-ar LD=arm-none-eabi-ld CFLAGS='-Werror -Wall -Wextra' lib
915}
Manuel Pégourié-Gonnard2adb3752018-06-07 10:51:44 +0200916
Gilles Peskine8f073122018-11-27 15:58:47 +0100917component_build_arm_none_eabi_gcc_no_udbl_division () {
918 msg "build: arm-none-eabi-gcc -DMBEDTLS_NO_UDBL_DIVISION, make" # ~ 10s
Gilles Peskine8f073122018-11-27 15:58:47 +0100919 scripts/config.pl full
920 scripts/config.pl unset MBEDTLS_NET_C
921 scripts/config.pl unset MBEDTLS_TIMING_C
922 scripts/config.pl unset MBEDTLS_FS_IO
923 scripts/config.pl unset MBEDTLS_ENTROPY_NV_SEED
924 scripts/config.pl set MBEDTLS_NO_PLATFORM_ENTROPY
925 # following things are not in the default config
926 scripts/config.pl unset MBEDTLS_HAVEGE_C # depends on timing.c
927 scripts/config.pl unset MBEDTLS_THREADING_PTHREAD
928 scripts/config.pl unset MBEDTLS_THREADING_C
929 scripts/config.pl unset MBEDTLS_MEMORY_BACKTRACE # execinfo.h
930 scripts/config.pl unset MBEDTLS_MEMORY_BUFFER_ALLOC_C # calls exit
931 scripts/config.pl set MBEDTLS_NO_UDBL_DIVISION
932 make CC=arm-none-eabi-gcc AR=arm-none-eabi-ar LD=arm-none-eabi-ld CFLAGS='-Werror -Wall -Wextra' lib
933 echo "Checking that software 64-bit division is not required"
934 if_build_succeeded not grep __aeabi_uldiv library/*.o
935}
Manuel Pégourié-Gonnard2adb3752018-06-07 10:51:44 +0200936
Gilles Peskine8f073122018-11-27 15:58:47 +0100937component_build_arm_none_eabi_gcc_no_64bit_multiplication () {
938 msg "build: arm-none-eabi-gcc MBEDTLS_NO_64BIT_MULTIPLICATION, make" # ~ 10s
Gilles Peskine8f073122018-11-27 15:58:47 +0100939 scripts/config.pl full
940 scripts/config.pl unset MBEDTLS_NET_C
941 scripts/config.pl unset MBEDTLS_TIMING_C
942 scripts/config.pl unset MBEDTLS_FS_IO
943 scripts/config.pl unset MBEDTLS_ENTROPY_NV_SEED
944 scripts/config.pl set MBEDTLS_NO_PLATFORM_ENTROPY
945 # following things are not in the default config
946 scripts/config.pl unset MBEDTLS_HAVEGE_C # depends on timing.c
947 scripts/config.pl unset MBEDTLS_THREADING_PTHREAD
948 scripts/config.pl unset MBEDTLS_THREADING_C
949 scripts/config.pl unset MBEDTLS_MEMORY_BACKTRACE # execinfo.h
950 scripts/config.pl unset MBEDTLS_MEMORY_BUFFER_ALLOC_C # calls exit
951 scripts/config.pl set MBEDTLS_NO_64BIT_MULTIPLICATION
952 make CC=arm-none-eabi-gcc AR=arm-none-eabi-ar LD=arm-none-eabi-ld CFLAGS='-Werror -O1 -march=armv6-m -mthumb' lib
953 echo "Checking that software 64-bit multiplication is not required"
954 if_build_succeeded not grep __aeabi_lmul library/*.o
955}
Manuel Pégourié-Gonnard2adb3752018-06-07 10:51:44 +0200956
Gilles Peskine8f073122018-11-27 15:58:47 +0100957component_build_armcc () {
958 msg "build: ARM Compiler 5, make"
Gilles Peskine8f073122018-11-27 15:58:47 +0100959 scripts/config.pl full
960 scripts/config.pl unset MBEDTLS_NET_C
961 scripts/config.pl unset MBEDTLS_TIMING_C
962 scripts/config.pl unset MBEDTLS_FS_IO
963 scripts/config.pl unset MBEDTLS_ENTROPY_NV_SEED
964 scripts/config.pl unset MBEDTLS_HAVE_TIME
965 scripts/config.pl unset MBEDTLS_HAVE_TIME_DATE
966 scripts/config.pl set MBEDTLS_NO_PLATFORM_ENTROPY
967 # following things are not in the default config
968 scripts/config.pl unset MBEDTLS_DEPRECATED_WARNING
969 scripts/config.pl unset MBEDTLS_HAVEGE_C # depends on timing.c
970 scripts/config.pl unset MBEDTLS_THREADING_PTHREAD
971 scripts/config.pl unset MBEDTLS_THREADING_C
972 scripts/config.pl unset MBEDTLS_MEMORY_BACKTRACE # execinfo.h
973 scripts/config.pl unset MBEDTLS_MEMORY_BUFFER_ALLOC_C # calls exit
974 scripts/config.pl unset MBEDTLS_PLATFORM_TIME_ALT # depends on MBEDTLS_HAVE_TIME
Manuel Pégourié-Gonnardedb2dc92015-02-10 14:36:31 +0000975
Gilles Peskine8f073122018-11-27 15:58:47 +0100976 if [ $RUN_ARMCC -ne 0 ]; then
977 make CC="$ARMC5_CC" AR="$ARMC5_AR" WARNING_CFLAGS='--strict --c99' lib
978 make clean
Manuel Pégourié-Gonnard2adb3752018-06-07 10:51:44 +0200979
Gilles Peskine8f073122018-11-27 15:58:47 +0100980 # ARM Compiler 6 - Target ARMv7-A
981 armc6_build_test "--target=arm-arm-none-eabi -march=armv7-a"
Gilles Peskineed942f82017-06-08 15:19:20 +0200982
Gilles Peskine8f073122018-11-27 15:58:47 +0100983 # ARM Compiler 6 - Target ARMv7-M
984 armc6_build_test "--target=arm-arm-none-eabi -march=armv7-m"
Andres AG87bb5772016-09-27 15:05:15 +0100985
Gilles Peskine8f073122018-11-27 15:58:47 +0100986 # ARM Compiler 6 - Target ARMv8-A - AArch32
987 armc6_build_test "--target=arm-arm-none-eabi -march=armv8.2-a"
Andres AG87bb5772016-09-27 15:05:15 +0100988
Gilles Peskine8f073122018-11-27 15:58:47 +0100989 # ARM Compiler 6 - Target ARMv8-M
990 armc6_build_test "--target=arm-arm-none-eabi -march=armv8-m.main"
Simon Butcher940737f2017-07-23 13:42:36 +0200991
Gilles Peskine8f073122018-11-27 15:58:47 +0100992 # ARM Compiler 6 - Target ARMv8-A - AArch64
993 armc6_build_test "--target=aarch64-arm-none-eabi -march=armv8.2-a"
994 fi
995}
Simon Butcher940737f2017-07-23 13:42:36 +0200996
Gilles Peskine8f073122018-11-27 15:58:47 +0100997component_test_allow_sha1 () {
998 msg "build: allow SHA1 in certificates by default"
Gilles Peskine8f073122018-11-27 15:58:47 +0100999 scripts/config.pl set MBEDTLS_TLS_DEFAULT_ALLOW_SHA1_IN_CERTIFICATES
1000 make CFLAGS='-Werror -Wall -Wextra'
1001 msg "test: allow SHA1 in certificates by default"
1002 make test
1003 if_build_succeeded tests/ssl-opt.sh -f SHA-1
1004}
Simon Butcher940737f2017-07-23 13:42:36 +02001005
Gilles Peskine8f073122018-11-27 15:58:47 +01001006component_build_mingw () {
1007 msg "build: Windows cross build - mingw64, make (Link Library)" # ~ 30s
Gilles Peskine8f073122018-11-27 15:58:47 +01001008 make CC=i686-w64-mingw32-gcc AR=i686-w64-mingw32-ar LD=i686-w64-minggw32-ld CFLAGS='-Werror -Wall -Wextra' WINDOWS_BUILD=1 lib programs
Gilles Peskine2a458da2017-05-12 15:26:58 +02001009
Gilles Peskine8f073122018-11-27 15:58:47 +01001010 # note Make tests only builds the tests, but doesn't run them
1011 make CC=i686-w64-mingw32-gcc AR=i686-w64-mingw32-ar LD=i686-w64-minggw32-ld CFLAGS='-Werror' WINDOWS_BUILD=1 tests
1012 make WINDOWS_BUILD=1 clean
Hanno Beckere963efa2018-01-03 10:03:43 +00001013
Gilles Peskine8f073122018-11-27 15:58:47 +01001014 msg "build: Windows cross build - mingw64, make (DLL)" # ~ 30s
1015 make CC=i686-w64-mingw32-gcc AR=i686-w64-mingw32-ar LD=i686-w64-minggw32-ld CFLAGS='-Werror -Wall -Wextra' WINDOWS_BUILD=1 SHARED=1 lib programs
1016 make CC=i686-w64-mingw32-gcc AR=i686-w64-mingw32-ar LD=i686-w64-minggw32-ld CFLAGS='-Werror -Wall -Wextra' WINDOWS_BUILD=1 SHARED=1 tests
1017 make WINDOWS_BUILD=1 clean
1018}
Simon Butcher002bc622016-11-17 09:27:45 +00001019
Gilles Peskine8f073122018-11-27 15:58:47 +01001020component_test_memsan () {
Gilles Peskine7ad603e2017-12-10 23:22:20 +01001021 msg "build: MSan (clang)" # ~ 1 min 20s
Gilles Peskine7ad603e2017-12-10 23:22:20 +01001022 scripts/config.pl unset MBEDTLS_AESNI_C # memsan doesn't grok asm
1023 CC=clang cmake -D CMAKE_BUILD_TYPE:String=MemSan .
1024 make
Manuel Pégourié-Gonnard4a9dc2a2014-05-09 13:46:59 +02001025
Gilles Peskine7ad603e2017-12-10 23:22:20 +01001026 msg "test: main suites (MSan)" # ~ 10s
1027 make test
Manuel Pégourié-Gonnard9bda9b32014-11-20 13:10:22 +01001028
Gilles Peskine7ad603e2017-12-10 23:22:20 +01001029 msg "test: ssl-opt.sh (MSan)" # ~ 1 min
Gilles Peskine7c652162017-12-11 00:01:40 +01001030 if_build_succeeded tests/ssl-opt.sh
Manuel Pégourié-Gonnard9bda9b32014-11-20 13:10:22 +01001031
Gilles Peskine7ad603e2017-12-10 23:22:20 +01001032 # Optional part(s)
Manuel Pégourié-Gonnard9bda9b32014-11-20 13:10:22 +01001033
Gilles Peskine7ad603e2017-12-10 23:22:20 +01001034 if [ "$MEMORY" -gt 0 ]; then
1035 msg "test: compat.sh (MSan)" # ~ 6 min 20s
Gilles Peskine7c652162017-12-11 00:01:40 +01001036 if_build_succeeded tests/compat.sh
Gilles Peskine7ad603e2017-12-10 23:22:20 +01001037 fi
Gilles Peskine8f073122018-11-27 15:58:47 +01001038}
Manuel Pégourié-Gonnard80955ee2014-03-19 18:29:01 +01001039
Gilles Peskine8f073122018-11-27 15:58:47 +01001040component_test_memcheck () {
Gilles Peskine7ad603e2017-12-10 23:22:20 +01001041 msg "build: Release (clang)"
Gilles Peskine7ad603e2017-12-10 23:22:20 +01001042 CC=clang cmake -D CMAKE_BUILD_TYPE:String=Release .
1043 make
Manuel Pégourié-Gonnard392d3dd2015-01-26 14:03:56 +00001044
Gilles Peskine7ad603e2017-12-10 23:22:20 +01001045 msg "test: main suites valgrind (Release)"
1046 make memcheck
Manuel Pégourié-Gonnard392d3dd2015-01-26 14:03:56 +00001047
Gilles Peskine7ad603e2017-12-10 23:22:20 +01001048 # Optional part(s)
1049 # Currently broken, programs don't seem to receive signals
1050 # under valgrind on OS X
Manuel Pégourié-Gonnard392d3dd2015-01-26 14:03:56 +00001051
Gilles Peskine7ad603e2017-12-10 23:22:20 +01001052 if [ "$MEMORY" -gt 0 ]; then
1053 msg "test: ssl-opt.sh --memcheck (Release)"
Gilles Peskine7c652162017-12-11 00:01:40 +01001054 if_build_succeeded tests/ssl-opt.sh --memcheck
Gilles Peskine7ad603e2017-12-10 23:22:20 +01001055 fi
Manuel Pégourié-Gonnard392d3dd2015-01-26 14:03:56 +00001056
Gilles Peskine7ad603e2017-12-10 23:22:20 +01001057 if [ "$MEMORY" -gt 1 ]; then
1058 msg "test: compat.sh --memcheck (Release)"
Gilles Peskine7c652162017-12-11 00:01:40 +01001059 if_build_succeeded tests/compat.sh --memcheck
Gilles Peskine7ad603e2017-12-10 23:22:20 +01001060 fi
Gilles Peskine8f073122018-11-27 15:58:47 +01001061}
Manuel Pégourié-Gonnard392d3dd2015-01-26 14:03:56 +00001062
Gilles Peskine8f073122018-11-27 15:58:47 +01001063component_test_cmake_out_of_source () {
1064 msg "build: cmake 'out-of-source' build"
Gilles Peskine8f073122018-11-27 15:58:47 +01001065 MBEDTLS_ROOT_DIR="$PWD"
1066 mkdir "$OUT_OF_SOURCE_DIR"
1067 cd "$OUT_OF_SOURCE_DIR"
1068 cmake "$MBEDTLS_ROOT_DIR"
1069 make
Manuel Pégourié-Gonnard392d3dd2015-01-26 14:03:56 +00001070
Gilles Peskine8f073122018-11-27 15:58:47 +01001071 msg "test: cmake 'out-of-source' build"
1072 make test
1073 # Test an SSL option that requires an auxiliary script in test/scripts/.
1074 # Also ensure that there are no error messages such as
1075 # "No such file or directory", which would indicate that some required
1076 # file is missing (ssl-opt.sh tolerates the absence of some files so
1077 # may exit with status 0 but emit errors).
1078 if_build_succeeded ./tests/ssl-opt.sh -f 'Fallback SCSV: beginning of list' 2>ssl-opt.err
1079 if [ -s ssl-opt.err ]; then
1080 cat ssl-opt.err >&2
1081 record_status [ ! -s ssl-opt.err ]
1082 rm ssl-opt.err
1083 fi
1084 cd "$MBEDTLS_ROOT_DIR"
1085 rm -rf "$OUT_OF_SOURCE_DIR"
1086 unset MBEDTLS_ROOT_DIR
1087}
Andres AGdc192212016-08-31 17:33:13 +01001088
Gilles Peskine8f073122018-11-27 15:58:47 +01001089component_test_zeroize () {
1090 # Test that the function mbedtls_platform_zeroize() is not optimized away by
1091 # different combinations of compilers and optimization flags by using an
1092 # auxiliary GDB script. Unfortunately, GDB does not return error values to the
1093 # system in all cases that the script fails, so we must manually search the
1094 # output to check whether the pass string is present and no failure strings
1095 # were printed.
1096 for optimization_flag in -O2 -O3 -Ofast -Os; do
1097 for compiler in clang gcc; do
1098 msg "test: $compiler $optimization_flag, mbedtls_platform_zeroize()"
Gilles Peskine8f073122018-11-27 15:58:47 +01001099 make programs CC="$compiler" DEBUG=1 CFLAGS="$optimization_flag"
1100 if_build_succeeded gdb -x tests/scripts/test_zeroize.gdb -nw -batch -nx 2>&1 | tee test_zeroize.log
1101 if_build_succeeded grep "The buffer was correctly zeroized" test_zeroize.log
1102 if_build_succeeded not grep -i "error" test_zeroize.log
1103 rm -f test_zeroize.log
Gilles Peskinee48351a2018-11-27 16:06:30 +01001104 make clean
Gilles Peskine8f073122018-11-27 15:58:47 +01001105 done
Andres Amaya Garcia29673812017-10-25 10:35:51 +01001106 done
Gilles Peskine8f073122018-11-27 15:58:47 +01001107}
Andres Amaya Garciad0d7bf62017-10-25 09:01:31 +01001108
Gilles Peskine8f073122018-11-27 15:58:47 +01001109component_check_python_files () {
1110 msg "Lint: Python scripts"
1111 record_status tests/scripts/check-python-files.sh
1112}
Gilles Peskine192c72f2017-12-21 15:59:21 +01001113
Gilles Peskine8f073122018-11-27 15:58:47 +01001114component_check_generate_test_code () {
1115 msg "uint test: generate_test_code.py"
1116 record_status ./tests/scripts/test_generate_test_code.py
1117}
Gilles Peskine192c72f2017-12-21 15:59:21 +01001118
1119################################################################
1120#### Termination
1121################################################################
1122
Gilles Peskine8f073122018-11-27 15:58:47 +01001123post_report () {
1124 msg "Done, cleaning up"
1125 cleanup
Manuel Pégourié-Gonnard80955ee2014-03-19 18:29:01 +01001126
Gilles Peskine8f073122018-11-27 15:58:47 +01001127 final_report
1128}
1129
1130
1131
1132################################################################
1133#### Run all the things
1134################################################################
1135
Gilles Peskine92525112018-11-27 18:15:35 +01001136run_all_components () {
1137 # Small things
1138 run_component component_check_recursion
1139 run_component component_check_generated_files
1140 run_component component_check_doxy_blocks
1141 run_component component_check_files
1142 run_component component_check_names
1143 run_component component_check_doxygen_warnings
1144
1145 # Test many different configurations
1146 run_component component_test_default_cmake_gcc_asan
1147 run_component component_test_ref_configs
1148 run_component component_test_sslv3
1149 run_component component_test_no_renegotiation
1150 run_component component_test_rsa_no_crt
1151 run_component component_test_small_ssl_out_content_len
1152 run_component component_test_small_ssl_in_content_len
1153 run_component component_test_small_ssl_dtls_max_buffering
1154 run_component component_test_small_mbedtls_ssl_dtls_max_buffering
1155 run_component component_test_full_cmake_clang
1156 run_component component_build_deprecated
1157 run_component component_test_depends_curves
1158 run_component component_test_depends_hashes
1159 run_component component_test_depends_pkalgs
1160 run_component component_build_key_exchanges
1161 run_component component_build_default_make_gcc_and_cxx
1162 run_component component_test_no_platform
1163 run_component component_build_no_std_function
1164 run_component component_build_no_ssl_srv
1165 run_component component_build_no_ssl_cli
1166 run_component component_build_no_sockets
1167 run_component component_test_no_max_fragment_length
1168 run_component component_test_no_max_fragment_length_small_ssl_out_content_len
1169 run_component component_test_null_entropy
1170 run_component component_test_platform_calloc_macro
1171 run_component component_test_aes_fewer_tables
1172 run_component component_test_aes_rom_tables
1173 run_component component_test_aes_fewer_tables_and_rom_tables
1174 if uname -a | grep -F Linux >/dev/null; then
1175 run_component component_test_make_shared
1176 fi
1177 if uname -a | grep -F x86_64 >/dev/null; then
1178 run_component component_test_m32_o0
1179 run_component component_test_m32_o1
1180 run_component component_test_mx32
1181 fi
1182 run_component component_test_have_int32
1183 run_component component_test_have_int64
1184 run_component component_test_no_udbl_division
1185 run_component component_test_no_64bit_multiplication
1186 run_component component_build_arm_none_eabi_gcc
1187 run_component component_build_arm_none_eabi_gcc_no_udbl_division
1188 run_component component_build_arm_none_eabi_gcc_no_64bit_multiplication
1189 run_component component_build_armcc
1190 run_component component_test_allow_sha1
1191 run_component component_build_mingw
1192 # MemSan currently only available on Linux 64 bits
1193 if uname -a | grep 'Linux.*x86_64' >/dev/null; then
1194 run_component component_test_memsan
1195 else # no MemSan
1196 run_component component_test_memcheck
1197 fi
1198 run_component component_test_cmake_out_of_source
1199
1200 # More small things
1201 run_component component_test_zeroize
1202 run_component component_check_python_files
1203 run_component component_check_generate_test_code
1204}
1205
Gilles Peskinee48351a2018-11-27 16:06:30 +01001206# Run one component and clean up afterwards.
Gilles Peskine8f073122018-11-27 15:58:47 +01001207run_component () {
Gilles Peskine81b96ed2018-11-27 21:37:53 +01001208 if [ $ALL_EXCEPT -ne 0 ] && component_is_excluded "$1"; then
1209 return
1210 fi
Gilles Peskine8ae15dd2019-01-02 18:57:02 +01001211 # Back up the configuration in case the component modifies it.
1212 # The cleanup function will restore it.
1213 cp -p "$CONFIG_H" "$CONFIG_BAK"
Gilles Peskineffcdeff2018-12-04 12:49:28 +01001214 current_component="$1"
Gilles Peskine8f073122018-11-27 15:58:47 +01001215 "$@"
Gilles Peskinee48351a2018-11-27 16:06:30 +01001216 cleanup
Gilles Peskine8f073122018-11-27 15:58:47 +01001217}
1218
1219# Preliminary setup
1220pre_check_environment
1221pre_initialize_variables
1222pre_parse_command_line "$@"
Gilles Peskine348fb9a2018-11-27 17:04:29 +01001223
1224case "$INTROSPECTION_MODE" in
1225 list_components)
1226 components=
1227 newline='
1228'
1229 run_component () {
Gilles Peskine92525112018-11-27 18:15:35 +01001230 components="${components}${newline}${1#component_}"
Gilles Peskine348fb9a2018-11-27 17:04:29 +01001231 }
1232 ;;
1233
1234 *)
1235 pre_check_git
1236 build_status=0
1237 if [ $KEEP_GOING -eq 1 ]; then
1238 pre_setup_keep_going
1239 else
1240 record_status () {
1241 "$@"
1242 }
1243 fi
1244 pre_print_configuration
1245 pre_check_tools
1246 pre_print_tools
1247 cleanup
1248 ;;
1249esac
Gilles Peskine8f073122018-11-27 15:58:47 +01001250
Gilles Peskine81b96ed2018-11-27 21:37:53 +01001251if [ -n "$COMPONENTS" ] && [ $ALL_EXCEPT -eq 0 ]; then
Gilles Peskine92525112018-11-27 18:15:35 +01001252 for component in $COMPONENTS; do
1253 run_component "component_$component"
1254 done
1255else
1256 run_all_components
Gilles Peskine8f073122018-11-27 15:58:47 +01001257fi
Gilles Peskine8f073122018-11-27 15:58:47 +01001258
1259# We're done.
Gilles Peskine348fb9a2018-11-27 17:04:29 +01001260case "$INTROSPECTION_MODE" in
1261 list_components)
1262 echo "$components" | sort
1263 ;;
1264 *)
1265 post_report
1266 ;;
1267esac