1#! /usr/bin/env bash
2
3# all.sh
4#
5# Copyright The Mbed TLS Contributors
6# SPDX-License-Identifier: Apache-2.0
7#
8# Licensed under the Apache License, Version 2.0 (the "License"); you may
9# not use this file except in compliance with the License.
10# You may obtain a copy of the License at
11#
12# http://www.apache.org/licenses/LICENSE-2.0
13#
14# Unless required by applicable law or agreed to in writing, software
15# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
16# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17# See the License for the specific language governing permissions and
18# limitations under the License.
19
20
21
22################################################################
23#### Documentation
24################################################################
25
26# Purpose
27# -------
28#
29# To run all tests possible or available on the platform.
30#
31# Notes for users
32# ---------------
33#
34# Warning: the test is destructive. It includes various build modes and
35# configurations, and can and will arbitrarily change the current CMake
36# configuration. The following files must be committed into git:
37#    * include/mbedtls/mbedtls_config.h
38#    * Makefile, library/Makefile, programs/Makefile, tests/Makefile,
39#      programs/fuzz/Makefile
40# After running this script, the CMake cache will be lost and CMake
41# will no longer be initialised.
42#
43# The script assumes the presence of a number of tools:
44#   * Basic Unix tools (Windows users note: a Unix-style find must be before
45#     the Windows find in the PATH)
46#   * Perl
47#   * GNU Make
48#   * CMake
49#   * GCC and Clang (recent enough for using ASan with gcc and MemSan with clang, or valgrind)
50#   * G++
51#   * arm-gcc and mingw-gcc
52#   * ArmCC 5 and ArmCC 6, unless invoked with --no-armcc
53#   * OpenSSL and GnuTLS command line tools, recent enough for the
54#     interoperability tests. If they don't support old features which we want
55#     to test, then a legacy version of these tools must be present as well
56#     (search for LEGACY below).
57# See the invocation of check_tools below for details.
58#
59# This script must be invoked from the toplevel directory of a git
60# working copy of Mbed TLS.
61#
62# The behavior on an error depends on whether --keep-going (alias -k)
63# is in effect.
64#  * Without --keep-going: the script stops on the first error without
65#    cleaning up. This lets you work in the configuration of the failing
66#    component.
67#  * With --keep-going: the script runs all requested components and
68#    reports failures at the end. In particular the script always cleans
69#    up on exit.
70#
71# Note that the output is not saved. You may want to run
72#   script -c tests/scripts/all.sh
73# or
74#   tests/scripts/all.sh >all.log 2>&1
75#
76# Notes for maintainers
77# ---------------------
78#
79# The bulk of the code is organized into functions that follow one of the
80# following naming conventions:
81#  * pre_XXX: things to do before running the tests, in order.
82#  * component_XXX: independent components. They can be run in any order.
83#      * component_check_XXX: quick tests that aren't worth parallelizing.
84#      * component_build_XXX: build things but don't run them.
85#      * component_test_XXX: build and test.
86#  * support_XXX: if support_XXX exists and returns false then
87#    component_XXX is not run by default.
88#  * post_XXX: things to do after running the tests.
89#  * other: miscellaneous support functions.
90#
91# Each component must start by invoking `msg` with a short informative message.
92#
93# Warning: due to the way bash detects errors, the failure of a command
94# inside 'if' or '!' is not detected. Use the 'not' function instead of '!'.
95#
96# Each component is executed in a separate shell process. The component
97# fails if any command in it returns a non-zero status.
98#
99# The framework performs some cleanup tasks after each component. This
100# means that components can assume that the working directory is in a
101# cleaned-up state, and don't need to perform the cleanup themselves.
102# * Run `make clean`.
103# * Restore `include/mbedtls/mbedtls_config.h` from a backup made before running
104#   the component.
105# * Check out `Makefile`, `library/Makefile`, `programs/Makefile`,
106#   `tests/Makefile` and `programs/fuzz/Makefile` from git.
107#   This cleans up after an in-tree use of CMake.
108#
109# The tests are roughly in order from fastest to slowest. This doesn't
110# have to be exact, but in general you should add slower tests towards
111# the end and fast checks near the beginning.
112
113
114
115################################################################
116#### Initialization and command line parsing
117################################################################
118
119# Abort on errors (even on the left-hand side of a pipe).
120# Treat uninitialised variables as errors.
121set -e -o pipefail -u
122
123# Enable ksh/bash extended file matching patterns
124shopt -s extglob
125
126pre_check_environment () {
127    if [ -d library -a -d include -a -d tests ]; then :; else
128        echo "Must be run from mbed TLS root" >&2
129        exit 1
130    fi
131}
132
133pre_initialize_variables () {
134    CONFIG_H='include/mbedtls/mbedtls_config.h'
135    CRYPTO_CONFIG_H='include/psa/crypto_config.h'
136    CONFIG_TEST_DRIVER_H='tests/include/test/drivers/config_test_driver.h'
137
138    # Files that are clobbered by some jobs will be backed up. Use a different
139    # suffix from auxiliary scripts so that all.sh and auxiliary scripts can
140    # independently decide when to remove the backup file.
141    backup_suffix='.all.bak'
142    # Files clobbered by config.py
143    files_to_back_up="$CONFIG_H $CRYPTO_CONFIG_H $CONFIG_TEST_DRIVER_H"
144    # Files clobbered by in-tree cmake
145    files_to_back_up="$files_to_back_up Makefile library/Makefile programs/Makefile tests/Makefile programs/fuzz/Makefile"
146
147    append_outcome=0
148    MEMORY=0
149    FORCE=0
150    QUIET=0
151    KEEP_GOING=0
152
153    # Seed value used with the --release-test option.
154    #
155    # See also RELEASE_SEED in basic-build-test.sh. Debugging is easier if
156    # both values are kept in sync. If you change the value here because it
157    # breaks some tests, you'll definitely want to change it in
158    # basic-build-test.sh as well.
159    RELEASE_SEED=1
160
161    : ${MBEDTLS_TEST_OUTCOME_FILE=}
162    : ${MBEDTLS_TEST_PLATFORM="$(uname -s | tr -c \\n0-9A-Za-z _)-$(uname -m | tr -c \\n0-9A-Za-z _)"}
163    export MBEDTLS_TEST_OUTCOME_FILE
164    export MBEDTLS_TEST_PLATFORM
165
166    # Default commands, can be overridden by the environment
167    : ${OPENSSL:="openssl"}
168    : ${OPENSSL_LEGACY:="$OPENSSL"}
169    : ${OPENSSL_NEXT:="$OPENSSL"}
170    : ${GNUTLS_CLI:="gnutls-cli"}
171    : ${GNUTLS_SERV:="gnutls-serv"}
172    : ${GNUTLS_LEGACY_CLI:="$GNUTLS_CLI"}
173    : ${GNUTLS_LEGACY_SERV:="$GNUTLS_SERV"}
174    : ${OUT_OF_SOURCE_DIR:=./mbedtls_out_of_source_build}
175    : ${ARMC5_BIN_DIR:=/usr/bin}
176    : ${ARMC6_BIN_DIR:=/usr/bin}
177    : ${ARM_NONE_EABI_GCC_PREFIX:=arm-none-eabi-}
178    : ${ARM_LINUX_GNUEABI_GCC_PREFIX:=arm-linux-gnueabi-}
179
180    # if MAKEFLAGS is not set add the -j option to speed up invocations of make
181    if [ -z "${MAKEFLAGS+set}" ]; then
182        export MAKEFLAGS="-j$(all_sh_nproc)"
183    fi
184
185    # Include more verbose output for failing tests run by CMake or make
186    export CTEST_OUTPUT_ON_FAILURE=1
187
188    # CFLAGS and LDFLAGS for Asan builds that don't use CMake
189    # default to -O2, use -Ox _after_ this if you want another level
190    ASAN_CFLAGS='-O2 -Werror -fsanitize=address,undefined -fno-sanitize-recover=all'
191
192    # Gather the list of available components. These are the functions
193    # defined in this script whose name starts with "component_".
194    # Parse the script with sed. This way we get the functions in the order
195    # they are defined.
196    ALL_COMPONENTS=$(sed -n 's/^ *component_\([0-9A-Z_a-z]*\) *().*/\1/p' <"$0")
197
198    # Exclude components that are not supported on this platform.
199    SUPPORTED_COMPONENTS=
200    for component in $ALL_COMPONENTS; do
201        case $(type "support_$component" 2>&1) in
202            *' function'*)
203                if ! support_$component; then continue; fi;;
204        esac
205        SUPPORTED_COMPONENTS="$SUPPORTED_COMPONENTS $component"
206    done
207}
208
209# Test whether the component $1 is included in the command line patterns.
210is_component_included()
211{
212    # Temporarily disable wildcard expansion so that $COMMAND_LINE_COMPONENTS
213    # only does word splitting.
214    set -f
215    for pattern in $COMMAND_LINE_COMPONENTS; do
216        set +f
217        case ${1#component_} in $pattern) return 0;; esac
218    done
219    set +f
220    return 1
221}
222
223usage()
224{
225    cat <<EOF
226Usage: $0 [OPTION]... [COMPONENT]...
227Run mbedtls release validation tests.
228By default, run all tests. With one or more COMPONENT, run only those.
229COMPONENT can be the name of a component or a shell wildcard pattern.
230
231Examples:
232  $0 "check_*"
233    Run all sanity checks.
234  $0 --no-armcc --except test_memsan
235    Run everything except builds that require armcc and MemSan.
236
237Special options:
238  -h|--help             Print this help and exit.
239  --list-all-components List all available test components and exit.
240  --list-components     List components supported on this platform and exit.
241
242General options:
243  -q|--quiet            Only output component names, and errors if any.
244  -f|--force            Force the tests to overwrite any modified files.
245  -k|--keep-going       Run all tests and report errors at the end.
246  -m|--memory           Additional optional memory tests.
247     --append-outcome   Append to the outcome file (if used).
248     --arm-none-eabi-gcc-prefix=<string>
249                        Prefix for a cross-compiler for arm-none-eabi
250                        (default: "${ARM_NONE_EABI_GCC_PREFIX}")
251     --arm-linux-gnueabi-gcc-prefix=<string>
252                        Prefix for a cross-compiler for arm-linux-gnueabi
253                        (default: "${ARM_LINUX_GNUEABI_GCC_PREFIX}")
254     --armcc            Run ARM Compiler builds (on by default).
255     --restore          First clean up the build tree, restoring backed up
256                        files. Do not run any components unless they are
257                        explicitly specified.
258     --error-test       Error test mode: run a failing function in addition
259                        to any specified component. May be repeated.
260     --except           Exclude the COMPONENTs listed on the command line,
261                        instead of running only those.
262     --no-append-outcome    Write a new outcome file and analyze it (default).
263     --no-armcc         Skip ARM Compiler builds.
264     --no-force         Refuse to overwrite modified files (default).
265     --no-keep-going    Stop at the first error (default).
266     --no-memory        No additional memory tests (default).
267     --no-quiet         Print full output from components.
268     --out-of-source-dir=<path>  Directory used for CMake out-of-source build tests.
269     --outcome-file=<path>  File where test outcomes are written (not done if
270                            empty; default: \$MBEDTLS_TEST_OUTCOME_FILE).
271     --random-seed      Use a random seed value for randomized tests (default).
272  -r|--release-test     Run this script in release mode. This fixes the seed value to ${RELEASE_SEED}.
273  -s|--seed             Integer seed value to use for this test run.
274
275Tool path options:
276     --armc5-bin-dir=<ARMC5_bin_dir_path>       ARM Compiler 5 bin directory.
277     --armc6-bin-dir=<ARMC6_bin_dir_path>       ARM Compiler 6 bin directory.
278     --gnutls-cli=<GnuTLS_cli_path>             GnuTLS client executable to use for most tests.
279     --gnutls-serv=<GnuTLS_serv_path>           GnuTLS server executable to use for most tests.
280     --gnutls-legacy-cli=<GnuTLS_cli_path>      GnuTLS client executable to use for legacy tests.
281     --gnutls-legacy-serv=<GnuTLS_serv_path>    GnuTLS server executable to use for legacy tests.
282     --openssl=<OpenSSL_path>                   OpenSSL executable to use for most tests.
283     --openssl-legacy=<OpenSSL_path>            OpenSSL executable to use for legacy tests..
284     --openssl-next=<OpenSSL_path>              OpenSSL executable to use for recent things like ARIA
285EOF
286}
287
288# Cleanup before/after running a component.
289# Remove built files as well as the cmake cache/config.
290# Does not remove generated source files.
291cleanup()
292{
293    command make clean
294
295    # Remove CMake artefacts
296    find . -name .git -prune -o \
297           -iname CMakeFiles -exec rm -rf {} \+ -o \
298           \( -iname cmake_install.cmake -o \
299              -iname CTestTestfile.cmake -o \
300              -iname CMakeCache.txt -o \
301              -path './cmake/*.cmake' \) -exec rm -f {} \+
302    # Recover files overwritten by in-tree CMake builds
303    rm -f include/Makefile include/mbedtls/Makefile programs/!(fuzz)/Makefile
304
305    # Remove any artifacts from the component_test_cmake_as_subdirectory test.
306    rm -rf programs/test/cmake_subproject/build
307    rm -f programs/test/cmake_subproject/Makefile
308    rm -f programs/test/cmake_subproject/cmake_subproject
309
310    # Remove any artifacts from the component_test_cmake_as_package test.
311    rm -rf programs/test/cmake_package/build
312    rm -f programs/test/cmake_package/Makefile
313    rm -f programs/test/cmake_package/cmake_package
314
315    # Remove any artifacts from the component_test_cmake_as_installed_package test.
316    rm -rf programs/test/cmake_package_install/build
317    rm -f programs/test/cmake_package_install/Makefile
318    rm -f programs/test/cmake_package_install/cmake_package_install
319
320    # Restore files that may have been clobbered by the job
321    for x in $files_to_back_up; do
322        if [[ -e "$x$backup_suffix" ]]; then
323            cp -p "$x$backup_suffix" "$x"
324        fi
325    done
326}
327
328# Final cleanup when this script exits (except when exiting on a failure
329# in non-keep-going mode).
330final_cleanup () {
331    cleanup
332
333    for x in $files_to_back_up; do
334        rm -f "$x$backup_suffix"
335    done
336}
337
338# Executed on exit. May be redefined depending on command line options.
339final_report () {
340    :
341}
342
343fatal_signal () {
344    final_cleanup
345    final_report $1
346    trap - $1
347    kill -$1 $$
348}
349
350trap 'fatal_signal HUP' HUP
351trap 'fatal_signal INT' INT
352trap 'fatal_signal TERM' TERM
353
354# Number of processors on this machine. Used as the default setting
355# for parallel make.
356all_sh_nproc ()
357{
358    {
359        nproc || # Linux
360        sysctl -n hw.ncpuonline || # NetBSD, OpenBSD
361        sysctl -n hw.ncpu || # FreeBSD
362        echo 1
363    } 2>/dev/null
364}
365
366msg()
367{
368    if [ -n "${current_component:-}" ]; then
369        current_section="${current_component#component_}: $1"
370    else
371        current_section="$1"
372    fi
373
374    if [ $QUIET -eq 1 ]; then
375        return
376    fi
377
378    echo ""
379    echo "******************************************************************"
380    echo "* $current_section "
381    printf "* "; date
382    echo "******************************************************************"
383}
384
385armc6_build_test()
386{
387    FLAGS="$1"
388
389    msg "build: ARM Compiler 6 ($FLAGS)"
390    ARM_TOOL_VARIANT="ult" CC="$ARMC6_CC" AR="$ARMC6_AR" CFLAGS="$FLAGS" \
391                    WARNING_CFLAGS='-Werror -xc -std=c99' make lib
392
393    msg "size: ARM Compiler 6 ($FLAGS)"
394    "$ARMC6_FROMELF" -z library/*.o
395
396    make clean
397}
398
399err_msg()
400{
401    echo "$1" >&2
402}
403
404check_tools()
405{
406    for TOOL in "$@"; do
407        if ! `type "$TOOL" >/dev/null 2>&1`; then
408            err_msg "$TOOL not found!"
409            exit 1
410        fi
411    done
412}
413
414pre_parse_command_line () {
415    COMMAND_LINE_COMPONENTS=
416    all_except=0
417    error_test=0
418    restore_first=0
419    no_armcc=
420
421    # Note that legacy options are ignored instead of being omitted from this
422    # list of options, so invocations that worked with previous version of
423    # all.sh will still run and work properly.
424    while [ $# -gt 0 ]; do
425        case "$1" in
426            --append-outcome) append_outcome=1;;
427            --arm-none-eabi-gcc-prefix) shift; ARM_NONE_EABI_GCC_PREFIX="$1";;
428            --arm-linux-gnueabi-gcc-prefix) shift; ARM_LINUX_GNUEABI_GCC_PREFIX="$1";;
429            --armcc) no_armcc=;;
430            --armc5-bin-dir) shift; ARMC5_BIN_DIR="$1";;
431            --armc6-bin-dir) shift; ARMC6_BIN_DIR="$1";;
432            --error-test) error_test=$((error_test + 1));;
433            --except) all_except=1;;
434            --force|-f) FORCE=1;;
435            --gnutls-cli) shift; GNUTLS_CLI="$1";;
436            --gnutls-legacy-cli) shift; GNUTLS_LEGACY_CLI="$1";;
437            --gnutls-legacy-serv) shift; GNUTLS_LEGACY_SERV="$1";;
438            --gnutls-serv) shift; GNUTLS_SERV="$1";;
439            --help|-h) usage; exit;;
440            --keep-going|-k) KEEP_GOING=1;;
441            --list-all-components) printf '%s\n' $ALL_COMPONENTS; exit;;
442            --list-components) printf '%s\n' $SUPPORTED_COMPONENTS; exit;;
443            --memory|-m) MEMORY=1;;
444            --no-append-outcome) append_outcome=0;;
445            --no-armcc) no_armcc=1;;
446            --no-force) FORCE=0;;
447            --no-keep-going) KEEP_GOING=0;;
448            --no-memory) MEMORY=0;;
449            --no-quiet) QUIET=0;;
450            --openssl) shift; OPENSSL="$1";;
451            --openssl-legacy) shift; OPENSSL_LEGACY="$1";;
452            --openssl-next) shift; OPENSSL_NEXT="$1";;
453            --outcome-file) shift; MBEDTLS_TEST_OUTCOME_FILE="$1";;
454            --out-of-source-dir) shift; OUT_OF_SOURCE_DIR="$1";;
455            --quiet|-q) QUIET=1;;
456            --random-seed) unset SEED;;
457            --release-test|-r) SEED=$RELEASE_SEED;;
458            --restore) restore_first=1;;
459            --seed|-s) shift; SEED="$1";;
460            -*)
461                echo >&2 "Unknown option: $1"
462                echo >&2 "Run $0 --help for usage."
463                exit 120
464                ;;
465            *) COMMAND_LINE_COMPONENTS="$COMMAND_LINE_COMPONENTS $1";;
466        esac
467        shift
468    done
469
470    # With no list of components, run everything.
471    if [ -z "$COMMAND_LINE_COMPONENTS" ] && [ $restore_first -eq 0 ]; then
472        all_except=1
473    fi
474
475    # --no-armcc is a legacy option. The modern way is --except '*_armcc*'.
476    # Ignore it if components are listed explicitly on the command line.
477    if [ -n "$no_armcc" ] && [ $all_except -eq 1 ]; then
478        COMMAND_LINE_COMPONENTS="$COMMAND_LINE_COMPONENTS *_armcc*"
479    fi
480
481    # Error out if an explicitly requested component doesn't exist.
482    if [ $all_except -eq 0 ]; then
483        unsupported=0
484        # Temporarily disable wildcard expansion so that $COMMAND_LINE_COMPONENTS
485        # only does word splitting.
486        set -f
487        for component in $COMMAND_LINE_COMPONENTS; do
488            set +f
489            # If the requested name includes a wildcard character, don't
490            # check it. Accept wildcard patterns that don't match anything.
491            case $component in
492                *[*?\[]*) continue;;
493            esac
494            case " $SUPPORTED_COMPONENTS " in
495                *" $component "*) :;;
496                *)
497                    echo >&2 "Component $component was explicitly requested, but is not known or not supported."
498                    unsupported=$((unsupported + 1));;
499            esac
500        done
501        set +f
502        if [ $unsupported -ne 0 ]; then
503            exit 2
504        fi
505    fi
506
507    # Build the list of components to run.
508    RUN_COMPONENTS=
509    for component in $SUPPORTED_COMPONENTS; do
510        if is_component_included "$component"; [ $? -eq $all_except ]; then
511            RUN_COMPONENTS="$RUN_COMPONENTS $component"
512        fi
513    done
514
515    unset all_except
516    unset no_armcc
517}
518
519pre_check_git () {
520    if [ $FORCE -eq 1 ]; then
521        rm -rf "$OUT_OF_SOURCE_DIR"
522        git checkout-index -f -q $CONFIG_H
523        cleanup
524    else
525
526        if [ -d "$OUT_OF_SOURCE_DIR" ]; then
527            echo "Warning - there is an existing directory at '$OUT_OF_SOURCE_DIR'" >&2
528            echo "You can either delete this directory manually, or force the test by rerunning"
529            echo "the script as: $0 --force --out-of-source-dir $OUT_OF_SOURCE_DIR"
530            exit 1
531        fi
532
533        if ! git diff --quiet include/mbedtls/mbedtls_config.h; then
534            err_msg "Warning - the configuration file 'include/mbedtls/mbedtls_config.h' has been edited. "
535            echo "You can either delete or preserve your work, or force the test by rerunning the"
536            echo "script as: $0 --force"
537            exit 1
538        fi
539    fi
540}
541
542pre_restore_files () {
543    # If the makefiles have been generated by a framework such as cmake,
544    # restore them from git. If the makefiles look like modifications from
545    # the ones checked into git, take care not to modify them. Whatever
546    # this function leaves behind is what the script will restore before
547    # each component.
548    case "$(head -n1 Makefile)" in
549        *[Gg]enerated*)
550            git update-index --no-skip-worktree Makefile library/Makefile programs/Makefile tests/Makefile programs/fuzz/Makefile
551            git checkout -- Makefile library/Makefile programs/Makefile tests/Makefile programs/fuzz/Makefile
552            ;;
553    esac
554}
555
556pre_back_up () {
557    for x in $files_to_back_up; do
558        cp -p "$x" "$x$backup_suffix"
559    done
560}
561
562pre_setup_keep_going () {
563    failure_count=0 # Number of failed components
564    last_failure_status=0 # Last failure status in this component
565
566    # See err_trap
567    previous_failure_status=0
568    previous_failed_command=
569    previous_failure_funcall_depth=0
570    unset report_failed_command
571
572    start_red=
573    end_color=
574    if [ -t 1 ]; then
575        case "${TERM:-}" in
576            *color*|cygwin|linux|rxvt*|screen|[Eex]term*)
577                start_red=$(printf '\033[31m')
578                end_color=$(printf '\033[0m')
579                ;;
580        esac
581    fi
582
583    # Keep a summary of failures in a file. We'll print it out at the end.
584    failure_summary_file=$PWD/all-sh-failures-$$.log
585    : >"$failure_summary_file"
586
587    # Whether it makes sense to keep a component going after the specified
588    # command fails (test command) or not (configure or build).
589    # This function normally receives the failing simple command
590    # ($BASH_COMMAND) as an argument, but if $report_failed_command is set,
591    # this is passed instead.
592    # This doesn't have to be 100% accurate: all failures are recorded anyway.
593    # False positives result in running things that can't be expected to
594    # work. False negatives result in things not running after something else
595    # failed even though they might have given useful feedback.
596    can_keep_going_after_failure () {
597        case "$1" in
598            "msg "*) false;;
599            "cd "*) false;;
600            *make*[\ /]tests*) false;; # make tests, make CFLAGS=-I../tests, ...
601            *test*) true;; # make test, tests/stuff, env V=v tests/stuff, ...
602            *make*check*) true;;
603            "grep "*) true;;
604            "[ "*) true;;
605            "! "*) true;;
606            *) false;;
607        esac
608    }
609
610    # This function runs if there is any error in a component.
611    # It must either exit with a nonzero status, or set
612    # last_failure_status to a nonzero value.
613    err_trap () {
614        # Save $? (status of the failing command). This must be the very
615        # first thing, before $? is overridden.
616        last_failure_status=$?
617        failed_command=${report_failed_command-$BASH_COMMAND}
618
619        if [[ $last_failure_status -eq $previous_failure_status &&
620              "$failed_command" == "$previous_failed_command" &&
621              ${#FUNCNAME[@]} == $((previous_failure_funcall_depth - 1)) ]]
622        then
623            # The same command failed twice in a row, but this time one level
624            # less deep in the function call stack. This happens when the last
625            # command of a function returns a nonzero status, and the function
626            # returns that same status. Ignore the second failure.
627            previous_failure_funcall_depth=${#FUNCNAME[@]}
628            return
629        fi
630        previous_failure_status=$last_failure_status
631        previous_failed_command=$failed_command
632        previous_failure_funcall_depth=${#FUNCNAME[@]}
633
634        text="$current_section: $failed_command -> $last_failure_status"
635        echo "${start_red}^^^^$text^^^^${end_color}" >&2
636        echo "$text" >>"$failure_summary_file"
637
638        # If the command is fatal (configure or build command), stop this
639        # component. Otherwise (test command) keep the component running
640        # (run more tests from the same build).
641        if ! can_keep_going_after_failure "$failed_command"; then
642            exit $last_failure_status
643        fi
644    }
645
646    final_report () {
647        if [ $failure_count -gt 0 ]; then
648            echo
649            echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
650            echo "${start_red}FAILED: $failure_count components${end_color}"
651            cat "$failure_summary_file"
652            echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
653        elif [ -z "${1-}" ]; then
654            echo "SUCCESS :)"
655        fi
656        if [ -n "${1-}" ]; then
657            echo "Killed by SIG$1."
658        fi
659        rm -f "$failure_summary_file"
660        if [ $failure_count -gt 0 ]; then
661            exit 1
662        fi
663    }
664}
665
666# record_status() and if_build_succeeded() are kept temporarily for backward
667# compatibility. Don't use them in new components.
668record_status () {
669    "$@"
670}
671if_build_succeeded () {
672    "$@"
673}
674
675# '! true' does not trigger the ERR trap. Arrange to trigger it, with
676# a reasonably informative error message (not just "$@").
677not () {
678    if "$@"; then
679        report_failed_command="! $*"
680        false
681        unset report_failed_command
682    fi
683}
684
685pre_prepare_outcome_file () {
686    case "$MBEDTLS_TEST_OUTCOME_FILE" in
687      [!/]*) MBEDTLS_TEST_OUTCOME_FILE="$PWD/$MBEDTLS_TEST_OUTCOME_FILE";;
688    esac
689    if [ -n "$MBEDTLS_TEST_OUTCOME_FILE" ] && [ "$append_outcome" -eq 0 ]; then
690        rm -f "$MBEDTLS_TEST_OUTCOME_FILE"
691    fi
692}
693
694pre_print_configuration () {
695    if [ $QUIET -eq 1 ]; then
696        return
697    fi
698
699    msg "info: $0 configuration"
700    echo "MEMORY: $MEMORY"
701    echo "FORCE: $FORCE"
702    echo "MBEDTLS_TEST_OUTCOME_FILE: ${MBEDTLS_TEST_OUTCOME_FILE:-(none)}"
703    echo "SEED: ${SEED-"UNSET"}"
704    echo
705    echo "OPENSSL: $OPENSSL"
706    echo "OPENSSL_LEGACY: $OPENSSL_LEGACY"
707    echo "OPENSSL_NEXT: $OPENSSL_NEXT"
708    echo "GNUTLS_CLI: $GNUTLS_CLI"
709    echo "GNUTLS_SERV: $GNUTLS_SERV"
710    echo "GNUTLS_LEGACY_CLI: $GNUTLS_LEGACY_CLI"
711    echo "GNUTLS_LEGACY_SERV: $GNUTLS_LEGACY_SERV"
712    echo "ARMC5_BIN_DIR: $ARMC5_BIN_DIR"
713    echo "ARMC6_BIN_DIR: $ARMC6_BIN_DIR"
714}
715
716# Make sure the tools we need are available.
717pre_check_tools () {
718    # Build the list of variables to pass to output_env.sh.
719    set env
720
721    case " $RUN_COMPONENTS " in
722        # Require OpenSSL and GnuTLS if running any tests (as opposed to
723        # only doing builds). Not all tests run OpenSSL and GnuTLS, but this
724        # is a good enough approximation in practice.
725        *" test_"*)
726            # To avoid setting OpenSSL and GnuTLS for each call to compat.sh
727            # and ssl-opt.sh, we just export the variables they require.
728            export OPENSSL="$OPENSSL"
729            export GNUTLS_CLI="$GNUTLS_CLI"
730            export GNUTLS_SERV="$GNUTLS_SERV"
731            # Avoid passing --seed flag in every call to ssl-opt.sh
732            if [ -n "${SEED-}" ]; then
733                export SEED
734            fi
735            set "$@" OPENSSL="$OPENSSL" OPENSSL_LEGACY="$OPENSSL_LEGACY"
736            set "$@" GNUTLS_CLI="$GNUTLS_CLI" GNUTLS_SERV="$GNUTLS_SERV"
737            set "$@" GNUTLS_LEGACY_CLI="$GNUTLS_LEGACY_CLI"
738            set "$@" GNUTLS_LEGACY_SERV="$GNUTLS_LEGACY_SERV"
739            check_tools "$OPENSSL" "$OPENSSL_LEGACY" "$OPENSSL_NEXT" \
740                        "$GNUTLS_CLI" "$GNUTLS_SERV" \
741                        "$GNUTLS_LEGACY_CLI" "$GNUTLS_LEGACY_SERV"
742            ;;
743    esac
744
745    case " $RUN_COMPONENTS " in
746        *_doxygen[_\ ]*) check_tools "doxygen" "dot";;
747    esac
748
749    case " $RUN_COMPONENTS " in
750        *_arm_none_eabi_gcc[_\ ]*) check_tools "${ARM_NONE_EABI_GCC_PREFIX}gcc";;
751    esac
752
753    case " $RUN_COMPONENTS " in
754        *_mingw[_\ ]*) check_tools "i686-w64-mingw32-gcc";;
755    esac
756
757    case " $RUN_COMPONENTS " in
758        *" test_zeroize "*) check_tools "gdb";;
759    esac
760
761    case " $RUN_COMPONENTS " in
762        *_armcc*)
763            ARMC5_CC="$ARMC5_BIN_DIR/armcc"
764            ARMC5_AR="$ARMC5_BIN_DIR/armar"
765            ARMC5_FROMELF="$ARMC5_BIN_DIR/fromelf"
766            ARMC6_CC="$ARMC6_BIN_DIR/armclang"
767            ARMC6_AR="$ARMC6_BIN_DIR/armar"
768            ARMC6_FROMELF="$ARMC6_BIN_DIR/fromelf"
769            check_tools "$ARMC5_CC" "$ARMC5_AR" "$ARMC5_FROMELF" \
770                        "$ARMC6_CC" "$ARMC6_AR" "$ARMC6_FROMELF";;
771    esac
772
773    # past this point, no call to check_tool, only printing output
774    if [ $QUIET -eq 1 ]; then
775        return
776    fi
777
778    msg "info: output_env.sh"
779    case $RUN_COMPONENTS in
780        *_armcc*)
781            set "$@" ARMC5_CC="$ARMC5_CC" ARMC6_CC="$ARMC6_CC" RUN_ARMCC=1;;
782        *) set "$@" RUN_ARMCC=0;;
783    esac
784    "$@" scripts/output_env.sh
785}
786
787pre_generate_files() {
788    # since make doesn't have proper dependencies, remove any possibly outdate
789    # file that might be around before generating fresh ones
790    make neat
791    if [ $QUIET -eq 1 ]; then
792        make generated_files >/dev/null
793    else
794        make generated_files
795    fi
796}
797
798
799
800################################################################
801#### Basic checks
802################################################################
803
804#
805# Test Suites to be executed
806#
807# The test ordering tries to optimize for the following criteria:
808# 1. Catch possible problems early, by running first tests that run quickly
809#    and/or are more likely to fail than others (eg I use Clang most of the
810#    time, so start with a GCC build).
811# 2. Minimize total running time, by avoiding useless rebuilds
812#
813# Indicative running times are given for reference.
814
815component_check_recursion () {
816    msg "Check: recursion.pl" # < 1s
817    tests/scripts/recursion.pl library/*.c
818}
819
820component_check_generated_files () {
821    msg "Check: check-generated-files, files generated with make" # 2s
822    make generated_files
823    tests/scripts/check-generated-files.sh
824
825    msg "Check: check-generated-files -u, files present" # 2s
826    tests/scripts/check-generated-files.sh -u
827    # Check that the generated files are considered up to date.
828    tests/scripts/check-generated-files.sh
829
830    msg "Check: check-generated-files -u, files absent" # 2s
831    command make neat
832    tests/scripts/check-generated-files.sh -u
833    # Check that the generated files are considered up to date.
834    tests/scripts/check-generated-files.sh
835
836    # This component ends with the generated files present in the source tree.
837    # This is necessary for subsequent components!
838}
839
840component_check_doxy_blocks () {
841    msg "Check: doxygen markup outside doxygen blocks" # < 1s
842    tests/scripts/check-doxy-blocks.pl
843}
844
845component_check_files () {
846    msg "Check: file sanity checks (permissions, encodings)" # < 1s
847    tests/scripts/check_files.py
848}
849
850component_check_changelog () {
851    msg "Check: changelog entries" # < 1s
852    rm -f ChangeLog.new
853    scripts/assemble_changelog.py -o ChangeLog.new
854    if [ -e ChangeLog.new ]; then
855        # Show the diff for information. It isn't an error if the diff is
856        # non-empty.
857        diff -u ChangeLog ChangeLog.new || true
858        rm ChangeLog.new
859    fi
860}
861
862component_check_names () {
863    msg "Check: declared and exported names (builds the library)" # < 3s
864    tests/scripts/check_names.py -v
865}
866
867component_check_test_cases () {
868    msg "Check: test case descriptions" # < 1s
869    if [ $QUIET -eq 1 ]; then
870        opt='--quiet'
871    else
872        opt=''
873    fi
874    tests/scripts/check_test_cases.py -q $opt
875    unset opt
876}
877
878component_check_doxygen_warnings () {
879    msg "Check: doxygen warnings (builds the documentation)" # ~ 3s
880    tests/scripts/doxygen.sh
881}
882
883
884
885################################################################
886#### Build and test many configurations and targets
887################################################################
888
889component_test_default_out_of_box () {
890    msg "build: make, default config (out-of-box)" # ~1min
891    make
892    # Disable fancy stuff
893    unset MBEDTLS_TEST_OUTCOME_FILE
894
895    msg "test: main suites make, default config (out-of-box)" # ~10s
896    make test
897
898    msg "selftest: make, default config (out-of-box)" # ~10s
899    programs/test/selftest
900}
901
902component_test_default_cmake_gcc_asan () {
903    msg "build: cmake, gcc, ASan" # ~ 1 min 50s
904    CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
905    make
906
907    msg "test: main suites (inc. selftests) (ASan build)" # ~ 50s
908    make test
909
910    msg "test: selftest (ASan build)" # ~ 10s
911    programs/test/selftest
912
913    msg "test: ssl-opt.sh (ASan build)" # ~ 1 min
914    tests/ssl-opt.sh
915
916    msg "test: compat.sh (ASan build)" # ~ 6 min
917    tests/compat.sh
918
919    msg "test: context-info.sh (ASan build)" # ~ 15 sec
920    tests/context-info.sh
921}
922
923component_test_full_cmake_gcc_asan () {
924    msg "build: full config, cmake, gcc, ASan"
925    scripts/config.py full
926    CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
927    make
928
929    msg "test: main suites (inc. selftests) (full config, ASan build)"
930    make test
931
932    msg "test: selftest (ASan build)" # ~ 10s
933    programs/test/selftest
934
935    msg "test: ssl-opt.sh (full config, ASan build)"
936    tests/ssl-opt.sh
937
938    msg "test: compat.sh (full config, ASan build)"
939    tests/compat.sh
940
941    msg "test: context-info.sh (full config, ASan build)" # ~ 15 sec
942    tests/context-info.sh
943
944    msg "test: check direct ECP dependencies in TLS and X.509"
945    docs/architecture/psa-migration/syms.sh full
946
947    # TODO: replace "mbedtls_ecp_curve" with "mbedtls_ecp" also for
948    # "full-tls-external" once Issue6839 is completed
949    not grep mbedtls_ecp_curve full-tls-external
950    not grep mbedtls_ecp full-x509-external
951
952    rm  full-tls-external \
953        full-tls-modules \
954        full-x509-external \
955        full-x509-modules
956}
957
958component_test_psa_crypto_key_id_encodes_owner () {
959    msg "build: full config + PSA_CRYPTO_KEY_ID_ENCODES_OWNER, cmake, gcc, ASan"
960    scripts/config.py full
961    scripts/config.py set MBEDTLS_PSA_CRYPTO_KEY_ID_ENCODES_OWNER
962    CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
963    make
964
965    msg "test: full config - USE_PSA_CRYPTO + PSA_CRYPTO_KEY_ID_ENCODES_OWNER, cmake, gcc, ASan"
966    make test
967}
968
969# check_renamed_symbols HEADER LIB
970# Check that if HEADER contains '#define MACRO ...' then MACRO is not a symbol
971# name is LIB.
972check_renamed_symbols () {
973    ! nm "$2" | sed 's/.* //' |
974      grep -x -F "$(sed -n 's/^ *# *define  *\([A-Z_a-z][0-9A-Z_a-z]*\)..*/\1/p' "$1")"
975}
976
977component_build_psa_crypto_spm () {
978    msg "build: full config + PSA_CRYPTO_KEY_ID_ENCODES_OWNER + PSA_CRYPTO_SPM, make, gcc"
979    scripts/config.py full
980    scripts/config.py unset MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS
981    scripts/config.py set MBEDTLS_PSA_CRYPTO_KEY_ID_ENCODES_OWNER
982    scripts/config.py set MBEDTLS_PSA_CRYPTO_SPM
983    # We can only compile, not link, since our test and sample programs
984    # aren't equipped for the modified names used when MBEDTLS_PSA_CRYPTO_SPM
985    # is active.
986    make CC=gcc CFLAGS='-Werror -Wall -Wextra -I../tests/include/spe' lib
987
988    # Check that if a symbol is renamed by crypto_spe.h, the non-renamed
989    # version is not present.
990    echo "Checking for renamed symbols in the library"
991    check_renamed_symbols tests/include/spe/crypto_spe.h library/libmbedcrypto.a
992}
993
994component_test_psa_crypto_client () {
995    msg "build: default config - PSA_CRYPTO_C + PSA_CRYPTO_CLIENT, make"
996    scripts/config.py unset MBEDTLS_PSA_CRYPTO_C
997    scripts/config.py unset MBEDTLS_PSA_CRYPTO_STORAGE_C
998    scripts/config.py set MBEDTLS_PSA_CRYPTO_CLIENT
999    scripts/config.py unset MBEDTLS_LMS_C
1000    scripts/config.py unset MBEDTLS_LMS_PRIVATE
1001    make
1002
1003    msg "test: default config - PSA_CRYPTO_C + PSA_CRYPTO_CLIENT, make"
1004    make test
1005}
1006
1007component_test_psa_crypto_rsa_no_genprime() {
1008    msg "build: default config minus MBEDTLS_GENPRIME"
1009    scripts/config.py unset MBEDTLS_GENPRIME
1010    make
1011
1012    msg "test: default config minus MBEDTLS_GENPRIME"
1013    make test
1014}
1015
1016component_test_ref_configs () {
1017    msg "test/build: ref-configs (ASan build)" # ~ 6 min 20s
1018    # test-ref-configs works by overwriting mbedtls_config.h; this makes cmake
1019    # want to re-generate generated files that depend on it, quite correctly.
1020    # However this doesn't work as the generation script expects a specific
1021    # format for mbedtls_config.h, which the other files don't follow. Also,
1022    # cmake can't know this, but re-generation is actually not necessary as
1023    # the generated files only depend on the list of available options, not
1024    # whether they're on or off. So, disable cmake's (over-sensitive here)
1025    # dependency resolution for generated files and just rely on them being
1026    # present (thanks to pre_generate_files) by turning GEN_FILES off.
1027    CC=gcc cmake -D GEN_FILES=Off -D CMAKE_BUILD_TYPE:String=Asan .
1028    tests/scripts/test-ref-configs.pl
1029}
1030
1031component_test_no_renegotiation () {
1032    msg "build: Default + !MBEDTLS_SSL_RENEGOTIATION (ASan build)" # ~ 6 min
1033    scripts/config.py unset MBEDTLS_SSL_RENEGOTIATION
1034    CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
1035    make
1036
1037    msg "test: !MBEDTLS_SSL_RENEGOTIATION - main suites (inc. selftests) (ASan build)" # ~ 50s
1038    make test
1039
1040    msg "test: !MBEDTLS_SSL_RENEGOTIATION - ssl-opt.sh (ASan build)" # ~ 6 min
1041    tests/ssl-opt.sh
1042}
1043
1044component_test_no_pem_no_fs () {
1045    msg "build: Default + !MBEDTLS_PEM_PARSE_C + !MBEDTLS_FS_IO (ASan build)"
1046    scripts/config.py unset MBEDTLS_PEM_PARSE_C
1047    scripts/config.py unset MBEDTLS_FS_IO
1048    scripts/config.py unset MBEDTLS_PSA_ITS_FILE_C # requires a filesystem
1049    scripts/config.py unset MBEDTLS_PSA_CRYPTO_STORAGE_C # requires PSA ITS
1050    CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
1051    make
1052
1053    msg "test: !MBEDTLS_PEM_PARSE_C !MBEDTLS_FS_IO - main suites (inc. selftests) (ASan build)" # ~ 50s
1054    make test
1055
1056    msg "test: !MBEDTLS_PEM_PARSE_C !MBEDTLS_FS_IO - ssl-opt.sh (ASan build)" # ~ 6 min
1057    tests/ssl-opt.sh
1058}
1059
1060component_test_rsa_no_crt () {
1061    msg "build: Default + RSA_NO_CRT (ASan build)" # ~ 6 min
1062    scripts/config.py set MBEDTLS_RSA_NO_CRT
1063    CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
1064    make
1065
1066    msg "test: RSA_NO_CRT - main suites (inc. selftests) (ASan build)" # ~ 50s
1067    make test
1068
1069    msg "test: RSA_NO_CRT - RSA-related part of ssl-opt.sh (ASan build)" # ~ 5s
1070    tests/ssl-opt.sh -f RSA
1071
1072    msg "test: RSA_NO_CRT - RSA-related part of compat.sh (ASan build)" # ~ 3 min
1073    tests/compat.sh -t RSA
1074
1075    msg "test: RSA_NO_CRT - RSA-related part of context-info.sh (ASan build)" # ~ 15 sec
1076    tests/context-info.sh
1077}
1078
1079component_test_no_ctr_drbg_classic () {
1080    msg "build: Full minus CTR_DRBG, classic crypto in TLS"
1081    scripts/config.py full
1082    scripts/config.py unset MBEDTLS_CTR_DRBG_C
1083    scripts/config.py unset MBEDTLS_USE_PSA_CRYPTO
1084    scripts/config.py unset MBEDTLS_SSL_PROTO_TLS1_3
1085
1086    CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
1087    make
1088
1089    msg "test: Full minus CTR_DRBG, classic crypto - main suites"
1090    make test
1091
1092    # In this configuration, the TLS test programs use HMAC_DRBG.
1093    # The SSL tests are slow, so run a small subset, just enough to get
1094    # confidence that the SSL code copes with HMAC_DRBG.
1095    msg "test: Full minus CTR_DRBG, classic crypto - ssl-opt.sh (subset)"
1096    tests/ssl-opt.sh -f 'Default\|SSL async private.*delay=\|tickets enabled on server'
1097
1098    msg "test: Full minus CTR_DRBG, classic crypto - compat.sh (subset)"
1099    tests/compat.sh -m tls12 -t 'ECDSA PSK' -V NO -p OpenSSL
1100}
1101
1102component_test_no_ctr_drbg_use_psa () {
1103    msg "build: Full minus CTR_DRBG, PSA crypto in TLS"
1104    scripts/config.py full
1105    scripts/config.py unset MBEDTLS_CTR_DRBG_C
1106    scripts/config.py set MBEDTLS_USE_PSA_CRYPTO
1107
1108    CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
1109    make
1110
1111    msg "test: Full minus CTR_DRBG, USE_PSA_CRYPTO - main suites"
1112    make test
1113
1114    # In this configuration, the TLS test programs use HMAC_DRBG.
1115    # The SSL tests are slow, so run a small subset, just enough to get
1116    # confidence that the SSL code copes with HMAC_DRBG.
1117    msg "test: Full minus CTR_DRBG, USE_PSA_CRYPTO - ssl-opt.sh (subset)"
1118    tests/ssl-opt.sh -f 'Default\|SSL async private.*delay=\|tickets enabled on server'
1119
1120    msg "test: Full minus CTR_DRBG, USE_PSA_CRYPTO - compat.sh (subset)"
1121    tests/compat.sh -m tls12 -t 'ECDSA PSK' -V NO -p OpenSSL
1122}
1123
1124component_test_no_hmac_drbg_classic () {
1125    msg "build: Full minus HMAC_DRBG, classic crypto in TLS"
1126    scripts/config.py full
1127    scripts/config.py unset MBEDTLS_HMAC_DRBG_C
1128    scripts/config.py unset MBEDTLS_ECDSA_DETERMINISTIC # requires HMAC_DRBG
1129    scripts/config.py unset MBEDTLS_USE_PSA_CRYPTO
1130    scripts/config.py unset MBEDTLS_SSL_PROTO_TLS1_3
1131
1132    CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
1133    make
1134
1135    msg "test: Full minus HMAC_DRBG, classic crypto - main suites"
1136    make test
1137
1138    # Normally our ECDSA implementation uses deterministic ECDSA. But since
1139    # HMAC_DRBG is disabled in this configuration, randomized ECDSA is used
1140    # instead.
1141    # Test SSL with non-deterministic ECDSA. Only test features that
1142    # might be affected by how ECDSA signature is performed.
1143    msg "test: Full minus HMAC_DRBG, classic crypto - ssl-opt.sh (subset)"
1144    tests/ssl-opt.sh -f 'Default\|SSL async private: sign'
1145
1146    # To save time, only test one protocol version, since this part of
1147    # the protocol is identical in (D)TLS up to 1.2.
1148    msg "test: Full minus HMAC_DRBG, classic crypto - compat.sh (ECDSA)"
1149    tests/compat.sh -m tls12 -t 'ECDSA'
1150}
1151
1152component_test_no_hmac_drbg_use_psa () {
1153    msg "build: Full minus HMAC_DRBG, PSA crypto in TLS"
1154    scripts/config.py full
1155    scripts/config.py unset MBEDTLS_HMAC_DRBG_C
1156    scripts/config.py unset MBEDTLS_ECDSA_DETERMINISTIC # requires HMAC_DRBG
1157    scripts/config.py set MBEDTLS_USE_PSA_CRYPTO
1158
1159    CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
1160    make
1161
1162    msg "test: Full minus HMAC_DRBG, USE_PSA_CRYPTO - main suites"
1163    make test
1164
1165    # Normally our ECDSA implementation uses deterministic ECDSA. But since
1166    # HMAC_DRBG is disabled in this configuration, randomized ECDSA is used
1167    # instead.
1168    # Test SSL with non-deterministic ECDSA. Only test features that
1169    # might be affected by how ECDSA signature is performed.
1170    msg "test: Full minus HMAC_DRBG, USE_PSA_CRYPTO - ssl-opt.sh (subset)"
1171    tests/ssl-opt.sh -f 'Default\|SSL async private: sign'
1172
1173    # To save time, only test one protocol version, since this part of
1174    # the protocol is identical in (D)TLS up to 1.2.
1175    msg "test: Full minus HMAC_DRBG, USE_PSA_CRYPTO - compat.sh (ECDSA)"
1176    tests/compat.sh -m tls12 -t 'ECDSA'
1177}
1178
1179component_test_psa_external_rng_no_drbg_classic () {
1180    msg "build: PSA_CRYPTO_EXTERNAL_RNG minus *_DRBG, classic crypto in TLS"
1181    scripts/config.py full
1182    scripts/config.py unset MBEDTLS_USE_PSA_CRYPTO
1183    scripts/config.py unset MBEDTLS_SSL_PROTO_TLS1_3
1184    scripts/config.py set MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG
1185    scripts/config.py unset MBEDTLS_ENTROPY_C
1186    scripts/config.py unset MBEDTLS_ENTROPY_NV_SEED
1187    scripts/config.py unset MBEDTLS_PLATFORM_NV_SEED_ALT
1188    scripts/config.py unset MBEDTLS_CTR_DRBG_C
1189    scripts/config.py unset MBEDTLS_HMAC_DRBG_C
1190    scripts/config.py unset MBEDTLS_ECDSA_DETERMINISTIC # requires HMAC_DRBG
1191    # When MBEDTLS_USE_PSA_CRYPTO is disabled and there is no DRBG,
1192    # the SSL test programs don't have an RNG and can't work. Explicitly
1193    # make them use the PSA RNG with -DMBEDTLS_TEST_USE_PSA_CRYPTO_RNG.
1194    make CFLAGS="$ASAN_CFLAGS -O2 -DMBEDTLS_TEST_USE_PSA_CRYPTO_RNG" LDFLAGS="$ASAN_CFLAGS"
1195
1196    msg "test: PSA_CRYPTO_EXTERNAL_RNG minus *_DRBG, classic crypto - main suites"
1197    make test
1198
1199    msg "test: PSA_CRYPTO_EXTERNAL_RNG minus *_DRBG, classic crypto - ssl-opt.sh (subset)"
1200    tests/ssl-opt.sh -f 'Default'
1201}
1202
1203component_test_psa_external_rng_no_drbg_use_psa () {
1204    msg "build: PSA_CRYPTO_EXTERNAL_RNG minus *_DRBG, PSA crypto in TLS"
1205    scripts/config.py full
1206    scripts/config.py set MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG
1207    scripts/config.py unset MBEDTLS_ENTROPY_C
1208    scripts/config.py unset MBEDTLS_ENTROPY_NV_SEED
1209    scripts/config.py unset MBEDTLS_PLATFORM_NV_SEED_ALT
1210    scripts/config.py unset MBEDTLS_CTR_DRBG_C
1211    scripts/config.py unset MBEDTLS_HMAC_DRBG_C
1212    scripts/config.py unset MBEDTLS_ECDSA_DETERMINISTIC # requires HMAC_DRBG
1213    make CFLAGS="$ASAN_CFLAGS -O2" LDFLAGS="$ASAN_CFLAGS"
1214
1215    msg "test: PSA_CRYPTO_EXTERNAL_RNG minus *_DRBG, PSA crypto - main suites"
1216    make test
1217
1218    msg "test: PSA_CRYPTO_EXTERNAL_RNG minus *_DRBG, PSA crypto - ssl-opt.sh (subset)"
1219    tests/ssl-opt.sh -f 'Default\|opaque'
1220}
1221
1222component_test_crypto_full_md_light_only () {
1223    msg "build: crypto_full with only the light subset of MD"
1224    scripts/config.py crypto_full
1225    # Disable MD
1226    scripts/config.py unset MBEDTLS_MD_C
1227    # Disable direct dependencies of MD
1228    scripts/config.py unset MBEDTLS_HKDF_C
1229    scripts/config.py unset MBEDTLS_HMAC_DRBG_C
1230    scripts/config.py unset MBEDTLS_PKCS7_C
1231    # Disable indirect dependencies of MD
1232    scripts/config.py unset MBEDTLS_ECDSA_DETERMINISTIC # needs HMAC_DRBG
1233    # Note: MD-light is auto-enabled in build_info.h by modules that need it,
1234    # which we haven't disabled, so no need to explicitly enable it.
1235    make CFLAGS="$ASAN_CFLAGS" LDFLAGS="$ASAN_CFLAGS"
1236
1237    # Make sure we don't have the HMAC functions, but the hashing functions
1238    not grep mbedtls_md_hmac library/md.o
1239    grep mbedtls_md library/md.o
1240
1241    msg "test: crypto_full with only the light subset of MD"
1242    make test
1243}
1244
1245component_test_full_no_cipher () {
1246    msg "build: full minus CIPHER"
1247    scripts/config.py full
1248    scripts/config.py unset MBEDTLS_CIPHER_C
1249    # Direct dependencies
1250    scripts/config.py unset MBEDTLS_CCM_C
1251    scripts/config.py unset MBEDTLS_CMAC_C
1252    scripts/config.py unset MBEDTLS_GCM_C
1253    scripts/config.py unset MBEDTLS_NIST_KW_C
1254    scripts/config.py unset MBEDTLS_PKCS12_C
1255    scripts/config.py unset MBEDTLS_PKCS5_C
1256    scripts/config.py unset MBEDTLS_PSA_CRYPTO_C
1257    scripts/config.py unset MBEDTLS_SSL_TLS_C
1258    scripts/config.py unset MBEDTLS_SSL_TICKET_C
1259    # Indirect dependencies
1260    scripts/config.py unset MBEDTLS_SSL_CLI_C
1261    scripts/config.py unset MBEDTLS_PSA_CRYPTO_SE_C
1262    scripts/config.py unset MBEDTLS_PSA_CRYPTO_STORAGE_C
1263    scripts/config.py unset MBEDTLS_SSL_DTLS_ANTI_REPLAY
1264    scripts/config.py unset MBEDTLS_SSL_DTLS_CONNECTION_ID
1265    scripts/config.py unset MBEDTLS_SSL_DTLS_CONNECTION_ID_COMPAT
1266    scripts/config.py unset MBEDTLS_SSL_PROTO_TLS1_3
1267    scripts/config.py unset MBEDTLS_SSL_SRV_C
1268    scripts/config.py unset MBEDTLS_USE_PSA_CRYPTO
1269    scripts/config.py unset MBEDTLS_LMS_C
1270    scripts/config.py unset MBEDTLS_LMS_PRIVATE
1271    make
1272
1273    msg "test: full minus CIPHER"
1274    make test
1275}
1276
1277component_test_crypto_full_no_cipher () {
1278    msg "build: crypto_full minus CIPHER"
1279    scripts/config.py crypto_full
1280    scripts/config.py unset MBEDTLS_CIPHER_C
1281    # Direct dependencies
1282    scripts/config.py unset MBEDTLS_CCM_C
1283    scripts/config.py unset MBEDTLS_CMAC_C
1284    scripts/config.py unset MBEDTLS_GCM_C
1285    scripts/config.py unset MBEDTLS_NIST_KW_C
1286    scripts/config.py unset MBEDTLS_PKCS12_C
1287    scripts/config.py unset MBEDTLS_PKCS5_C
1288    scripts/config.py unset MBEDTLS_PSA_CRYPTO_C
1289    # Indirect dependencies
1290    scripts/config.py unset MBEDTLS_PSA_CRYPTO_SE_C
1291    scripts/config.py unset MBEDTLS_PSA_CRYPTO_STORAGE_C
1292    scripts/config.py unset MBEDTLS_USE_PSA_CRYPTO
1293    scripts/config.py unset MBEDTLS_LMS_C
1294    scripts/config.py unset MBEDTLS_LMS_PRIVATE
1295    make
1296
1297    msg "test: crypto_full minus CIPHER"
1298    make test
1299}
1300
1301component_test_full_no_bignum () {
1302    msg "build: full minus bignum"
1303    scripts/config.py full
1304    scripts/config.py unset MBEDTLS_BIGNUM_C
1305    # Direct dependencies of bignum
1306    scripts/config.py unset MBEDTLS_ECP_C
1307    scripts/config.py unset MBEDTLS_RSA_C
1308    scripts/config.py unset MBEDTLS_DHM_C
1309    # Direct dependencies of ECP
1310    scripts/config.py unset MBEDTLS_ECDH_C
1311    scripts/config.py unset MBEDTLS_ECDSA_C
1312    scripts/config.py unset MBEDTLS_ECJPAKE_C
1313    scripts/config.py unset MBEDTLS_ECP_RESTARTABLE
1314    # Indirect dependencies of ECP
1315    scripts/config.py unset MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED
1316    scripts/config.py unset MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED
1317    scripts/config.py unset MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED
1318    scripts/config.py unset MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED
1319    scripts/config.py unset MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED
1320    scripts/config.py unset MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED
1321    scripts/config.py unset MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED
1322    scripts/config.py unset MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL_ENABLED
1323    # Direct dependencies of DHM
1324    scripts/config.py unset MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED
1325    # Direct dependencies of RSA
1326    scripts/config.py unset MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED
1327    scripts/config.py unset MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED
1328    scripts/config.py unset MBEDTLS_KEY_EXCHANGE_RSA_ENABLED
1329    scripts/config.py unset MBEDTLS_X509_RSASSA_PSS_SUPPORT
1330    # PK and its dependencies
1331    scripts/config.py unset MBEDTLS_PK_C
1332    scripts/config.py unset MBEDTLS_PK_PARSE_C
1333    scripts/config.py unset MBEDTLS_PK_WRITE_C
1334    scripts/config.py unset MBEDTLS_X509_USE_C
1335    scripts/config.py unset MBEDTLS_X509_CRT_PARSE_C
1336    scripts/config.py unset MBEDTLS_X509_CRL_PARSE_C
1337    scripts/config.py unset MBEDTLS_X509_CSR_PARSE_C
1338    scripts/config.py unset MBEDTLS_X509_CREATE_C
1339    scripts/config.py unset MBEDTLS_X509_CRT_WRITE_C
1340    scripts/config.py unset MBEDTLS_X509_CSR_WRITE_C
1341    scripts/config.py unset MBEDTLS_PKCS7_C
1342    scripts/config.py unset MBEDTLS_SSL_SERVER_NAME_INDICATION
1343    scripts/config.py unset MBEDTLS_SSL_ASYNC_PRIVATE
1344    scripts/config.py unset MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK
1345
1346    make
1347
1348    msg "test: full minus bignum"
1349    make test
1350}
1351
1352component_test_tls1_2_default_stream_cipher_only () {
1353    msg "build: default with only stream cipher"
1354
1355    # Disable AEAD (controlled by the presence of one of GCM_C, CCM_C, CHACHAPOLY_C
1356    scripts/config.py unset MBEDTLS_GCM_C
1357    scripts/config.py unset MBEDTLS_CCM_C
1358    scripts/config.py unset MBEDTLS_CHACHAPOLY_C
1359    # Disable CBC-legacy (controlled by MBEDTLS_CIPHER_MODE_CBC plus at least one block cipher (AES, ARIA, Camellia, DES))
1360    scripts/config.py unset MBEDTLS_CIPHER_MODE_CBC
1361    # Disable CBC-EtM (controlled by the same as CBC-legacy plus MBEDTLS_SSL_ENCRYPT_THEN_MAC)
1362    scripts/config.py unset MBEDTLS_SSL_ENCRYPT_THEN_MAC
1363    # Enable stream (currently that's just the NULL pseudo-cipher (controlled by MBEDTLS_CIPHER_NULL_CIPHER))
1364    scripts/config.py set MBEDTLS_CIPHER_NULL_CIPHER
1365    # Modules that depend on AEAD
1366    scripts/config.py unset MBEDTLS_SSL_CONTEXT_SERIALIZATION
1367    scripts/config.py unset MBEDTLS_SSL_TICKET_C
1368
1369    make
1370
1371    msg "test: default with only stream cipher"
1372    make test
1373
1374    # Not running ssl-opt.sh because most tests require a non-NULL ciphersuite.
1375}
1376
1377component_test_tls1_2_default_stream_cipher_only_use_psa () {
1378    msg "build: default with only stream cipher use psa"
1379
1380    scripts/config.py set MBEDTLS_USE_PSA_CRYPTO
1381    # Disable AEAD (controlled by the presence of one of GCM_C, CCM_C, CHACHAPOLY_C)
1382    scripts/config.py unset MBEDTLS_GCM_C
1383    scripts/config.py unset MBEDTLS_CCM_C
1384    scripts/config.py unset MBEDTLS_CHACHAPOLY_C
1385    # Disable CBC-legacy (controlled by MBEDTLS_CIPHER_MODE_CBC plus at least one block cipher (AES, ARIA, Camellia, DES))
1386    scripts/config.py unset MBEDTLS_CIPHER_MODE_CBC
1387    # Disable CBC-EtM (controlled by the same as CBC-legacy plus MBEDTLS_SSL_ENCRYPT_THEN_MAC)
1388    scripts/config.py unset MBEDTLS_SSL_ENCRYPT_THEN_MAC
1389    # Enable stream (currently that's just the NULL pseudo-cipher (controlled by MBEDTLS_CIPHER_NULL_CIPHER))
1390    scripts/config.py set MBEDTLS_CIPHER_NULL_CIPHER
1391    # Modules that depend on AEAD
1392    scripts/config.py unset MBEDTLS_SSL_CONTEXT_SERIALIZATION
1393    scripts/config.py unset MBEDTLS_SSL_TICKET_C
1394
1395    make
1396
1397    msg "test: default with only stream cipher use psa"
1398    make test
1399
1400    # Not running ssl-opt.sh because most tests require a non-NULL ciphersuite.
1401}
1402
1403component_test_tls1_2_default_cbc_legacy_cipher_only () {
1404    msg "build: default with only CBC-legacy cipher"
1405
1406    # Disable AEAD (controlled by the presence of one of GCM_C, CCM_C, CHACHAPOLY_C)
1407    scripts/config.py unset MBEDTLS_GCM_C
1408    scripts/config.py unset MBEDTLS_CCM_C
1409    scripts/config.py unset MBEDTLS_CHACHAPOLY_C
1410    # Enable CBC-legacy (controlled by MBEDTLS_CIPHER_MODE_CBC plus at least one block cipher (AES, ARIA, Camellia, DES))
1411    scripts/config.py set MBEDTLS_CIPHER_MODE_CBC
1412    # Disable CBC-EtM (controlled by the same as CBC-legacy plus MBEDTLS_SSL_ENCRYPT_THEN_MAC)
1413    scripts/config.py unset MBEDTLS_SSL_ENCRYPT_THEN_MAC
1414    # Disable stream (currently that's just the NULL pseudo-cipher (controlled by MBEDTLS_CIPHER_NULL_CIPHER))
1415    scripts/config.py unset MBEDTLS_CIPHER_NULL_CIPHER
1416    # Modules that depend on AEAD
1417    scripts/config.py unset MBEDTLS_SSL_CONTEXT_SERIALIZATION
1418    scripts/config.py unset MBEDTLS_SSL_TICKET_C
1419
1420    make
1421
1422    msg "test: default with only CBC-legacy cipher"
1423    make test
1424
1425    msg "test: default with only CBC-legacy cipher - ssl-opt.sh (subset)"
1426    tests/ssl-opt.sh -f "TLS 1.2"
1427}
1428
1429component_test_tls1_2_deafult_cbc_legacy_cipher_only_use_psa () {
1430    msg "build: default with only CBC-legacy cipher use psa"
1431
1432    scripts/config.py set MBEDTLS_USE_PSA_CRYPTO
1433    # Disable AEAD (controlled by the presence of one of GCM_C, CCM_C, CHACHAPOLY_C)
1434    scripts/config.py unset MBEDTLS_GCM_C
1435    scripts/config.py unset MBEDTLS_CCM_C
1436    scripts/config.py unset MBEDTLS_CHACHAPOLY_C
1437    # Enable CBC-legacy (controlled by MBEDTLS_CIPHER_MODE_CBC plus at least one block cipher (AES, ARIA, Camellia, DES))
1438    scripts/config.py set MBEDTLS_CIPHER_MODE_CBC
1439    # Disable CBC-EtM (controlled by the same as CBC-legacy plus MBEDTLS_SSL_ENCRYPT_THEN_MAC)
1440    scripts/config.py unset MBEDTLS_SSL_ENCRYPT_THEN_MAC
1441    # Disable stream (currently that's just the NULL pseudo-cipher (controlled by MBEDTLS_CIPHER_NULL_CIPHER))
1442    scripts/config.py unset MBEDTLS_CIPHER_NULL_CIPHER
1443    # Modules that depend on AEAD
1444    scripts/config.py unset MBEDTLS_SSL_CONTEXT_SERIALIZATION
1445    scripts/config.py unset MBEDTLS_SSL_TICKET_C
1446
1447    make
1448
1449    msg "test: default with only CBC-legacy cipher use psa"
1450    make test
1451
1452    msg "test: default with only CBC-legacy cipher use psa - ssl-opt.sh (subset)"
1453    tests/ssl-opt.sh -f "TLS 1.2"
1454}
1455
1456component_test_tls1_2_default_cbc_legacy_cbc_etm_cipher_only () {
1457    msg "build: default with only CBC-legacy and CBC-EtM ciphers"
1458
1459    # Disable AEAD (controlled by the presence of one of GCM_C, CCM_C, CHACHAPOLY_C)
1460    scripts/config.py unset MBEDTLS_GCM_C
1461    scripts/config.py unset MBEDTLS_CCM_C
1462    scripts/config.py unset MBEDTLS_CHACHAPOLY_C
1463    # Enable CBC-legacy (controlled by MBEDTLS_CIPHER_MODE_CBC plus at least one block cipher (AES, ARIA, Camellia, DES))
1464    scripts/config.py set MBEDTLS_CIPHER_MODE_CBC
1465    # Enable CBC-EtM (controlled by the same as CBC-legacy plus MBEDTLS_SSL_ENCRYPT_THEN_MAC)
1466    scripts/config.py set MBEDTLS_SSL_ENCRYPT_THEN_MAC
1467    # Disable stream (currently that's just the NULL pseudo-cipher (controlled by MBEDTLS_CIPHER_NULL_CIPHER))
1468    scripts/config.py unset MBEDTLS_CIPHER_NULL_CIPHER
1469    # Modules that depend on AEAD
1470    scripts/config.py unset MBEDTLS_SSL_CONTEXT_SERIALIZATION
1471    scripts/config.py unset MBEDTLS_SSL_TICKET_C
1472
1473    make
1474
1475    msg "test: default with only CBC-legacy and CBC-EtM ciphers"
1476    make test
1477
1478    msg "test: default with only CBC-legacy and CBC-EtM ciphers - ssl-opt.sh (subset)"
1479    tests/ssl-opt.sh -f "TLS 1.2"
1480}
1481
1482component_test_tls1_2_default_cbc_legacy_cbc_etm_cipher_only_use_psa () {
1483    msg "build: default with only CBC-legacy and CBC-EtM ciphers use psa"
1484
1485    scripts/config.py set MBEDTLS_USE_PSA_CRYPTO
1486    # Disable AEAD (controlled by the presence of one of GCM_C, CCM_C, CHACHAPOLY_C)
1487    scripts/config.py unset MBEDTLS_GCM_C
1488    scripts/config.py unset MBEDTLS_CCM_C
1489    scripts/config.py unset MBEDTLS_CHACHAPOLY_C
1490    # Enable CBC-legacy (controlled by MBEDTLS_CIPHER_MODE_CBC plus at least one block cipher (AES, ARIA, Camellia, DES))
1491    scripts/config.py set MBEDTLS_CIPHER_MODE_CBC
1492    # Enable CBC-EtM (controlled by the same as CBC-legacy plus MBEDTLS_SSL_ENCRYPT_THEN_MAC)
1493    scripts/config.py set MBEDTLS_SSL_ENCRYPT_THEN_MAC
1494    # Disable stream (currently that's just the NULL pseudo-cipher (controlled by MBEDTLS_CIPHER_NULL_CIPHER))
1495    scripts/config.py unset MBEDTLS_CIPHER_NULL_CIPHER
1496    # Modules that depend on AEAD
1497    scripts/config.py unset MBEDTLS_SSL_CONTEXT_SERIALIZATION
1498    scripts/config.py unset MBEDTLS_SSL_TICKET_C
1499
1500    make
1501
1502    msg "test: default with only CBC-legacy and CBC-EtM ciphers use psa"
1503    make test
1504
1505    msg "test: default with only CBC-legacy and CBC-EtM ciphers use psa - ssl-opt.sh (subset)"
1506    tests/ssl-opt.sh -f "TLS 1.2"
1507}
1508
1509# We're not aware of any other (open source) implementation of EC J-PAKE in TLS
1510# that we could use for interop testing. However, we now have sort of two
1511# implementations ourselves: one using PSA, the other not. At least test that
1512# these two interoperate with each other.
1513component_test_tls1_2_ecjpake_compatibility() {
1514    msg "build: TLS1.2 server+client w/ EC-JPAKE w/o USE_PSA"
1515    scripts/config.py set MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED
1516    make -C programs ssl/ssl_server2 ssl/ssl_client2
1517    cp programs/ssl/ssl_server2 s2_no_use_psa
1518    cp programs/ssl/ssl_client2 c2_no_use_psa
1519
1520    msg "build: TLS1.2 server+client w/ EC-JPAKE w/ USE_PSA"
1521    scripts/config.py set MBEDTLS_USE_PSA_CRYPTO
1522    make clean
1523    make -C programs ssl/ssl_server2 ssl/ssl_client2
1524    make -C programs test/udp_proxy test/query_compile_time_config
1525
1526    msg "test: server w/o USE_PSA - client w/ USE_PSA, text password"
1527    P_SRV=../s2_no_use_psa tests/ssl-opt.sh -f "ECJPAKE: working, TLS"
1528    msg "test: server w/o USE_PSA - client w/ USE_PSA, opaque password"
1529    P_SRV=../s2_no_use_psa tests/ssl-opt.sh -f "ECJPAKE: opaque password client only, working, TLS"
1530    msg "test: client w/o USE_PSA - server w/ USE_PSA, text password"
1531    P_CLI=../c2_no_use_psa tests/ssl-opt.sh -f "ECJPAKE: working, TLS"
1532    msg "test: client w/o USE_PSA - server w/ USE_PSA, opaque password"
1533    P_CLI=../c2_no_use_psa tests/ssl-opt.sh -f "ECJPAKE: opaque password server only, working, TLS"
1534
1535    rm s2_no_use_psa c2_no_use_psa
1536}
1537
1538component_test_psa_external_rng_use_psa_crypto () {
1539    msg "build: full + PSA_CRYPTO_EXTERNAL_RNG + USE_PSA_CRYPTO minus CTR_DRBG"
1540    scripts/config.py full
1541    scripts/config.py set MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG
1542    scripts/config.py set MBEDTLS_USE_PSA_CRYPTO
1543    scripts/config.py unset MBEDTLS_CTR_DRBG_C
1544    make CFLAGS="$ASAN_CFLAGS -O2" LDFLAGS="$ASAN_CFLAGS"
1545
1546    msg "test: full + PSA_CRYPTO_EXTERNAL_RNG + USE_PSA_CRYPTO minus CTR_DRBG"
1547    make test
1548
1549    msg "test: full + PSA_CRYPTO_EXTERNAL_RNG + USE_PSA_CRYPTO minus CTR_DRBG"
1550    tests/ssl-opt.sh -f 'Default\|opaque'
1551}
1552
1553component_test_everest () {
1554    msg "build: Everest ECDH context (ASan build)" # ~ 6 min
1555    scripts/config.py set MBEDTLS_ECDH_VARIANT_EVEREST_ENABLED
1556    CC=clang cmake -D CMAKE_BUILD_TYPE:String=Asan .
1557    make
1558
1559    msg "test: Everest ECDH context - main suites (inc. selftests) (ASan build)" # ~ 50s
1560    make test
1561
1562    msg "test: Everest ECDH context - ECDH-related part of ssl-opt.sh (ASan build)" # ~ 5s
1563    tests/ssl-opt.sh -f ECDH
1564
1565    msg "test: Everest ECDH context - compat.sh with some ECDH ciphersuites (ASan build)" # ~ 3 min
1566    # Exclude some symmetric ciphers that are redundant here to gain time.
1567    tests/compat.sh -f ECDH -V NO -e 'ARIA\|CAMELLIA\|CHACHA'
1568}
1569
1570component_test_everest_curve25519_only () {
1571    msg "build: Everest ECDH context, only Curve25519" # ~ 6 min
1572    scripts/config.py set MBEDTLS_ECDH_VARIANT_EVEREST_ENABLED
1573    scripts/config.py unset MBEDTLS_ECDSA_C
1574    scripts/config.py unset MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED
1575    scripts/config.py unset MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED
1576    scripts/config.py unset MBEDTLS_ECJPAKE_C
1577    # Disable all curves
1578    for c in $(sed -n 's/#define \(MBEDTLS_ECP_DP_[0-9A-Z_a-z]*_ENABLED\).*/\1/p' <"$CONFIG_H"); do
1579        scripts/config.py unset "$c"
1580    done
1581    scripts/config.py set MBEDTLS_ECP_DP_CURVE25519_ENABLED
1582
1583    make CFLAGS="$ASAN_CFLAGS -O2" LDFLAGS="$ASAN_CFLAGS"
1584
1585    msg "test: Everest ECDH context, only Curve25519" # ~ 50s
1586    make test
1587}
1588
1589component_test_small_ssl_out_content_len () {
1590    msg "build: small SSL_OUT_CONTENT_LEN (ASan build)"
1591    scripts/config.py set MBEDTLS_SSL_IN_CONTENT_LEN 16384
1592    scripts/config.py set MBEDTLS_SSL_OUT_CONTENT_LEN 4096
1593    CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
1594    make
1595
1596    msg "test: small SSL_OUT_CONTENT_LEN - ssl-opt.sh MFL and large packet tests"
1597    tests/ssl-opt.sh -f "Max fragment\|Large packet"
1598}
1599
1600component_test_small_ssl_in_content_len () {
1601    msg "build: small SSL_IN_CONTENT_LEN (ASan build)"
1602    scripts/config.py set MBEDTLS_SSL_IN_CONTENT_LEN 4096
1603    scripts/config.py set MBEDTLS_SSL_OUT_CONTENT_LEN 16384
1604    CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
1605    make
1606
1607    msg "test: small SSL_IN_CONTENT_LEN - ssl-opt.sh MFL tests"
1608    tests/ssl-opt.sh -f "Max fragment"
1609}
1610
1611component_test_small_ssl_dtls_max_buffering () {
1612    msg "build: small MBEDTLS_SSL_DTLS_MAX_BUFFERING #0"
1613    scripts/config.py set MBEDTLS_SSL_DTLS_MAX_BUFFERING 1000
1614    CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
1615    make
1616
1617    msg "test: small MBEDTLS_SSL_DTLS_MAX_BUFFERING #0 - ssl-opt.sh specific reordering test"
1618    tests/ssl-opt.sh -f "DTLS reordering: Buffer out-of-order hs msg before reassembling next, free buffered msg"
1619}
1620
1621component_test_small_mbedtls_ssl_dtls_max_buffering () {
1622    msg "build: small MBEDTLS_SSL_DTLS_MAX_BUFFERING #1"
1623    scripts/config.py set MBEDTLS_SSL_DTLS_MAX_BUFFERING 190
1624    CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
1625    make
1626
1627    msg "test: small MBEDTLS_SSL_DTLS_MAX_BUFFERING #1 - ssl-opt.sh specific reordering test"
1628    tests/ssl-opt.sh -f "DTLS reordering: Buffer encrypted Finished message, drop for fragmented NewSessionTicket"
1629}
1630
1631component_test_psa_collect_statuses () {
1632  msg "build+test: psa_collect_statuses" # ~30s
1633  scripts/config.py full
1634  tests/scripts/psa_collect_statuses.py
1635  # Check that psa_crypto_init() succeeded at least once
1636  grep -q '^0:psa_crypto_init:' tests/statuses.log
1637  rm -f tests/statuses.log
1638}
1639
1640component_test_full_cmake_clang () {
1641    msg "build: cmake, full config, clang" # ~ 50s
1642    scripts/config.py full
1643    CC=clang CXX=clang cmake -D CMAKE_BUILD_TYPE:String=Release -D ENABLE_TESTING=On -D TEST_CPP=1 .
1644    make
1645
1646    msg "test: main suites (full config, clang)" # ~ 5s
1647    make test
1648
1649    msg "test: cpp_dummy_build (full config, clang)" # ~ 1s
1650    programs/test/cpp_dummy_build
1651
1652    msg "test: psa_constant_names (full config, clang)" # ~ 1s
1653    tests/scripts/test_psa_constant_names.py
1654
1655    msg "test: ssl-opt.sh default, ECJPAKE, SSL async (full config)" # ~ 1s
1656    tests/ssl-opt.sh -f 'Default\|ECJPAKE\|SSL async private'
1657
1658    msg "test: compat.sh NULL (full config)" # ~ 2 min
1659    env OPENSSL="$OPENSSL_LEGACY" GNUTLS_CLI="$GNUTLS_LEGACY_CLI" GNUTLS_SERV="$GNUTLS_LEGACY_SERV" tests/compat.sh -e '^$' -f 'NULL'
1660
1661    msg "test: compat.sh ARIA + ChachaPoly"
1662    env OPENSSL="$OPENSSL_NEXT" tests/compat.sh -e '^$' -f 'ARIA\|CHACHA'
1663}
1664
1665skip_suites_without_constant_flow () {
1666    # Skip the test suites that don't have any constant-flow annotations.
1667    # This will need to be adjusted if we ever start declaring things as
1668    # secret from macros or functions inside tests/include or tests/src.
1669    SKIP_TEST_SUITES=$(
1670        git -C tests/suites grep -L TEST_CF_ 'test_suite_*.function' |
1671            sed 's/test_suite_//; s/\.function$//' |
1672            tr '\n' ,)
1673    export SKIP_TEST_SUITES
1674}
1675
1676component_test_memsan_constant_flow () {
1677    # This tests both (1) accesses to undefined memory, and (2) branches or
1678    # memory access depending on secret values. To distinguish between those:
1679    # - unset MBEDTLS_TEST_CONSTANT_FLOW_MEMSAN - does the failure persist?
1680    # - or alternatively, change the build type to MemSanDbg, which enables
1681    # origin tracking and nicer stack traces (which are useful for debugging
1682    # anyway), and check if the origin was TEST_CF_SECRET() or something else.
1683    msg "build: cmake MSan (clang), full config minus MBEDTLS_USE_PSA_CRYPTO with constant flow testing"
1684    scripts/config.py full
1685    scripts/config.py set MBEDTLS_TEST_CONSTANT_FLOW_MEMSAN
1686    scripts/config.py unset MBEDTLS_USE_PSA_CRYPTO
1687    scripts/config.py unset MBEDTLS_AESNI_C # memsan doesn't grok asm
1688    CC=clang cmake -D CMAKE_BUILD_TYPE:String=MemSan .
1689    make
1690
1691    msg "test: main suites (full minus MBEDTLS_USE_PSA_CRYPTO, Msan + constant flow)"
1692    make test
1693}
1694
1695component_test_memsan_constant_flow_psa () {
1696    # This tests both (1) accesses to undefined memory, and (2) branches or
1697    # memory access depending on secret values. To distinguish between those:
1698    # - unset MBEDTLS_TEST_CONSTANT_FLOW_MEMSAN - does the failure persist?
1699    # - or alternatively, change the build type to MemSanDbg, which enables
1700    # origin tracking and nicer stack traces (which are useful for debugging
1701    # anyway), and check if the origin was TEST_CF_SECRET() or something else.
1702    msg "build: cmake MSan (clang), full config with constant flow testing"
1703    scripts/config.py full
1704    scripts/config.py set MBEDTLS_TEST_CONSTANT_FLOW_MEMSAN
1705    scripts/config.py unset MBEDTLS_AESNI_C # memsan doesn't grok asm
1706    CC=clang cmake -D CMAKE_BUILD_TYPE:String=MemSan .
1707    make
1708
1709    msg "test: main suites (Msan + constant flow)"
1710    make test
1711}
1712
1713component_test_valgrind_constant_flow () {
1714    # This tests both (1) everything that valgrind's memcheck usually checks
1715    # (heap buffer overflows, use of uninitialized memory, use-after-free,
1716    # etc.) and (2) branches or memory access depending on secret values,
1717    # which will be reported as uninitialized memory. To distinguish between
1718    # secret and actually uninitialized:
1719    # - unset MBEDTLS_TEST_CONSTANT_FLOW_VALGRIND - does the failure persist?
1720    # - or alternatively, build with debug info and manually run the offending
1721    # test suite with valgrind --track-origins=yes, then check if the origin
1722    # was TEST_CF_SECRET() or something else.
1723    msg "build: cmake release GCC, full config minus MBEDTLS_USE_PSA_CRYPTO with constant flow testing"
1724    scripts/config.py full
1725    scripts/config.py set MBEDTLS_TEST_CONSTANT_FLOW_VALGRIND
1726    scripts/config.py unset MBEDTLS_USE_PSA_CRYPTO
1727    skip_suites_without_constant_flow
1728    cmake -D CMAKE_BUILD_TYPE:String=Release .
1729    make
1730
1731    # this only shows a summary of the results (how many of each type)
1732    # details are left in Testing/<date>/DynamicAnalysis.xml
1733    msg "test: some suites (full minus MBEDTLS_USE_PSA_CRYPTO, valgrind + constant flow)"
1734    make memcheck
1735}
1736
1737component_test_valgrind_constant_flow_psa () {
1738    # This tests both (1) everything that valgrind's memcheck usually checks
1739    # (heap buffer overflows, use of uninitialized memory, use-after-free,
1740    # etc.) and (2) branches or memory access depending on secret values,
1741    # which will be reported as uninitialized memory. To distinguish between
1742    # secret and actually uninitialized:
1743    # - unset MBEDTLS_TEST_CONSTANT_FLOW_VALGRIND - does the failure persist?
1744    # - or alternatively, build with debug info and manually run the offending
1745    # test suite with valgrind --track-origins=yes, then check if the origin
1746    # was TEST_CF_SECRET() or something else.
1747    msg "build: cmake release GCC, full config with constant flow testing"
1748    scripts/config.py full
1749    scripts/config.py set MBEDTLS_TEST_CONSTANT_FLOW_VALGRIND
1750    skip_suites_without_constant_flow
1751    cmake -D CMAKE_BUILD_TYPE:String=Release .
1752    make
1753
1754    # this only shows a summary of the results (how many of each type)
1755    # details are left in Testing/<date>/DynamicAnalysis.xml
1756    msg "test: some suites (valgrind + constant flow)"
1757    make memcheck
1758}
1759
1760component_test_default_no_deprecated () {
1761    # Test that removing the deprecated features from the default
1762    # configuration leaves something consistent.
1763    msg "build: make, default + MBEDTLS_DEPRECATED_REMOVED" # ~ 30s
1764    scripts/config.py set MBEDTLS_DEPRECATED_REMOVED
1765    make CC=gcc CFLAGS='-O -Werror -Wall -Wextra'
1766
1767    msg "test: make, default + MBEDTLS_DEPRECATED_REMOVED" # ~ 5s
1768    make test
1769}
1770
1771component_test_full_no_deprecated () {
1772    msg "build: make, full_no_deprecated config" # ~ 30s
1773    scripts/config.py full_no_deprecated
1774    make CC=gcc CFLAGS='-O -Werror -Wall -Wextra'
1775
1776    msg "test: make, full_no_deprecated config" # ~ 5s
1777    make test
1778
1779    msg "test: ensure that X509 has no direct dependency on BIGNUM_C"
1780    not grep mbedtls_mpi library/libmbedx509.a
1781}
1782
1783component_test_full_no_deprecated_deprecated_warning () {
1784    # Test that there is nothing deprecated in "full_no_deprecated".
1785    # A deprecated feature would trigger a warning (made fatal) from
1786    # MBEDTLS_DEPRECATED_WARNING.
1787    msg "build: make, full_no_deprecated config, MBEDTLS_DEPRECATED_WARNING" # ~ 30s
1788    scripts/config.py full_no_deprecated
1789    scripts/config.py unset MBEDTLS_DEPRECATED_REMOVED
1790    scripts/config.py set MBEDTLS_DEPRECATED_WARNING
1791    make CC=gcc CFLAGS='-O -Werror -Wall -Wextra'
1792
1793    msg "test: make, full_no_deprecated config, MBEDTLS_DEPRECATED_WARNING" # ~ 5s
1794    make test
1795}
1796
1797component_test_full_deprecated_warning () {
1798    # Test that when MBEDTLS_DEPRECATED_WARNING is enabled, the build passes
1799    # with only certain whitelisted types of warnings.
1800    msg "build: make, full config + MBEDTLS_DEPRECATED_WARNING, expect warnings" # ~ 30s
1801    scripts/config.py full
1802    scripts/config.py set MBEDTLS_DEPRECATED_WARNING
1803    # Expect warnings from '#warning' directives in check_config.h.
1804    make CC=gcc CFLAGS='-O -Werror -Wall -Wextra -Wno-error=cpp' lib programs
1805
1806    msg "build: make tests, full config + MBEDTLS_DEPRECATED_WARNING, expect warnings" # ~ 30s
1807    # Set MBEDTLS_TEST_DEPRECATED to enable tests for deprecated features.
1808    # By default those are disabled when MBEDTLS_DEPRECATED_WARNING is set.
1809    # Expect warnings from '#warning' directives in check_config.h and
1810    # from the use of deprecated functions in test suites.
1811    make CC=gcc CFLAGS='-O -Werror -Wall -Wextra -Wno-error=deprecated-declarations -Wno-error=cpp -DMBEDTLS_TEST_DEPRECATED' tests
1812
1813    msg "test: full config + MBEDTLS_TEST_DEPRECATED" # ~ 30s
1814    make test
1815}
1816
1817# Check that the specified libraries exist and are empty.
1818are_empty_libraries () {
1819  nm "$@" >/dev/null 2>/dev/null
1820  ! nm "$@" 2>/dev/null | grep -v ':$' | grep .
1821}
1822
1823component_build_crypto_default () {
1824  msg "build: make, crypto only"
1825  scripts/config.py crypto
1826  make CFLAGS='-O1 -Werror'
1827  are_empty_libraries library/libmbedx509.* library/libmbedtls.*
1828}
1829
1830component_build_crypto_full () {
1831  msg "build: make, crypto only, full config"
1832  scripts/config.py crypto_full
1833  make CFLAGS='-O1 -Werror'
1834  are_empty_libraries library/libmbedx509.* library/libmbedtls.*
1835}
1836
1837component_test_crypto_for_psa_service () {
1838  msg "build: make, config for PSA crypto service"
1839  scripts/config.py crypto
1840  scripts/config.py set MBEDTLS_PSA_CRYPTO_KEY_ID_ENCODES_OWNER
1841  # Disable things that are not needed for just cryptography, to
1842  # reach a configuration that would be typical for a PSA cryptography
1843  # service providing all implemented PSA algorithms.
1844  # System stuff
1845  scripts/config.py unset MBEDTLS_ERROR_C
1846  scripts/config.py unset MBEDTLS_TIMING_C
1847  scripts/config.py unset MBEDTLS_VERSION_FEATURES
1848  # Crypto stuff with no PSA interface
1849  scripts/config.py unset MBEDTLS_BASE64_C
1850  # Keep MBEDTLS_CIPHER_C because psa_crypto_cipher, CCM and GCM need it.
1851  scripts/config.py unset MBEDTLS_HKDF_C # PSA's HKDF is independent
1852  # Keep MBEDTLS_MD_C because deterministic ECDSA needs it for HMAC_DRBG.
1853  scripts/config.py unset MBEDTLS_NIST_KW_C
1854  scripts/config.py unset MBEDTLS_PEM_PARSE_C
1855  scripts/config.py unset MBEDTLS_PEM_WRITE_C
1856  scripts/config.py unset MBEDTLS_PKCS12_C
1857  scripts/config.py unset MBEDTLS_PKCS5_C
1858  # MBEDTLS_PK_PARSE_C and MBEDTLS_PK_WRITE_C are actually currently needed
1859  # in PSA code to work with RSA keys. We don't require users to set those:
1860  # they will be reenabled in build_info.h.
1861  scripts/config.py unset MBEDTLS_PK_C
1862  scripts/config.py unset MBEDTLS_PK_PARSE_C
1863  scripts/config.py unset MBEDTLS_PK_WRITE_C
1864  make CFLAGS='-O1 -Werror' all test
1865  are_empty_libraries library/libmbedx509.* library/libmbedtls.*
1866}
1867
1868component_build_crypto_baremetal () {
1869  msg "build: make, crypto only, baremetal config"
1870  scripts/config.py crypto_baremetal
1871  make CFLAGS="-O1 -Werror -I$PWD/tests/include/baremetal-override/"
1872  are_empty_libraries library/libmbedx509.* library/libmbedtls.*
1873}
1874support_build_crypto_baremetal () {
1875    support_build_baremetal "$@"
1876}
1877
1878component_build_baremetal () {
1879  msg "build: make, baremetal config"
1880  scripts/config.py baremetal
1881  make CFLAGS="-O1 -Werror -I$PWD/tests/include/baremetal-override/"
1882}
1883support_build_baremetal () {
1884    # Older Glibc versions include time.h from other headers such as stdlib.h,
1885    # which makes the no-time.h-in-baremetal check fail. Ubuntu 16.04 has this
1886    # problem, Ubuntu 18.04 is ok.
1887    ! grep -q -F time.h /usr/include/x86_64-linux-gnu/sys/types.h
1888}
1889
1890# depends.py family of tests
1891component_test_depends_py_cipher_id () {
1892    msg "test/build: depends.py cipher_id (gcc)"
1893    tests/scripts/depends.py cipher_id --unset-use-psa
1894}
1895
1896component_test_depends_py_cipher_chaining () {
1897    msg "test/build: depends.py cipher_chaining (gcc)"
1898    tests/scripts/depends.py cipher_chaining --unset-use-psa
1899}
1900
1901component_test_depends_py_cipher_padding () {
1902    msg "test/build: depends.py cipher_padding (gcc)"
1903    tests/scripts/depends.py cipher_padding --unset-use-psa
1904}
1905
1906component_test_depends_py_curves () {
1907    msg "test/build: depends.py curves (gcc)"
1908    tests/scripts/depends.py curves --unset-use-psa
1909}
1910
1911component_test_depends_py_hashes () {
1912    msg "test/build: depends.py hashes (gcc)"
1913    tests/scripts/depends.py hashes --unset-use-psa
1914}
1915
1916component_test_depends_py_kex () {
1917    msg "test/build: depends.py kex (gcc)"
1918    tests/scripts/depends.py kex --unset-use-psa
1919}
1920
1921component_test_depends_py_pkalgs () {
1922    msg "test/build: depends.py pkalgs (gcc)"
1923    tests/scripts/depends.py pkalgs --unset-use-psa
1924}
1925
1926# PSA equivalents of the depends.py tests
1927component_test_depends_py_cipher_id_psa () {
1928    msg "test/build: depends.py cipher_id (gcc) with MBEDTLS_USE_PSA_CRYPTO defined"
1929    tests/scripts/depends.py cipher_id
1930}
1931
1932component_test_depends_py_cipher_chaining_psa () {
1933    msg "test/build: depends.py cipher_chaining (gcc) with MBEDTLS_USE_PSA_CRYPTO defined"
1934    tests/scripts/depends.py cipher_chaining
1935}
1936
1937component_test_depends_py_cipher_padding_psa () {
1938    msg "test/build: depends.py cipher_padding (gcc) with MBEDTLS_USE_PSA_CRYPTO defined"
1939    tests/scripts/depends.py cipher_padding
1940}
1941
1942component_test_depends_py_curves_psa () {
1943    msg "test/build: depends.py curves (gcc) with MBEDTLS_USE_PSA_CRYPTO defined"
1944    tests/scripts/depends.py curves
1945}
1946
1947component_test_depends_py_hashes_psa () {
1948    msg "test/build: depends.py hashes (gcc) with MBEDTLS_USE_PSA_CRYPTO defined"
1949    tests/scripts/depends.py hashes
1950}
1951
1952component_test_depends_py_kex_psa () {
1953    msg "test/build: depends.py kex (gcc) with MBEDTLS_USE_PSA_CRYPTO defined"
1954    tests/scripts/depends.py kex
1955}
1956
1957component_test_depends_py_pkalgs_psa () {
1958    msg "test/build: depends.py pkalgs (gcc) with MBEDTLS_USE_PSA_CRYPTO defined"
1959    tests/scripts/depends.py pkalgs
1960}
1961
1962component_build_no_pk_rsa_alt_support () {
1963    msg "build: !MBEDTLS_PK_RSA_ALT_SUPPORT" # ~30s
1964
1965    scripts/config.py full
1966    scripts/config.py unset MBEDTLS_PK_RSA_ALT_SUPPORT
1967    scripts/config.py set MBEDTLS_RSA_C
1968    scripts/config.py set MBEDTLS_X509_CRT_WRITE_C
1969
1970    # Only compile - this is primarily to test for compile issues
1971    make CC=gcc CFLAGS='-Werror -Wall -Wextra -I../tests/include/alt-dummy'
1972}
1973
1974component_build_module_alt () {
1975    msg "build: MBEDTLS_XXX_ALT" # ~30s
1976    scripts/config.py full
1977
1978    # Disable options that are incompatible with some ALT implementations:
1979    # aesni.c and padlock.c reference mbedtls_aes_context fields directly.
1980    scripts/config.py unset MBEDTLS_AESNI_C
1981    scripts/config.py unset MBEDTLS_PADLOCK_C
1982    scripts/config.py unset MBEDTLS_AESCE_C
1983    # MBEDTLS_ECP_RESTARTABLE is documented as incompatible.
1984    scripts/config.py unset MBEDTLS_ECP_RESTARTABLE
1985    # You can only have one threading implementation: alt or pthread, not both.
1986    scripts/config.py unset MBEDTLS_THREADING_PTHREAD
1987    # The SpecifiedECDomain parsing code accesses mbedtls_ecp_group fields
1988    # directly and assumes the implementation works with partial groups.
1989    scripts/config.py unset MBEDTLS_PK_PARSE_EC_EXTENDED
1990    # MBEDTLS_SHA256_*ALT can't be used with MBEDTLS_SHA256_USE_A64_CRYPTO_*
1991    scripts/config.py unset MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT
1992    scripts/config.py unset MBEDTLS_SHA256_USE_A64_CRYPTO_ONLY
1993    # MBEDTLS_SHA512_*ALT can't be used with MBEDTLS_SHA512_USE_A64_CRYPTO_*
1994    scripts/config.py unset MBEDTLS_SHA512_USE_A64_CRYPTO_IF_PRESENT
1995    scripts/config.py unset MBEDTLS_SHA512_USE_A64_CRYPTO_ONLY
1996
1997    # Enable all MBEDTLS_XXX_ALT for whole modules. Do not enable
1998    # MBEDTLS_XXX_YYY_ALT which are for single functions.
1999    scripts/config.py set-all 'MBEDTLS_([A-Z0-9]*|NIST_KW)_ALT'
2000    scripts/config.py unset MBEDTLS_DHM_ALT #incompatible with MBEDTLS_DEBUG_C
2001
2002    # We can only compile, not link, since we don't have any implementations
2003    # suitable for testing with the dummy alt headers.
2004    make CC=gcc CFLAGS='-Werror -Wall -Wextra -I../tests/include/alt-dummy' lib
2005}
2006
2007component_build_dhm_alt () {
2008    msg "build: MBEDTLS_DHM_ALT" # ~30s
2009    scripts/config.py full
2010    scripts/config.py set MBEDTLS_DHM_ALT
2011    # debug.c currently references mbedtls_dhm_context fields directly.
2012    scripts/config.py unset MBEDTLS_DEBUG_C
2013    # We can only compile, not link, since we don't have any implementations
2014    # suitable for testing with the dummy alt headers.
2015    make CC=gcc CFLAGS='-Werror -Wall -Wextra -I../tests/include/alt-dummy' lib
2016}
2017
2018component_test_no_use_psa_crypto_full_cmake_asan() {
2019    # full minus MBEDTLS_USE_PSA_CRYPTO: run the same set of tests as basic-build-test.sh
2020    msg "build: cmake, full config minus MBEDTLS_USE_PSA_CRYPTO, ASan"
2021    scripts/config.py full
2022    scripts/config.py unset MBEDTLS_PSA_CRYPTO_C
2023    scripts/config.py unset MBEDTLS_USE_PSA_CRYPTO
2024    scripts/config.py unset MBEDTLS_SSL_PROTO_TLS1_3
2025    scripts/config.py unset MBEDTLS_PSA_ITS_FILE_C
2026    scripts/config.py unset MBEDTLS_PSA_CRYPTO_SE_C
2027    scripts/config.py unset MBEDTLS_PSA_CRYPTO_STORAGE_C
2028    scripts/config.py unset MBEDTLS_LMS_C
2029    scripts/config.py unset MBEDTLS_LMS_PRIVATE
2030    CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
2031    make
2032
2033    msg "test: main suites (full minus MBEDTLS_USE_PSA_CRYPTO)"
2034    make test
2035
2036    # Note: ssl-opt.sh has some test cases that depend on
2037    # MBEDTLS_ECP_RESTARTABLE && !MBEDTLS_USE_PSA_CRYPTO
2038    # This is the only component where those tests are not skipped.
2039    msg "test: ssl-opt.sh (full minus MBEDTLS_USE_PSA_CRYPTO)"
2040    tests/ssl-opt.sh
2041
2042    msg "test: compat.sh default (full minus MBEDTLS_USE_PSA_CRYPTO)"
2043    tests/compat.sh
2044
2045    msg "test: compat.sh NULL (full minus MBEDTLS_USE_PSA_CRYPTO)"
2046    env OPENSSL="$OPENSSL_LEGACY" GNUTLS_CLI="$GNUTLS_LEGACY_CLI" GNUTLS_SERV="$GNUTLS_LEGACY_SERV" tests/compat.sh -f 'NULL'
2047
2048    msg "test: compat.sh ARIA + ChachaPoly (full minus MBEDTLS_USE_PSA_CRYPTO)"
2049    env OPENSSL="$OPENSSL_NEXT" tests/compat.sh -e '^$' -f 'ARIA\|CHACHA'
2050}
2051
2052component_test_psa_crypto_config_accel_ecdsa () {
2053    msg "test: MBEDTLS_PSA_CRYPTO_CONFIG with accelerated ECDSA"
2054
2055    # Algorithms and key types to accelerate
2056    loc_accel_list="ALG_ECDSA ALG_DETERMINISTIC_ECDSA KEY_TYPE_ECC_KEY_PAIR KEY_TYPE_ECC_PUBLIC_KEY"
2057
2058    # Configure and build the test driver library
2059    # -------------------------------------------
2060
2061    # Disable ALG_STREAM_CIPHER and ALG_ECB_NO_PADDING to avoid having
2062    # partial support for cipher operations in the driver test library.
2063    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_STREAM_CIPHER
2064    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_ECB_NO_PADDING
2065
2066    loc_accel_flags=$( echo "$loc_accel_list" | sed 's/[^ ]* */-DLIBTESTDRIVER1_MBEDTLS_PSA_ACCEL_&/g' )
2067    # These hashes are needed for some ECDSA signature tests.
2068    loc_accel_flags="$loc_accel_flags -DLIBTESTDRIVER1_MBEDTLS_PSA_ACCEL_ALG_SHA_224"
2069    loc_accel_flags="$loc_accel_flags -DLIBTESTDRIVER1_MBEDTLS_PSA_ACCEL_ALG_SHA_256"
2070    loc_accel_flags="$loc_accel_flags -DLIBTESTDRIVER1_MBEDTLS_PSA_ACCEL_ALG_SHA_384"
2071    loc_accel_flags="$loc_accel_flags -DLIBTESTDRIVER1_MBEDTLS_PSA_ACCEL_ALG_SHA_512"
2072    make -C tests libtestdriver1.a CFLAGS="$ASAN_CFLAGS $loc_accel_flags" LDFLAGS="$ASAN_CFLAGS"
2073
2074    # Configure and build the main libraries
2075    # --------------------------------------
2076
2077    # Start from default config (no USE_PSA) + driver support + TLS 1.3
2078    scripts/config.py set MBEDTLS_PSA_CRYPTO_DRIVERS
2079    scripts/config.py set MBEDTLS_PSA_CRYPTO_CONFIG
2080    scripts/config.py set MBEDTLS_SSL_PROTO_TLS1_3
2081
2082    # Disable the module that's accelerated
2083    scripts/config.py unset MBEDTLS_ECDSA_C
2084
2085    # Disable things that depend on it
2086    scripts/config.py unset MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED
2087    scripts/config.py unset MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED
2088
2089    # Build the library
2090    loc_accel_flags="$loc_accel_flags $( echo "$loc_accel_list" | sed 's/[^ ]* */-DMBEDTLS_PSA_ACCEL_&/g' )"
2091    make CFLAGS="$ASAN_CFLAGS -O -Werror -I../tests/include -I../tests -I../../tests -DPSA_CRYPTO_DRIVER_TEST -DMBEDTLS_TEST_LIBTESTDRIVER1 $loc_accel_flags" LDFLAGS="-ltestdriver1 $ASAN_CFLAGS"
2092
2093    # Make sure this was not re-enabled by accident (additive config)
2094    not grep mbedtls_ecdsa_ library/ecdsa.o
2095
2096    # Run the tests
2097    # -------------
2098
2099    msg "test: MBEDTLS_PSA_CRYPTO_CONFIG with accelerated ECDSA"
2100    make test
2101}
2102
2103# Auxiliary function to build config for ECDSA with and without drivers
2104config_psa_crypto_config_ecdsa_use_psa () {
2105    DRIVER_ONLY="$1"
2106    # start with config full for maximum coverage (also enables USE_PSA)
2107    scripts/config.py full
2108    # enable support for drivers and configuring PSA-only algorithms
2109    scripts/config.py set MBEDTLS_PSA_CRYPTO_CONFIG
2110    scripts/config.py set MBEDTLS_PSA_CRYPTO_DRIVERS
2111    if [ "$DRIVER_ONLY" -eq 1 ]; then
2112        # Disable the module that's accelerated
2113        scripts/config.py unset MBEDTLS_ECDSA_C
2114    fi
2115    # Restartable feature is not yet supported by PSA. Once it will in
2116    # the future, the following line could be removed (see issues
2117    # 6061, 6332 and following ones)
2118    scripts/config.py unset MBEDTLS_ECP_RESTARTABLE
2119    # Dynamic secure element support is a deprecated feature and needs to be disabled here.
2120    # This is done to have the same form of psa_key_attributes_s for libdriver and library.
2121    scripts/config.py unset MBEDTLS_PSA_CRYPTO_SE_C
2122}
2123
2124# Keep in sync with component_test_psa_crypto_config_reference_ecdsa_use_psa
2125component_test_psa_crypto_config_accel_ecdsa_use_psa () {
2126    msg "test: MBEDTLS_PSA_CRYPTO_CONFIG with accelerated ECDSA + USE_PSA"
2127
2128    # Algorithms and key types to accelerate
2129    loc_accel_list="ALG_ECDSA ALG_DETERMINISTIC_ECDSA KEY_TYPE_ECC_KEY_PAIR KEY_TYPE_ECC_PUBLIC_KEY"
2130
2131    # Configure and build the test driver library
2132    # -------------------------------------------
2133
2134    # Disable ALG_STREAM_CIPHER and ALG_ECB_NO_PADDING to avoid having
2135    # partial support for cipher operations in the driver test library.
2136    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_STREAM_CIPHER
2137    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_ECB_NO_PADDING
2138
2139    loc_accel_flags=$( echo "$loc_accel_list" | sed 's/[^ ]* */-DLIBTESTDRIVER1_MBEDTLS_PSA_ACCEL_&/g' )
2140    # SHA-1 and all variants of SHA-2 are needed for ECDSA and X.509 tests
2141    loc_accel_flags="$loc_accel_flags -DLIBTESTDRIVER1_MBEDTLS_PSA_ACCEL_ALG_SHA_1"
2142    loc_accel_flags="$loc_accel_flags -DLIBTESTDRIVER1_MBEDTLS_PSA_ACCEL_ALG_SHA_224"
2143    loc_accel_flags="$loc_accel_flags -DLIBTESTDRIVER1_MBEDTLS_PSA_ACCEL_ALG_SHA_256"
2144    loc_accel_flags="$loc_accel_flags -DLIBTESTDRIVER1_MBEDTLS_PSA_ACCEL_ALG_SHA_384"
2145    loc_accel_flags="$loc_accel_flags -DLIBTESTDRIVER1_MBEDTLS_PSA_ACCEL_ALG_SHA_512"
2146    make -C tests libtestdriver1.a CFLAGS="$ASAN_CFLAGS $loc_accel_flags" LDFLAGS="$ASAN_CFLAGS"
2147
2148    # Configure and build the main libraries with drivers enabled
2149    # -----------------------------------------------------------
2150
2151    # Use the same config as reference, only without built-in ECDSA
2152    config_psa_crypto_config_ecdsa_use_psa 1
2153
2154    # Build the library
2155    loc_accel_flags="$loc_accel_flags $( echo "$loc_accel_list" | sed 's/[^ ]* */-DMBEDTLS_PSA_ACCEL_&/g' )"
2156    make CFLAGS="$ASAN_CFLAGS -O -Werror -I../tests/include -I../tests -I../../tests -DPSA_CRYPTO_DRIVER_TEST -DMBEDTLS_TEST_LIBTESTDRIVER1 $loc_accel_flags" LDFLAGS="-ltestdriver1 $ASAN_CFLAGS"
2157
2158    # Make sure ECDSA was not re-enabled by accident (additive config)
2159    not grep mbedtls_ecdsa_ library/ecdsa.o
2160
2161    # Run the tests
2162    # -------------
2163
2164    msg "test: MBEDTLS_PSA_CRYPTO_CONFIG with accelerated ECDSA + USE_PSA"
2165    make test
2166
2167    msg "test: ssl-opt.sh"
2168    tests/ssl-opt.sh
2169}
2170
2171# Keep in sync with component_test_psa_crypto_config_accel_ecdsa_use_psa.
2172# Used by tests/scripts/analyze_outcomes.py for comparison purposes.
2173component_test_psa_crypto_config_reference_ecdsa_use_psa () {
2174    msg "test: MBEDTLS_PSA_CRYPTO_CONFIG with accelerated ECDSA + USE_PSA"
2175
2176    # To be aligned with the accel component that needs this
2177    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_STREAM_CIPHER
2178    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_ECB_NO_PADDING
2179
2180    config_psa_crypto_config_ecdsa_use_psa 0
2181
2182    make
2183
2184    msg "test: MBEDTLS_PSA_CRYPTO_CONFIG with accelerated ECDSA + USE_PSA"
2185    make test
2186
2187    msg "test: ssl-opt.sh"
2188    tests/ssl-opt.sh
2189}
2190
2191component_test_psa_crypto_config_accel_ecdh () {
2192    msg "test: MBEDTLS_PSA_CRYPTO_CONFIG with accelerated ECDH"
2193
2194    # Algorithms and key types to accelerate
2195    loc_accel_list="ALG_ECDH KEY_TYPE_ECC_KEY_PAIR KEY_TYPE_ECC_PUBLIC_KEY"
2196
2197    # Configure and build the test driver library
2198    # -------------------------------------------
2199
2200    # Disable ALG_STREAM_CIPHER and ALG_ECB_NO_PADDING to avoid having
2201    # partial support for cipher operations in the driver test library.
2202    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_STREAM_CIPHER
2203    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_ECB_NO_PADDING
2204
2205    loc_accel_flags=$( echo "$loc_accel_list" | sed 's/[^ ]* */-DLIBTESTDRIVER1_MBEDTLS_PSA_ACCEL_&/g' )
2206    make -C tests libtestdriver1.a CFLAGS=" $ASAN_CFLAGS $loc_accel_flags" LDFLAGS="$ASAN_CFLAGS"
2207
2208    # Configure and build the main libraries
2209    # --------------------------------------
2210
2211    # Start from default config (no USE_PSA or TLS 1.3) + driver support
2212    scripts/config.py set MBEDTLS_PSA_CRYPTO_DRIVERS
2213    scripts/config.py set MBEDTLS_PSA_CRYPTO_CONFIG
2214
2215    # Disable the module that's accelerated
2216    scripts/config.py unset MBEDTLS_ECDH_C
2217
2218    # Disable things that depend on it
2219    scripts/config.py unset MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED
2220    scripts/config.py unset MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED
2221    scripts/config.py unset MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED
2222    scripts/config.py unset MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED
2223    scripts/config.py unset MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED
2224
2225    # Build the main library
2226    loc_accel_flags="$loc_accel_flags $( echo "$loc_accel_list" | sed 's/[^ ]* */-DMBEDTLS_PSA_ACCEL_&/g' )"
2227    make CFLAGS="$ASAN_CFLAGS -O -Werror -I../tests/include -I../tests -I../../tests -DPSA_CRYPTO_DRIVER_TEST -DMBEDTLS_TEST_LIBTESTDRIVER1 $loc_accel_flags" LDFLAGS="-ltestdriver1 $ASAN_CFLAGS"
2228
2229    # Make sure this was not re-enabled by accident (additive config)
2230    not grep mbedtls_ecdh_ library/ecdh.o
2231
2232    # Run the tests
2233    # -------------
2234
2235    msg "test: MBEDTLS_PSA_CRYPTO_CONFIG with accelerated ECDH"
2236    make test
2237}
2238
2239# Auxiliary function to build config for ECDH with and without drivers.
2240#
2241# This is used by the two following components to ensure they always use the
2242# same config, except for the use of driver or built-in ECDH:
2243# - component_test_psa_crypto_config_accel_ecdh_use_psa;
2244# - component_test_psa_crypto_config_reference_ecdh_use_psa.
2245# This support comparing their test coverage with analyze_outcomes.py.
2246config_psa_crypto_config_ecdh_use_psa () {
2247    DRIVER_ONLY="$1"
2248    # start with config full for maximum coverage (also enables USE_PSA)
2249    scripts/config.py full
2250    # enable support for drivers and configuring PSA-only algorithms
2251    scripts/config.py set MBEDTLS_PSA_CRYPTO_CONFIG
2252    scripts/config.py set MBEDTLS_PSA_CRYPTO_DRIVERS
2253    if [ "$DRIVER_ONLY" -eq 1 ]; then
2254        # Disable the module that's accelerated
2255        scripts/config.py unset MBEDTLS_ECDH_C
2256    fi
2257    # Disable things that depend on it (regardless of driver or built-in)
2258    scripts/config.py unset MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED
2259    scripts/config.py unset MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED
2260    scripts/config.py unset MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED
2261    scripts/config.py unset MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED
2262    scripts/config.py unset MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED
2263
2264    scripts/config.py unset MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED
2265    scripts/config.py unset MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL_ENABLED
2266    # Note: the above two lines should be enough, but currently there's a bug
2267    # that prevents tests from passing TLS 1.3 with only PSK (no ephemeral)
2268    # when TLS 1.2 is also enabled, see #6848.
2269    # So, as a temporary measure disable all of TLS 1.3.
2270    scripts/config.py unset MBEDTLS_SSL_PROTO_TLS1_3
2271
2272    # Restartable feature is not yet supported by PSA. Once it will in
2273    # the future, the following line could be removed (see issues
2274    # 6061, 6332 and following ones)
2275    scripts/config.py unset MBEDTLS_ECP_RESTARTABLE
2276}
2277
2278# Keep in sync with component_test_psa_crypto_config_reference_ecdh_use_psa
2279component_test_psa_crypto_config_accel_ecdh_use_psa () {
2280    msg "test: MBEDTLS_PSA_CRYPTO_CONFIG with accelerated ECDH + USE_PSA"
2281
2282    # Algorithms and key types to accelerate
2283    loc_accel_list="ALG_ECDH KEY_TYPE_ECC_KEY_PAIR KEY_TYPE_ECC_PUBLIC_KEY"
2284
2285    # Configure and build the test driver library
2286    # -------------------------------------------
2287
2288    # Disable ALG_STREAM_CIPHER and ALG_ECB_NO_PADDING to avoid having
2289    # partial support for cipher operations in the driver test library.
2290    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_STREAM_CIPHER
2291    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_ECB_NO_PADDING
2292
2293    loc_accel_flags=$( echo "$loc_accel_list" | sed 's/[^ ]* */-DLIBTESTDRIVER1_MBEDTLS_PSA_ACCEL_&/g' )
2294    make -C tests libtestdriver1.a CFLAGS=" $ASAN_CFLAGS $loc_accel_flags" LDFLAGS="$ASAN_CFLAGS"
2295
2296    # Configure and build the main libraries
2297    # --------------------------------------
2298
2299    # Use the same config as reference, only without built-in ECDH
2300    config_psa_crypto_config_ecdh_use_psa 1
2301
2302    # Build the main library
2303    loc_accel_flags="$loc_accel_flags $( echo "$loc_accel_list" | sed 's/[^ ]* */-DMBEDTLS_PSA_ACCEL_&/g' )"
2304    make CFLAGS="$ASAN_CFLAGS -O -Werror -I../tests/include -I../tests -I../../tests -DPSA_CRYPTO_DRIVER_TEST -DMBEDTLS_TEST_LIBTESTDRIVER1 $loc_accel_flags" LDFLAGS="-ltestdriver1 $ASAN_CFLAGS"
2305
2306    # Make sure this was not re-enabled by accident (additive config)
2307    not grep mbedtls_ecdh_ library/ecdh.o
2308
2309    # Run the tests
2310    # -------------
2311
2312    msg "test: MBEDTLS_PSA_CRYPTO_CONFIG with accelerated ECDH + USE_PSA"
2313    make test
2314
2315    msg "test: ssl-opt.sh"
2316    tests/ssl-opt.sh
2317}
2318
2319# Keep in sync with component_test_psa_crypto_config_accel_ecdh_use_psa.
2320# Used by tests/scripts/analyze_outcomes.py for comparison purposes.
2321component_test_psa_crypto_config_reference_ecdh_use_psa () {
2322    msg "test: MBEDTLS_PSA_CRYPTO_CONFIG with reference ECDH + USE_PSA"
2323
2324    # To be aligned with the accel component that needs this
2325    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_STREAM_CIPHER
2326    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_ECB_NO_PADDING
2327
2328    config_psa_crypto_config_ecdh_use_psa 0
2329
2330    make
2331
2332    msg "test: MBEDTLS_PSA_CRYPTO_CONFIG with reference ECDH + USE_PSA"
2333    make test
2334
2335    msg "test: ssl-opt.sh"
2336    tests/ssl-opt.sh
2337}
2338
2339# Auxiliary function to build config for EC JPAKE with and without drivers.
2340#
2341# This is used by the two following components to ensure they always use the
2342# same config, except for the use of driver or built-in ECJPAKE:
2343# - component_test_psa_crypto_config_accel_ecjpake_use_psa;
2344# - component_test_psa_crypto_config_reference_ecjpake_use_psa.
2345# This support comparing their test coverage with analyze_outcomes.py.
2346config_psa_crypto_config_ecjpake_use_psa () {
2347    DRIVER_ONLY="$1"
2348    # start with config full for maximum coverage (also enables USE_PSA)
2349    scripts/config.py full
2350    # enable support for drivers and configuring PSA-only algorithms
2351    scripts/config.py set MBEDTLS_PSA_CRYPTO_CONFIG
2352    scripts/config.py set MBEDTLS_PSA_CRYPTO_DRIVERS
2353    if [ "$DRIVER_ONLY" -eq 1 ]; then
2354        # Disable the module that's accelerated
2355        scripts/config.py unset MBEDTLS_ECJPAKE_C
2356    fi
2357
2358    # Dynamic secure element support is a deprecated feature and needs to be disabled here.
2359    # This is done to have the same form of psa_key_attributes_s for libdriver and library.
2360    scripts/config.py unset MBEDTLS_PSA_CRYPTO_SE_C
2361}
2362
2363# Keep in sync with component_test_psa_crypto_config_reference_ecjpake_use_psa
2364component_test_psa_crypto_config_accel_ecjpake_use_psa () {
2365    msg "test: MBEDTLS_PSA_CRYPTO_CONFIG with accelerated ECJPAKE + USE_PSA"
2366
2367    # Algorithms and key types to accelerate
2368    loc_accel_list="ALG_JPAKE KEY_TYPE_ECC_KEY_PAIR KEY_TYPE_ECC_PUBLIC_KEY"
2369
2370    # Configure and build the test driver library
2371    # -------------------------------------------
2372
2373    # Disable ALG_STREAM_CIPHER and ALG_ECB_NO_PADDING to avoid having
2374    # partial support for cipher operations in the driver test library.
2375    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_STREAM_CIPHER
2376    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_ECB_NO_PADDING
2377
2378    loc_accel_flags=$( echo "$loc_accel_list" | sed 's/[^ ]* */-DLIBTESTDRIVER1_MBEDTLS_PSA_ACCEL_&/g' )
2379    make -C tests libtestdriver1.a CFLAGS=" $ASAN_CFLAGS $loc_accel_flags" LDFLAGS="$ASAN_CFLAGS"
2380
2381    # Configure and build the main libraries
2382    # --------------------------------------
2383
2384    # Use the same config as reference, only without built-in JPAKE
2385    config_psa_crypto_config_ecjpake_use_psa 1
2386
2387    # Build the main library
2388    loc_accel_flags="$loc_accel_flags $( echo "$loc_accel_list" | sed 's/[^ ]* */-DMBEDTLS_PSA_ACCEL_&/g' )"
2389    make CFLAGS="$ASAN_CFLAGS -O -Werror -I../tests/include -I../tests -I../../tests -DPSA_CRYPTO_DRIVER_TEST -DMBEDTLS_TEST_LIBTESTDRIVER1 $loc_accel_flags" LDFLAGS="-ltestdriver1 $ASAN_CFLAGS"
2390
2391    # Make sure this was not re-enabled by accident (additive config)
2392    not grep mbedtls_ecjpake_ library/ecjpake.o
2393
2394    # Run the tests
2395    # -------------
2396
2397    msg "test: MBEDTLS_PSA_CRYPTO_CONFIG with accelerated JPAKE + USE_PSA"
2398    make test
2399
2400    msg "test: ssl-opt.sh"
2401    tests/ssl-opt.sh
2402}
2403
2404# Keep in sync with component_test_psa_crypto_config_accel_ecjpake_use_psa.
2405# Used by tests/scripts/analyze_outcomes.py for comparison purposes.
2406component_test_psa_crypto_config_reference_ecjpake_use_psa () {
2407    msg "test: MBEDTLS_PSA_CRYPTO_CONFIG with reference ECJPAKE + USE_PSA"
2408
2409    # To be aligned with the accel component that needs this
2410    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_STREAM_CIPHER
2411    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_ECB_NO_PADDING
2412
2413    config_psa_crypto_config_ecjpake_use_psa 0
2414
2415    make
2416
2417    msg "test: MBEDTLS_PSA_CRYPTO_CONFIG with reference ECJPAKE + USE_PSA"
2418    make test
2419
2420    msg "test: ssl-opt.sh"
2421    tests/ssl-opt.sh
2422}
2423
2424component_test_psa_crypto_config_accel_ecc () {
2425    msg "test: MBEDTLS_PSA_CRYPTO_CONFIG with accelerated ECC"
2426
2427    # Algorithms and key types to accelerate
2428    loc_accel_list="ALG_ECDH ALG_ECDSA ALG_DETERMINISTIC_ECDSA ALG_JPAKE KEY_TYPE_ECC_KEY_PAIR KEY_TYPE_ECC_PUBLIC_KEY"
2429
2430    # Configure and build the test driver library
2431    # --------------------------------------------
2432
2433    # Disable ALG_STREAM_CIPHER and ALG_ECB_NO_PADDING to avoid having
2434    # partial support for cipher operations in the driver test library.
2435    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_STREAM_CIPHER
2436    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_ECB_NO_PADDING
2437
2438    loc_accel_flags=$( echo "$loc_accel_list" | sed 's/[^ ]* */-DLIBTESTDRIVER1_MBEDTLS_PSA_ACCEL_&/g' )
2439    # These hashes are needed for some ECDSA signature tests.
2440    loc_accel_flags="$loc_accel_flags -DLIBTESTDRIVER1_MBEDTLS_PSA_ACCEL_ALG_SHA_224"
2441    loc_accel_flags="$loc_accel_flags -DLIBTESTDRIVER1_MBEDTLS_PSA_ACCEL_ALG_SHA_256"
2442    loc_accel_flags="$loc_accel_flags -DLIBTESTDRIVER1_MBEDTLS_PSA_ACCEL_ALG_SHA_384"
2443    loc_accel_flags="$loc_accel_flags -DLIBTESTDRIVER1_MBEDTLS_PSA_ACCEL_ALG_SHA_512"
2444    make -C tests libtestdriver1.a CFLAGS="$ASAN_CFLAGS $loc_accel_flags" LDFLAGS="$ASAN_CFLAGS"
2445
2446    # Configure and build the main libraries
2447    # ---------------------------------------
2448
2449    # start with default + driver support
2450    scripts/config.py set MBEDTLS_PSA_CRYPTO_DRIVERS
2451    scripts/config.py set MBEDTLS_PSA_CRYPTO_CONFIG
2452
2453    # disable modules for which we have drivers
2454    scripts/config.py unset MBEDTLS_ECDSA_C
2455    scripts/config.py unset MBEDTLS_ECDH_C
2456    scripts/config.py unset MBEDTLS_ECJPAKE_C
2457
2458    # dependencies
2459    #scripts/config.py unset MBEDTLS_SSL_PROTO_TLS1_3 # not in default anyway
2460    scripts/config.py unset MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED
2461    scripts/config.py unset MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED
2462    scripts/config.py unset MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED
2463    scripts/config.py unset MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED
2464    scripts/config.py unset MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED
2465
2466    # build and link with test drivers
2467    loc_accel_flags="$loc_accel_flags $( echo "$loc_accel_list" | sed 's/[^ ]* */-DMBEDTLS_PSA_ACCEL_&/g' )"
2468    make CFLAGS="$ASAN_CFLAGS -I../tests/include -I../tests -I../../tests -DPSA_CRYPTO_DRIVER_TEST -DMBEDTLS_TEST_LIBTESTDRIVER1 $loc_accel_flags" LDFLAGS="-ltestdriver1 $ASAN_CFLAGS"
2469
2470    # make sure these were not auto-re-enabled by accident
2471    not grep mbedtls_ecdh_ library/ecdh.o
2472    not grep mbedtls_ecdsa_ library/ecdsa.o
2473    not grep mbedtls_ecjpake_ library/ecjpake.o
2474
2475    # Run the tests
2476    # -------------
2477
2478    msg "test: MBEDTLS_PSA_CRYPTO_CONFIG with accelerated ECC"
2479    make test
2480}
2481
2482component_test_psa_crypto_config_accel_rsa_signature () {
2483    msg "test: MBEDTLS_PSA_CRYPTO_CONFIG with accelerated RSA signature"
2484
2485    # Disable ALG_STREAM_CIPHER and ALG_ECB_NO_PADDING to avoid having
2486    # partial support for cipher operations in the driver test library.
2487    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_STREAM_CIPHER
2488    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_ECB_NO_PADDING
2489
2490    # It seems it is not possible to remove only the support for RSA signature
2491    # in the library. Thus we have to remove all RSA support (signature and
2492    # encryption/decryption). AS there is no driver support for asymmetric
2493    # encryption/decryption so far remove RSA encryption/decryption from the
2494    # application algorithm list.
2495    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_RSA_OAEP
2496    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_RSA_PKCS1V15_CRYPT
2497
2498    # Make sure both the library and the test library support the SHA hash
2499    # algorithms and only those ones (SHA256 is included by default). That way:
2500    # - the test library can compute the RSA signatures even in the case of a
2501    #   composite RSA signature algorithm based on a SHA hash (no other hash
2502    #   used in the unit tests).
2503    # - the dependency of RSA signature tests on PSA_WANT_ALG_SHA_xyz is
2504    #   fulfilled as the hash SHA algorithm is supported by the library, and
2505    #   thus the tests are run, not skipped.
2506    # - when testing a signature key with an algorithm wildcard built from
2507    #   PSA_ALG_ANY_HASH as algorithm to test with the key, the chosen hash
2508    #   algorithm based on the hashes supported by the library is also
2509    #   supported by the test library.
2510    # Disabled unwanted hashes here, we'll enable hashes we want in loc_accel_flags.
2511    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_MD5
2512    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_RIPEMD160_C
2513
2514    # We need PEM parsing in the test library as well to support the import
2515    # of PEM encoded RSA keys.
2516    scripts/config.py -f tests/include/test/drivers/config_test_driver.h set MBEDTLS_PEM_PARSE_C
2517    scripts/config.py -f tests/include/test/drivers/config_test_driver.h set MBEDTLS_BASE64_C
2518
2519    loc_accel_list="ALG_RSA_PKCS1V15_SIGN ALG_RSA_PSS KEY_TYPE_RSA_KEY_PAIR KEY_TYPE_RSA_PUBLIC_KEY"
2520    loc_accel_flags=$( echo "$loc_accel_list" | sed 's/[^ ]* */-DLIBTESTDRIVER1_MBEDTLS_PSA_ACCEL_&/g' )
2521    # These hashes are needed for some RSA-PSS signature tests.
2522    loc_accel_flags="$loc_accel_flags -DLIBTESTDRIVER1_MBEDTLS_PSA_ACCEL_ALG_SHA_1"
2523    loc_accel_flags="$loc_accel_flags -DLIBTESTDRIVER1_MBEDTLS_PSA_ACCEL_ALG_SHA_224"
2524    loc_accel_flags="$loc_accel_flags -DLIBTESTDRIVER1_MBEDTLS_PSA_ACCEL_ALG_SHA_256"
2525    loc_accel_flags="$loc_accel_flags -DLIBTESTDRIVER1_MBEDTLS_PSA_ACCEL_ALG_SHA_384"
2526    loc_accel_flags="$loc_accel_flags -DLIBTESTDRIVER1_MBEDTLS_PSA_ACCEL_ALG_SHA_512"
2527    make -C tests libtestdriver1.a CFLAGS="$ASAN_CFLAGS $loc_accel_flags" LDFLAGS="$ASAN_CFLAGS"
2528
2529    # Mbed TLS library build
2530    scripts/config.py set MBEDTLS_PSA_CRYPTO_DRIVERS
2531    scripts/config.py set MBEDTLS_PSA_CRYPTO_CONFIG
2532
2533    # Remove RSA support and its dependencies
2534    scripts/config.py unset MBEDTLS_PKCS1_V15
2535    scripts/config.py unset MBEDTLS_PKCS1_V21
2536    scripts/config.py unset MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED
2537    scripts/config.py unset MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED
2538    scripts/config.py unset MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED
2539    scripts/config.py unset MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED
2540    scripts/config.py unset MBEDTLS_KEY_EXCHANGE_RSA_ENABLED
2541    scripts/config.py unset MBEDTLS_RSA_C
2542    scripts/config.py unset MBEDTLS_X509_RSASSA_PSS_SUPPORT
2543
2544    scripts/config.py unset MBEDTLS_MD5_C
2545    scripts/config.py unset MBEDTLS_RIPEMD160_C
2546    scripts/config.py unset MBEDTLS_SSL_PROTO_TLS1
2547    scripts/config.py unset MBEDTLS_SSL_PROTO_TLS1_1
2548    scripts/config.py unset MBEDTLS_SSL_CBC_RECORD_SPLITTING
2549
2550    loc_accel_flags="$loc_accel_flags $( echo "$loc_accel_list" | sed 's/[^ ]* */-DMBEDTLS_PSA_ACCEL_&/g' )"
2551    make CFLAGS="$ASAN_CFLAGS -Werror -I../tests/include -I../tests -I../../tests -DPSA_CRYPTO_DRIVER_TEST -DMBEDTLS_TEST_LIBTESTDRIVER1 $loc_accel_flags" LDFLAGS="-ltestdriver1 $ASAN_CFLAGS"
2552
2553    not grep mbedtls_rsa_rsassa_pkcs1_v15_sign library/rsa.o
2554    not grep mbedtls_rsa_rsassa_pss_sign_ext library/rsa.o
2555
2556    msg "test: MBEDTLS_PSA_CRYPTO_CONFIG with accelerated RSA signature"
2557    make test
2558}
2559
2560component_test_psa_crypto_config_accel_hash () {
2561    msg "test: MBEDTLS_PSA_CRYPTO_CONFIG with accelerated hash"
2562
2563    # Disable ALG_STREAM_CIPHER and ALG_ECB_NO_PADDING to avoid having
2564    # partial support for cipher operations in the driver test library.
2565    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_STREAM_CIPHER
2566    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_ECB_NO_PADDING
2567
2568    loc_accel_list="ALG_MD5 ALG_RIPEMD160 ALG_SHA_1 ALG_SHA_224 ALG_SHA_256 ALG_SHA_384 ALG_SHA_512"
2569    loc_accel_flags=$( echo "$loc_accel_list" | sed 's/[^ ]* */-DLIBTESTDRIVER1_MBEDTLS_PSA_ACCEL_&/g' )
2570    make -C tests libtestdriver1.a CFLAGS="$ASAN_CFLAGS $loc_accel_flags" LDFLAGS="$ASAN_CFLAGS"
2571
2572    scripts/config.py set MBEDTLS_PSA_CRYPTO_DRIVERS
2573    scripts/config.py set MBEDTLS_PSA_CRYPTO_CONFIG
2574    scripts/config.py unset MBEDTLS_MD5_C
2575    scripts/config.py unset MBEDTLS_RIPEMD160_C
2576    scripts/config.py unset MBEDTLS_SHA1_C
2577    # Don't unset MBEDTLS_SHA256_C as it is needed by PSA crypto core.
2578    scripts/config.py unset MBEDTLS_SHA384_C
2579    scripts/config.py unset MBEDTLS_SHA512_C
2580    loc_accel_flags="$loc_accel_flags $( echo "$loc_accel_list" | sed 's/[^ ]* */-DMBEDTLS_PSA_ACCEL_&/g' )"
2581    make CFLAGS="$ASAN_CFLAGS -Werror -I../tests/include -I../tests -I../../tests -DPSA_CRYPTO_DRIVER_TEST -DMBEDTLS_TEST_LIBTESTDRIVER1 $loc_accel_flags" LDFLAGS="-ltestdriver1 $ASAN_CFLAGS"
2582
2583    not grep mbedtls_sha512_init library/sha512.o
2584    not grep mbedtls_sha1_init library/sha1.o
2585
2586    msg "test: MBEDTLS_PSA_CRYPTO_CONFIG with accelerated hash"
2587    make test
2588}
2589
2590component_test_psa_crypto_config_accel_hash_keep_builtins () {
2591    msg "test: MBEDTLS_PSA_CRYPTO_CONFIG with accelerated+builtin hash"
2592    # This component ensures that all the test cases for
2593    # md_psa_dynamic_dispatch with legacy+driver in test_suite_md are run.
2594
2595    # Disable ALG_STREAM_CIPHER and ALG_ECB_NO_PADDING to avoid having
2596    # partial support for cipher operations in the driver test library.
2597    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_STREAM_CIPHER
2598    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_ECB_NO_PADDING
2599
2600    loc_accel_list="ALG_MD5 ALG_RIPEMD160 ALG_SHA_1 ALG_SHA_224 ALG_SHA_256 ALG_SHA_384 ALG_SHA_512"
2601    loc_accel_flags=$( echo "$loc_accel_list" | sed 's/[^ ]* */-DLIBTESTDRIVER1_MBEDTLS_PSA_ACCEL_&/g' )
2602    make -C tests libtestdriver1.a CFLAGS="$ASAN_CFLAGS $loc_accel_flags" LDFLAGS="$ASAN_CFLAGS"
2603
2604    scripts/config.py set MBEDTLS_PSA_CRYPTO_DRIVERS
2605    scripts/config.py set MBEDTLS_PSA_CRYPTO_CONFIG
2606    loc_accel_flags="$loc_accel_flags $( echo "$loc_accel_list" | sed 's/[^ ]* */-DMBEDTLS_PSA_ACCEL_&/g' )"
2607    make CFLAGS="$ASAN_CFLAGS -Werror -I../tests/include -I../tests -I../../tests -DPSA_CRYPTO_DRIVER_TEST -DMBEDTLS_TEST_LIBTESTDRIVER1 $loc_accel_flags" LDFLAGS="-ltestdriver1 $ASAN_CFLAGS"
2608
2609    msg "test: MBEDTLS_PSA_CRYPTO_CONFIG with accelerated+builtin hash"
2610    make test
2611}
2612
2613# Auxiliary function to build config for hashes with and without drivers
2614config_psa_crypto_hash_use_psa () {
2615    DRIVER_ONLY="$1"
2616    # start with config full for maximum coverage (also enables USE_PSA)
2617    scripts/config.py full
2618    # enable support for drivers and configuring PSA-only algorithms
2619    scripts/config.py set MBEDTLS_PSA_CRYPTO_CONFIG
2620    scripts/config.py set MBEDTLS_PSA_CRYPTO_DRIVERS
2621    if [ "$DRIVER_ONLY" -eq 1 ]; then
2622        # disable the built-in implementation of hashes
2623        scripts/config.py unset MBEDTLS_MD5_C
2624        scripts/config.py unset MBEDTLS_RIPEMD160_C
2625        scripts/config.py unset MBEDTLS_SHA1_C
2626        scripts/config.py unset MBEDTLS_SHA224_C
2627        scripts/config.py unset MBEDTLS_SHA256_C # see external RNG below
2628        scripts/config.py unset MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT
2629        scripts/config.py unset MBEDTLS_SHA384_C
2630        scripts/config.py unset MBEDTLS_SHA512_C
2631        scripts/config.py unset MBEDTLS_SHA512_USE_A64_CRYPTO_IF_PRESENT
2632    fi
2633    # Use an external RNG as currently internal RNGs depend on entropy.c
2634    # which in turn hard-depends on SHA256_C (or SHA512_C).
2635    # See component_test_psa_external_rng_no_drbg_use_psa.
2636    scripts/config.py set MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG
2637    scripts/config.py unset MBEDTLS_ENTROPY_C
2638    scripts/config.py unset MBEDTLS_ENTROPY_NV_SEED # depends on ENTROPY_C
2639    scripts/config.py unset MBEDTLS_PLATFORM_NV_SEED_ALT # depends on former
2640    # Also unset MD_C and things that depend on it.
2641    if [ "$DRIVER_ONLY" -eq 1 ]; then
2642        scripts/config.py unset MBEDTLS_MD_C
2643    fi
2644    scripts/config.py unset MBEDTLS_HKDF_C # has independent PSA implementation
2645    scripts/config.py unset MBEDTLS_HMAC_DRBG_C
2646    scripts/config.py unset MBEDTLS_PKCS7_C
2647    scripts/config.py unset MBEDTLS_ECDSA_DETERMINISTIC
2648    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_DETERMINISTIC_ECDSA
2649
2650    # Dynamic secure element support is a deprecated feature and needs to be disabled here.
2651    # This is done to have the same form of psa_key_attributes_s for libdriver and library.
2652    scripts/config.py unset MBEDTLS_PSA_CRYPTO_SE_C
2653}
2654
2655# Note that component_test_psa_crypto_config_reference_hash_use_psa
2656# is related to this component and both components need to be kept in sync.
2657# For details please see comments for component_test_psa_crypto_config_reference_hash_use_psa.
2658component_test_psa_crypto_config_accel_hash_use_psa () {
2659    msg "test: MBEDTLS_PSA_CRYPTO_CONFIG with accelerated hash and USE_PSA"
2660
2661    # Disable ALG_STREAM_CIPHER and ALG_ECB_NO_PADDING to avoid having
2662    # partial support for cipher operations in the driver test library.
2663    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_STREAM_CIPHER
2664    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_ECB_NO_PADDING
2665
2666    loc_accel_list="ALG_MD5 ALG_RIPEMD160 ALG_SHA_1 ALG_SHA_224 ALG_SHA_256 ALG_SHA_384 ALG_SHA_512"
2667    loc_accel_flags=$( echo "$loc_accel_list" | sed 's/[^ ]* */-DLIBTESTDRIVER1_MBEDTLS_PSA_ACCEL_&/g' )
2668    make -C tests libtestdriver1.a CFLAGS="$ASAN_CFLAGS $loc_accel_flags" LDFLAGS="$ASAN_CFLAGS"
2669
2670    config_psa_crypto_hash_use_psa 1
2671
2672    loc_accel_flags="$loc_accel_flags $( echo "$loc_accel_list" | sed 's/[^ ]* */-DMBEDTLS_PSA_ACCEL_&/g' )"
2673    make CFLAGS="$ASAN_CFLAGS -Werror -I../tests/include -I../tests -I../../tests -DPSA_CRYPTO_DRIVER_TEST -DMBEDTLS_TEST_LIBTESTDRIVER1 $loc_accel_flags" LDFLAGS="-ltestdriver1 $ASAN_CFLAGS" all
2674
2675    # There's a risk of something getting re-enabled via config_psa.h;
2676    # make sure it did not happen. Note: it's OK for MD_LIGHT to be enabled,
2677    # but not the full MD_C (for now), so check mbedtls_md_hmac for that.
2678    not grep mbedtls_md_hmac library/md.o
2679    not grep mbedtls_md5 library/md5.o
2680    not grep mbedtls_sha1 library/sha1.o
2681    not grep mbedtls_sha256 library/sha256.o
2682    not grep mbedtls_sha512 library/sha512.o
2683    not grep mbedtls_ripemd160 library/ripemd160.o
2684
2685    msg "test: MBEDTLS_PSA_CRYPTO_CONFIG with accelerated hash and USE_PSA"
2686    make test
2687
2688    # This is mostly useful so that we can later compare outcome files with
2689    # the reference config in analyze_outcomes.py, to check that the
2690    # dependency declarations in ssl-opt.sh and in TLS code are correct.
2691    msg "test: ssl-opt.sh, MBEDTLS_PSA_CRYPTO_CONFIG with accelerated hash and USE_PSA"
2692    tests/ssl-opt.sh
2693
2694    # This is to make sure all ciphersuites are exercised, but we don't need
2695    # interop testing (besides, we already got some from ssl-opt.sh).
2696    msg "test: compat.sh, MBEDTLS_PSA_CRYPTO_CONFIG with accelerated hash and USE_PSA"
2697    tests/compat.sh -p mbedTLS -V YES
2698}
2699
2700# This component provides reference configuration for test_psa_crypto_config_accel_hash_use_psa
2701# without accelerated hash. The outcome from both components are used by the analyze_outcomes.py
2702# script to find regression in test coverage when accelerated hash is used (tests and ssl-opt).
2703# Both components need to be kept in sync.
2704component_test_psa_crypto_config_reference_hash_use_psa() {
2705    msg "test: MBEDTLS_PSA_CRYPTO_CONFIG without accelerated hash and USE_PSA"
2706
2707    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_STREAM_CIPHER
2708    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_ECB_NO_PADDING
2709
2710    config_psa_crypto_hash_use_psa 0
2711
2712    make
2713
2714    msg "test: MBEDTLS_PSA_CRYPTO_CONFIG without accelerated hash and USE_PSA"
2715    make test
2716
2717    msg "test: ssl-opt.sh, MBEDTLS_PSA_CRYPTO_CONFIG without accelerated hash and USE_PSA"
2718    tests/ssl-opt.sh
2719}
2720
2721component_test_psa_crypto_config_accel_cipher () {
2722    msg "test: MBEDTLS_PSA_CRYPTO_CONFIG with accelerated cipher"
2723
2724    loc_accel_list="ALG_CBC_NO_PADDING ALG_CBC_PKCS7 ALG_CTR ALG_CFB ALG_OFB ALG_XTS KEY_TYPE_DES"
2725    loc_accel_flags=$( echo "$loc_accel_list" | sed 's/[^ ]* */-DLIBTESTDRIVER1_MBEDTLS_PSA_ACCEL_&/g' )
2726    make -C tests libtestdriver1.a CFLAGS="$ASAN_CFLAGS $loc_accel_flags" LDFLAGS="$ASAN_CFLAGS"
2727
2728    scripts/config.py set MBEDTLS_PSA_CRYPTO_DRIVERS
2729    scripts/config.py set MBEDTLS_PSA_CRYPTO_CONFIG
2730
2731    # There is no intended accelerator support for ALG STREAM_CIPHER and
2732    # ALG_ECB_NO_PADDING. Therefore, asking for them in the build implies the
2733    # inclusion of the Mbed TLS cipher operations. As we want to test here with
2734    # cipher operations solely supported by accelerators, disabled those
2735    # PSA configuration options.
2736    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_STREAM_CIPHER
2737    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_ECB_NO_PADDING
2738    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_CMAC
2739
2740    scripts/config.py unset MBEDTLS_CIPHER_MODE_CBC
2741    scripts/config.py unset MBEDTLS_CIPHER_PADDING_PKCS7
2742    scripts/config.py unset MBEDTLS_CIPHER_MODE_CTR
2743    scripts/config.py unset MBEDTLS_CIPHER_MODE_CFB
2744    scripts/config.py unset MBEDTLS_CIPHER_MODE_OFB
2745    scripts/config.py unset MBEDTLS_CIPHER_MODE_XTS
2746    scripts/config.py unset MBEDTLS_DES_C
2747
2748    loc_accel_flags="$loc_accel_flags $( echo "$loc_accel_list" | sed 's/[^ ]* */-DMBEDTLS_PSA_ACCEL_&/g' )"
2749    make CFLAGS="$ASAN_CFLAGS -Werror -I../tests/include -I../tests -I../../tests -DPSA_CRYPTO_DRIVER_TEST -DMBEDTLS_TEST_LIBTESTDRIVER1 $loc_accel_flags" LDFLAGS="-ltestdriver1 $ASAN_CFLAGS"
2750
2751    not grep mbedtls_des* library/des.o
2752
2753    msg "test: MBEDTLS_PSA_CRYPTO_CONFIG with accelerated cipher"
2754    make test
2755}
2756
2757component_test_psa_crypto_config_accel_aead () {
2758    msg "test: MBEDTLS_PSA_CRYPTO_CONFIG with accelerated AEAD"
2759
2760    # Disable ALG_STREAM_CIPHER and ALG_ECB_NO_PADDING to avoid having
2761    # partial support for cipher operations in the driver test library.
2762    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_STREAM_CIPHER
2763    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_ECB_NO_PADDING
2764
2765    loc_accel_list="ALG_GCM ALG_CCM ALG_CHACHA20_POLY1305 KEY_TYPE_AES KEY_TYPE_CHACHA20 KEY_TYPE_ARIA KEY_TYPE_CAMELLIA"
2766    loc_accel_flags=$( echo "$loc_accel_list" | sed 's/[^ ]* */-DLIBTESTDRIVER1_MBEDTLS_PSA_ACCEL_&/g' )
2767    make -C tests libtestdriver1.a CFLAGS="$ASAN_CFLAGS $loc_accel_flags" LDFLAGS="$ASAN_CFLAGS"
2768
2769    scripts/config.py set MBEDTLS_PSA_CRYPTO_DRIVERS
2770    scripts/config.py set MBEDTLS_PSA_CRYPTO_CONFIG
2771
2772    scripts/config.py unset MBEDTLS_GCM_C
2773    scripts/config.py unset MBEDTLS_CCM_C
2774    scripts/config.py unset MBEDTLS_CHACHAPOLY_C
2775    # Features that depend on AEAD
2776    scripts/config.py unset MBEDTLS_SSL_CONTEXT_SERIALIZATION
2777    scripts/config.py unset MBEDTLS_SSL_TICKET_C
2778
2779    loc_accel_flags="$loc_accel_flags $( echo "$loc_accel_list" | sed 's/[^ ]* */-DMBEDTLS_PSA_ACCEL_&/g' )"
2780    make CFLAGS="$ASAN_CFLAGS -Werror -I../tests/include -I../tests -I../../tests -DPSA_CRYPTO_DRIVER_TEST -DMBEDTLS_TEST_LIBTESTDRIVER1 $loc_accel_flags" LDFLAGS="-ltestdriver1 $ASAN_CFLAGS"
2781
2782    # There's a risk of something getting re-enabled via config_psa.h
2783    # make sure it did not happen.
2784    not grep mbedtls_ccm library/ccm.o
2785    not grep mbedtls_gcm library/gcm.o
2786    not grep mbedtls_chachapoly library/chachapoly.o
2787
2788    msg "test: MBEDTLS_PSA_CRYPTO_CONFIG with accelerated AEAD"
2789    make test
2790}
2791
2792component_test_psa_crypto_config_accel_pake() {
2793    msg "test: MBEDTLS_PSA_CRYPTO_CONFIG with accelerated PAKE"
2794
2795    # Start with full
2796    scripts/config.py full
2797
2798    # Disable ALG_STREAM_CIPHER and ALG_ECB_NO_PADDING to avoid having
2799    # partial support for cipher operations in the driver test library.
2800    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_STREAM_CIPHER
2801    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_ECB_NO_PADDING
2802
2803    loc_accel_list="ALG_JPAKE"
2804    loc_accel_flags=$( echo "$loc_accel_list" | sed 's/[^ ]* */-DLIBTESTDRIVER1_MBEDTLS_PSA_ACCEL_&/g' )
2805    make -C tests libtestdriver1.a CFLAGS="$ASAN_CFLAGS $loc_accel_flags" LDFLAGS="$ASAN_CFLAGS"
2806
2807    scripts/config.py set MBEDTLS_PSA_CRYPTO_DRIVERS
2808    scripts/config.py set MBEDTLS_PSA_CRYPTO_CONFIG
2809
2810    # Make build-in fallback not available
2811    scripts/config.py unset MBEDTLS_ECJPAKE_C
2812    scripts/config.py unset MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED
2813
2814    # Dynamic secure element support is a deprecated feature and needs to be disabled here.
2815    # This is done to have the same form of psa_key_attributes_s for libdriver and library.
2816    scripts/config.py unset MBEDTLS_PSA_CRYPTO_SE_C
2817
2818    loc_accel_flags="$loc_accel_flags $( echo "$loc_accel_list" | sed 's/[^ ]* */-DMBEDTLS_PSA_ACCEL_&/g' )"
2819    make CFLAGS="$ASAN_CFLAGS -Werror -I../tests/include -I../tests -I../../tests -DPSA_CRYPTO_DRIVER_TEST -DMBEDTLS_TEST_LIBTESTDRIVER1 $loc_accel_flags" LDFLAGS="-ltestdriver1 $ASAN_CFLAGS"
2820
2821    not grep mbedtls_ecjpake_init library/ecjpake.o
2822
2823    msg "test: MBEDTLS_PSA_CRYPTO_CONFIG with accelerated PAKE"
2824    make test
2825}
2826
2827component_test_psa_crypto_config_no_driver() {
2828    # full plus MBEDTLS_PSA_CRYPTO_CONFIG
2829    msg "build: full + MBEDTLS_PSA_CRYPTO_CONFIG minus MBEDTLS_PSA_CRYPTO_DRIVERS"
2830    scripts/config.py full
2831    scripts/config.py set MBEDTLS_PSA_CRYPTO_CONFIG
2832    scripts/config.py unset MBEDTLS_PSA_CRYPTO_DRIVERS
2833    scripts/config.py unset MBEDTLS_USE_PSA_CRYPTO
2834    scripts/config.py unset MBEDTLS_SSL_PROTO_TLS1_3
2835    make CC=gcc CFLAGS="$ASAN_CFLAGS -O2" LDFLAGS="$ASAN_CFLAGS"
2836
2837    msg "test: full + MBEDTLS_PSA_CRYPTO_CONFIG minus MBEDTLS_PSA_CRYPTO_DRIVERS"
2838    make test
2839}
2840
2841component_test_psa_crypto_config_chachapoly_disabled() {
2842    # full minus MBEDTLS_CHACHAPOLY_C without PSA_WANT_ALG_GCM and PSA_WANT_ALG_CHACHA20_POLY1305
2843    msg "build: full minus MBEDTLS_CHACHAPOLY_C without PSA_WANT_ALG_GCM and PSA_WANT_ALG_CHACHA20_POLY1305"
2844    scripts/config.py full
2845    scripts/config.py unset MBEDTLS_CHACHAPOLY_C
2846    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_GCM
2847    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_CHACHA20_POLY1305
2848    make CC=gcc CFLAGS="$ASAN_CFLAGS -O2" LDFLAGS="$ASAN_CFLAGS"
2849
2850    msg "test: full minus MBEDTLS_CHACHAPOLY_C without PSA_WANT_ALG_GCM and PSA_WANT_ALG_CHACHA20_POLY1305"
2851    make test
2852}
2853
2854# This should be renamed to test and updated once the accelerator ECDH code is in place and ready to test.
2855component_build_psa_accel_alg_ecdh() {
2856    # full plus MBEDTLS_PSA_CRYPTO_CONFIG with PSA_WANT_ALG_ECDH
2857    # without MBEDTLS_ECDH_C
2858    msg "build: full + MBEDTLS_PSA_CRYPTO_CONFIG + PSA_WANT_ALG_ECDH without MBEDTLS_ECDH_C"
2859    scripts/config.py full
2860    scripts/config.py set MBEDTLS_PSA_CRYPTO_CONFIG
2861    scripts/config.py set MBEDTLS_PSA_CRYPTO_DRIVERS
2862    scripts/config.py unset MBEDTLS_USE_PSA_CRYPTO
2863    scripts/config.py unset MBEDTLS_SSL_PROTO_TLS1_3
2864    scripts/config.py unset MBEDTLS_ECDH_C
2865    scripts/config.py unset MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED
2866    scripts/config.py unset MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED
2867    scripts/config.py unset MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED
2868    scripts/config.py unset MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED
2869    scripts/config.py unset MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED
2870    # Need to define the correct symbol and include the test driver header path in order to build with the test driver
2871    make CC=gcc CFLAGS="$ASAN_CFLAGS -DPSA_CRYPTO_DRIVER_TEST -DMBEDTLS_PSA_ACCEL_ALG_ECDH -I../tests/include -O2" LDFLAGS="$ASAN_CFLAGS"
2872}
2873
2874# This should be renamed to test and updated once the accelerator ECC key pair code is in place and ready to test.
2875component_build_psa_accel_key_type_ecc_key_pair() {
2876    # full plus MBEDTLS_PSA_CRYPTO_CONFIG with PSA_WANT_KEY_TYPE_ECC_KEY_PAIR
2877    msg "build: full + MBEDTLS_PSA_CRYPTO_CONFIG + PSA_WANT_KEY_TYPE_ECC_KEY_PAIR"
2878    scripts/config.py full
2879    scripts/config.py set MBEDTLS_PSA_CRYPTO_CONFIG
2880    scripts/config.py set MBEDTLS_PSA_CRYPTO_DRIVERS
2881    scripts/config.py unset MBEDTLS_USE_PSA_CRYPTO
2882    scripts/config.py unset MBEDTLS_SSL_PROTO_TLS1_3
2883    scripts/config.py -f include/psa/crypto_config.h set PSA_WANT_KEY_TYPE_ECC_KEY_PAIR 1
2884    scripts/config.py -f include/psa/crypto_config.h set PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY 1
2885    # Need to define the correct symbol and include the test driver header path in order to build with the test driver
2886    make CC=gcc CFLAGS="$ASAN_CFLAGS -DPSA_CRYPTO_DRIVER_TEST -DMBEDTLS_PSA_ACCEL_KEY_TYPE_ECC_KEY_PAIR -I../tests/include -O2" LDFLAGS="$ASAN_CFLAGS"
2887}
2888
2889# This should be renamed to test and updated once the accelerator ECC public key code is in place and ready to test.
2890component_build_psa_accel_key_type_ecc_public_key() {
2891    # full plus MBEDTLS_PSA_CRYPTO_CONFIG with PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY
2892    msg "build: full + MBEDTLS_PSA_CRYPTO_CONFIG + PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY"
2893    scripts/config.py full
2894    scripts/config.py set MBEDTLS_PSA_CRYPTO_CONFIG
2895    scripts/config.py set MBEDTLS_PSA_CRYPTO_DRIVERS
2896    scripts/config.py unset MBEDTLS_USE_PSA_CRYPTO
2897    scripts/config.py unset MBEDTLS_SSL_PROTO_TLS1_3
2898    scripts/config.py -f include/psa/crypto_config.h set PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY 1
2899    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_KEY_TYPE_ECC_KEY_PAIR
2900    # Need to define the correct symbol and include the test driver header path in order to build with the test driver
2901    make CC=gcc CFLAGS="$ASAN_CFLAGS -DPSA_CRYPTO_DRIVER_TEST -DMBEDTLS_PSA_ACCEL_KEY_TYPE_ECC_PUBLIC_KEY -I../tests/include -O2" LDFLAGS="$ASAN_CFLAGS"
2902}
2903
2904# This should be renamed to test and updated once the accelerator HMAC code is in place and ready to test.
2905component_build_psa_accel_alg_hmac() {
2906    # full plus MBEDTLS_PSA_CRYPTO_CONFIG with PSA_WANT_ALG_HMAC
2907    msg "build: full + MBEDTLS_PSA_CRYPTO_CONFIG + PSA_WANT_ALG_HMAC"
2908    scripts/config.py full
2909    scripts/config.py set MBEDTLS_PSA_CRYPTO_CONFIG
2910    scripts/config.py set MBEDTLS_PSA_CRYPTO_DRIVERS
2911    scripts/config.py unset MBEDTLS_USE_PSA_CRYPTO
2912    scripts/config.py unset MBEDTLS_SSL_PROTO_TLS1_3
2913    # Need to define the correct symbol and include the test driver header path in order to build with the test driver
2914    make CC=gcc CFLAGS="$ASAN_CFLAGS -DPSA_CRYPTO_DRIVER_TEST -DMBEDTLS_PSA_ACCEL_ALG_HMAC -I../tests/include -O2" LDFLAGS="$ASAN_CFLAGS"
2915}
2916
2917# This should be renamed to test and updated once the accelerator HKDF code is in place and ready to test.
2918component_build_psa_accel_alg_hkdf() {
2919    # full plus MBEDTLS_PSA_CRYPTO_CONFIG with PSA_WANT_ALG_HKDF
2920    # without MBEDTLS_HKDF_C
2921    msg "build: full + MBEDTLS_PSA_CRYPTO_CONFIG + PSA_WANT_ALG_HKDF without MBEDTLS_HKDF_C"
2922    scripts/config.py full
2923    scripts/config.py set MBEDTLS_PSA_CRYPTO_CONFIG
2924    scripts/config.py set MBEDTLS_PSA_CRYPTO_DRIVERS
2925    scripts/config.py unset MBEDTLS_USE_PSA_CRYPTO
2926    scripts/config.py unset MBEDTLS_SSL_PROTO_TLS1_3
2927    scripts/config.py unset MBEDTLS_HKDF_C
2928    # Make sure to unset TLS1_3 since it requires HKDF_C and will not build properly without it.
2929    scripts/config.py unset MBEDTLS_SSL_PROTO_TLS1_3
2930    # Need to define the correct symbol and include the test driver header path in order to build with the test driver
2931    make CC=gcc CFLAGS="$ASAN_CFLAGS -DPSA_CRYPTO_DRIVER_TEST -DMBEDTLS_PSA_ACCEL_ALG_HKDF -I../tests/include -O2" LDFLAGS="$ASAN_CFLAGS"
2932}
2933
2934# This should be renamed to test and updated once the accelerator MD5 code is in place and ready to test.
2935component_build_psa_accel_alg_md5() {
2936    # full plus MBEDTLS_PSA_CRYPTO_CONFIG with PSA_WANT_ALG_MD5 without other hashes
2937    msg "build: full + MBEDTLS_PSA_CRYPTO_CONFIG + PSA_WANT_ALG_MD5 - other hashes"
2938    scripts/config.py full
2939    scripts/config.py set MBEDTLS_PSA_CRYPTO_CONFIG
2940    scripts/config.py set MBEDTLS_PSA_CRYPTO_DRIVERS
2941    scripts/config.py unset MBEDTLS_USE_PSA_CRYPTO
2942    scripts/config.py unset MBEDTLS_SSL_PROTO_TLS1_3
2943    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_RIPEMD160
2944    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_SHA_1
2945    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_SHA_224
2946    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_SHA_256
2947    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_SHA_384
2948    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_SHA_512
2949    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_TLS12_ECJPAKE_TO_PMS
2950    scripts/config.py unset MBEDTLS_LMS_C
2951    scripts/config.py unset MBEDTLS_LMS_PRIVATE
2952    # Need to define the correct symbol and include the test driver header path in order to build with the test driver
2953    make CC=gcc CFLAGS="$ASAN_CFLAGS -DPSA_CRYPTO_DRIVER_TEST -DMBEDTLS_PSA_ACCEL_ALG_MD5 -I../tests/include -O2" LDFLAGS="$ASAN_CFLAGS"
2954}
2955
2956# This should be renamed to test and updated once the accelerator RIPEMD160 code is in place and ready to test.
2957component_build_psa_accel_alg_ripemd160() {
2958    # full plus MBEDTLS_PSA_CRYPTO_CONFIG with PSA_WANT_ALG_RIPEMD160 without other hashes
2959    msg "build: full + MBEDTLS_PSA_CRYPTO_CONFIG + PSA_WANT_ALG_RIPEMD160 - other hashes"
2960    scripts/config.py full
2961    scripts/config.py set MBEDTLS_PSA_CRYPTO_CONFIG
2962    scripts/config.py set MBEDTLS_PSA_CRYPTO_DRIVERS
2963    scripts/config.py unset MBEDTLS_USE_PSA_CRYPTO
2964    scripts/config.py unset MBEDTLS_SSL_PROTO_TLS1_3
2965    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_MD5
2966    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_SHA_1
2967    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_SHA_224
2968    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_SHA_256
2969    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_SHA_384
2970    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_SHA_512
2971    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_TLS12_ECJPAKE_TO_PMS
2972    scripts/config.py unset MBEDTLS_LMS_C
2973    scripts/config.py unset MBEDTLS_LMS_PRIVATE
2974    # Need to define the correct symbol and include the test driver header path in order to build with the test driver
2975    make CC=gcc CFLAGS="$ASAN_CFLAGS -DPSA_CRYPTO_DRIVER_TEST -DMBEDTLS_PSA_ACCEL_ALG_RIPEMD160 -I../tests/include -O2" LDFLAGS="$ASAN_CFLAGS"
2976}
2977
2978# This should be renamed to test and updated once the accelerator SHA1 code is in place and ready to test.
2979component_build_psa_accel_alg_sha1() {
2980    # full plus MBEDTLS_PSA_CRYPTO_CONFIG with PSA_WANT_ALG_SHA_1 without other hashes
2981    msg "build: full + MBEDTLS_PSA_CRYPTO_CONFIG + PSA_WANT_ALG_SHA_1 - other hashes"
2982    scripts/config.py full
2983    scripts/config.py set MBEDTLS_PSA_CRYPTO_CONFIG
2984    scripts/config.py set MBEDTLS_PSA_CRYPTO_DRIVERS
2985    scripts/config.py unset MBEDTLS_USE_PSA_CRYPTO
2986    scripts/config.py unset MBEDTLS_SSL_PROTO_TLS1_3
2987    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_MD5
2988    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_RIPEMD160
2989    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_SHA_224
2990    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_SHA_256
2991    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_SHA_384
2992    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_SHA_512
2993    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_TLS12_ECJPAKE_TO_PMS
2994    scripts/config.py unset MBEDTLS_LMS_C
2995    scripts/config.py unset MBEDTLS_LMS_PRIVATE
2996    # Need to define the correct symbol and include the test driver header path in order to build with the test driver
2997    make CC=gcc CFLAGS="$ASAN_CFLAGS -DPSA_CRYPTO_DRIVER_TEST -DMBEDTLS_PSA_ACCEL_ALG_SHA_1 -I../tests/include -O2" LDFLAGS="$ASAN_CFLAGS"
2998}
2999
3000# This should be renamed to test and updated once the accelerator SHA224 code is in place and ready to test.
3001component_build_psa_accel_alg_sha224() {
3002    # full plus MBEDTLS_PSA_CRYPTO_CONFIG with PSA_WANT_ALG_SHA_224 without other hashes
3003    msg "build: full + MBEDTLS_PSA_CRYPTO_CONFIG + PSA_WANT_ALG_SHA_224 - other hashes"
3004    scripts/config.py full
3005    scripts/config.py set MBEDTLS_PSA_CRYPTO_CONFIG
3006    scripts/config.py set MBEDTLS_PSA_CRYPTO_DRIVERS
3007    scripts/config.py unset MBEDTLS_USE_PSA_CRYPTO
3008    scripts/config.py unset MBEDTLS_SSL_PROTO_TLS1_3
3009    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_MD5
3010    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_RIPEMD160
3011    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_SHA_1
3012    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_SHA_384
3013    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_SHA_512
3014    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_TLS12_ECJPAKE_TO_PMS
3015    # Need to define the correct symbol and include the test driver header path in order to build with the test driver
3016    make CC=gcc CFLAGS="$ASAN_CFLAGS -DPSA_CRYPTO_DRIVER_TEST -DMBEDTLS_PSA_ACCEL_ALG_SHA_224 -I../tests/include -O2" LDFLAGS="$ASAN_CFLAGS"
3017}
3018
3019# This should be renamed to test and updated once the accelerator SHA256 code is in place and ready to test.
3020component_build_psa_accel_alg_sha256() {
3021    # full plus MBEDTLS_PSA_CRYPTO_CONFIG with PSA_WANT_ALG_SHA_256 without other hashes
3022    msg "build: full + MBEDTLS_PSA_CRYPTO_CONFIG + PSA_WANT_ALG_SHA_256 - other hashes"
3023    scripts/config.py full
3024    scripts/config.py set MBEDTLS_PSA_CRYPTO_CONFIG
3025    scripts/config.py set MBEDTLS_PSA_CRYPTO_DRIVERS
3026    scripts/config.py unset MBEDTLS_USE_PSA_CRYPTO
3027    scripts/config.py unset MBEDTLS_SSL_PROTO_TLS1_3
3028    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_MD5
3029    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_RIPEMD160
3030    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_SHA_1
3031    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_SHA_224
3032    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_SHA_384
3033    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_SHA_512
3034    # Need to define the correct symbol and include the test driver header path in order to build with the test driver
3035    make CC=gcc CFLAGS="$ASAN_CFLAGS -DPSA_CRYPTO_DRIVER_TEST -DMBEDTLS_PSA_ACCEL_ALG_SHA_256 -I../tests/include -O2" LDFLAGS="$ASAN_CFLAGS"
3036}
3037
3038# This should be renamed to test and updated once the accelerator SHA384 code is in place and ready to test.
3039component_build_psa_accel_alg_sha384() {
3040    # full plus MBEDTLS_PSA_CRYPTO_CONFIG with PSA_WANT_ALG_SHA_384 without other hashes
3041    msg "build: full + MBEDTLS_PSA_CRYPTO_CONFIG + PSA_WANT_ALG_SHA_384 - other hashes"
3042    scripts/config.py full
3043    scripts/config.py set MBEDTLS_PSA_CRYPTO_CONFIG
3044    scripts/config.py set MBEDTLS_PSA_CRYPTO_DRIVERS
3045    scripts/config.py unset MBEDTLS_USE_PSA_CRYPTO
3046    scripts/config.py unset MBEDTLS_SSL_PROTO_TLS1_3
3047    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_MD5
3048    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_RIPEMD160
3049    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_SHA_1
3050    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_SHA_224
3051    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_SHA_256
3052    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_TLS12_ECJPAKE_TO_PMS
3053    scripts/config.py unset MBEDTLS_LMS_C
3054    scripts/config.py unset MBEDTLS_LMS_PRIVATE
3055    # Need to define the correct symbol and include the test driver header path in order to build with the test driver
3056    make CC=gcc CFLAGS="$ASAN_CFLAGS -DPSA_CRYPTO_DRIVER_TEST -DMBEDTLS_PSA_ACCEL_ALG_SHA_384 -I../tests/include -O2" LDFLAGS="$ASAN_CFLAGS"
3057}
3058
3059# This should be renamed to test and updated once the accelerator SHA512 code is in place and ready to test.
3060component_build_psa_accel_alg_sha512() {
3061    # full plus MBEDTLS_PSA_CRYPTO_CONFIG with PSA_WANT_ALG_SHA_512 without other hashes
3062    msg "build: full + MBEDTLS_PSA_CRYPTO_CONFIG + PSA_WANT_ALG_SHA_512 - other hashes"
3063    scripts/config.py full
3064    scripts/config.py set MBEDTLS_PSA_CRYPTO_CONFIG
3065    scripts/config.py set MBEDTLS_PSA_CRYPTO_DRIVERS
3066    scripts/config.py unset MBEDTLS_USE_PSA_CRYPTO
3067    scripts/config.py unset MBEDTLS_SSL_PROTO_TLS1_3
3068    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_MD5
3069    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_RIPEMD160
3070    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_SHA_1
3071    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_SHA_224
3072    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_SHA_256
3073    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_SHA_384
3074    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_TLS12_ECJPAKE_TO_PMS
3075    scripts/config.py unset MBEDTLS_LMS_C
3076    scripts/config.py unset MBEDTLS_LMS_PRIVATE
3077    # Need to define the correct symbol and include the test driver header path in order to build with the test driver
3078    make CC=gcc CFLAGS="$ASAN_CFLAGS -DPSA_CRYPTO_DRIVER_TEST -DMBEDTLS_PSA_ACCEL_ALG_SHA_512 -I../tests/include -O2" LDFLAGS="$ASAN_CFLAGS"
3079}
3080
3081# This should be renamed to test and updated once the accelerator RSA code is in place and ready to test.
3082component_build_psa_accel_alg_rsa_pkcs1v15_crypt() {
3083    # full plus MBEDTLS_PSA_CRYPTO_CONFIG with PSA_WANT_ALG_RSA_PKCS1V15_CRYPT
3084    msg "build: full + MBEDTLS_PSA_CRYPTO_CONFIG + PSA_WANT_ALG_RSA_PKCS1V15_CRYPT + PSA_WANT_KEY_TYPE_RSA_PUBLIC_KEY"
3085    scripts/config.py full
3086    scripts/config.py set MBEDTLS_PSA_CRYPTO_CONFIG
3087    scripts/config.py set MBEDTLS_PSA_CRYPTO_DRIVERS
3088    scripts/config.py unset MBEDTLS_USE_PSA_CRYPTO
3089    scripts/config.py unset MBEDTLS_SSL_PROTO_TLS1_3
3090    scripts/config.py -f include/psa/crypto_config.h set PSA_WANT_ALG_RSA_PKCS1V15_CRYPT 1
3091    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_RSA_PKCS1V15_SIGN
3092    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_RSA_OAEP
3093    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_RSA_PSS
3094    # Need to define the correct symbol and include the test driver header path in order to build with the test driver
3095    make CC=gcc CFLAGS="$ASAN_CFLAGS -DPSA_CRYPTO_DRIVER_TEST -DMBEDTLS_PSA_ACCEL_ALG_RSA_PKCS1V15_CRYPT -I../tests/include -O2" LDFLAGS="$ASAN_CFLAGS"
3096}
3097
3098# This should be renamed to test and updated once the accelerator RSA code is in place and ready to test.
3099component_build_psa_accel_alg_rsa_pkcs1v15_sign() {
3100    # full plus MBEDTLS_PSA_CRYPTO_CONFIG with PSA_WANT_ALG_RSA_PKCS1V15_SIGN and PSA_WANT_KEY_TYPE_RSA_PUBLIC_KEY
3101    msg "build: full + MBEDTLS_PSA_CRYPTO_CONFIG + PSA_WANT_ALG_RSA_PKCS1V15_SIGN + PSA_WANT_KEY_TYPE_RSA_PUBLIC_KEY"
3102    scripts/config.py full
3103    scripts/config.py set MBEDTLS_PSA_CRYPTO_CONFIG
3104    scripts/config.py set MBEDTLS_PSA_CRYPTO_DRIVERS
3105    scripts/config.py unset MBEDTLS_USE_PSA_CRYPTO
3106    scripts/config.py unset MBEDTLS_SSL_PROTO_TLS1_3
3107    scripts/config.py -f include/psa/crypto_config.h set PSA_WANT_ALG_RSA_PKCS1V15_SIGN 1
3108    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_RSA_PKCS1V15_CRYPT
3109    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_RSA_OAEP
3110    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_RSA_PSS
3111    # Need to define the correct symbol and include the test driver header path in order to build with the test driver
3112    make CC=gcc CFLAGS="$ASAN_CFLAGS -DPSA_CRYPTO_DRIVER_TEST -DMBEDTLS_PSA_ACCEL_ALG_RSA_PKCS1V15_SIGN -I../tests/include -O2" LDFLAGS="$ASAN_CFLAGS"
3113}
3114
3115# This should be renamed to test and updated once the accelerator RSA code is in place and ready to test.
3116component_build_psa_accel_alg_rsa_oaep() {
3117    # full plus MBEDTLS_PSA_CRYPTO_CONFIG with PSA_WANT_ALG_RSA_OAEP and PSA_WANT_KEY_TYPE_RSA_PUBLIC_KEY
3118    msg "build: full + MBEDTLS_PSA_CRYPTO_CONFIG + PSA_WANT_ALG_RSA_OAEP + PSA_WANT_KEY_TYPE_RSA_PUBLIC_KEY"
3119    scripts/config.py full
3120    scripts/config.py set MBEDTLS_PSA_CRYPTO_CONFIG
3121    scripts/config.py set MBEDTLS_PSA_CRYPTO_DRIVERS
3122    scripts/config.py unset MBEDTLS_USE_PSA_CRYPTO
3123    scripts/config.py unset MBEDTLS_SSL_PROTO_TLS1_3
3124    scripts/config.py -f include/psa/crypto_config.h set PSA_WANT_ALG_RSA_OAEP 1
3125    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_RSA_PKCS1V15_CRYPT
3126    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_RSA_PKCS1V15_SIGN
3127    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_RSA_PSS
3128    # Need to define the correct symbol and include the test driver header path in order to build with the test driver
3129    make CC=gcc CFLAGS="$ASAN_CFLAGS -DPSA_CRYPTO_DRIVER_TEST -DMBEDTLS_PSA_ACCEL_ALG_RSA_OAEP -I../tests/include -O2" LDFLAGS="$ASAN_CFLAGS"
3130}
3131
3132# This should be renamed to test and updated once the accelerator RSA code is in place and ready to test.
3133component_build_psa_accel_alg_rsa_pss() {
3134    # full plus MBEDTLS_PSA_CRYPTO_CONFIG with PSA_WANT_ALG_RSA_PSS and PSA_WANT_KEY_TYPE_RSA_PUBLIC_KEY
3135    msg "build: full + MBEDTLS_PSA_CRYPTO_CONFIG + PSA_WANT_ALG_RSA_PSS + PSA_WANT_KEY_TYPE_RSA_PUBLIC_KEY"
3136    scripts/config.py full
3137    scripts/config.py set MBEDTLS_PSA_CRYPTO_CONFIG
3138    scripts/config.py set MBEDTLS_PSA_CRYPTO_DRIVERS
3139    scripts/config.py unset MBEDTLS_USE_PSA_CRYPTO
3140    scripts/config.py unset MBEDTLS_SSL_PROTO_TLS1_3
3141    scripts/config.py -f include/psa/crypto_config.h set PSA_WANT_ALG_RSA_PSS 1
3142    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_RSA_PKCS1V15_CRYPT
3143    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_RSA_PKCS1V15_SIGN
3144    scripts/config.py -f include/psa/crypto_config.h unset PSA_WANT_ALG_RSA_OAEP
3145    # Need to define the correct symbol and include the test driver header path in order to build with the test driver
3146    make CC=gcc CFLAGS="$ASAN_CFLAGS -DPSA_CRYPTO_DRIVER_TEST -DMBEDTLS_PSA_ACCEL_ALG_RSA_PSS -I../tests/include -O2" LDFLAGS="$ASAN_CFLAGS"
3147}
3148
3149# This should be renamed to test and updated once the accelerator RSA code is in place and ready to test.
3150component_build_psa_accel_key_type_rsa_key_pair() {
3151    # full plus MBEDTLS_PSA_CRYPTO_CONFIG with PSA_WANT_KEY_TYPE_RSA_KEY_PAIR and PSA_WANT_ALG_RSA_PSS
3152    msg "build: full + MBEDTLS_PSA_CRYPTO_CONFIG + PSA_WANT_KEY_TYPE_RSA_KEY_PAIR + PSA_WANT_ALG_RSA_PSS"
3153    scripts/config.py full
3154    scripts/config.py set MBEDTLS_PSA_CRYPTO_CONFIG
3155    scripts/config.py set MBEDTLS_PSA_CRYPTO_DRIVERS
3156    scripts/config.py unset MBEDTLS_USE_PSA_CRYPTO
3157    scripts/config.py unset MBEDTLS_SSL_PROTO_TLS1_3
3158    scripts/config.py -f include/psa/crypto_config.h set PSA_WANT_ALG_RSA_PSS 1
3159    scripts/config.py -f include/psa/crypto_config.h set PSA_WANT_KEY_TYPE_RSA_KEY_PAIR 1
3160    # Need to define the correct symbol and include the test driver header path in order to build with the test driver
3161    make CC=gcc CFLAGS="$ASAN_CFLAGS -DPSA_CRYPTO_DRIVER_TEST -DMBEDTLS_PSA_ACCEL_KEY_TYPE_RSA_KEY_PAIR -I../tests/include -O2" LDFLAGS="$ASAN_CFLAGS"
3162}
3163
3164# This should be renamed to test and updated once the accelerator RSA code is in place and ready to test.
3165component_build_psa_accel_key_type_rsa_public_key() {
3166    # full plus MBEDTLS_PSA_CRYPTO_CONFIG with PSA_WANT_KEY_TYPE_RSA_PUBLIC_KEY and PSA_WANT_ALG_RSA_PSS
3167    msg "build: full + MBEDTLS_PSA_CRYPTO_CONFIG + PSA_WANT_KEY_TYPE_RSA_PUBLIC_KEY + PSA_WANT_ALG_RSA_PSS"
3168    scripts/config.py full
3169    scripts/config.py set MBEDTLS_PSA_CRYPTO_CONFIG
3170    scripts/config.py set MBEDTLS_PSA_CRYPTO_DRIVERS
3171    scripts/config.py unset MBEDTLS_USE_PSA_CRYPTO
3172    scripts/config.py unset MBEDTLS_SSL_PROTO_TLS1_3
3173    scripts/config.py -f include/psa/crypto_config.h set PSA_WANT_ALG_RSA_PSS 1
3174    scripts/config.py -f include/psa/crypto_config.h set PSA_WANT_KEY_TYPE_RSA_PUBLIC_KEY 1
3175    # Need to define the correct symbol and include the test driver header path in order to build with the test driver
3176    make CC=gcc CFLAGS="$ASAN_CFLAGS -DPSA_CRYPTO_DRIVER_TEST -DMBEDTLS_PSA_ACCEL_KEY_TYPE_RSA_PUBLIC_KEY -I../tests/include -O2" LDFLAGS="$ASAN_CFLAGS"
3177}
3178
3179component_test_no_platform () {
3180    # Full configuration build, without platform support, file IO and net sockets.
3181    # This should catch missing mbedtls_printf definitions, and by disabling file
3182    # IO, it should catch missing '#include <stdio.h>'
3183    msg "build: full config except platform/fsio/net, make, gcc, C99" # ~ 30s
3184    scripts/config.py full
3185    scripts/config.py unset MBEDTLS_PLATFORM_C
3186    scripts/config.py unset MBEDTLS_NET_C
3187    scripts/config.py unset MBEDTLS_PLATFORM_MEMORY
3188    scripts/config.py unset MBEDTLS_PLATFORM_PRINTF_ALT
3189    scripts/config.py unset MBEDTLS_PLATFORM_FPRINTF_ALT
3190    scripts/config.py unset MBEDTLS_PLATFORM_SNPRINTF_ALT
3191    scripts/config.py unset MBEDTLS_PLATFORM_VSNPRINTF_ALT
3192    scripts/config.py unset MBEDTLS_PLATFORM_TIME_ALT
3193    scripts/config.py unset MBEDTLS_PLATFORM_EXIT_ALT
3194    scripts/config.py unset MBEDTLS_PLATFORM_SETBUF_ALT
3195    scripts/config.py unset MBEDTLS_PLATFORM_NV_SEED_ALT
3196    scripts/config.py unset MBEDTLS_ENTROPY_NV_SEED
3197    scripts/config.py unset MBEDTLS_FS_IO
3198    scripts/config.py unset MBEDTLS_PSA_CRYPTO_SE_C
3199    scripts/config.py unset MBEDTLS_PSA_CRYPTO_STORAGE_C
3200    scripts/config.py unset MBEDTLS_PSA_ITS_FILE_C
3201    # Note, _DEFAULT_SOURCE needs to be defined for platforms using glibc version >2.19,
3202    # to re-enable platform integration features otherwise disabled in C99 builds
3203    make CC=gcc CFLAGS='-Werror -Wall -Wextra -std=c99 -pedantic -Os -D_DEFAULT_SOURCE' lib programs
3204    make CC=gcc CFLAGS='-Werror -Wall -Wextra -Os' test
3205}
3206
3207component_build_no_std_function () {
3208    # catch compile bugs in _uninit functions
3209    msg "build: full config with NO_STD_FUNCTION, make, gcc" # ~ 30s
3210    scripts/config.py full
3211    scripts/config.py set MBEDTLS_PLATFORM_NO_STD_FUNCTIONS
3212    scripts/config.py unset MBEDTLS_ENTROPY_NV_SEED
3213    scripts/config.py unset MBEDTLS_PLATFORM_NV_SEED_ALT
3214    CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Check .
3215    make
3216}
3217
3218component_build_no_ssl_srv () {
3219    msg "build: full config except SSL server, make, gcc" # ~ 30s
3220    scripts/config.py full
3221    scripts/config.py unset MBEDTLS_SSL_SRV_C
3222    make CC=gcc CFLAGS='-Werror -Wall -Wextra -O1'
3223}
3224
3225component_build_no_ssl_cli () {
3226    msg "build: full config except SSL client, make, gcc" # ~ 30s
3227    scripts/config.py full
3228    scripts/config.py unset MBEDTLS_SSL_CLI_C
3229    make CC=gcc CFLAGS='-Werror -Wall -Wextra -O1'
3230}
3231
3232component_build_no_sockets () {
3233    # Note, C99 compliance can also be tested with the sockets support disabled,
3234    # as that requires a POSIX platform (which isn't the same as C99).
3235    msg "build: full config except net_sockets.c, make, gcc -std=c99 -pedantic" # ~ 30s
3236    scripts/config.py full
3237    scripts/config.py unset MBEDTLS_NET_C # getaddrinfo() undeclared, etc.
3238    scripts/config.py set MBEDTLS_NO_PLATFORM_ENTROPY # uses syscall() on GNU/Linux
3239    make CC=gcc CFLAGS='-Werror -Wall -Wextra -O1 -std=c99 -pedantic' lib
3240}
3241
3242component_test_memory_buffer_allocator_backtrace () {
3243    msg "build: default config with memory buffer allocator and backtrace enabled"
3244    scripts/config.py set MBEDTLS_MEMORY_BUFFER_ALLOC_C
3245    scripts/config.py set MBEDTLS_PLATFORM_MEMORY
3246    scripts/config.py set MBEDTLS_MEMORY_BACKTRACE
3247    scripts/config.py set MBEDTLS_MEMORY_DEBUG
3248    CC=gcc cmake -DCMAKE_BUILD_TYPE:String=Release .
3249    make
3250
3251    msg "test: MBEDTLS_MEMORY_BUFFER_ALLOC_C and MBEDTLS_MEMORY_BACKTRACE"
3252    make test
3253}
3254
3255component_test_memory_buffer_allocator () {
3256    msg "build: default config with memory buffer allocator"
3257    scripts/config.py set MBEDTLS_MEMORY_BUFFER_ALLOC_C
3258    scripts/config.py set MBEDTLS_PLATFORM_MEMORY
3259    CC=gcc cmake -DCMAKE_BUILD_TYPE:String=Release .
3260    make
3261
3262    msg "test: MBEDTLS_MEMORY_BUFFER_ALLOC_C"
3263    make test
3264
3265    msg "test: ssl-opt.sh, MBEDTLS_MEMORY_BUFFER_ALLOC_C"
3266    # MBEDTLS_MEMORY_BUFFER_ALLOC is slow. Skip tests that tend to time out.
3267    tests/ssl-opt.sh -e '^DTLS proxy'
3268}
3269
3270component_test_no_max_fragment_length () {
3271    # Run max fragment length tests with MFL disabled
3272    msg "build: default config except MFL extension (ASan build)" # ~ 30s
3273    scripts/config.py unset MBEDTLS_SSL_MAX_FRAGMENT_LENGTH
3274    CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
3275    make
3276
3277    msg "test: ssl-opt.sh, MFL-related tests"
3278    tests/ssl-opt.sh -f "Max fragment length"
3279}
3280
3281component_test_asan_remove_peer_certificate () {
3282    msg "build: default config with MBEDTLS_SSL_KEEP_PEER_CERTIFICATE disabled (ASan build)"
3283    scripts/config.py unset MBEDTLS_SSL_KEEP_PEER_CERTIFICATE
3284    CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
3285    make
3286
3287    msg "test: !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE"
3288    make test
3289
3290    msg "test: ssl-opt.sh, !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE"
3291    tests/ssl-opt.sh
3292
3293    msg "test: compat.sh, !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE"
3294    tests/compat.sh
3295
3296    msg "test: context-info.sh, !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE"
3297    tests/context-info.sh
3298}
3299
3300component_test_no_max_fragment_length_small_ssl_out_content_len () {
3301    msg "build: no MFL extension, small SSL_OUT_CONTENT_LEN (ASan build)"
3302    scripts/config.py unset MBEDTLS_SSL_MAX_FRAGMENT_LENGTH
3303    scripts/config.py set MBEDTLS_SSL_IN_CONTENT_LEN 16384
3304    scripts/config.py set MBEDTLS_SSL_OUT_CONTENT_LEN 4096
3305    CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
3306    make
3307
3308    msg "test: MFL tests (disabled MFL extension case) & large packet tests"
3309    tests/ssl-opt.sh -f "Max fragment length\|Large buffer"
3310
3311    msg "test: context-info.sh (disabled MFL extension case)"
3312    tests/context-info.sh
3313}
3314
3315component_test_variable_ssl_in_out_buffer_len () {
3316    msg "build: MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH enabled (ASan build)"
3317    scripts/config.py set MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH
3318    CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
3319    make
3320
3321    msg "test: MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH enabled"
3322    make test
3323
3324    msg "test: ssl-opt.sh, MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH enabled"
3325    tests/ssl-opt.sh
3326
3327    msg "test: compat.sh, MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH enabled"
3328    tests/compat.sh
3329}
3330
3331component_test_dtls_cid_legacy () {
3332    msg "build: MBEDTLS_SSL_DTLS_CONNECTION_ID (legacy) enabled (ASan build)"
3333    scripts/config.py set MBEDTLS_SSL_DTLS_CONNECTION_ID_COMPAT 1
3334
3335    CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
3336    make
3337
3338    msg "test: MBEDTLS_SSL_DTLS_CONNECTION_ID (legacy)"
3339    make test
3340
3341    msg "test: ssl-opt.sh, MBEDTLS_SSL_DTLS_CONNECTION_ID (legacy) enabled"
3342    tests/ssl-opt.sh
3343
3344    msg "test: compat.sh, MBEDTLS_SSL_DTLS_CONNECTION_ID (legacy) enabled"
3345    tests/compat.sh
3346}
3347
3348component_test_ssl_alloc_buffer_and_mfl () {
3349    msg "build: default config with memory buffer allocator and MFL extension"
3350    scripts/config.py set MBEDTLS_MEMORY_BUFFER_ALLOC_C
3351    scripts/config.py set MBEDTLS_PLATFORM_MEMORY
3352    scripts/config.py set MBEDTLS_MEMORY_DEBUG
3353    scripts/config.py set MBEDTLS_SSL_MAX_FRAGMENT_LENGTH
3354    scripts/config.py set MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH
3355    CC=gcc cmake -DCMAKE_BUILD_TYPE:String=Release .
3356    make
3357
3358    msg "test: MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH, MBEDTLS_MEMORY_BUFFER_ALLOC_C, MBEDTLS_MEMORY_DEBUG and MBEDTLS_SSL_MAX_FRAGMENT_LENGTH"
3359    make test
3360
3361    msg "test: MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH, MBEDTLS_MEMORY_BUFFER_ALLOC_C, MBEDTLS_MEMORY_DEBUG and MBEDTLS_SSL_MAX_FRAGMENT_LENGTH"
3362    tests/ssl-opt.sh -f "Handshake memory usage"
3363}
3364
3365component_test_when_no_ciphersuites_have_mac () {
3366    msg "build: when no ciphersuites have MAC"
3367    scripts/config.py unset MBEDTLS_CIPHER_NULL_CIPHER
3368    scripts/config.py unset MBEDTLS_CIPHER_MODE_CBC
3369    scripts/config.py unset MBEDTLS_CMAC_C
3370    make
3371
3372    msg "test: !MBEDTLS_SSL_SOME_MODES_USE_MAC"
3373    make test
3374
3375    msg "test ssl-opt.sh: !MBEDTLS_SSL_SOME_MODES_USE_MAC"
3376    tests/ssl-opt.sh -f 'Default\|EtM' -e 'without EtM'
3377}
3378
3379component_test_no_date_time () {
3380    msg "build: default config without MBEDTLS_HAVE_TIME_DATE"
3381    scripts/config.py unset MBEDTLS_HAVE_TIME_DATE
3382    CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Check .
3383    make
3384
3385    msg "test: !MBEDTLS_HAVE_TIME_DATE - main suites"
3386    make test
3387}
3388
3389component_test_platform_calloc_macro () {
3390    msg "build: MBEDTLS_PLATFORM_{CALLOC/FREE}_MACRO enabled (ASan build)"
3391    scripts/config.py set MBEDTLS_PLATFORM_MEMORY
3392    scripts/config.py set MBEDTLS_PLATFORM_CALLOC_MACRO calloc
3393    scripts/config.py set MBEDTLS_PLATFORM_FREE_MACRO   free
3394    CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
3395    make
3396
3397    msg "test: MBEDTLS_PLATFORM_{CALLOC/FREE}_MACRO enabled (ASan build)"
3398    make test
3399}
3400
3401component_test_malloc_0_null () {
3402    msg "build: malloc(0) returns NULL (ASan+UBSan build)"
3403    scripts/config.py full
3404    make CC=gcc CFLAGS="'-DMBEDTLS_CONFIG_FILE=\"$PWD/tests/configs/config-wrapper-malloc-0-null.h\"' $ASAN_CFLAGS -O" LDFLAGS="$ASAN_CFLAGS"
3405
3406    msg "test: malloc(0) returns NULL (ASan+UBSan build)"
3407    make test
3408
3409    msg "selftest: malloc(0) returns NULL (ASan+UBSan build)"
3410    # Just the calloc selftest. "make test" ran the others as part of the
3411    # test suites.
3412    programs/test/selftest calloc
3413
3414    msg "test ssl-opt.sh: malloc(0) returns NULL (ASan+UBSan build)"
3415    # Run a subset of the tests. The choice is a balance between coverage
3416    # and time (including time indirectly wasted due to flaky tests).
3417    # The current choice is to skip tests whose description includes
3418    # "proxy", which is an approximation of skipping tests that use the
3419    # UDP proxy, which tend to be slower and flakier.
3420    tests/ssl-opt.sh -e 'proxy'
3421}
3422
3423component_test_aes_fewer_tables () {
3424    msg "build: default config with AES_FEWER_TABLES enabled"
3425    scripts/config.py set MBEDTLS_AES_FEWER_TABLES
3426    make CC=gcc CFLAGS='-Werror -Wall -Wextra'
3427
3428    msg "test: AES_FEWER_TABLES"
3429    make test
3430}
3431
3432component_test_aes_rom_tables () {
3433    msg "build: default config with AES_ROM_TABLES enabled"
3434    scripts/config.py set MBEDTLS_AES_ROM_TABLES
3435    make CC=gcc CFLAGS='-Werror -Wall -Wextra'
3436
3437    msg "test: AES_ROM_TABLES"
3438    make test
3439}
3440
3441component_test_aes_fewer_tables_and_rom_tables () {
3442    msg "build: default config with AES_ROM_TABLES and AES_FEWER_TABLES enabled"
3443    scripts/config.py set MBEDTLS_AES_FEWER_TABLES
3444    scripts/config.py set MBEDTLS_AES_ROM_TABLES
3445    make CC=gcc CFLAGS='-Werror -Wall -Wextra'
3446
3447    msg "test: AES_FEWER_TABLES + AES_ROM_TABLES"
3448    make test
3449}
3450
3451component_test_ctr_drbg_aes_256_sha_256 () {
3452    msg "build: full + MBEDTLS_ENTROPY_FORCE_SHA256 (ASan build)"
3453    scripts/config.py full
3454    scripts/config.py unset MBEDTLS_MEMORY_BUFFER_ALLOC_C
3455    scripts/config.py set MBEDTLS_ENTROPY_FORCE_SHA256
3456    CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
3457    make
3458
3459    msg "test: full + MBEDTLS_ENTROPY_FORCE_SHA256 (ASan build)"
3460    make test
3461}
3462
3463component_test_ctr_drbg_aes_128_sha_512 () {
3464    msg "build: full + MBEDTLS_CTR_DRBG_USE_128_BIT_KEY (ASan build)"
3465    scripts/config.py full
3466    scripts/config.py unset MBEDTLS_MEMORY_BUFFER_ALLOC_C
3467    scripts/config.py set MBEDTLS_CTR_DRBG_USE_128_BIT_KEY
3468    CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
3469    make
3470
3471    msg "test: full + MBEDTLS_CTR_DRBG_USE_128_BIT_KEY (ASan build)"
3472    make test
3473}
3474
3475component_test_ctr_drbg_aes_128_sha_256 () {
3476    msg "build: full + MBEDTLS_CTR_DRBG_USE_128_BIT_KEY + MBEDTLS_ENTROPY_FORCE_SHA256 (ASan build)"
3477    scripts/config.py full
3478    scripts/config.py unset MBEDTLS_MEMORY_BUFFER_ALLOC_C
3479    scripts/config.py set MBEDTLS_CTR_DRBG_USE_128_BIT_KEY
3480    scripts/config.py set MBEDTLS_ENTROPY_FORCE_SHA256
3481    CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
3482    make
3483
3484    msg "test: full + MBEDTLS_CTR_DRBG_USE_128_BIT_KEY + MBEDTLS_ENTROPY_FORCE_SHA256 (ASan build)"
3485    make test
3486}
3487
3488component_test_se_default () {
3489    msg "build: default config + MBEDTLS_PSA_CRYPTO_SE_C"
3490    scripts/config.py set MBEDTLS_PSA_CRYPTO_SE_C
3491    make CC=clang CFLAGS="$ASAN_CFLAGS -Os" LDFLAGS="$ASAN_CFLAGS"
3492
3493    msg "test: default config + MBEDTLS_PSA_CRYPTO_SE_C"
3494    make test
3495}
3496
3497component_test_psa_crypto_drivers () {
3498    msg "build: MBEDTLS_PSA_CRYPTO_DRIVERS w/ driver hooks"
3499    scripts/config.py full
3500    scripts/config.py set MBEDTLS_PSA_CRYPTO_DRIVERS
3501    scripts/config.py set MBEDTLS_PSA_CRYPTO_BUILTIN_KEYS
3502    loc_cflags="$ASAN_CFLAGS -DPSA_CRYPTO_DRIVER_TEST_ALL"
3503    loc_cflags="${loc_cflags} '-DMBEDTLS_USER_CONFIG_FILE=\"../tests/configs/user-config-for-test.h\"'"
3504    loc_cflags="${loc_cflags} -I../tests/include -O2"
3505
3506    make CC=gcc CFLAGS="${loc_cflags}" LDFLAGS="$ASAN_CFLAGS"
3507
3508    msg "test: full + MBEDTLS_PSA_CRYPTO_DRIVERS"
3509    make test
3510}
3511
3512component_test_make_shared () {
3513    msg "build/test: make shared" # ~ 40s
3514    make SHARED=1 all check
3515    ldd programs/util/strerror | grep libmbedcrypto
3516    programs/test/dlopen_demo.sh
3517}
3518
3519component_test_cmake_shared () {
3520    msg "build/test: cmake shared" # ~ 2min
3521    cmake -DUSE_SHARED_MBEDTLS_LIBRARY=On .
3522    make
3523    ldd programs/util/strerror | grep libmbedcrypto
3524    make test
3525    programs/test/dlopen_demo.sh
3526}
3527
3528test_build_opt () {
3529    info=$1 cc=$2; shift 2
3530    for opt in "$@"; do
3531          msg "build/test: $cc $opt, $info" # ~ 30s
3532          make CC="$cc" CFLAGS="$opt -std=c99 -pedantic -Wall -Wextra -Werror"
3533          # We're confident enough in compilers to not run _all_ the tests,
3534          # but at least run the unit tests. In particular, runs with
3535          # optimizations use inline assembly whereas runs with -O0
3536          # skip inline assembly.
3537          make test # ~30s
3538          make clean
3539    done
3540}
3541
3542component_test_clang_opt () {
3543    scripts/config.py full
3544    test_build_opt 'full config' clang -O0 -Os -O2
3545}
3546
3547component_test_gcc_opt () {
3548    scripts/config.py full
3549    test_build_opt 'full config' gcc -O0 -Os -O2
3550}
3551
3552component_build_mbedtls_config_file () {
3553    msg "build: make with MBEDTLS_CONFIG_FILE" # ~40s
3554    scripts/config.py -w full_config.h full
3555    echo '#error "MBEDTLS_CONFIG_FILE is not working"' >"$CONFIG_H"
3556    make CFLAGS="-I '$PWD' -DMBEDTLS_CONFIG_FILE='\"full_config.h\"'"
3557    # Make sure this feature is enabled. We'll disable it in the next phase.
3558    programs/test/query_compile_time_config MBEDTLS_NIST_KW_C
3559    make clean
3560
3561    msg "build: make with MBEDTLS_CONFIG_FILE + MBEDTLS_USER_CONFIG_FILE"
3562    # In the user config, disable one feature (for simplicity, pick a feature
3563    # that nothing else depends on).
3564    echo '#undef MBEDTLS_NIST_KW_C' >user_config.h
3565    make CFLAGS="-I '$PWD' -DMBEDTLS_CONFIG_FILE='\"full_config.h\"' -DMBEDTLS_USER_CONFIG_FILE='\"user_config.h\"'"
3566    not programs/test/query_compile_time_config MBEDTLS_NIST_KW_C
3567
3568    rm -f user_config.h full_config.h
3569}
3570
3571component_build_psa_config_file () {
3572    msg "build: make with MBEDTLS_PSA_CRYPTO_CONFIG_FILE" # ~40s
3573    scripts/config.py set MBEDTLS_PSA_CRYPTO_CONFIG
3574    cp "$CRYPTO_CONFIG_H" psa_test_config.h
3575    echo '#error "MBEDTLS_PSA_CRYPTO_CONFIG_FILE is not working"' >"$CRYPTO_CONFIG_H"
3576    make CFLAGS="-I '$PWD' -DMBEDTLS_PSA_CRYPTO_CONFIG_FILE='\"psa_test_config.h\"'"
3577    # Make sure this feature is enabled. We'll disable it in the next phase.
3578    programs/test/query_compile_time_config MBEDTLS_CMAC_C
3579    make clean
3580
3581    msg "build: make with MBEDTLS_PSA_CRYPTO_CONFIG_FILE + MBEDTLS_PSA_CRYPTO_USER_CONFIG_FILE" # ~40s
3582    # In the user config, disable one feature, which will reflect on the
3583    # mbedtls configuration so we can query it with query_compile_time_config.
3584    echo '#undef PSA_WANT_ALG_CMAC' >psa_user_config.h
3585    scripts/config.py unset MBEDTLS_CMAC_C
3586    make CFLAGS="-I '$PWD' -DMBEDTLS_PSA_CRYPTO_CONFIG_FILE='\"psa_test_config.h\"' -DMBEDTLS_PSA_CRYPTO_USER_CONFIG_FILE='\"psa_user_config.h\"'"
3587    not programs/test/query_compile_time_config MBEDTLS_CMAC_C
3588
3589    rm -f psa_test_config.h psa_user_config.h
3590}
3591
3592component_build_psa_alt_headers () {
3593    msg "build: make with PSA alt headers" # ~20s
3594
3595    # Generate alternative versions of the substitutable headers with the
3596    # same content except different include guards.
3597    make -C tests include/alt-extra/psa/crypto_platform_alt.h include/alt-extra/psa/crypto_struct_alt.h
3598
3599    # Build the library and some programs.
3600    # Don't build the fuzzers to avoid having to go through hoops to set
3601    # a correct include path for programs/fuzz/Makefile.
3602    make CFLAGS="-I ../tests/include/alt-extra -DMBEDTLS_PSA_CRYPTO_PLATFORM_FILE='\"psa/crypto_platform_alt.h\"' -DMBEDTLS_PSA_CRYPTO_STRUCT_FILE='\"psa/crypto_struct_alt.h\"'" lib
3603    make -C programs -o fuzz CFLAGS="-I ../tests/include/alt-extra -DMBEDTLS_PSA_CRYPTO_PLATFORM_FILE='\"psa/crypto_platform_alt.h\"' -DMBEDTLS_PSA_CRYPTO_STRUCT_FILE='\"psa/crypto_struct_alt.h\"'"
3604
3605    # Check that we're getting the alternative include guards and not the
3606    # original include guards.
3607    programs/test/query_included_headers | grep -x PSA_CRYPTO_PLATFORM_ALT_H
3608    programs/test/query_included_headers | grep -x PSA_CRYPTO_STRUCT_ALT_H
3609    programs/test/query_included_headers | not grep -x PSA_CRYPTO_PLATFORM_H
3610    programs/test/query_included_headers | not grep -x PSA_CRYPTO_STRUCT_H
3611}
3612
3613component_test_m32_o0 () {
3614    # Build without optimization, so as to use portable C code (in a 32-bit
3615    # build) and not the i386-specific inline assembly.
3616    msg "build: i386, make, gcc -O0 (ASan build)" # ~ 30s
3617    scripts/config.py full
3618    make CC=gcc CFLAGS="$ASAN_CFLAGS -m32 -O0" LDFLAGS="-m32 $ASAN_CFLAGS"
3619
3620    msg "test: i386, make, gcc -O0 (ASan build)"
3621    make test
3622}
3623support_test_m32_o0 () {
3624    case $(uname -m) in
3625        amd64|x86_64) true;;
3626        *) false;;
3627    esac
3628}
3629
3630component_test_m32_o2 () {
3631    # Build with optimization, to use the i386 specific inline assembly
3632    # and go faster for tests.
3633    msg "build: i386, make, gcc -O2 (ASan build)" # ~ 30s
3634    scripts/config.py full
3635    make CC=gcc CFLAGS="$ASAN_CFLAGS -m32 -O2" LDFLAGS="-m32 $ASAN_CFLAGS"
3636
3637    msg "test: i386, make, gcc -O2 (ASan build)"
3638    make test
3639
3640    msg "test ssl-opt.sh, i386, make, gcc-O2"
3641    tests/ssl-opt.sh
3642}
3643support_test_m32_o2 () {
3644    support_test_m32_o0 "$@"
3645}
3646
3647component_test_m32_everest () {
3648    msg "build: i386, Everest ECDH context (ASan build)" # ~ 6 min
3649    scripts/config.py set MBEDTLS_ECDH_VARIANT_EVEREST_ENABLED
3650    make CC=gcc CFLAGS="$ASAN_CFLAGS -m32 -O2" LDFLAGS="-m32 $ASAN_CFLAGS"
3651
3652    msg "test: i386, Everest ECDH context - main suites (inc. selftests) (ASan build)" # ~ 50s
3653    make test
3654
3655    msg "test: i386, Everest ECDH context - ECDH-related part of ssl-opt.sh (ASan build)" # ~ 5s
3656    tests/ssl-opt.sh -f ECDH
3657
3658    msg "test: i386, Everest ECDH context - compat.sh with some ECDH ciphersuites (ASan build)" # ~ 3 min
3659    # Exclude some symmetric ciphers that are redundant here to gain time.
3660    tests/compat.sh -f ECDH -V NO -e 'ARIA\|CAMELLIA\|CHACHA'
3661}
3662support_test_m32_everest () {
3663    support_test_m32_o0 "$@"
3664}
3665
3666component_test_mx32 () {
3667    msg "build: 64-bit ILP32, make, gcc" # ~ 30s
3668    scripts/config.py full
3669    make CC=gcc CFLAGS='-Werror -Wall -Wextra -mx32' LDFLAGS='-mx32'
3670
3671    msg "test: 64-bit ILP32, make, gcc"
3672    make test
3673}
3674support_test_mx32 () {
3675    case $(uname -m) in
3676        amd64|x86_64) true;;
3677        *) false;;
3678    esac
3679}
3680
3681component_test_min_mpi_window_size () {
3682    msg "build: Default + MBEDTLS_MPI_WINDOW_SIZE=1 (ASan build)" # ~ 10s
3683    scripts/config.py set MBEDTLS_MPI_WINDOW_SIZE 1
3684    CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
3685    make
3686
3687    msg "test: MBEDTLS_MPI_WINDOW_SIZE=1 - main suites (inc. selftests) (ASan build)" # ~ 10s
3688    make test
3689}
3690
3691component_test_have_int32 () {
3692    msg "build: gcc, force 32-bit bignum limbs"
3693    scripts/config.py unset MBEDTLS_HAVE_ASM
3694    scripts/config.py unset MBEDTLS_AESNI_C
3695    scripts/config.py unset MBEDTLS_PADLOCK_C
3696    scripts/config.py unset MBEDTLS_AESCE_C
3697    make CC=gcc CFLAGS='-Werror -Wall -Wextra -DMBEDTLS_HAVE_INT32'
3698
3699    msg "test: gcc, force 32-bit bignum limbs"
3700    make test
3701}
3702
3703component_test_have_int64 () {
3704    msg "build: gcc, force 64-bit bignum limbs"
3705    scripts/config.py unset MBEDTLS_HAVE_ASM
3706    scripts/config.py unset MBEDTLS_AESNI_C
3707    scripts/config.py unset MBEDTLS_PADLOCK_C
3708    scripts/config.py unset MBEDTLS_AESCE_C
3709    make CC=gcc CFLAGS='-Werror -Wall -Wextra -DMBEDTLS_HAVE_INT64'
3710
3711    msg "test: gcc, force 64-bit bignum limbs"
3712    make test
3713}
3714
3715component_test_no_udbl_division () {
3716    msg "build: MBEDTLS_NO_UDBL_DIVISION native" # ~ 10s
3717    scripts/config.py full
3718    scripts/config.py set MBEDTLS_NO_UDBL_DIVISION
3719    make CFLAGS='-Werror -O1'
3720
3721    msg "test: MBEDTLS_NO_UDBL_DIVISION native" # ~ 10s
3722    make test
3723}
3724
3725component_test_no_64bit_multiplication () {
3726    msg "build: MBEDTLS_NO_64BIT_MULTIPLICATION native" # ~ 10s
3727    scripts/config.py full
3728    scripts/config.py set MBEDTLS_NO_64BIT_MULTIPLICATION
3729    make CFLAGS='-Werror -O1'
3730
3731    msg "test: MBEDTLS_NO_64BIT_MULTIPLICATION native" # ~ 10s
3732    make test
3733}
3734
3735component_test_no_strings () {
3736    msg "build: no strings" # ~10s
3737    scripts/config.py full
3738    # Disable options that activate a large amount of string constants.
3739    scripts/config.py unset MBEDTLS_DEBUG_C
3740    scripts/config.py unset MBEDTLS_ERROR_C
3741    scripts/config.py set MBEDTLS_ERROR_STRERROR_DUMMY
3742    scripts/config.py unset MBEDTLS_VERSION_FEATURES
3743    make CFLAGS='-Werror -Os'
3744
3745    msg "test: no strings" # ~ 10s
3746    make test
3747}
3748
3749component_test_no_x509_info () {
3750    msg "build: full + MBEDTLS_X509_REMOVE_INFO" # ~ 10s
3751    scripts/config.pl full
3752    scripts/config.pl unset MBEDTLS_MEMORY_BACKTRACE # too slow for tests
3753    scripts/config.pl set MBEDTLS_X509_REMOVE_INFO
3754    make CFLAGS='-Werror -O2'
3755
3756    msg "test: full + MBEDTLS_X509_REMOVE_INFO" # ~ 10s
3757    make test
3758
3759    msg "test: ssl-opt.sh, full + MBEDTLS_X509_REMOVE_INFO" # ~ 1 min
3760    tests/ssl-opt.sh
3761}
3762
3763component_build_arm_none_eabi_gcc () {
3764    msg "build: ${ARM_NONE_EABI_GCC_PREFIX}gcc -O1, baremetal+debug" # ~ 10s
3765    scripts/config.py baremetal
3766    make CC="${ARM_NONE_EABI_GCC_PREFIX}gcc" AR="${ARM_NONE_EABI_GCC_PREFIX}ar" LD="${ARM_NONE_EABI_GCC_PREFIX}ld" CFLAGS='-std=c99 -Werror -Wall -Wextra -O1' lib
3767
3768    msg "size: ${ARM_NONE_EABI_GCC_PREFIX}gcc -O1, baremetal+debug"
3769    ${ARM_NONE_EABI_GCC_PREFIX}size library/*.o
3770}
3771
3772component_build_arm_linux_gnueabi_gcc_arm5vte () {
3773    msg "build: ${ARM_LINUX_GNUEABI_GCC_PREFIX}gcc -march=arm5vte, baremetal+debug" # ~ 10s
3774    scripts/config.py baremetal
3775    # Build for a target platform that's close to what Debian uses
3776    # for its "armel" distribution (https://wiki.debian.org/ArmEabiPort).
3777    # See https://github.com/Mbed-TLS/mbedtls/pull/2169 and comments.
3778    # Build everything including programs, see for example
3779    # https://github.com/Mbed-TLS/mbedtls/pull/3449#issuecomment-675313720
3780    make CC="${ARM_LINUX_GNUEABI_GCC_PREFIX}gcc" AR="${ARM_LINUX_GNUEABI_GCC_PREFIX}ar" CFLAGS='-Werror -Wall -Wextra -march=armv5te -O1' LDFLAGS='-march=armv5te'
3781
3782    msg "size: ${ARM_LINUX_GNUEABI_GCC_PREFIX}gcc -march=armv5te -O1, baremetal+debug"
3783    ${ARM_LINUX_GNUEABI_GCC_PREFIX}size library/*.o
3784}
3785support_build_arm_linux_gnueabi_gcc_arm5vte () {
3786    type ${ARM_LINUX_GNUEABI_GCC_PREFIX}gcc >/dev/null 2>&1
3787}
3788
3789component_build_arm_none_eabi_gcc_arm5vte () {
3790    msg "build: ${ARM_NONE_EABI_GCC_PREFIX}gcc -march=arm5vte, baremetal+debug" # ~ 10s
3791    scripts/config.py baremetal
3792    # This is an imperfect substitute for
3793    # component_build_arm_linux_gnueabi_gcc_arm5vte
3794    # in case the gcc-arm-linux-gnueabi toolchain is not available
3795    make CC="${ARM_NONE_EABI_GCC_PREFIX}gcc" AR="${ARM_NONE_EABI_GCC_PREFIX}ar" CFLAGS='-std=c99 -Werror -Wall -Wextra -march=armv5te -O1' LDFLAGS='-march=armv5te' SHELL='sh -x' lib
3796
3797    msg "size: ${ARM_NONE_EABI_GCC_PREFIX}gcc -march=armv5te -O1, baremetal+debug"
3798    ${ARM_NONE_EABI_GCC_PREFIX}size library/*.o
3799}
3800
3801component_build_arm_none_eabi_gcc_m0plus () {
3802    msg "build: ${ARM_NONE_EABI_GCC_PREFIX}gcc -mthumb -mcpu=cortex-m0plus, baremetal_size" # ~ 10s
3803    scripts/config.py baremetal_size
3804    make CC="${ARM_NONE_EABI_GCC_PREFIX}gcc" AR="${ARM_NONE_EABI_GCC_PREFIX}ar" LD="${ARM_NONE_EABI_GCC_PREFIX}ld" CFLAGS='-std=c99 -Werror -Wall -Wextra -mthumb -mcpu=cortex-m0plus -Os' lib
3805
3806    msg "size: ${ARM_NONE_EABI_GCC_PREFIX}gcc -mthumb -mcpu=cortex-m0plus -Os, baremetal_size"
3807    ${ARM_NONE_EABI_GCC_PREFIX}size library/*.o
3808}
3809
3810component_build_arm_none_eabi_gcc_no_udbl_division () {
3811    msg "build: ${ARM_NONE_EABI_GCC_PREFIX}gcc -DMBEDTLS_NO_UDBL_DIVISION, make" # ~ 10s
3812    scripts/config.py baremetal
3813    scripts/config.py set MBEDTLS_NO_UDBL_DIVISION
3814    make CC="${ARM_NONE_EABI_GCC_PREFIX}gcc" AR="${ARM_NONE_EABI_GCC_PREFIX}ar" LD="${ARM_NONE_EABI_GCC_PREFIX}ld" CFLAGS='-std=c99 -Werror -Wall -Wextra' lib
3815    echo "Checking that software 64-bit division is not required"
3816    not grep __aeabi_uldiv library/*.o
3817}
3818
3819component_build_arm_none_eabi_gcc_no_64bit_multiplication () {
3820    msg "build: ${ARM_NONE_EABI_GCC_PREFIX}gcc MBEDTLS_NO_64BIT_MULTIPLICATION, make" # ~ 10s
3821    scripts/config.py baremetal
3822    scripts/config.py set MBEDTLS_NO_64BIT_MULTIPLICATION
3823    make CC="${ARM_NONE_EABI_GCC_PREFIX}gcc" AR="${ARM_NONE_EABI_GCC_PREFIX}ar" LD="${ARM_NONE_EABI_GCC_PREFIX}ld" CFLAGS='-std=c99 -Werror -O1 -march=armv6-m -mthumb' lib
3824    echo "Checking that software 64-bit multiplication is not required"
3825    not grep __aeabi_lmul library/*.o
3826}
3827
3828component_build_armcc () {
3829    msg "build: ARM Compiler 5"
3830    scripts/config.py baremetal
3831    # armc[56] don't support SHA-512 intrinsics
3832    scripts/config.py unset MBEDTLS_SHA512_USE_A64_CRYPTO_IF_PRESENT
3833
3834    # Stop armclang warning about feature detection for A64_CRYPTO.
3835    # With this enabled, the library does build correctly under armclang,
3836    # but in baremetal builds (as tested here), feature detection is
3837    # unavailable, and the user is notified via a #warning. So enabling
3838    # this feature would prevent us from building with -Werror on
3839    # armclang. Tracked in #7198.
3840    scripts/config.py unset MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT
3841
3842    scripts/config.py set MBEDTLS_HAVE_ASM
3843
3844    make CC="$ARMC5_CC" AR="$ARMC5_AR" WARNING_CFLAGS='--strict --c99' lib
3845
3846    msg "size: ARM Compiler 5"
3847    "$ARMC5_FROMELF" -z library/*.o
3848
3849    make clean
3850
3851    # Compile with -O1 since some Arm inline assembly is disabled for -O0.
3852
3853    # ARM Compiler 6 - Target ARMv7-A
3854    armc6_build_test "-O1 --target=arm-arm-none-eabi -march=armv7-a"
3855
3856    # ARM Compiler 6 - Target ARMv7-M
3857    armc6_build_test "-O1 --target=arm-arm-none-eabi -march=armv7-m"
3858
3859    # ARM Compiler 6 - Target ARMv7-M+DSP
3860    armc6_build_test "-O1 --target=arm-arm-none-eabi -march=armv7-m+dsp"
3861
3862    # ARM Compiler 6 - Target ARMv8-A - AArch32
3863    armc6_build_test "-O1 --target=arm-arm-none-eabi -march=armv8.2-a"
3864
3865    # ARM Compiler 6 - Target ARMv8-M
3866    armc6_build_test "-O1 --target=arm-arm-none-eabi -march=armv8-m.main"
3867
3868    # ARM Compiler 6 - Target ARMv8.2-A - AArch64
3869    armc6_build_test "-O1 --target=aarch64-arm-none-eabi -march=armv8.2-a+crypto"
3870}
3871support_build_armcc () {
3872    armc5_cc="$ARMC5_BIN_DIR/armcc"
3873    armc6_cc="$ARMC6_BIN_DIR/armclang"
3874    (check_tools "$armc5_cc" "$armc6_cc" > /dev/null 2>&1)
3875}
3876
3877component_test_tls13_only () {
3878    msg "build: default config with MBEDTLS_SSL_PROTO_TLS1_3, without MBEDTLS_SSL_PROTO_TLS1_2"
3879    scripts/config.py set MBEDTLS_SSL_EARLY_DATA
3880    make CFLAGS="'-DMBEDTLS_USER_CONFIG_FILE=\"../tests/configs/tls13-only.h\"'"
3881
3882    msg "test: TLS 1.3 only, all key exchange modes enabled"
3883    make test
3884
3885    msg "ssl-opt.sh: TLS 1.3 only, all key exchange modes enabled"
3886    tests/ssl-opt.sh
3887}
3888
3889component_test_tls13_only_psk () {
3890    msg "build: TLS 1.3 only from default, only PSK key exchange mode"
3891    scripts/config.py unset MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED
3892    scripts/config.py unset MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL_ENABLED
3893    scripts/config.py unset MBEDTLS_ECDH_C
3894    scripts/config.py unset MBEDTLS_X509_CRT_PARSE_C
3895    scripts/config.py unset MBEDTLS_X509_RSASSA_PSS_SUPPORT
3896    scripts/config.py unset MBEDTLS_SSL_SERVER_NAME_INDICATION
3897    scripts/config.py unset MBEDTLS_ECDSA_C
3898    scripts/config.py unset MBEDTLS_PKCS1_V21
3899    scripts/config.py unset MBEDTLS_PKCS7_C
3900    scripts/config.py set   MBEDTLS_SSL_EARLY_DATA
3901    make CFLAGS="'-DMBEDTLS_USER_CONFIG_FILE=\"../tests/configs/tls13-only.h\"'"
3902
3903    msg "test_suite_ssl: TLS 1.3 only, only PSK key exchange mode enabled"
3904    cd tests; ./test_suite_ssl; cd ..
3905
3906    msg "ssl-opt.sh: TLS 1.3 only, only PSK key exchange mode enabled"
3907    tests/ssl-opt.sh
3908}
3909
3910component_test_tls13_only_ephemeral () {
3911    msg "build: TLS 1.3 only from default, only ephemeral key exchange mode"
3912    scripts/config.py unset MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_ENABLED
3913    scripts/config.py unset MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_EPHEMERAL_ENABLED
3914    scripts/config.py unset MBEDTLS_SSL_EARLY_DATA
3915    make CFLAGS="'-DMBEDTLS_USER_CONFIG_FILE=\"../tests/configs/tls13-only.h\"'"
3916
3917    msg "test_suite_ssl: TLS 1.3 only, only ephemeral key exchange mode"
3918    cd tests; ./test_suite_ssl; cd ..
3919
3920    msg "ssl-opt.sh: TLS 1.3 only, only ephemeral key exchange mode"
3921    tests/ssl-opt.sh
3922}
3923
3924component_test_tls13_only_psk_ephemeral () {
3925    msg "build: TLS 1.3 only from default, only PSK ephemeral key exchange mode"
3926    scripts/config.py unset MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_ENABLED
3927    scripts/config.py unset MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED
3928    scripts/config.py unset MBEDTLS_X509_CRT_PARSE_C
3929    scripts/config.py unset MBEDTLS_X509_RSASSA_PSS_SUPPORT
3930    scripts/config.py unset MBEDTLS_SSL_SERVER_NAME_INDICATION
3931    scripts/config.py unset MBEDTLS_ECDSA_C
3932    scripts/config.py unset MBEDTLS_PKCS1_V21
3933    scripts/config.py unset MBEDTLS_PKCS7_C
3934    scripts/config.py set   MBEDTLS_SSL_EARLY_DATA
3935    make CFLAGS="'-DMBEDTLS_USER_CONFIG_FILE=\"../tests/configs/tls13-only.h\"'"
3936
3937    msg "test_suite_ssl: TLS 1.3 only, only PSK ephemeral key exchange mode"
3938    cd tests; ./test_suite_ssl; cd ..
3939
3940    msg "ssl-opt.sh: TLS 1.3 only, only PSK ephemeral key exchange mode"
3941    tests/ssl-opt.sh
3942}
3943
3944component_test_tls13_only_psk_all () {
3945    msg "build: TLS 1.3 only from default, without ephemeral key exchange mode"
3946    scripts/config.py unset MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED
3947    scripts/config.py unset MBEDTLS_X509_CRT_PARSE_C
3948    scripts/config.py unset MBEDTLS_X509_RSASSA_PSS_SUPPORT
3949    scripts/config.py unset MBEDTLS_SSL_SERVER_NAME_INDICATION
3950    scripts/config.py unset MBEDTLS_ECDSA_C
3951    scripts/config.py unset MBEDTLS_PKCS1_V21
3952    scripts/config.py unset MBEDTLS_PKCS7_C
3953    scripts/config.py set   MBEDTLS_SSL_EARLY_DATA
3954    make CFLAGS="'-DMBEDTLS_USER_CONFIG_FILE=\"../tests/configs/tls13-only.h\"'"
3955
3956    msg "test_suite_ssl: TLS 1.3 only, PSK and PSK ephemeral key exchange modes"
3957    cd tests; ./test_suite_ssl; cd ..
3958
3959    msg "ssl-opt.sh: TLS 1.3 only, PSK and PSK ephemeral key exchange modes"
3960    tests/ssl-opt.sh
3961}
3962
3963component_test_tls13_only_ephemeral_all () {
3964    msg "build: TLS 1.3 only from default, without PSK key exchange mode"
3965    scripts/config.py unset MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_PSK_ENABLED
3966    scripts/config.py set   MBEDTLS_SSL_EARLY_DATA
3967    make CFLAGS="'-DMBEDTLS_USER_CONFIG_FILE=\"../tests/configs/tls13-only.h\"'"
3968
3969    msg "test_suite_ssl: TLS 1.3 only, ephemeral and PSK ephemeral key exchange modes"
3970    cd tests; ./test_suite_ssl; cd ..
3971
3972    msg "ssl-opt.sh: TLS 1.3 only, ephemeral and PSK ephemeral key exchange modes"
3973    tests/ssl-opt.sh
3974}
3975
3976component_test_tls13 () {
3977    msg "build: default config with MBEDTLS_SSL_PROTO_TLS1_3 enabled, without padding"
3978    scripts/config.py set MBEDTLS_SSL_PROTO_TLS1_3
3979    scripts/config.py set MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE
3980    scripts/config.py set MBEDTLS_SSL_CID_TLS1_3_PADDING_GRANULARITY 1
3981    scripts/config.py set MBEDTLS_SSL_EARLY_DATA
3982    CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
3983    make
3984    msg "test: default config with MBEDTLS_SSL_PROTO_TLS1_3 enabled, without padding"
3985    make test
3986    msg "ssl-opt.sh (TLS 1.3)"
3987    tests/ssl-opt.sh
3988}
3989
3990component_test_tls13_no_compatibility_mode () {
3991    msg "build: default config with MBEDTLS_SSL_PROTO_TLS1_3 enabled, without padding"
3992    scripts/config.py set   MBEDTLS_SSL_PROTO_TLS1_3
3993    scripts/config.py unset MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE
3994    scripts/config.py set   MBEDTLS_SSL_CID_TLS1_3_PADDING_GRANULARITY 1
3995    scripts/config.py set   MBEDTLS_SSL_EARLY_DATA
3996    CC=gcc cmake -D CMAKE_BUILD_TYPE:String=Asan .
3997    make
3998    msg "test: default config with MBEDTLS_SSL_PROTO_TLS1_3 enabled, without padding"
3999    make test
4000    msg "ssl-opt.sh (TLS 1.3 no compatibility mode)"
4001    tests/ssl-opt.sh
4002}
4003
4004component_test_tls13_only_record_size_limit () {
4005    msg "build: TLS 1.3 only from default, record size limit extension enabled"
4006    scripts/config.py set MBEDTLS_SSL_RECORD_SIZE_LIMIT
4007    make CFLAGS="'-DMBEDTLS_USER_CONFIG_FILE=\"../tests/configs/tls13-only.h\"'"
4008
4009    msg "test_suite_ssl: TLS 1.3 only, record size limit extension enabled"
4010    cd tests; ./test_suite_ssl; cd ..
4011
4012    msg "ssl-opt.sh: (TLS 1.3 only, record size limit extension tests only)"
4013    # Both the server and the client will currently abort the handshake when they encounter the
4014    # record size limit extension. There is no way to prevent gnutls-cli from sending the extension
4015    # which makes all G_NEXT_CLI + P_SRV tests fail. Thus, run only the tests for the this extension.
4016    tests/ssl-opt.sh -f "Record Size Limit"
4017}
4018
4019component_build_mingw () {
4020    msg "build: Windows cross build - mingw64, make (Link Library)" # ~ 30s
4021    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
4022
4023    # note Make tests only builds the tests, but doesn't run them
4024    make CC=i686-w64-mingw32-gcc AR=i686-w64-mingw32-ar LD=i686-w64-minggw32-ld CFLAGS='-Werror' WINDOWS_BUILD=1 tests
4025    make WINDOWS_BUILD=1 clean
4026
4027    msg "build: Windows cross build - mingw64, make (DLL)" # ~ 30s
4028    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
4029    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
4030    make WINDOWS_BUILD=1 clean
4031}
4032support_build_mingw() {
4033    case $(i686-w64-mingw32-gcc -dumpversion 2>/dev/null) in
4034        [0-5]*|"") false;;
4035        *) true;;
4036    esac
4037}
4038
4039component_test_memsan () {
4040    msg "build: MSan (clang)" # ~ 1 min 20s
4041    scripts/config.py unset MBEDTLS_AESNI_C # memsan doesn't grok asm
4042    CC=clang cmake -D CMAKE_BUILD_TYPE:String=MemSan .
4043    make
4044
4045    msg "test: main suites (MSan)" # ~ 10s
4046    make test
4047
4048    msg "test: ssl-opt.sh (MSan)" # ~ 1 min
4049    tests/ssl-opt.sh
4050
4051    # Optional part(s)
4052
4053    if [ "$MEMORY" -gt 0 ]; then
4054        msg "test: compat.sh (MSan)" # ~ 6 min 20s
4055        tests/compat.sh
4056    fi
4057}
4058
4059component_test_valgrind () {
4060    msg "build: Release (clang)"
4061    # default config, in particular without MBEDTLS_USE_PSA_CRYPTO
4062    CC=clang cmake -D CMAKE_BUILD_TYPE:String=Release .
4063    make
4064
4065    msg "test: main suites, Valgrind (default config)"
4066    make memcheck
4067
4068    # Optional parts (slow; currently broken on OS X because programs don't
4069    # seem to receive signals under valgrind on OS X).
4070    # These optional parts don't run on the CI.
4071    if [ "$MEMORY" -gt 0 ]; then
4072        msg "test: ssl-opt.sh --memcheck (default config)"
4073        tests/ssl-opt.sh --memcheck
4074    fi
4075
4076    if [ "$MEMORY" -gt 1 ]; then
4077        msg "test: compat.sh --memcheck (default config)"
4078        tests/compat.sh --memcheck
4079    fi
4080
4081    if [ "$MEMORY" -gt 0 ]; then
4082        msg "test: context-info.sh --memcheck (default config)"
4083        tests/context-info.sh --memcheck
4084    fi
4085}
4086
4087component_test_valgrind_psa () {
4088    msg "build: Release, full (clang)"
4089    # full config, in particular with MBEDTLS_USE_PSA_CRYPTO
4090    scripts/config.py full
4091    CC=clang cmake -D CMAKE_BUILD_TYPE:String=Release .
4092    make
4093
4094    msg "test: main suites, Valgrind (full config)"
4095    make memcheck
4096}
4097
4098support_test_cmake_out_of_source () {
4099    distrib_id=""
4100    distrib_ver=""
4101    distrib_ver_minor=""
4102    distrib_ver_major=""
4103
4104    # Attempt to parse lsb-release to find out distribution and version. If not
4105    # found this should fail safe (test is supported).
4106    if [[ -f /etc/lsb-release ]]; then
4107
4108        while read -r lsb_line; do
4109            case "$lsb_line" in
4110                "DISTRIB_ID"*) distrib_id=${lsb_line/#DISTRIB_ID=};;
4111                "DISTRIB_RELEASE"*) distrib_ver=${lsb_line/#DISTRIB_RELEASE=};;
4112            esac
4113        done < /etc/lsb-release
4114
4115        distrib_ver_major="${distrib_ver%%.*}"
4116        distrib_ver="${distrib_ver#*.}"
4117        distrib_ver_minor="${distrib_ver%%.*}"
4118    fi
4119
4120    # Running the out of source CMake test on Ubuntu 16.04 using more than one
4121    # processor (as the CI does) can create a race condition whereby the build
4122    # fails to see a generated file, despite that file actually having been
4123    # generated. This problem appears to go away with 18.04 or newer, so make
4124    # the out of source tests unsupported on Ubuntu 16.04.
4125    [ "$distrib_id" != "Ubuntu" ] || [ "$distrib_ver_major" -gt 16 ]
4126}
4127
4128component_test_cmake_out_of_source () {
4129    msg "build: cmake 'out-of-source' build"
4130    MBEDTLS_ROOT_DIR="$PWD"
4131    mkdir "$OUT_OF_SOURCE_DIR"
4132    cd "$OUT_OF_SOURCE_DIR"
4133    cmake -D CMAKE_BUILD_TYPE:String=Check "$MBEDTLS_ROOT_DIR"
4134    make
4135
4136    msg "test: cmake 'out-of-source' build"
4137    make test
4138    # Check that ssl-opt.sh can find the test programs.
4139    # Also ensure that there are no error messages such as
4140    # "No such file or directory", which would indicate that some required
4141    # file is missing (ssl-opt.sh tolerates the absence of some files so
4142    # may exit with status 0 but emit errors).
4143    ./tests/ssl-opt.sh -f 'Default' >ssl-opt.out 2>ssl-opt.err
4144    grep PASS ssl-opt.out
4145    cat ssl-opt.err >&2
4146    # If ssl-opt.err is non-empty, record an error and keep going.
4147    [ ! -s ssl-opt.err ]
4148    rm ssl-opt.out ssl-opt.err
4149    cd "$MBEDTLS_ROOT_DIR"
4150    rm -rf "$OUT_OF_SOURCE_DIR"
4151}
4152
4153component_test_cmake_as_subdirectory () {
4154    msg "build: cmake 'as-subdirectory' build"
4155    cd programs/test/cmake_subproject
4156    cmake .
4157    make
4158    ./cmake_subproject
4159}
4160support_test_cmake_as_subdirectory () {
4161    support_test_cmake_out_of_source
4162}
4163
4164component_test_cmake_as_package () {
4165    msg "build: cmake 'as-package' build"
4166    cd programs/test/cmake_package
4167    cmake .
4168    make
4169    ./cmake_package
4170}
4171support_test_cmake_as_package () {
4172    support_test_cmake_out_of_source
4173}
4174
4175component_test_cmake_as_package_install () {
4176    msg "build: cmake 'as-installed-package' build"
4177    cd programs/test/cmake_package_install
4178    cmake .
4179    make
4180    ./cmake_package_install
4181}
4182support_test_cmake_as_package_install () {
4183    support_test_cmake_out_of_source
4184}
4185
4186component_test_zeroize () {
4187    # Test that the function mbedtls_platform_zeroize() is not optimized away by
4188    # different combinations of compilers and optimization flags by using an
4189    # auxiliary GDB script. Unfortunately, GDB does not return error values to the
4190    # system in all cases that the script fails, so we must manually search the
4191    # output to check whether the pass string is present and no failure strings
4192    # were printed.
4193
4194    # Don't try to disable ASLR. We don't care about ASLR here. We do care
4195    # about a spurious message if Gdb tries and fails, so suppress that.
4196    gdb_disable_aslr=
4197    if [ -z "$(gdb -batch -nw -ex 'set disable-randomization off' 2>&1)" ]; then
4198        gdb_disable_aslr='set disable-randomization off'
4199    fi
4200
4201    for optimization_flag in -O2 -O3 -Ofast -Os; do
4202        for compiler in clang gcc; do
4203            msg "test: $compiler $optimization_flag, mbedtls_platform_zeroize()"
4204            make programs CC="$compiler" DEBUG=1 CFLAGS="$optimization_flag"
4205            gdb -ex "$gdb_disable_aslr" -x tests/scripts/test_zeroize.gdb -nw -batch -nx 2>&1 | tee test_zeroize.log
4206            grep "The buffer was correctly zeroized" test_zeroize.log
4207            not grep -i "error" test_zeroize.log
4208            rm -f test_zeroize.log
4209            make clean
4210        done
4211    done
4212}
4213
4214component_test_psa_compliance () {
4215    msg "build: make, default config (out-of-box), libmbedcrypto.a only"
4216    make -C library libmbedcrypto.a
4217
4218    msg "unit test: test_psa_compliance.py"
4219    ./tests/scripts/test_psa_compliance.py
4220}
4221
4222support_test_psa_compliance () {
4223    # psa-compliance-tests only supports CMake >= 3.10.0
4224    ver="$(cmake --version)"
4225    ver="${ver#cmake version }"
4226    ver_major="${ver%%.*}"
4227
4228    ver="${ver#*.}"
4229    ver_minor="${ver%%.*}"
4230
4231    [ "$ver_major" -eq 3 ] && [ "$ver_minor" -ge 10 ]
4232}
4233
4234component_check_code_style () {
4235    msg "Check C code style"
4236    ./scripts/code_style.py
4237}
4238
4239support_check_code_style() {
4240    case $(uncrustify --version) in
4241        *0.75.1*) true;;
4242        *) false;;
4243    esac
4244}
4245
4246component_check_python_files () {
4247    msg "Lint: Python scripts"
4248    tests/scripts/check-python-files.sh
4249}
4250
4251component_check_test_helpers () {
4252    msg "unit test: generate_test_code.py"
4253    # unittest writes out mundane stuff like number or tests run on stderr.
4254    # Our convention is to reserve stderr for actual errors, and write
4255    # harmless info on stdout so it can be suppress with --quiet.
4256    ./tests/scripts/test_generate_test_code.py 2>&1
4257
4258    msg "unit test: translate_ciphers.py"
4259    python3 -m unittest tests/scripts/translate_ciphers.py 2>&1
4260}
4261
4262################################################################
4263#### Termination
4264################################################################
4265
4266post_report () {
4267    msg "Done, cleaning up"
4268    final_cleanup
4269
4270    final_report
4271}
4272
4273
4274
4275################################################################
4276#### Run all the things
4277################################################################
4278
4279# Function invoked by --error-test to test error reporting.
4280pseudo_component_error_test () {
4281    msg "Testing error reporting $error_test_i"
4282    if [ $KEEP_GOING -ne 0 ]; then
4283        echo "Expect three failing commands."
4284    fi
4285    # If the component doesn't run in a subshell, changing error_test_i to an
4286    # invalid integer will cause an error in the loop that runs this function.
4287    error_test_i=this_should_not_be_used_since_the_component_runs_in_a_subshell
4288    # Expected error: 'grep non_existent /dev/null -> 1'
4289    grep non_existent /dev/null
4290    # Expected error: '! grep -q . tests/scripts/all.sh -> 1'
4291    not grep -q . "$0"
4292    # Expected error: 'make unknown_target -> 2'
4293    make unknown_target
4294    false "this should not be executed"
4295}
4296
4297# Run one component and clean up afterwards.
4298run_component () {
4299    current_component="$1"
4300    export MBEDTLS_TEST_CONFIGURATION="$current_component"
4301
4302    # Unconditionally create a seedfile that's sufficiently long.
4303    # Do this before each component, because a previous component may
4304    # have messed it up or shortened it.
4305    local dd_cmd
4306    dd_cmd=(dd if=/dev/urandom of=./tests/seedfile bs=64 count=1)
4307    case $OSTYPE in
4308        linux*|freebsd*|openbsd*) dd_cmd+=(status=none)
4309    esac
4310    "${dd_cmd[@]}"
4311
4312    # Run the component in a subshell, with error trapping and output
4313    # redirection set up based on the relevant options.
4314    if [ $KEEP_GOING -eq 1 ]; then
4315        # We want to keep running if the subshell fails, so 'set -e' must
4316        # be off when the subshell runs.
4317        set +e
4318    fi
4319    (
4320        if [ $QUIET -eq 1 ]; then
4321            # msg() will be silenced, so just print the component name here.
4322            echo "${current_component#component_}"
4323            exec >/dev/null
4324        fi
4325        if [ $KEEP_GOING -eq 1 ]; then
4326            # Keep "set -e" off, and run an ERR trap instead to record failures.
4327            set -E
4328            trap err_trap ERR
4329        fi
4330        # The next line is what runs the component
4331        "$@"
4332        if [ $KEEP_GOING -eq 1 ]; then
4333            trap - ERR
4334            exit $last_failure_status
4335        fi
4336    )
4337    component_status=$?
4338    if [ $KEEP_GOING -eq 1 ]; then
4339        set -e
4340        if [ $component_status -ne 0 ]; then
4341            failure_count=$((failure_count + 1))
4342        fi
4343    fi
4344
4345    # Restore the build tree to a clean state.
4346    cleanup
4347    unset current_component
4348}
4349
4350# Preliminary setup
4351pre_check_environment
4352pre_initialize_variables
4353pre_parse_command_line "$@"
4354
4355pre_check_git
4356pre_restore_files
4357pre_back_up
4358
4359build_status=0
4360if [ $KEEP_GOING -eq 1 ]; then
4361    pre_setup_keep_going
4362fi
4363pre_prepare_outcome_file
4364pre_print_configuration
4365pre_check_tools
4366cleanup
4367pre_generate_files
4368
4369# Run the requested tests.
4370for ((error_test_i=1; error_test_i <= error_test; error_test_i++)); do
4371    run_component pseudo_component_error_test
4372done
4373unset error_test_i
4374for component in $RUN_COMPONENTS; do
4375    run_component "component_$component"
4376done
4377
4378# We're done.
4379post_report
4380