blob: 642128af209ebdf4b14b04fc829ba74fa246c92a [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.
Gilles Peskinec70637a2019-01-09 22:29:17 +010062# * 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.
Gilles Peskine878cf602019-01-06 20:50:38 +000065# * support_XXX: if support_XXX exists and returns false then
66# component_XXX is not run by default.
Gilles Peskine8f073122018-11-27 15:58:47 +010067# * post_XXX: things to do after running the tests.
68# * other: miscellaneous support functions.
69#
Gilles Peskinec70637a2019-01-09 22:29:17 +010070# Each component must start by invoking `msg` with a short informative message.
71#
72# The framework performs some cleanup tasks after each component. This
73# means that components can assume that the working directory is in a
74# cleaned-up state, and don't need to perform the cleanup themselves.
75# * Run `make clean`.
76# * Restore `include/mbedtks/config.h` from a backup made before running
77# the component.
78# * Check out `Makefile`, `library/Makefile`, `programs/Makefile` and
79# `tests/Makefile` from git. This cleans up after an in-tree use of
80# CMake.
81#
82# Any command that is expected to fail must be protected so that the
83# script keeps running in --keep-going mode despite `set -e`. In keep-going
84# mode, if a protected command fails, this is logged as a failure and the
85# script will exit with a failure status once it has run all components.
86# Commands can be protected in any of the following ways:
87# * `make` is a function which runs the `make` command with protection.
88# Note that you must write `make VAR=value`, not `VAR=value make`,
89# because the `VAR=value make` syntax doesn't work with functions.
90# * Put `report_status` before the command to protect it.
91# * Put `if_build_successful` before a command. This protects it, and
92# additionally skips it if a prior invocation of `make` in the same
93# component failed.
94#
Gilles Peskine192c72f2017-12-21 15:59:21 +010095# The tests are roughly in order from fastest to slowest. This doesn't
96# have to be exact, but in general you should add slower tests towards
97# the end and fast checks near the beginning.
Gilles Peskine192c72f2017-12-21 15:59:21 +010098
99
100
101################################################################
102#### Initialization and command line parsing
103################################################################
Manuel Pégourié-Gonnard80955ee2014-03-19 18:29:01 +0100104
SimonB2e23c822016-04-16 21:54:39 +0100105# Abort on errors (and uninitialised variables)
Manuel Pégourié-Gonnard80955ee2014-03-19 18:29:01 +0100106set -eu
107
Gilles Peskine8f073122018-11-27 15:58:47 +0100108pre_check_environment () {
Gilles Peskinea16c2b12019-01-06 19:58:02 +0000109 if [ -d library -a -d include -a -d tests ]; then :; else
Gilles Peskine8f073122018-11-27 15:58:47 +0100110 echo "Must be run from mbed TLS root" >&2
111 exit 1
112 fi
113}
Manuel Pégourié-Gonnard80955ee2014-03-19 18:29:01 +0100114
Gilles Peskine8f073122018-11-27 15:58:47 +0100115pre_initialize_variables () {
116 CONFIG_H='include/mbedtls/config.h'
117 CONFIG_BAK="$CONFIG_H.bak"
Manuel Pégourié-Gonnarde73b2632014-07-12 04:00:00 +0200118
Gilles Peskine8f073122018-11-27 15:58:47 +0100119 MEMORY=0
120 FORCE=0
121 KEEP_GOING=0
Manuel Pégourié-Gonnard80955ee2014-03-19 18:29:01 +0100122
Gilles Peskine8f073122018-11-27 15:58:47 +0100123 # Default commands, can be overriden by the environment
124 : ${OPENSSL:="openssl"}
125 : ${OPENSSL_LEGACY:="$OPENSSL"}
126 : ${OPENSSL_NEXT:="$OPENSSL"}
127 : ${GNUTLS_CLI:="gnutls-cli"}
128 : ${GNUTLS_SERV:="gnutls-serv"}
129 : ${GNUTLS_LEGACY_CLI:="$GNUTLS_CLI"}
130 : ${GNUTLS_LEGACY_SERV:="$GNUTLS_SERV"}
131 : ${OUT_OF_SOURCE_DIR:=./mbedtls_out_of_source_build}
132 : ${ARMC5_BIN_DIR:=/usr/bin}
133 : ${ARMC6_BIN_DIR:=/usr/bin}
Andres AGdc192212016-08-31 17:33:13 +0100134
Gilles Peskine8f073122018-11-27 15:58:47 +0100135 # if MAKEFLAGS is not set add the -j option to speed up invocations of make
Gilles Peskinea1fc4b52019-01-06 20:15:26 +0000136 if [ -z "${MAKEFLAGS+set}" ]; then
Gilles Peskine8f073122018-11-27 15:58:47 +0100137 export MAKEFLAGS="-j"
138 fi
Gilles Peskine878cf602019-01-06 20:50:38 +0000139
140 # Gather the list of available components. These are the functions
141 # defined in this script whose name starts with "component_".
142 # Parse the script with sed, because in sh there is no way to list
143 # defined functions.
144 ALL_COMPONENTS=$(sed -n 's/^ *component_\([0-9A-Z_a-z]*\) *().*/\1/p' <"$0")
145
146 # Exclude components that are not supported on this platform.
147 SUPPORTED_COMPONENTS=
148 for component in $ALL_COMPONENTS; do
149 case $(type "support_$component" 2>&1) in
150 *' function'*)
151 if ! support_$component; then continue; fi;;
152 esac
153 SUPPORTED_COMPONENTS="$SUPPORTED_COMPONENTS $component"
154 done
Gilles Peskine8f073122018-11-27 15:58:47 +0100155}
Andres AG38495a32016-07-12 16:54:33 +0100156
Gilles Peskine878cf602019-01-06 20:50:38 +0000157# Test whether $1 is excluded via the command line.
158is_component_excluded()
Gilles Peskine81b96ed2018-11-27 21:37:53 +0100159{
Gilles Peskine878cf602019-01-06 20:50:38 +0000160 # Is $1 excluded via $COMPONENTS (a space-separated list of wildcard
161 # patterns)?
Gilles Peskine81b96ed2018-11-27 21:37:53 +0100162 set -f
Gilles Peskinebeb3a812019-01-06 22:11:25 +0000163 for pattern in $COMMAND_LINE_COMPONENTS; do
Gilles Peskine81b96ed2018-11-27 21:37:53 +0100164 set +f
165 case ${1#component_} in $pattern) return 0;; esac
166 done
167 set +f
168 return 1
169}
170
Simon Butcher41eeccf2016-09-07 00:07:09 +0100171usage()
SimonB2e23c822016-04-16 21:54:39 +0100172{
Gilles Peskine709346a2017-12-10 23:43:39 +0100173 cat <<EOF
Gilles Peskine92525112018-11-27 18:15:35 +0100174Usage: $0 [OPTION]... [COMPONENT]...
Gilles Peskine348fb9a2018-11-27 17:04:29 +0100175Run mbedtls release validation tests.
Gilles Peskine92525112018-11-27 18:15:35 +0100176By default, run all tests. With one or more COMPONENT, run only those.
Gilles Peskine348fb9a2018-11-27 17:04:29 +0100177
178Special options:
179 -h|--help Print this help and exit.
Gilles Peskine878cf602019-01-06 20:50:38 +0000180 --list-all-components List all available test components and exit.
181 --list-components List components supported on this platform and exit.
Gilles Peskine709346a2017-12-10 23:43:39 +0100182
183General options:
184 -f|--force Force the tests to overwrite any modified files.
Gilles Peskine7c652162017-12-11 00:01:40 +0100185 -k|--keep-going Run all tests and report errors at the end.
Gilles Peskine709346a2017-12-10 23:43:39 +0100186 -m|--memory Additional optional memory tests.
Gilles Peskinebca6ab92017-12-19 18:24:31 +0100187 --armcc Run ARM Compiler builds (on by default).
Gilles Peskine81b96ed2018-11-27 21:37:53 +0100188 --except If some components are passed on the command line,
189 run all the tests except for these components. In
190 this mode, you can pass shell wildcard patterns as
191 component names, e.g. "$0 --except 'test_*'" to
192 exclude all components that run tests.
Gilles Peskinebca6ab92017-12-19 18:24:31 +0100193 --no-armcc Skip ARM Compiler builds.
Gilles Peskine38d81652018-03-21 08:40:26 +0100194 --no-force Refuse to overwrite modified files (default).
195 --no-keep-going Stop at the first error (default).
196 --no-memory No additional memory tests (default).
Gilles Peskine709346a2017-12-10 23:43:39 +0100197 --out-of-source-dir=<path> Directory used for CMake out-of-source build tests.
Gilles Peskine38d81652018-03-21 08:40:26 +0100198 --random-seed Use a random seed value for randomized tests (default).
Gilles Peskine709346a2017-12-10 23:43:39 +0100199 -r|--release-test Run this script in release mode. This fixes the seed value to 1.
200 -s|--seed Integer seed value to use for this test run.
201
202Tool path options:
203 --armc5-bin-dir=<ARMC5_bin_dir_path> ARM Compiler 5 bin directory.
204 --armc6-bin-dir=<ARMC6_bin_dir_path> ARM Compiler 6 bin directory.
205 --gnutls-cli=<GnuTLS_cli_path> GnuTLS client executable to use for most tests.
206 --gnutls-serv=<GnuTLS_serv_path> GnuTLS server executable to use for most tests.
207 --gnutls-legacy-cli=<GnuTLS_cli_path> GnuTLS client executable to use for legacy tests.
208 --gnutls-legacy-serv=<GnuTLS_serv_path> GnuTLS server executable to use for legacy tests.
209 --openssl=<OpenSSL_path> OpenSSL executable to use for most tests.
210 --openssl-legacy=<OpenSSL_path> OpenSSL executable to use for legacy tests e.g. SSLv3.
Manuel Pégourié-Gonnard6b368922018-02-20 12:02:07 +0100211 --openssl-next=<OpenSSL_path> OpenSSL executable to use for recent things like ARIA
Gilles Peskine709346a2017-12-10 23:43:39 +0100212EOF
SimonB2e23c822016-04-16 21:54:39 +0100213}
Manuel Pégourié-Gonnard80955ee2014-03-19 18:29:01 +0100214
215# remove built files as well as the cmake cache/config
216cleanup()
217{
Gilles Peskinea71d64c2018-03-21 12:16:57 +0100218 if [ -n "${MBEDTLS_ROOT_DIR+set}" ]; then
219 cd "$MBEDTLS_ROOT_DIR"
220 fi
221
Gilles Peskine7c652162017-12-11 00:01:40 +0100222 command make clean
Manuel Pégourié-Gonnarde73b2632014-07-12 04:00:00 +0200223
Gilles Peskine31b07e22018-03-21 12:15:06 +0100224 # Remove CMake artefacts
Simon Butcher3ad2efd2018-05-02 14:49:38 +0100225 find . -name .git -prune \
Gilles Peskine31b07e22018-03-21 12:15:06 +0100226 -iname CMakeFiles -exec rm -rf {} \+ -o \
227 \( -iname cmake_install.cmake -o \
228 -iname CTestTestfile.cmake -o \
229 -iname CMakeCache.txt \) -exec rm {} \+
230 # Recover files overwritten by in-tree CMake builds
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +0000231 rm -f include/Makefile include/mbedtls/Makefile programs/*/Makefile
Paul Bakkerfe0984d2014-06-13 00:13:45 +0200232 git update-index --no-skip-worktree Makefile library/Makefile programs/Makefile tests/Makefile
233 git checkout -- Makefile library/Makefile programs/Makefile tests/Makefile
Manuel Pégourié-Gonnarde73b2632014-07-12 04:00:00 +0200234
235 if [ -f "$CONFIG_BAK" ]; then
236 mv "$CONFIG_BAK" "$CONFIG_H"
237 fi
Manuel Pégourié-Gonnard80955ee2014-03-19 18:29:01 +0100238}
239
Gilles Peskine7c652162017-12-11 00:01:40 +0100240# Executed on exit. May be redefined depending on command line options.
241final_report () {
242 :
243}
244
245fatal_signal () {
246 cleanup
247 final_report $1
248 trap - $1
249 kill -$1 $$
250}
251
252trap 'fatal_signal HUP' HUP
253trap 'fatal_signal INT' INT
254trap 'fatal_signal TERM' TERM
Manuel Pégourié-Gonnarde73b2632014-07-12 04:00:00 +0200255
Manuel Pégourié-Gonnard3895f5a2014-03-27 14:44:04 +0100256msg()
257{
Gilles Peskineffcdeff2018-12-04 12:49:28 +0100258 if [ -n "${current_component:-}" ]; then
259 current_section="${current_component#component_}: $1"
260 else
261 current_section="$1"
262 fi
Manuel Pégourié-Gonnard3895f5a2014-03-27 14:44:04 +0100263 echo ""
264 echo "******************************************************************"
Gilles Peskineffcdeff2018-12-04 12:49:28 +0100265 echo "* $current_section "
Manuel Pégourié-Gonnard392d3dd2015-01-26 14:03:56 +0000266 printf "* "; date
Manuel Pégourié-Gonnard3895f5a2014-03-27 14:44:04 +0100267 echo "******************************************************************"
268}
Manuel Pégourié-Gonnard80955ee2014-03-19 18:29:01 +0100269
Gilles Peskine8f073122018-11-27 15:58:47 +0100270armc6_build_test()
271{
272 FLAGS="$1"
Andres AGa5cd9732016-10-17 15:23:10 +0100273
Gilles Peskine8f073122018-11-27 15:58:47 +0100274 msg "build: ARM Compiler 6 ($FLAGS), make"
275 ARM_TOOL_VARIANT="ult" CC="$ARMC6_CC" AR="$ARMC6_AR" CFLAGS="$FLAGS" \
276 WARNING_CFLAGS='-xc -std=c99' make lib
277 make clean
278}
Andres AGa5cd9732016-10-17 15:23:10 +0100279
Andres AGd9eba4b2016-08-26 14:42:14 +0100280err_msg()
281{
282 echo "$1" >&2
283}
284
285check_tools()
286{
287 for TOOL in "$@"; do
Andres AG98393602017-01-31 17:04:45 +0000288 if ! `type "$TOOL" >/dev/null 2>&1`; then
Andres AGd9eba4b2016-08-26 14:42:14 +0100289 err_msg "$TOOL not found!"
290 exit 1
291 fi
292 done
293}
294
Andrzej Kurek991f9fe2018-07-02 09:08:21 -0400295check_headers_in_cpp () {
296 ls include/mbedtls >headers.txt
297 <programs/test/cpp_dummy_build.cpp sed -n 's/"$//; s!^#include "mbedtls/!!p' |
298 sort |
299 diff headers.txt -
300 rm headers.txt
301}
302
Gilles Peskine8f073122018-11-27 15:58:47 +0100303pre_parse_command_line () {
Gilles Peskinebeb3a812019-01-06 22:11:25 +0000304 COMMAND_LINE_COMPONENTS=
305 all_except=
Gilles Peskine5331c6e2019-01-06 22:23:42 +0000306 no_armcc=
Gilles Peskinebeb3a812019-01-06 22:11:25 +0000307
Gilles Peskine8f073122018-11-27 15:58:47 +0100308 while [ $# -gt 0 ]; do
Gilles Peskine55f7c942019-01-09 22:28:21 +0100309 case "$1" in
Gilles Peskine5331c6e2019-01-06 22:23:42 +0000310 --armcc) no_armcc=;;
Gilles Peskine55f7c942019-01-09 22:28:21 +0100311 --armc5-bin-dir) shift; ARMC5_BIN_DIR="$1";;
312 --armc6-bin-dir) shift; ARMC6_BIN_DIR="$1";;
Gilles Peskinebeb3a812019-01-06 22:11:25 +0000313 --except) all_except=1;;
Gilles Peskine55f7c942019-01-09 22:28:21 +0100314 --force|-f) FORCE=1;;
315 --gnutls-cli) shift; GNUTLS_CLI="$1";;
316 --gnutls-legacy-cli) shift; GNUTLS_LEGACY_CLI="$1";;
317 --gnutls-legacy-serv) shift; GNUTLS_LEGACY_SERV="$1";;
318 --gnutls-serv) shift; GNUTLS_SERV="$1";;
319 --help|-h) usage; exit;;
320 --keep-going|-k) KEEP_GOING=1;;
Gilles Peskine878cf602019-01-06 20:50:38 +0000321 --list-all-components) printf '%s\n' $ALL_COMPONENTS; exit;;
322 --list-components) printf '%s\n' $SUPPORTED_COMPONENTS; exit;;
Gilles Peskine55f7c942019-01-09 22:28:21 +0100323 --memory|-m) MEMORY=1;;
Gilles Peskine5331c6e2019-01-06 22:23:42 +0000324 --no-armcc) no_armcc=1;;
Gilles Peskine55f7c942019-01-09 22:28:21 +0100325 --no-force) FORCE=0;;
326 --no-keep-going) KEEP_GOING=0;;
327 --no-memory) MEMORY=0;;
328 --openssl) shift; OPENSSL="$1";;
329 --openssl-legacy) shift; OPENSSL_LEGACY="$1";;
330 --openssl-next) shift; OPENSSL_NEXT="$1";;
331 --out-of-source-dir) shift; OUT_OF_SOURCE_DIR="$1";;
332 --random-seed) unset SEED;;
333 --release-test|-r) SEED=1;;
334 --seed|-s) shift; SEED="$1";;
335 -*)
336 echo >&2 "Unknown option: $1"
337 echo >&2 "Run $0 --help for usage."
338 exit 120
339 ;;
Gilles Peskinebeb3a812019-01-06 22:11:25 +0000340 *) COMMAND_LINE_COMPONENTS="$COMMAND_LINE_COMPONENTS $1";;
Gilles Peskine55f7c942019-01-09 22:28:21 +0100341 esac
342 shift
Gilles Peskine8f073122018-11-27 15:58:47 +0100343 done
Gilles Peskinebeb3a812019-01-06 22:11:25 +0000344
345 if [ -z "$COMMAND_LINE_COMPONENTS" ]; then
346 all_except=1
347 fi
348
Gilles Peskine5331c6e2019-01-06 22:23:42 +0000349 # --no-armcc is a legacy option. The modern way is --except '*_armcc*'.
350 # Ignore it if components are listed explicitly on the command line.
351 if [ -n "$no_armcc" ] && [ -n "$all_except" ]; then
352 COMMAND_LINE_COMPONENTS="$COMMAND_LINE_COMPONENTS *_armcc*"
353 fi
354
Gilles Peskinebeb3a812019-01-06 22:11:25 +0000355 # Build the list of components to run.
356 if [ -n "$all_except" ]; then
357 RUN_COMPONENTS=
358 for component in $SUPPORTED_COMPONENTS; do
359 if ! is_component_excluded "$component"; then
360 RUN_COMPONENTS="$RUN_COMPONENTS $component"
361 fi
362 done
363 else
364 RUN_COMPONENTS="$COMMAND_LINE_COMPONENTS"
365 fi
366
367 unset all_except
Gilles Peskine5331c6e2019-01-06 22:23:42 +0000368 unset no_armcc
Gilles Peskine8f073122018-11-27 15:58:47 +0100369}
SimonB2e23c822016-04-16 21:54:39 +0100370
Gilles Peskine8f073122018-11-27 15:58:47 +0100371pre_check_git () {
372 if [ $FORCE -eq 1 ]; then
373 git checkout-index -f -q $CONFIG_H
374 cleanup
375 else
SimonB2e23c822016-04-16 21:54:39 +0100376
Gilles Peskine8f073122018-11-27 15:58:47 +0100377 if [ -d "$OUT_OF_SOURCE_DIR" ]; then
378 echo "Warning - there is an existing directory at '$OUT_OF_SOURCE_DIR'" >&2
379 echo "You can either delete this directory manually, or force the test by rerunning"
380 echo "the script as: $0 --force --out-of-source-dir $OUT_OF_SOURCE_DIR"
381 exit 1
382 fi
383
Gilles Peskined1174cf2019-01-09 22:30:01 +0100384 if ! git diff --quiet include/mbedtls/config.h; then
Gilles Peskine8f073122018-11-27 15:58:47 +0100385 err_msg "Warning - the configuration file 'include/mbedtls/config.h' has been edited. "
386 echo "You can either delete or preserve your work, or force the test by rerunning the"
387 echo "script as: $0 --force"
388 exit 1
389 fi
Andres AGdc192212016-08-31 17:33:13 +0100390 fi
Gilles Peskine8f073122018-11-27 15:58:47 +0100391}
Andres AGdc192212016-08-31 17:33:13 +0100392
Gilles Peskine8f073122018-11-27 15:58:47 +0100393pre_setup_keep_going () {
Gilles Peskine7c652162017-12-11 00:01:40 +0100394 failure_summary=
395 failure_count=0
396 start_red=
397 end_color=
398 if [ -t 1 ]; then
Gilles Peskine9736b9d2018-01-02 21:54:17 +0100399 case "${TERM:-}" in
Gilles Peskine7c652162017-12-11 00:01:40 +0100400 *color*|cygwin|linux|rxvt*|screen|[Eex]term*)
401 start_red=$(printf '\033[31m')
402 end_color=$(printf '\033[0m')
403 ;;
404 esac
405 fi
406 record_status () {
407 if "$@"; then
408 last_status=0
409 else
410 last_status=$?
411 text="$current_section: $* -> $last_status"
412 failure_summary="$failure_summary
413$text"
414 failure_count=$((failure_count + 1))
415 echo "${start_red}^^^^$text^^^^${end_color}"
416 fi
417 }
418 make () {
419 case "$*" in
420 *test|*check)
421 if [ $build_status -eq 0 ]; then
422 record_status command make "$@"
423 else
424 echo "(skipped because the build failed)"
425 fi
426 ;;
427 *)
428 record_status command make "$@"
429 build_status=$last_status
430 ;;
431 esac
432 }
433 final_report () {
434 if [ $failure_count -gt 0 ]; then
435 echo
436 echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
437 echo "${start_red}FAILED: $failure_count${end_color}$failure_summary"
438 echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
Jaeden Amero7c1258d2018-07-20 16:42:14 +0100439 exit 1
Gilles Peskine7c652162017-12-11 00:01:40 +0100440 elif [ -z "${1-}" ]; then
441 echo "SUCCESS :)"
442 fi
443 if [ -n "${1-}" ]; then
444 echo "Killed by SIG$1."
445 fi
446 }
Gilles Peskine8f073122018-11-27 15:58:47 +0100447}
448
Gilles Peskine7c652162017-12-11 00:01:40 +0100449if_build_succeeded () {
450 if [ $build_status -eq 0 ]; then
451 record_status "$@"
452 fi
453}
454
Manuel Pégourié-Gonnard2adb3752018-06-07 10:51:44 +0200455# to be used instead of ! for commands run with
456# record_status or if_build_succeeded
457not() {
458 ! "$@"
459}
460
Gilles Peskine8f073122018-11-27 15:58:47 +0100461pre_print_configuration () {
462 msg "info: $0 configuration"
463 echo "MEMORY: $MEMORY"
464 echo "FORCE: $FORCE"
465 echo "SEED: ${SEED-"UNSET"}"
466 echo "OPENSSL: $OPENSSL"
467 echo "OPENSSL_LEGACY: $OPENSSL_LEGACY"
468 echo "OPENSSL_NEXT: $OPENSSL_NEXT"
469 echo "GNUTLS_CLI: $GNUTLS_CLI"
470 echo "GNUTLS_SERV: $GNUTLS_SERV"
471 echo "GNUTLS_LEGACY_CLI: $GNUTLS_LEGACY_CLI"
472 echo "GNUTLS_LEGACY_SERV: $GNUTLS_LEGACY_SERV"
473 echo "ARMC5_BIN_DIR: $ARMC5_BIN_DIR"
474 echo "ARMC6_BIN_DIR: $ARMC6_BIN_DIR"
475}
Andres AG87bb5772016-09-27 15:05:15 +0100476
Gilles Peskine87964262019-01-06 22:40:00 +0000477# Make sure the tools we need are available.
Gilles Peskine8f073122018-11-27 15:58:47 +0100478pre_check_tools () {
Gilles Peskinecc9f0b92019-01-06 22:46:21 +0000479 # Build the list of variables to pass to output_env.sh.
480 set env
481
Gilles Peskine87964262019-01-06 22:40:00 +0000482 case " $RUN_COMPONENTS " in
483 # Require OpenSSL and GnuTLS if running any tests (as opposed to
484 # only doing builds). Not all tests run OpenSSL and GnuTLS, but this
485 # is a good enough approximation in practice.
486 *" test_"*)
487 # To avoid setting OpenSSL and GnuTLS for each call to compat.sh
488 # and ssl-opt.sh, we just export the variables they require.
489 export OPENSSL_CMD="$OPENSSL"
490 export GNUTLS_CLI="$GNUTLS_CLI"
491 export GNUTLS_SERV="$GNUTLS_SERV"
492 # Avoid passing --seed flag in every call to ssl-opt.sh
493 if [ -n "${SEED-}" ]; then
494 export SEED
495 fi
Gilles Peskinecc9f0b92019-01-06 22:46:21 +0000496 set "$@" OPENSSL="$OPENSSL" OPENSSL_LEGACY="$OPENSSL_LEGACY"
497 set "$@" GNUTLS_CLI="$GNUTLS_CLI" GNUTLS_SERV="$GNUTLS_SERV"
498 set "$@" GNUTLS_LEGACY_CLI="$GNUTLS_LEGACY_CLI"
499 set "$@" GNUTLS_LEGACY_SERV="$GNUTLS_LEGACY_SERV"
Gilles Peskine87964262019-01-06 22:40:00 +0000500 check_tools "$OPENSSL" "$OPENSSL_LEGACY" "$OPENSSL_NEXT" \
501 "$GNUTLS_CLI" "$GNUTLS_SERV" \
502 "$GNUTLS_LEGACY_CLI" "$GNUTLS_LEGACY_SERV"
503 ;;
504 esac
Andres AGd9eba4b2016-08-26 14:42:14 +0100505
Gilles Peskine87964262019-01-06 22:40:00 +0000506 case " $RUN_COMPONENTS " in
507 *_doxygen[_\ ]*) check_tools "doxygen" "dot";;
508 esac
Andres AGb2fdd042016-09-22 14:17:46 +0100509
Gilles Peskine87964262019-01-06 22:40:00 +0000510 case " $RUN_COMPONENTS " in
511 *_arm_none_eabi_gcc[_\ ]*) check_tools "arm-none-eabi-gcc";;
512 esac
Andres AG7770ea82016-10-10 15:46:20 +0100513
Gilles Peskine87964262019-01-06 22:40:00 +0000514 case " $RUN_COMPONENTS " in
515 *_mingw[_\ ]*) check_tools "i686-w64-mingw32-gcc";;
516 esac
517
518 case " $RUN_COMPONENTS " in
519 *" test_zeroize "*) check_tools "gdb";;
520 esac
521
522 case " $RUN_COMPONENTS " in
Gilles Peskine5331c6e2019-01-06 22:23:42 +0000523 *_armcc*)
Gilles Peskine87964262019-01-06 22:40:00 +0000524 ARMC5_CC="$ARMC5_BIN_DIR/armcc"
525 ARMC5_AR="$ARMC5_BIN_DIR/armar"
526 ARMC6_CC="$ARMC6_BIN_DIR/armclang"
527 ARMC6_AR="$ARMC6_BIN_DIR/armar"
Gilles Peskine5331c6e2019-01-06 22:23:42 +0000528 check_tools "$ARMC5_CC" "$ARMC5_AR" "$ARMC6_CC" "$ARMC6_AR";;
529 esac
Gilles Peskinecc9f0b92019-01-06 22:46:21 +0000530
531 msg "info: output_env.sh"
532 case $RUN_COMPONENTS in
533 *_armcc*)
534 set "$@" ARMC5_CC="$ARMC5_CC" ARMC6_CC="$ARMC6_CC" RUN_ARMCC=1;;
535 *) set "$@" RUN_ARMCC=0;;
536 esac
537 "$@" scripts/output_env.sh
Gilles Peskine8f073122018-11-27 15:58:47 +0100538}
Gilles Peskine192c72f2017-12-21 15:59:21 +0100539
540
Gilles Peskinecc9f0b92019-01-06 22:46:21 +0000541
Gilles Peskine192c72f2017-12-21 15:59:21 +0100542################################################################
543#### Basic checks
544################################################################
Andres AGd9eba4b2016-08-26 14:42:14 +0100545
SimonB2e23c822016-04-16 21:54:39 +0100546#
547# Test Suites to be executed
548#
Manuel Pégourié-Gonnard57255b12014-06-09 11:21:49 +0200549# The test ordering tries to optimize for the following criteria:
Manuel Pégourié-Gonnard89d69b32014-11-20 13:48:53 +0100550# 1. Catch possible problems early, by running first tests that run quickly
Manuel Pégourié-Gonnard61bc57a2014-08-14 11:29:06 +0200551# and/or are more likely to fail than others (eg I use Clang most of the
552# time, so start with a GCC build).
Manuel Pégourié-Gonnard57255b12014-06-09 11:21:49 +0200553# 2. Minimize total running time, by avoiding useless rebuilds
554#
555# Indicative running times are given for reference.
Manuel Pégourié-Gonnard80955ee2014-03-19 18:29:01 +0100556
Gilles Peskine8f073122018-11-27 15:58:47 +0100557component_check_recursion () {
558 msg "test: recursion.pl" # < 1s
559 record_status tests/scripts/recursion.pl library/*.c
560}
Manuel Pégourié-Gonnardea29d152014-11-20 17:32:33 +0100561
Gilles Peskine8f073122018-11-27 15:58:47 +0100562component_check_generated_files () {
563 msg "test: freshness of generated source files" # < 1s
564 record_status tests/scripts/check-generated-files.sh
565}
Manuel Pégourié-Gonnardb3b8e432015-02-13 14:52:19 +0000566
Gilles Peskine8f073122018-11-27 15:58:47 +0100567component_check_doxy_blocks () {
568 msg "test: doxygen markup outside doxygen blocks" # < 1s
569 record_status tests/scripts/check-doxy-blocks.pl
570}
Manuel Pégourié-Gonnardd09a6b52015-04-09 17:19:23 +0200571
Gilles Peskine8f073122018-11-27 15:58:47 +0100572component_check_files () {
573 msg "test: check-files.py" # < 1s
Gilles Peskine8f073122018-11-27 15:58:47 +0100574 record_status tests/scripts/check-files.py
575}
Darryl Greena07039c2018-03-13 16:48:16 +0000576
Gilles Peskine8f073122018-11-27 15:58:47 +0100577component_check_names () {
578 msg "test/build: declared and exported names" # < 3s
Gilles Peskine8f073122018-11-27 15:58:47 +0100579 record_status tests/scripts/check-names.sh
580}
Manuel Pégourié-Gonnarda687baf2015-04-09 11:09:03 +0200581
Gilles Peskine8f073122018-11-27 15:58:47 +0100582component_check_doxygen_warnings () {
583 msg "test: doxygen warnings" # ~ 3s
Gilles Peskine8f073122018-11-27 15:58:47 +0100584 record_status tests/scripts/doxygen.sh
585}
Manuel Pégourié-Gonnard1d552e72016-01-04 16:49:09 +0100586
Gilles Peskine192c72f2017-12-21 15:59:21 +0100587
588
589################################################################
590#### Build and test many configurations and targets
591################################################################
592
Gilles Peskine8f073122018-11-27 15:58:47 +0100593component_test_default_cmake_gcc_asan () {
594 msg "build: cmake, gcc, ASan" # ~ 1 min 50s
Gilles Peskine8f073122018-11-27 15:58:47 +0100595 CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
596 make
Manuel Pégourié-Gonnard3895f5a2014-03-27 14:44:04 +0100597
Gilles Peskine8f073122018-11-27 15:58:47 +0100598 msg "test: main suites (inc. selftests) (ASan build)" # ~ 50s
599 make test
Manuel Pégourié-Gonnard57255b12014-06-09 11:21:49 +0200600
Gilles Peskine8f073122018-11-27 15:58:47 +0100601 msg "test: ssl-opt.sh (ASan build)" # ~ 1 min
602 if_build_succeeded tests/ssl-opt.sh
Manuel Pégourié-Gonnard57255b12014-06-09 11:21:49 +0200603
Gilles Peskine8f073122018-11-27 15:58:47 +0100604 msg "test: compat.sh (ASan build)" # ~ 6 min
605 if_build_succeeded tests/compat.sh
606}
Manuel Pégourié-Gonnard57255b12014-06-09 11:21:49 +0200607
Gilles Peskine782f4112018-11-27 16:11:09 +0100608component_test_ref_configs () {
609 msg "test/build: ref-configs (ASan build)" # ~ 6 min 20s
610 CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
611 record_status tests/scripts/test-ref-configs.pl
612}
613
Gilles Peskine8f073122018-11-27 15:58:47 +0100614component_test_sslv3 () {
615 msg "build: Default + SSLv3 (ASan build)" # ~ 6 min
Gilles Peskine8f073122018-11-27 15:58:47 +0100616 scripts/config.pl set MBEDTLS_SSL_PROTO_SSL3
617 CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
618 make
Simon Butcher3ea7f522016-03-07 23:22:10 +0000619
Gilles Peskine8f073122018-11-27 15:58:47 +0100620 msg "test: SSLv3 - main suites (inc. selftests) (ASan build)" # ~ 50s
621 make test
Simon Butcher3ea7f522016-03-07 23:22:10 +0000622
Gilles Peskine8f073122018-11-27 15:58:47 +0100623 msg "build: SSLv3 - compat.sh (ASan build)" # ~ 6 min
624 if_build_succeeded tests/compat.sh -m 'tls1 tls1_1 tls1_2 dtls1 dtls1_2'
625 if_build_succeeded env OPENSSL_CMD="$OPENSSL_LEGACY" tests/compat.sh -m 'ssl3'
Simon Butcher3ea7f522016-03-07 23:22:10 +0000626
Gilles Peskine8f073122018-11-27 15:58:47 +0100627 msg "build: SSLv3 - ssl-opt.sh (ASan build)" # ~ 6 min
628 if_build_succeeded tests/ssl-opt.sh
629}
Simon Butcher3ea7f522016-03-07 23:22:10 +0000630
Gilles Peskine8f073122018-11-27 15:58:47 +0100631component_test_no_renegotiation () {
632 msg "build: Default + !MBEDTLS_SSL_RENEGOTIATION (ASan build)" # ~ 6 min
Gilles Peskine8f073122018-11-27 15:58:47 +0100633 scripts/config.pl unset MBEDTLS_SSL_RENEGOTIATION
634 CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
635 make
Hanno Becker134c2ab2017-10-12 15:29:50 +0100636
Gilles Peskine8f073122018-11-27 15:58:47 +0100637 msg "test: !MBEDTLS_SSL_RENEGOTIATION - main suites (inc. selftests) (ASan build)" # ~ 50s
638 make test
Hanno Becker134c2ab2017-10-12 15:29:50 +0100639
Gilles Peskine8f073122018-11-27 15:58:47 +0100640 msg "test: !MBEDTLS_SSL_RENEGOTIATION - ssl-opt.sh (ASan build)" # ~ 6 min
641 if_build_succeeded tests/ssl-opt.sh
642}
Manuel Pégourié-Gonnard246978d2014-11-20 13:29:53 +0100643
Gilles Peskine8f073122018-11-27 15:58:47 +0100644component_test_rsa_no_crt () {
645 msg "build: Default + RSA_NO_CRT (ASan build)" # ~ 6 min
Gilles Peskine8f073122018-11-27 15:58:47 +0100646 scripts/config.pl set MBEDTLS_RSA_NO_CRT
647 CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
648 make
Hanno Beckerd5ba5ef2017-09-28 12:53:51 +0100649
Gilles Peskine8f073122018-11-27 15:58:47 +0100650 msg "test: RSA_NO_CRT - main suites (inc. selftests) (ASan build)" # ~ 50s
651 make test
Hanno Beckerd5ba5ef2017-09-28 12:53:51 +0100652
Gilles Peskine8f073122018-11-27 15:58:47 +0100653 msg "test: RSA_NO_CRT - RSA-related part of ssl-opt.sh (ASan build)" # ~ 5s
654 if_build_succeeded tests/ssl-opt.sh -f RSA
Hanno Beckerd5ba5ef2017-09-28 12:53:51 +0100655
Gilles Peskine8f073122018-11-27 15:58:47 +0100656 msg "test: RSA_NO_CRT - RSA-related part of compat.sh (ASan build)" # ~ 3 min
657 if_build_succeeded tests/compat.sh -t RSA
658}
Hanno Beckerd5ba5ef2017-09-28 12:53:51 +0100659
Gilles Peskine8f073122018-11-27 15:58:47 +0100660component_test_small_ssl_out_content_len () {
661 msg "build: small SSL_OUT_CONTENT_LEN (ASan build)"
Gilles Peskine8f073122018-11-27 15:58:47 +0100662 scripts/config.pl set MBEDTLS_SSL_IN_CONTENT_LEN 16384
663 scripts/config.pl set MBEDTLS_SSL_OUT_CONTENT_LEN 4096
664 CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
665 make
Angus Grattonc4dd0732018-04-11 16:28:39 +1000666
Gilles Peskine8f073122018-11-27 15:58:47 +0100667 msg "test: small SSL_OUT_CONTENT_LEN - ssl-opt.sh MFL and large packet tests"
668 if_build_succeeded tests/ssl-opt.sh -f "Max fragment\|Large packet"
669}
Angus Grattonc4dd0732018-04-11 16:28:39 +1000670
Gilles Peskine8f073122018-11-27 15:58:47 +0100671component_test_small_ssl_in_content_len () {
672 msg "build: small SSL_IN_CONTENT_LEN (ASan build)"
Gilles Peskine8f073122018-11-27 15:58:47 +0100673 scripts/config.pl set MBEDTLS_SSL_IN_CONTENT_LEN 4096
674 scripts/config.pl set MBEDTLS_SSL_OUT_CONTENT_LEN 16384
675 CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
676 make
Angus Grattonc4dd0732018-04-11 16:28:39 +1000677
Gilles Peskine8f073122018-11-27 15:58:47 +0100678 msg "test: small SSL_IN_CONTENT_LEN - ssl-opt.sh MFL tests"
679 if_build_succeeded tests/ssl-opt.sh -f "Max fragment"
680}
Angus Grattonc4dd0732018-04-11 16:28:39 +1000681
Gilles Peskine8f073122018-11-27 15:58:47 +0100682component_test_small_ssl_dtls_max_buffering () {
683 msg "build: small MBEDTLS_SSL_DTLS_MAX_BUFFERING #0"
Gilles Peskine8f073122018-11-27 15:58:47 +0100684 scripts/config.pl set MBEDTLS_SSL_DTLS_MAX_BUFFERING 1000
685 CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
686 make
Hanno Becker2f5aa4c2018-08-24 14:43:44 +0100687
Gilles Peskine8f073122018-11-27 15:58:47 +0100688 msg "test: small MBEDTLS_SSL_DTLS_MAX_BUFFERING #0 - ssl-opt.sh specific reordering test"
689 if_build_succeeded tests/ssl-opt.sh -f "DTLS reordering: Buffer out-of-order hs msg before reassembling next, free buffered msg"
690}
Hanno Becker2f5aa4c2018-08-24 14:43:44 +0100691
Gilles Peskine8f073122018-11-27 15:58:47 +0100692component_test_small_mbedtls_ssl_dtls_max_buffering () {
693 msg "build: small MBEDTLS_SSL_DTLS_MAX_BUFFERING #1"
Gilles Peskine8f073122018-11-27 15:58:47 +0100694 scripts/config.pl set MBEDTLS_SSL_DTLS_MAX_BUFFERING 240
695 CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
696 make
Hanno Becker2f5aa4c2018-08-24 14:43:44 +0100697
Gilles Peskine8f073122018-11-27 15:58:47 +0100698 msg "test: small MBEDTLS_SSL_DTLS_MAX_BUFFERING #1 - ssl-opt.sh specific reordering test"
699 if_build_succeeded tests/ssl-opt.sh -f "DTLS reordering: Buffer encrypted Finished message, drop for fragmented NewSessionTicket"
700}
Hanno Becker2f5aa4c2018-08-24 14:43:44 +0100701
Gilles Peskine8f073122018-11-27 15:58:47 +0100702component_test_full_cmake_clang () {
703 msg "build: cmake, full config, clang" # ~ 50s
Gilles Peskine8f073122018-11-27 15:58:47 +0100704 scripts/config.pl full
705 scripts/config.pl unset MBEDTLS_MEMORY_BACKTRACE # too slow for tests
706 CC=clang cmake -D CMAKE_BUILD_TYPE:String=Check -D ENABLE_TESTING=On .
707 make
Manuel Pégourié-Gonnard3895f5a2014-03-27 14:44:04 +0100708
Gilles Peskine8f073122018-11-27 15:58:47 +0100709 msg "test: main suites (full config)" # ~ 5s
710 make test
Manuel Pégourié-Gonnarde73b2632014-07-12 04:00:00 +0200711
Gilles Peskine8f073122018-11-27 15:58:47 +0100712 msg "test: ssl-opt.sh default, ECJPAKE, SSL async (full config)" # ~ 1s
713 if_build_succeeded tests/ssl-opt.sh -f 'Default\|ECJPAKE\|SSL async private'
Manuel Pégourié-Gonnarde73b2632014-07-12 04:00:00 +0200714
Gilles Peskine8f073122018-11-27 15:58:47 +0100715 msg "test: compat.sh RC4, DES & NULL (full config)" # ~ 2 min
716 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 +0200717
Gilles Peskine8f073122018-11-27 15:58:47 +0100718 msg "test: compat.sh ARIA + ChachaPoly"
719 if_build_succeeded env OPENSSL_CMD="$OPENSSL_NEXT" tests/compat.sh -e '^$' -f 'ARIA\|CHACHA'
720}
Manuel Pégourié-Gonnard6b368922018-02-20 12:02:07 +0100721
Gilles Peskine8f073122018-11-27 15:58:47 +0100722component_build_deprecated () {
723 msg "build: make, full config + DEPRECATED_WARNING, gcc -O" # ~ 30s
Gilles Peskine8f073122018-11-27 15:58:47 +0100724 scripts/config.pl full
725 scripts/config.pl set MBEDTLS_DEPRECATED_WARNING
726 # Build with -O -Wextra to catch a maximum of issues.
727 make CC=gcc CFLAGS='-O -Werror -Wall -Wextra' lib programs
728 make CC=gcc CFLAGS='-O -Werror -Wall -Wextra -Wno-unused-function' tests
Gilles Peskineb4ef45b2018-03-01 22:23:50 +0100729
Gilles Peskine8f073122018-11-27 15:58:47 +0100730 msg "build: make, full config + DEPRECATED_REMOVED, clang -O" # ~ 30s
731 # No cleanup, just tweak the configuration and rebuild
732 make clean
733 scripts/config.pl unset MBEDTLS_DEPRECATED_WARNING
734 scripts/config.pl set MBEDTLS_DEPRECATED_REMOVED
735 # Build with -O -Wextra to catch a maximum of issues.
736 make CC=clang CFLAGS='-O -Werror -Wall -Wextra' lib programs
737 make CC=clang CFLAGS='-O -Werror -Wall -Wextra -Wno-unused-function' tests
738}
Gilles Peskine0afe6242018-02-21 19:28:12 +0100739
Manuel Pégourié-Gonnarde73b2632014-07-12 04:00:00 +0200740
Gilles Peskine8f073122018-11-27 15:58:47 +0100741component_test_depends_curves () {
742 msg "test/build: curves.pl (gcc)" # ~ 4 min
Gilles Peskine8f073122018-11-27 15:58:47 +0100743 record_status tests/scripts/curves.pl
744}
Manuel Pégourié-Gonnard1fe6bb92017-06-06 11:36:16 +0200745
Gilles Peskine8f073122018-11-27 15:58:47 +0100746component_test_depends_hashes () {
747 msg "test/build: depends-hashes.pl (gcc)" # ~ 2 min
Gilles Peskine8f073122018-11-27 15:58:47 +0100748 record_status tests/scripts/depends-hashes.pl
749}
Manuel Pégourié-Gonnard43be6cd2017-06-20 09:53:42 +0200750
Gilles Peskine8f073122018-11-27 15:58:47 +0100751component_test_depends_pkalgs () {
752 msg "test/build: depends-pkalgs.pl (gcc)" # ~ 2 min
Gilles Peskine8f073122018-11-27 15:58:47 +0100753 record_status tests/scripts/depends-pkalgs.pl
754}
Manuel Pégourié-Gonnard503a5ef2015-10-23 09:04:45 +0200755
Gilles Peskine8f073122018-11-27 15:58:47 +0100756component_build_key_exchanges () {
757 msg "test/build: key-exchanges (gcc)" # ~ 1 min
Gilles Peskine8f073122018-11-27 15:58:47 +0100758 record_status tests/scripts/key-exchanges.pl
759}
Manuel Pégourié-Gonnard80955ee2014-03-19 18:29:01 +0100760
Gilles Peskine8f073122018-11-27 15:58:47 +0100761component_build_default_make_gcc_and_cxx () {
762 msg "build: Unix make, -Os (gcc)" # ~ 30s
Gilles Peskine8f073122018-11-27 15:58:47 +0100763 make CC=gcc CFLAGS='-Werror -Wall -Wextra -Os'
Andrzej Kurek991f9fe2018-07-02 09:08:21 -0400764
Gilles Peskine8f073122018-11-27 15:58:47 +0100765 msg "test: verify header list in cpp_dummy_build.cpp"
766 record_status check_headers_in_cpp
Andrzej Kurek991f9fe2018-07-02 09:08:21 -0400767
Gilles Peskine8f073122018-11-27 15:58:47 +0100768 msg "build: Unix make, incremental g++"
769 make TEST_CPP=1
770}
Manuel Pégourié-Gonnarda71780e2015-02-13 13:56:55 +0000771
Gilles Peskineb28636b2019-01-02 19:06:24 +0100772component_test_check_params_without_platform () {
773 msg "build+test: MBEDTLS_CHECK_PARAMS without MBEDTLS_PLATFORM_C"
774 scripts/config.pl full # includes CHECK_PARAMS
775 scripts/config.pl unset MBEDTLS_MEMORY_BACKTRACE # too slow for tests
776 scripts/config.pl unset MBEDTLS_MEMORY_BUFFER_ALLOC_C
777 scripts/config.pl unset MBEDTLS_PLATFORM_EXIT_ALT
778 scripts/config.pl unset MBEDTLS_PLATFORM_TIME_ALT
779 scripts/config.pl unset MBEDTLS_PLATFORM_FPRINTF_ALT
780 scripts/config.pl unset MBEDTLS_PLATFORM_MEMORY
781 scripts/config.pl unset MBEDTLS_PLATFORM_PRINTF_ALT
782 scripts/config.pl unset MBEDTLS_PLATFORM_SNPRINTF_ALT
783 scripts/config.pl unset MBEDTLS_ENTROPY_NV_SEED
784 scripts/config.pl unset MBEDTLS_PLATFORM_C
785 make CC=gcc CFLAGS='-Werror -O1' all test
786}
Manuel Pégourié-Gonnard009a2642015-05-29 10:31:13 +0200787
Gilles Peskineb28636b2019-01-02 19:06:24 +0100788component_test_check_params_silent () {
789 msg "build+test: MBEDTLS_CHECK_PARAMS with alternative MBEDTLS_PARAM_FAILED()"
790 scripts/config.pl full # includes CHECK_PARAMS
791 scripts/config.pl unset MBEDTLS_MEMORY_BACKTRACE # too slow for tests
792 sed -i 's/.*\(#define MBEDTLS_PARAM_FAILED( cond )\).*/\1/' "$CONFIG_H"
793 make CC=gcc CFLAGS='-Werror -O1' all test
794}
Hanno Becker5175ac62017-09-18 15:36:25 +0100795
Gilles Peskine8f073122018-11-27 15:58:47 +0100796component_test_no_platform () {
797 # Full configuration build, without platform support, file IO and net sockets.
798 # This should catch missing mbedtls_printf definitions, and by disabling file
799 # IO, it should catch missing '#include <stdio.h>'
800 msg "build: full config except platform/fsio/net, make, gcc, C99" # ~ 30s
Gilles Peskine8f073122018-11-27 15:58:47 +0100801 scripts/config.pl full
802 scripts/config.pl unset MBEDTLS_PLATFORM_C
803 scripts/config.pl unset MBEDTLS_NET_C
804 scripts/config.pl unset MBEDTLS_PLATFORM_MEMORY
805 scripts/config.pl unset MBEDTLS_PLATFORM_PRINTF_ALT
806 scripts/config.pl unset MBEDTLS_PLATFORM_FPRINTF_ALT
807 scripts/config.pl unset MBEDTLS_PLATFORM_SNPRINTF_ALT
808 scripts/config.pl unset MBEDTLS_PLATFORM_TIME_ALT
809 scripts/config.pl unset MBEDTLS_PLATFORM_EXIT_ALT
810 scripts/config.pl unset MBEDTLS_ENTROPY_NV_SEED
811 scripts/config.pl unset MBEDTLS_MEMORY_BUFFER_ALLOC_C
812 scripts/config.pl unset MBEDTLS_FS_IO
813 # Note, _DEFAULT_SOURCE needs to be defined for platforms using glibc version >2.19,
814 # to re-enable platform integration features otherwise disabled in C99 builds
815 make CC=gcc CFLAGS='-Werror -Wall -Wextra -std=c99 -pedantic -O0 -D_DEFAULT_SOURCE' lib programs
816 make CC=gcc CFLAGS='-Werror -Wall -Wextra -O0' test
817}
Manuel Pégourié-Gonnard66b8e952015-05-20 11:13:56 +0200818
Gilles Peskine8f073122018-11-27 15:58:47 +0100819component_build_no_std_function () {
820 # catch compile bugs in _uninit functions
821 msg "build: full config with NO_STD_FUNCTION, make, gcc" # ~ 30s
Gilles Peskine8f073122018-11-27 15:58:47 +0100822 scripts/config.pl full
823 scripts/config.pl set MBEDTLS_PLATFORM_NO_STD_FUNCTIONS
824 scripts/config.pl unset MBEDTLS_ENTROPY_NV_SEED
825 make CC=gcc CFLAGS='-Werror -Wall -Wextra -O0'
826}
Manuel Pégourié-Gonnard66b8e952015-05-20 11:13:56 +0200827
Gilles Peskine8f073122018-11-27 15:58:47 +0100828component_build_no_ssl_srv () {
829 msg "build: full config except ssl_srv.c, make, gcc" # ~ 30s
Gilles Peskine8f073122018-11-27 15:58:47 +0100830 scripts/config.pl full
831 scripts/config.pl unset MBEDTLS_SSL_SRV_C
832 make CC=gcc CFLAGS='-Werror -Wall -Wextra -O0'
833}
Manuel Pégourié-Gonnard66b8e952015-05-20 11:13:56 +0200834
Gilles Peskine8f073122018-11-27 15:58:47 +0100835component_build_no_ssl_cli () {
836 msg "build: full config except ssl_cli.c, make, gcc" # ~ 30s
Gilles Peskine8f073122018-11-27 15:58:47 +0100837 scripts/config.pl full
838 scripts/config.pl unset MBEDTLS_SSL_CLI_C
839 make CC=gcc CFLAGS='-Werror -Wall -Wextra -O0'
840}
Manuel Pégourié-Gonnardedb2dc92015-02-10 14:36:31 +0000841
Gilles Peskine8f073122018-11-27 15:58:47 +0100842component_build_no_sockets () {
843 # Note, C99 compliance can also be tested with the sockets support disabled,
844 # as that requires a POSIX platform (which isn't the same as C99).
845 msg "build: full config except net_sockets.c, make, gcc -std=c99 -pedantic" # ~ 30s
Gilles Peskine8f073122018-11-27 15:58:47 +0100846 scripts/config.pl full
847 scripts/config.pl unset MBEDTLS_NET_C # getaddrinfo() undeclared, etc.
848 scripts/config.pl set MBEDTLS_NO_PLATFORM_ENTROPY # uses syscall() on GNU/Linux
849 make CC=gcc CFLAGS='-Werror -Wall -Wextra -O0 -std=c99 -pedantic' lib
850}
Hanno Becker5175ac62017-09-18 15:36:25 +0100851
Gilles Peskine8f073122018-11-27 15:58:47 +0100852component_test_no_max_fragment_length () {
853 # Run max fragment length tests with MFL disabled
854 msg "build: default config except MFL extension (ASan build)" # ~ 30s
Gilles Peskine8f073122018-11-27 15:58:47 +0100855 scripts/config.pl unset MBEDTLS_SSL_MAX_FRAGMENT_LENGTH
856 CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
857 make
Manuel Pégourié-Gonnardedb2dc92015-02-10 14:36:31 +0000858
Gilles Peskine8f073122018-11-27 15:58:47 +0100859 msg "test: ssl-opt.sh, MFL-related tests"
860 if_build_succeeded tests/ssl-opt.sh -f "Max fragment length"
861}
Angus Grattonc4dd0732018-04-11 16:28:39 +1000862
Gilles Peskine8f073122018-11-27 15:58:47 +0100863component_test_no_max_fragment_length_small_ssl_out_content_len () {
864 msg "build: no MFL extension, small SSL_OUT_CONTENT_LEN (ASan build)"
Gilles Peskine8f073122018-11-27 15:58:47 +0100865 scripts/config.pl unset MBEDTLS_SSL_MAX_FRAGMENT_LENGTH
866 scripts/config.pl set MBEDTLS_SSL_IN_CONTENT_LEN 16384
867 scripts/config.pl set MBEDTLS_SSL_OUT_CONTENT_LEN 4096
868 CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
869 make
Angus Grattonc4dd0732018-04-11 16:28:39 +1000870
Gilles Peskine8f073122018-11-27 15:58:47 +0100871 msg "test: MFL tests (disabled MFL extension case) & large packet tests"
872 if_build_succeeded tests/ssl-opt.sh -f "Max fragment length\|Large buffer"
873}
Janos Follath06c54002016-06-09 13:57:40 +0100874
Gilles Peskine8f073122018-11-27 15:58:47 +0100875component_test_null_entropy () {
876 msg "build: default config with MBEDTLS_TEST_NULL_ENTROPY (ASan build)"
Gilles Peskine8f073122018-11-27 15:58:47 +0100877 scripts/config.pl set MBEDTLS_TEST_NULL_ENTROPY
878 scripts/config.pl set MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES
879 scripts/config.pl set MBEDTLS_ENTROPY_C
880 scripts/config.pl unset MBEDTLS_ENTROPY_NV_SEED
881 scripts/config.pl unset MBEDTLS_ENTROPY_HARDWARE_ALT
882 scripts/config.pl unset MBEDTLS_HAVEGE_C
Gilles Peskine5fa32a72019-01-06 19:48:30 +0000883 CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan -D UNSAFE_BUILD=ON .
Gilles Peskine8f073122018-11-27 15:58:47 +0100884 make
Janos Follath06c54002016-06-09 13:57:40 +0100885
Gilles Peskine8f073122018-11-27 15:58:47 +0100886 msg "test: MBEDTLS_TEST_NULL_ENTROPY - main suites (inc. selftests) (ASan build)"
887 make test
888}
Hanno Beckere5fecec2018-10-11 11:02:52 +0100889
Gilles Peskine8f073122018-11-27 15:58:47 +0100890component_test_platform_calloc_macro () {
891 msg "build: MBEDTLS_PLATFORM_{CALLOC/FREE}_MACRO enabled (ASan build)"
Gilles Peskine8f073122018-11-27 15:58:47 +0100892 scripts/config.pl set MBEDTLS_PLATFORM_MEMORY
893 scripts/config.pl set MBEDTLS_PLATFORM_CALLOC_MACRO calloc
894 scripts/config.pl set MBEDTLS_PLATFORM_FREE_MACRO free
895 CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
896 make
Hanno Beckere5fecec2018-10-11 11:02:52 +0100897
Gilles Peskine8f073122018-11-27 15:58:47 +0100898 msg "test: MBEDTLS_PLATFORM_{CALLOC/FREE}_MACRO enabled (ASan build)"
899 make test
900}
Hanno Becker83ebf782017-07-07 12:29:15 +0100901
Gilles Peskine8f073122018-11-27 15:58:47 +0100902component_test_aes_fewer_tables () {
903 msg "build: default config with AES_FEWER_TABLES enabled"
Gilles Peskine8f073122018-11-27 15:58:47 +0100904 scripts/config.pl set MBEDTLS_AES_FEWER_TABLES
905 make CC=gcc CFLAGS='-Werror -Wall -Wextra'
Hanno Becker83ebf782017-07-07 12:29:15 +0100906
Gilles Peskine8f073122018-11-27 15:58:47 +0100907 msg "test: AES_FEWER_TABLES"
908 make test
909}
Hanno Becker83ebf782017-07-07 12:29:15 +0100910
Gilles Peskine8f073122018-11-27 15:58:47 +0100911component_test_aes_rom_tables () {
912 msg "build: default config with AES_ROM_TABLES enabled"
Gilles Peskine8f073122018-11-27 15:58:47 +0100913 scripts/config.pl set MBEDTLS_AES_ROM_TABLES
914 make CC=gcc CFLAGS='-Werror -Wall -Wextra'
Hanno Becker83ebf782017-07-07 12:29:15 +0100915
Gilles Peskine8f073122018-11-27 15:58:47 +0100916 msg "test: AES_ROM_TABLES"
917 make test
918}
Hanno Becker83ebf782017-07-07 12:29:15 +0100919
Gilles Peskine8f073122018-11-27 15:58:47 +0100920component_test_aes_fewer_tables_and_rom_tables () {
921 msg "build: default config with AES_ROM_TABLES and AES_FEWER_TABLES enabled"
Gilles Peskine8f073122018-11-27 15:58:47 +0100922 scripts/config.pl set MBEDTLS_AES_FEWER_TABLES
923 scripts/config.pl set MBEDTLS_AES_ROM_TABLES
924 make CC=gcc CFLAGS='-Werror -Wall -Wextra'
Hanno Becker83ebf782017-07-07 12:29:15 +0100925
Gilles Peskine8f073122018-11-27 15:58:47 +0100926 msg "test: AES_FEWER_TABLES + AES_ROM_TABLES"
927 make test
928}
929
930component_test_make_shared () {
Gilles Peskine7ad603e2017-12-10 23:22:20 +0100931 msg "build/test: make shared" # ~ 40s
Gilles Peskine7ad603e2017-12-10 23:22:20 +0100932 make SHARED=1 all check
Gilles Peskine8f073122018-11-27 15:58:47 +0100933}
Manuel Pégourié-Gonnard9b06abe2015-06-25 09:56:07 +0200934
Gilles Peskine8f073122018-11-27 15:58:47 +0100935component_test_m32_o0 () {
Simon Butcher8e6a22a2018-07-20 21:27:33 +0100936 # Build once with -O0, to compile out the i386 specific inline assembly
937 msg "build: i386, make, gcc -O0 (ASan build)" # ~ 30s
Simon Butcher7a6da6e2018-06-27 21:52:54 +0100938 scripts/config.pl full
Simon Butcher8e6a22a2018-07-20 21:27:33 +0100939 make CC=gcc CFLAGS='-O0 -Werror -Wall -Wextra -m32 -fsanitize=address'
Andres Amaya Garcia84e6ce82017-05-04 11:35:51 +0100940
Simon Butcher8e6a22a2018-07-20 21:27:33 +0100941 msg "test: i386, make, gcc -O0 (ASan build)"
942 make test
Gilles Peskine8f073122018-11-27 15:58:47 +0100943}
Gilles Peskine878cf602019-01-06 20:50:38 +0000944support_test_m32_o0 () {
945 case $(uname -m) in
946 *64*) true;;
947 *) false;;
948 esac
949}
Simon Butcher8e6a22a2018-07-20 21:27:33 +0100950
Gilles Peskine8f073122018-11-27 15:58:47 +0100951component_test_m32_o1 () {
Simon Butcher8e6a22a2018-07-20 21:27:33 +0100952 # Build again with -O1, to compile in the i386 specific inline assembly
953 msg "build: i386, make, gcc -O1 (ASan build)" # ~ 30s
Simon Butcher8e6a22a2018-07-20 21:27:33 +0100954 scripts/config.pl full
955 make CC=gcc CFLAGS='-O1 -Werror -Wall -Wextra -m32 -fsanitize=address'
956
957 msg "test: i386, make, gcc -O1 (ASan build)"
Andres Amaya Garciaf4fbdda2017-05-08 11:19:19 +0100958 make test
Gilles Peskine8f073122018-11-27 15:58:47 +0100959}
Gilles Peskine878cf602019-01-06 20:50:38 +0000960support_test_m32_o1 () {
961 support_test_m32_o0 "$@"
962}
Andres Amaya Garciaf4fbdda2017-05-08 11:19:19 +0100963
Gilles Peskine8f073122018-11-27 15:58:47 +0100964component_test_mx32 () {
Andres Amaya Garciaf4fbdda2017-05-08 11:19:19 +0100965 msg "build: 64-bit ILP32, make, gcc" # ~ 30s
Simon Butcher7a6da6e2018-06-27 21:52:54 +0100966 scripts/config.pl full
Andres Amaya Garciaf4fbdda2017-05-08 11:19:19 +0100967 make CC=gcc CFLAGS='-Werror -Wall -Wextra -mx32'
968
969 msg "test: 64-bit ILP32, make, gcc"
970 make test
Gilles Peskine8f073122018-11-27 15:58:47 +0100971}
Gilles Peskine878cf602019-01-06 20:50:38 +0000972support_test_mx32 () {
973 case $(uname -m) in
974 amd64|x86_64) true;;
975 *) false;;
976 esac
977}
Manuel Pégourié-Gonnardedb2dc92015-02-10 14:36:31 +0000978
Gilles Peskine8f073122018-11-27 15:58:47 +0100979component_test_have_int32 () {
980 msg "build: gcc, force 32-bit bignum limbs"
Gilles Peskine8f073122018-11-27 15:58:47 +0100981 scripts/config.pl unset MBEDTLS_HAVE_ASM
982 scripts/config.pl unset MBEDTLS_AESNI_C
983 scripts/config.pl unset MBEDTLS_PADLOCK_C
984 make CC=gcc CFLAGS='-Werror -Wall -Wextra -DMBEDTLS_HAVE_INT32'
Andres Amaya Garcia84e6ce82017-05-04 11:35:51 +0100985
Gilles Peskine8f073122018-11-27 15:58:47 +0100986 msg "test: gcc, force 32-bit bignum limbs"
987 make test
988}
Andres Amaya Garciafe843a32017-07-20 13:21:34 +0100989
Gilles Peskine8f073122018-11-27 15:58:47 +0100990component_test_have_int64 () {
991 msg "build: gcc, force 64-bit bignum limbs"
Gilles Peskine8f073122018-11-27 15:58:47 +0100992 scripts/config.pl unset MBEDTLS_HAVE_ASM
993 scripts/config.pl unset MBEDTLS_AESNI_C
994 scripts/config.pl unset MBEDTLS_PADLOCK_C
995 make CC=gcc CFLAGS='-Werror -Wall -Wextra -DMBEDTLS_HAVE_INT64'
Gilles Peskine14c3c062018-01-29 21:25:12 +0100996
Gilles Peskine8f073122018-11-27 15:58:47 +0100997 msg "test: gcc, force 64-bit bignum limbs"
998 make test
999}
Manuel Pégourié-Gonnardedb2dc92015-02-10 14:36:31 +00001000
Gilles Peskine8f073122018-11-27 15:58:47 +01001001component_test_no_udbl_division () {
1002 msg "build: MBEDTLS_NO_UDBL_DIVISION native" # ~ 10s
Gilles Peskine8f073122018-11-27 15:58:47 +01001003 scripts/config.pl full
1004 scripts/config.pl unset MBEDTLS_MEMORY_BACKTRACE # too slow for tests
1005 scripts/config.pl set MBEDTLS_NO_UDBL_DIVISION
1006 make CFLAGS='-Werror -O1'
Manuel Pégourié-Gonnard2adb3752018-06-07 10:51:44 +02001007
Gilles Peskine8f073122018-11-27 15:58:47 +01001008 msg "test: MBEDTLS_NO_UDBL_DIVISION native" # ~ 10s
1009 make test
1010}
Manuel Pégourié-Gonnard2adb3752018-06-07 10:51:44 +02001011
Gilles Peskine8f073122018-11-27 15:58:47 +01001012component_test_no_64bit_multiplication () {
1013 msg "build: MBEDTLS_NO_64BIT_MULTIPLICATION native" # ~ 10s
Gilles Peskine8f073122018-11-27 15:58:47 +01001014 scripts/config.pl full
1015 scripts/config.pl unset MBEDTLS_MEMORY_BACKTRACE # too slow for tests
1016 scripts/config.pl set MBEDTLS_NO_64BIT_MULTIPLICATION
1017 make CFLAGS='-Werror -O1'
Manuel Pégourié-Gonnard2adb3752018-06-07 10:51:44 +02001018
Gilles Peskine8f073122018-11-27 15:58:47 +01001019 msg "test: MBEDTLS_NO_64BIT_MULTIPLICATION native" # ~ 10s
1020 make test
1021}
Manuel Pégourié-Gonnard2adb3752018-06-07 10:51:44 +02001022
Gilles Peskine8f073122018-11-27 15:58:47 +01001023component_build_arm_none_eabi_gcc () {
1024 msg "build: arm-none-eabi-gcc, make" # ~ 10s
Gilles Peskine8f073122018-11-27 15:58:47 +01001025 scripts/config.pl full
1026 scripts/config.pl unset MBEDTLS_NET_C
1027 scripts/config.pl unset MBEDTLS_TIMING_C
1028 scripts/config.pl unset MBEDTLS_FS_IO
1029 scripts/config.pl unset MBEDTLS_ENTROPY_NV_SEED
1030 scripts/config.pl set MBEDTLS_NO_PLATFORM_ENTROPY
1031 # following things are not in the default config
1032 scripts/config.pl unset MBEDTLS_HAVEGE_C # depends on timing.c
1033 scripts/config.pl unset MBEDTLS_THREADING_PTHREAD
1034 scripts/config.pl unset MBEDTLS_THREADING_C
1035 scripts/config.pl unset MBEDTLS_MEMORY_BACKTRACE # execinfo.h
1036 scripts/config.pl unset MBEDTLS_MEMORY_BUFFER_ALLOC_C # calls exit
1037 make CC=arm-none-eabi-gcc AR=arm-none-eabi-ar LD=arm-none-eabi-ld CFLAGS='-Werror -Wall -Wextra' lib
1038}
Manuel Pégourié-Gonnard2adb3752018-06-07 10:51:44 +02001039
Gilles Peskine8f073122018-11-27 15:58:47 +01001040component_build_arm_none_eabi_gcc_no_udbl_division () {
1041 msg "build: arm-none-eabi-gcc -DMBEDTLS_NO_UDBL_DIVISION, make" # ~ 10s
Gilles Peskine8f073122018-11-27 15:58:47 +01001042 scripts/config.pl full
1043 scripts/config.pl unset MBEDTLS_NET_C
1044 scripts/config.pl unset MBEDTLS_TIMING_C
1045 scripts/config.pl unset MBEDTLS_FS_IO
1046 scripts/config.pl unset MBEDTLS_ENTROPY_NV_SEED
1047 scripts/config.pl set MBEDTLS_NO_PLATFORM_ENTROPY
1048 # following things are not in the default config
1049 scripts/config.pl unset MBEDTLS_HAVEGE_C # depends on timing.c
1050 scripts/config.pl unset MBEDTLS_THREADING_PTHREAD
1051 scripts/config.pl unset MBEDTLS_THREADING_C
1052 scripts/config.pl unset MBEDTLS_MEMORY_BACKTRACE # execinfo.h
1053 scripts/config.pl unset MBEDTLS_MEMORY_BUFFER_ALLOC_C # calls exit
1054 scripts/config.pl set MBEDTLS_NO_UDBL_DIVISION
1055 make CC=arm-none-eabi-gcc AR=arm-none-eabi-ar LD=arm-none-eabi-ld CFLAGS='-Werror -Wall -Wextra' lib
1056 echo "Checking that software 64-bit division is not required"
1057 if_build_succeeded not grep __aeabi_uldiv library/*.o
1058}
Manuel Pégourié-Gonnard2adb3752018-06-07 10:51:44 +02001059
Gilles Peskine8f073122018-11-27 15:58:47 +01001060component_build_arm_none_eabi_gcc_no_64bit_multiplication () {
1061 msg "build: arm-none-eabi-gcc MBEDTLS_NO_64BIT_MULTIPLICATION, make" # ~ 10s
Gilles Peskine8f073122018-11-27 15:58:47 +01001062 scripts/config.pl full
1063 scripts/config.pl unset MBEDTLS_NET_C
1064 scripts/config.pl unset MBEDTLS_TIMING_C
1065 scripts/config.pl unset MBEDTLS_FS_IO
1066 scripts/config.pl unset MBEDTLS_ENTROPY_NV_SEED
1067 scripts/config.pl set MBEDTLS_NO_PLATFORM_ENTROPY
1068 # following things are not in the default config
1069 scripts/config.pl unset MBEDTLS_HAVEGE_C # depends on timing.c
1070 scripts/config.pl unset MBEDTLS_THREADING_PTHREAD
1071 scripts/config.pl unset MBEDTLS_THREADING_C
1072 scripts/config.pl unset MBEDTLS_MEMORY_BACKTRACE # execinfo.h
1073 scripts/config.pl unset MBEDTLS_MEMORY_BUFFER_ALLOC_C # calls exit
1074 scripts/config.pl set MBEDTLS_NO_64BIT_MULTIPLICATION
1075 make CC=arm-none-eabi-gcc AR=arm-none-eabi-ar LD=arm-none-eabi-ld CFLAGS='-Werror -O1 -march=armv6-m -mthumb' lib
1076 echo "Checking that software 64-bit multiplication is not required"
1077 if_build_succeeded not grep __aeabi_lmul library/*.o
1078}
Manuel Pégourié-Gonnard2adb3752018-06-07 10:51:44 +02001079
Gilles Peskine8f073122018-11-27 15:58:47 +01001080component_build_armcc () {
1081 msg "build: ARM Compiler 5, make"
Gilles Peskine8f073122018-11-27 15:58:47 +01001082 scripts/config.pl full
1083 scripts/config.pl unset MBEDTLS_NET_C
1084 scripts/config.pl unset MBEDTLS_TIMING_C
1085 scripts/config.pl unset MBEDTLS_FS_IO
1086 scripts/config.pl unset MBEDTLS_ENTROPY_NV_SEED
1087 scripts/config.pl unset MBEDTLS_HAVE_TIME
1088 scripts/config.pl unset MBEDTLS_HAVE_TIME_DATE
1089 scripts/config.pl set MBEDTLS_NO_PLATFORM_ENTROPY
1090 # following things are not in the default config
1091 scripts/config.pl unset MBEDTLS_DEPRECATED_WARNING
1092 scripts/config.pl unset MBEDTLS_HAVEGE_C # depends on timing.c
1093 scripts/config.pl unset MBEDTLS_THREADING_PTHREAD
1094 scripts/config.pl unset MBEDTLS_THREADING_C
1095 scripts/config.pl unset MBEDTLS_MEMORY_BACKTRACE # execinfo.h
1096 scripts/config.pl unset MBEDTLS_MEMORY_BUFFER_ALLOC_C # calls exit
1097 scripts/config.pl unset MBEDTLS_PLATFORM_TIME_ALT # depends on MBEDTLS_HAVE_TIME
Manuel Pégourié-Gonnardedb2dc92015-02-10 14:36:31 +00001098
Gilles Peskine5331c6e2019-01-06 22:23:42 +00001099 make CC="$ARMC5_CC" AR="$ARMC5_AR" WARNING_CFLAGS='--strict --c99' lib
1100 make clean
Manuel Pégourié-Gonnard2adb3752018-06-07 10:51:44 +02001101
Gilles Peskine5331c6e2019-01-06 22:23:42 +00001102 # ARM Compiler 6 - Target ARMv7-A
1103 armc6_build_test "--target=arm-arm-none-eabi -march=armv7-a"
Gilles Peskineed942f82017-06-08 15:19:20 +02001104
Gilles Peskine5331c6e2019-01-06 22:23:42 +00001105 # ARM Compiler 6 - Target ARMv7-M
1106 armc6_build_test "--target=arm-arm-none-eabi -march=armv7-m"
Andres AG87bb5772016-09-27 15:05:15 +01001107
Gilles Peskine5331c6e2019-01-06 22:23:42 +00001108 # ARM Compiler 6 - Target ARMv8-A - AArch32
1109 armc6_build_test "--target=arm-arm-none-eabi -march=armv8.2-a"
Andres AG87bb5772016-09-27 15:05:15 +01001110
Gilles Peskine5331c6e2019-01-06 22:23:42 +00001111 # ARM Compiler 6 - Target ARMv8-M
1112 armc6_build_test "--target=arm-arm-none-eabi -march=armv8-m.main"
Simon Butcher940737f2017-07-23 13:42:36 +02001113
Gilles Peskine5331c6e2019-01-06 22:23:42 +00001114 # ARM Compiler 6 - Target ARMv8-A - AArch64
1115 armc6_build_test "--target=aarch64-arm-none-eabi -march=armv8.2-a"
Gilles Peskine8f073122018-11-27 15:58:47 +01001116}
Simon Butcher940737f2017-07-23 13:42:36 +02001117
Gilles Peskine8f073122018-11-27 15:58:47 +01001118component_test_allow_sha1 () {
1119 msg "build: allow SHA1 in certificates by default"
Gilles Peskine8f073122018-11-27 15:58:47 +01001120 scripts/config.pl set MBEDTLS_TLS_DEFAULT_ALLOW_SHA1_IN_CERTIFICATES
1121 make CFLAGS='-Werror -Wall -Wextra'
1122 msg "test: allow SHA1 in certificates by default"
1123 make test
1124 if_build_succeeded tests/ssl-opt.sh -f SHA-1
1125}
Simon Butcher940737f2017-07-23 13:42:36 +02001126
Gilles Peskine8f073122018-11-27 15:58:47 +01001127component_build_mingw () {
1128 msg "build: Windows cross build - mingw64, make (Link Library)" # ~ 30s
Gilles Peskine8f073122018-11-27 15:58:47 +01001129 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 +02001130
Gilles Peskine8f073122018-11-27 15:58:47 +01001131 # note Make tests only builds the tests, but doesn't run them
1132 make CC=i686-w64-mingw32-gcc AR=i686-w64-mingw32-ar LD=i686-w64-minggw32-ld CFLAGS='-Werror' WINDOWS_BUILD=1 tests
1133 make WINDOWS_BUILD=1 clean
Hanno Beckere963efa2018-01-03 10:03:43 +00001134
Gilles Peskine8f073122018-11-27 15:58:47 +01001135 msg "build: Windows cross build - mingw64, make (DLL)" # ~ 30s
1136 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
1137 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
1138 make WINDOWS_BUILD=1 clean
1139}
Simon Butcher002bc622016-11-17 09:27:45 +00001140
Gilles Peskine8f073122018-11-27 15:58:47 +01001141component_test_memsan () {
Gilles Peskine7ad603e2017-12-10 23:22:20 +01001142 msg "build: MSan (clang)" # ~ 1 min 20s
Gilles Peskine7ad603e2017-12-10 23:22:20 +01001143 scripts/config.pl unset MBEDTLS_AESNI_C # memsan doesn't grok asm
1144 CC=clang cmake -D CMAKE_BUILD_TYPE:String=MemSan .
1145 make
Manuel Pégourié-Gonnard4a9dc2a2014-05-09 13:46:59 +02001146
Gilles Peskine7ad603e2017-12-10 23:22:20 +01001147 msg "test: main suites (MSan)" # ~ 10s
1148 make test
Manuel Pégourié-Gonnard9bda9b32014-11-20 13:10:22 +01001149
Gilles Peskine7ad603e2017-12-10 23:22:20 +01001150 msg "test: ssl-opt.sh (MSan)" # ~ 1 min
Gilles Peskine7c652162017-12-11 00:01:40 +01001151 if_build_succeeded tests/ssl-opt.sh
Manuel Pégourié-Gonnard9bda9b32014-11-20 13:10:22 +01001152
Gilles Peskine7ad603e2017-12-10 23:22:20 +01001153 # Optional part(s)
Manuel Pégourié-Gonnard9bda9b32014-11-20 13:10:22 +01001154
Gilles Peskine7ad603e2017-12-10 23:22:20 +01001155 if [ "$MEMORY" -gt 0 ]; then
1156 msg "test: compat.sh (MSan)" # ~ 6 min 20s
Gilles Peskine7c652162017-12-11 00:01:40 +01001157 if_build_succeeded tests/compat.sh
Gilles Peskine7ad603e2017-12-10 23:22:20 +01001158 fi
Gilles Peskine8f073122018-11-27 15:58:47 +01001159}
Manuel Pégourié-Gonnard80955ee2014-03-19 18:29:01 +01001160
Gilles Peskine8f073122018-11-27 15:58:47 +01001161component_test_memcheck () {
Gilles Peskine7ad603e2017-12-10 23:22:20 +01001162 msg "build: Release (clang)"
Gilles Peskine7ad603e2017-12-10 23:22:20 +01001163 CC=clang cmake -D CMAKE_BUILD_TYPE:String=Release .
1164 make
Manuel Pégourié-Gonnard392d3dd2015-01-26 14:03:56 +00001165
Gilles Peskine7ad603e2017-12-10 23:22:20 +01001166 msg "test: main suites valgrind (Release)"
1167 make memcheck
Manuel Pégourié-Gonnard392d3dd2015-01-26 14:03:56 +00001168
Gilles Peskine7ad603e2017-12-10 23:22:20 +01001169 # Optional part(s)
1170 # Currently broken, programs don't seem to receive signals
1171 # under valgrind on OS X
Manuel Pégourié-Gonnard392d3dd2015-01-26 14:03:56 +00001172
Gilles Peskine7ad603e2017-12-10 23:22:20 +01001173 if [ "$MEMORY" -gt 0 ]; then
1174 msg "test: ssl-opt.sh --memcheck (Release)"
Gilles Peskine7c652162017-12-11 00:01:40 +01001175 if_build_succeeded tests/ssl-opt.sh --memcheck
Gilles Peskine7ad603e2017-12-10 23:22:20 +01001176 fi
Manuel Pégourié-Gonnard392d3dd2015-01-26 14:03:56 +00001177
Gilles Peskine7ad603e2017-12-10 23:22:20 +01001178 if [ "$MEMORY" -gt 1 ]; then
1179 msg "test: compat.sh --memcheck (Release)"
Gilles Peskine7c652162017-12-11 00:01:40 +01001180 if_build_succeeded tests/compat.sh --memcheck
Gilles Peskine7ad603e2017-12-10 23:22:20 +01001181 fi
Gilles Peskine8f073122018-11-27 15:58:47 +01001182}
Manuel Pégourié-Gonnard392d3dd2015-01-26 14:03:56 +00001183
Gilles Peskine8f073122018-11-27 15:58:47 +01001184component_test_cmake_out_of_source () {
1185 msg "build: cmake 'out-of-source' build"
Gilles Peskine8f073122018-11-27 15:58:47 +01001186 MBEDTLS_ROOT_DIR="$PWD"
1187 mkdir "$OUT_OF_SOURCE_DIR"
1188 cd "$OUT_OF_SOURCE_DIR"
1189 cmake "$MBEDTLS_ROOT_DIR"
1190 make
Manuel Pégourié-Gonnard392d3dd2015-01-26 14:03:56 +00001191
Gilles Peskine8f073122018-11-27 15:58:47 +01001192 msg "test: cmake 'out-of-source' build"
1193 make test
1194 # Test an SSL option that requires an auxiliary script in test/scripts/.
1195 # Also ensure that there are no error messages such as
1196 # "No such file or directory", which would indicate that some required
1197 # file is missing (ssl-opt.sh tolerates the absence of some files so
1198 # may exit with status 0 but emit errors).
1199 if_build_succeeded ./tests/ssl-opt.sh -f 'Fallback SCSV: beginning of list' 2>ssl-opt.err
1200 if [ -s ssl-opt.err ]; then
1201 cat ssl-opt.err >&2
1202 record_status [ ! -s ssl-opt.err ]
1203 rm ssl-opt.err
1204 fi
1205 cd "$MBEDTLS_ROOT_DIR"
1206 rm -rf "$OUT_OF_SOURCE_DIR"
1207 unset MBEDTLS_ROOT_DIR
1208}
Andres AGdc192212016-08-31 17:33:13 +01001209
Gilles Peskine8f073122018-11-27 15:58:47 +01001210component_test_zeroize () {
1211 # Test that the function mbedtls_platform_zeroize() is not optimized away by
1212 # different combinations of compilers and optimization flags by using an
1213 # auxiliary GDB script. Unfortunately, GDB does not return error values to the
1214 # system in all cases that the script fails, so we must manually search the
1215 # output to check whether the pass string is present and no failure strings
1216 # were printed.
Gilles Peskine4976e822019-01-06 19:52:22 +00001217
1218 # Don't try to disable ASLR. We don't care about ASLR here. We do care
1219 # about a spurious message if Gdb tries and fails, so suppress that.
1220 gdb_disable_aslr=
1221 if [ -z "$(gdb -batch -nw -ex 'set disable-randomization off' 2>&1)" ]; then
1222 gdb_disable_aslr='set disable-randomization off'
1223 fi
1224
Gilles Peskine8f073122018-11-27 15:58:47 +01001225 for optimization_flag in -O2 -O3 -Ofast -Os; do
Gilles Peskine55f7c942019-01-09 22:28:21 +01001226 for compiler in clang gcc; do
1227 msg "test: $compiler $optimization_flag, mbedtls_platform_zeroize()"
1228 make programs CC="$compiler" DEBUG=1 CFLAGS="$optimization_flag"
Gilles Peskine4976e822019-01-06 19:52:22 +00001229 if_build_succeeded gdb -ex "$gdb_disable_aslr" -x tests/scripts/test_zeroize.gdb -nw -batch -nx 2>&1 | tee test_zeroize.log
Gilles Peskine55f7c942019-01-09 22:28:21 +01001230 if_build_succeeded grep "The buffer was correctly zeroized" test_zeroize.log
1231 if_build_succeeded not grep -i "error" test_zeroize.log
1232 rm -f test_zeroize.log
1233 make clean
1234 done
Andres Amaya Garcia29673812017-10-25 10:35:51 +01001235 done
Gilles Peskine4976e822019-01-06 19:52:22 +00001236
1237 unset gdb_disable_aslr
Gilles Peskine8f073122018-11-27 15:58:47 +01001238}
Andres Amaya Garciad0d7bf62017-10-25 09:01:31 +01001239
Gilles Peskine8f073122018-11-27 15:58:47 +01001240component_check_python_files () {
1241 msg "Lint: Python scripts"
1242 record_status tests/scripts/check-python-files.sh
1243}
Gilles Peskine192c72f2017-12-21 15:59:21 +01001244
Gilles Peskine8f073122018-11-27 15:58:47 +01001245component_check_generate_test_code () {
1246 msg "uint test: generate_test_code.py"
1247 record_status ./tests/scripts/test_generate_test_code.py
1248}
Gilles Peskine192c72f2017-12-21 15:59:21 +01001249
1250################################################################
1251#### Termination
1252################################################################
1253
Gilles Peskine8f073122018-11-27 15:58:47 +01001254post_report () {
1255 msg "Done, cleaning up"
1256 cleanup
Manuel Pégourié-Gonnard80955ee2014-03-19 18:29:01 +01001257
Gilles Peskine8f073122018-11-27 15:58:47 +01001258 final_report
1259}
1260
1261
1262
1263################################################################
1264#### Run all the things
1265################################################################
1266
Gilles Peskinee48351a2018-11-27 16:06:30 +01001267# Run one component and clean up afterwards.
Gilles Peskine8f073122018-11-27 15:58:47 +01001268run_component () {
Gilles Peskine608953e2019-01-02 18:57:02 +01001269 # Back up the configuration in case the component modifies it.
1270 # The cleanup function will restore it.
1271 cp -p "$CONFIG_H" "$CONFIG_BAK"
Gilles Peskineffcdeff2018-12-04 12:49:28 +01001272 current_component="$1"
Gilles Peskine8f073122018-11-27 15:58:47 +01001273 "$@"
Gilles Peskinee48351a2018-11-27 16:06:30 +01001274 cleanup
Gilles Peskine8f073122018-11-27 15:58:47 +01001275}
1276
1277# Preliminary setup
1278pre_check_environment
1279pre_initialize_variables
1280pre_parse_command_line "$@"
Gilles Peskine348fb9a2018-11-27 17:04:29 +01001281
Gilles Peskine878cf602019-01-06 20:50:38 +00001282pre_check_git
1283build_status=0
1284if [ $KEEP_GOING -eq 1 ]; then
1285 pre_setup_keep_going
1286else
1287 record_status () {
1288 "$@"
1289 }
1290fi
1291pre_print_configuration
1292pre_check_tools
Gilles Peskine878cf602019-01-06 20:50:38 +00001293cleanup
Gilles Peskine8f073122018-11-27 15:58:47 +01001294
Gilles Peskinebeb3a812019-01-06 22:11:25 +00001295# Run the requested tests.
1296for component in $RUN_COMPONENTS; do
1297 run_component "component_$component"
1298done
Gilles Peskine8f073122018-11-27 15:58:47 +01001299
1300# We're done.
Gilles Peskine878cf602019-01-06 20:50:38 +00001301post_report