xref: /aosp_15_r20/external/mbedtls/tests/compat.sh (revision 62c56f9862f102b96d72393aff6076c951fb8148)
1*62c56f98SSadaf Ebrahimi#!/bin/sh
2*62c56f98SSadaf Ebrahimi
3*62c56f98SSadaf Ebrahimi# compat.sh
4*62c56f98SSadaf Ebrahimi#
5*62c56f98SSadaf Ebrahimi# Copyright The Mbed TLS Contributors
6*62c56f98SSadaf Ebrahimi# SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
7*62c56f98SSadaf Ebrahimi#
8*62c56f98SSadaf Ebrahimi# Purpose
9*62c56f98SSadaf Ebrahimi#
10*62c56f98SSadaf Ebrahimi# Test interoperbility with OpenSSL, GnuTLS as well as itself.
11*62c56f98SSadaf Ebrahimi#
12*62c56f98SSadaf Ebrahimi# Check each common ciphersuite, with each version, both ways (client/server),
13*62c56f98SSadaf Ebrahimi# with and without client authentication.
14*62c56f98SSadaf Ebrahimi
15*62c56f98SSadaf Ebrahimiset -u
16*62c56f98SSadaf Ebrahimi
17*62c56f98SSadaf Ebrahimi# Limit the size of each log to 10 GiB, in case of failures with this script
18*62c56f98SSadaf Ebrahimi# where it may output seemingly unlimited length error logs.
19*62c56f98SSadaf Ebrahimiulimit -f 20971520
20*62c56f98SSadaf Ebrahimi
21*62c56f98SSadaf EbrahimiORIGINAL_PWD=$PWD
22*62c56f98SSadaf Ebrahimiif ! cd "$(dirname "$0")"; then
23*62c56f98SSadaf Ebrahimi    exit 125
24*62c56f98SSadaf Ebrahimifi
25*62c56f98SSadaf Ebrahimi
26*62c56f98SSadaf Ebrahimi# initialise counters
27*62c56f98SSadaf EbrahimiTESTS=0
28*62c56f98SSadaf EbrahimiFAILED=0
29*62c56f98SSadaf EbrahimiSKIPPED=0
30*62c56f98SSadaf EbrahimiSRVMEM=0
31*62c56f98SSadaf Ebrahimi
32*62c56f98SSadaf Ebrahimi# default commands, can be overridden by the environment
33*62c56f98SSadaf Ebrahimi: ${M_SRV:=../programs/ssl/ssl_server2}
34*62c56f98SSadaf Ebrahimi: ${M_CLI:=../programs/ssl/ssl_client2}
35*62c56f98SSadaf Ebrahimi: ${OPENSSL:=openssl}
36*62c56f98SSadaf Ebrahimi: ${GNUTLS_CLI:=gnutls-cli}
37*62c56f98SSadaf Ebrahimi: ${GNUTLS_SERV:=gnutls-serv}
38*62c56f98SSadaf Ebrahimi
39*62c56f98SSadaf Ebrahimi# The OPENSSL variable used to be OPENSSL_CMD for historical reasons.
40*62c56f98SSadaf Ebrahimi# To help the migration, error out if the old variable is set,
41*62c56f98SSadaf Ebrahimi# but only if it has a different value than the new one.
42*62c56f98SSadaf Ebrahimiif [ "${OPENSSL_CMD+set}" = set ]; then
43*62c56f98SSadaf Ebrahimi    # the variable is set, we can now check its value
44*62c56f98SSadaf Ebrahimi    if [ "$OPENSSL_CMD" != "$OPENSSL" ]; then
45*62c56f98SSadaf Ebrahimi        echo "Please use OPENSSL instead of OPENSSL_CMD." >&2
46*62c56f98SSadaf Ebrahimi        exit 125
47*62c56f98SSadaf Ebrahimi    fi
48*62c56f98SSadaf Ebrahimifi
49*62c56f98SSadaf Ebrahimi
50*62c56f98SSadaf Ebrahimi# do we have a recent enough GnuTLS?
51*62c56f98SSadaf Ebrahimiif ( which $GNUTLS_CLI && which $GNUTLS_SERV ) >/dev/null 2>&1; then
52*62c56f98SSadaf Ebrahimi    G_VER="$( $GNUTLS_CLI --version | head -n1 )"
53*62c56f98SSadaf Ebrahimi    if echo "$G_VER" | grep '@VERSION@' > /dev/null; then # git version
54*62c56f98SSadaf Ebrahimi        PEER_GNUTLS=" GnuTLS"
55*62c56f98SSadaf Ebrahimi    else
56*62c56f98SSadaf Ebrahimi        eval $( echo $G_VER | sed 's/.* \([0-9]*\)\.\([0-9]\)*\.\([0-9]*\)$/MAJOR="\1" MINOR="\2" PATCH="\3"/' )
57*62c56f98SSadaf Ebrahimi        if [ $MAJOR -lt 3 -o \
58*62c56f98SSadaf Ebrahimi            \( $MAJOR -eq 3 -a $MINOR -lt 2 \) -o \
59*62c56f98SSadaf Ebrahimi            \( $MAJOR -eq 3 -a $MINOR -eq 2 -a $PATCH -lt 15 \) ]
60*62c56f98SSadaf Ebrahimi        then
61*62c56f98SSadaf Ebrahimi            PEER_GNUTLS=""
62*62c56f98SSadaf Ebrahimi        else
63*62c56f98SSadaf Ebrahimi            PEER_GNUTLS=" GnuTLS"
64*62c56f98SSadaf Ebrahimi            if [ $MINOR -lt 4 ]; then
65*62c56f98SSadaf Ebrahimi                GNUTLS_MINOR_LT_FOUR='x'
66*62c56f98SSadaf Ebrahimi            fi
67*62c56f98SSadaf Ebrahimi        fi
68*62c56f98SSadaf Ebrahimi    fi
69*62c56f98SSadaf Ebrahimielse
70*62c56f98SSadaf Ebrahimi    PEER_GNUTLS=""
71*62c56f98SSadaf Ebrahimifi
72*62c56f98SSadaf Ebrahimi
73*62c56f98SSadaf Ebrahimiguess_config_name() {
74*62c56f98SSadaf Ebrahimi    if git diff --quiet ../include/mbedtls/mbedtls_config.h 2>/dev/null; then
75*62c56f98SSadaf Ebrahimi        echo "default"
76*62c56f98SSadaf Ebrahimi    else
77*62c56f98SSadaf Ebrahimi        echo "unknown"
78*62c56f98SSadaf Ebrahimi    fi
79*62c56f98SSadaf Ebrahimi}
80*62c56f98SSadaf Ebrahimi: ${MBEDTLS_TEST_OUTCOME_FILE=}
81*62c56f98SSadaf Ebrahimi: ${MBEDTLS_TEST_CONFIGURATION:="$(guess_config_name)"}
82*62c56f98SSadaf Ebrahimi: ${MBEDTLS_TEST_PLATFORM:="$(uname -s | tr -c \\n0-9A-Za-z _)-$(uname -m | tr -c \\n0-9A-Za-z _)"}
83*62c56f98SSadaf Ebrahimi
84*62c56f98SSadaf Ebrahimi# default values for options
85*62c56f98SSadaf Ebrahimi# /!\ keep this synchronised with:
86*62c56f98SSadaf Ebrahimi# - basic-build-test.sh
87*62c56f98SSadaf Ebrahimi# - all.sh (multiple components)
88*62c56f98SSadaf EbrahimiMODES="tls12 dtls12"
89*62c56f98SSadaf EbrahimiVERIFIES="NO YES"
90*62c56f98SSadaf EbrahimiTYPES="ECDSA RSA PSK"
91*62c56f98SSadaf EbrahimiFILTER=""
92*62c56f98SSadaf Ebrahimi# By default, exclude:
93*62c56f98SSadaf Ebrahimi# - NULL: excluded from our default config + requires OpenSSL legacy
94*62c56f98SSadaf Ebrahimi# - ARIA: requires OpenSSL >= 1.1.1
95*62c56f98SSadaf Ebrahimi# - ChachaPoly: requires OpenSSL >= 1.1.0
96*62c56f98SSadaf EbrahimiEXCLUDE='NULL\|ARIA\|CHACHA20_POLY1305'
97*62c56f98SSadaf EbrahimiVERBOSE=""
98*62c56f98SSadaf EbrahimiMEMCHECK=0
99*62c56f98SSadaf EbrahimiPEERS="OpenSSL$PEER_GNUTLS mbedTLS"
100*62c56f98SSadaf Ebrahimi
101*62c56f98SSadaf Ebrahimi# hidden option: skip DTLS with OpenSSL
102*62c56f98SSadaf Ebrahimi# (travis CI has a version that doesn't work for us)
103*62c56f98SSadaf Ebrahimi: ${OSSL_NO_DTLS:=0}
104*62c56f98SSadaf Ebrahimi
105*62c56f98SSadaf Ebrahimiprint_usage() {
106*62c56f98SSadaf Ebrahimi    echo "Usage: $0"
107*62c56f98SSadaf Ebrahimi    printf "  -h|--help\tPrint this help.\n"
108*62c56f98SSadaf Ebrahimi    printf "  -f|--filter\tOnly matching ciphersuites are tested (Default: '%s')\n" "$FILTER"
109*62c56f98SSadaf Ebrahimi    printf "  -e|--exclude\tMatching ciphersuites are excluded (Default: '%s')\n" "$EXCLUDE"
110*62c56f98SSadaf Ebrahimi    printf "  -m|--modes\tWhich modes to perform (Default: '%s')\n" "$MODES"
111*62c56f98SSadaf Ebrahimi    printf "  -t|--types\tWhich key exchange type to perform (Default: '%s')\n" "$TYPES"
112*62c56f98SSadaf Ebrahimi    printf "  -V|--verify\tWhich verification modes to perform (Default: '%s')\n" "$VERIFIES"
113*62c56f98SSadaf Ebrahimi    printf "  -p|--peers\tWhich peers to use (Default: '%s')\n" "$PEERS"
114*62c56f98SSadaf Ebrahimi    printf "            \tAlso available: GnuTLS (needs v3.2.15 or higher)\n"
115*62c56f98SSadaf Ebrahimi    printf "  -M|--memcheck\tCheck memory leaks and errors.\n"
116*62c56f98SSadaf Ebrahimi    printf "  -v|--verbose\tSet verbose output.\n"
117*62c56f98SSadaf Ebrahimi    printf "     --list-test-case\tList all potential test cases (No Execution)\n"
118*62c56f98SSadaf Ebrahimi    printf "     --outcome-file\tFile where test outcomes are written\n"
119*62c56f98SSadaf Ebrahimi    printf "                   \t(default: \$MBEDTLS_TEST_OUTCOME_FILE, none if empty)\n"
120*62c56f98SSadaf Ebrahimi}
121*62c56f98SSadaf Ebrahimi
122*62c56f98SSadaf Ebrahimi# print_test_case <CLIENT> <SERVER> <STANDARD_CIPHER_SUITE>
123*62c56f98SSadaf Ebrahimiprint_test_case() {
124*62c56f98SSadaf Ebrahimi    for i in $3; do
125*62c56f98SSadaf Ebrahimi        uniform_title $1 $2 $i
126*62c56f98SSadaf Ebrahimi        echo $TITLE
127*62c56f98SSadaf Ebrahimi    done
128*62c56f98SSadaf Ebrahimi}
129*62c56f98SSadaf Ebrahimi
130*62c56f98SSadaf Ebrahimi# list_test_case lists all potential test cases in compat.sh without execution
131*62c56f98SSadaf Ebrahimilist_test_case() {
132*62c56f98SSadaf Ebrahimi    reset_ciphersuites
133*62c56f98SSadaf Ebrahimi    for TYPE in $TYPES; do
134*62c56f98SSadaf Ebrahimi        add_common_ciphersuites
135*62c56f98SSadaf Ebrahimi        add_openssl_ciphersuites
136*62c56f98SSadaf Ebrahimi        add_gnutls_ciphersuites
137*62c56f98SSadaf Ebrahimi        add_mbedtls_ciphersuites
138*62c56f98SSadaf Ebrahimi    done
139*62c56f98SSadaf Ebrahimi
140*62c56f98SSadaf Ebrahimi    for VERIFY in $VERIFIES; do
141*62c56f98SSadaf Ebrahimi        VERIF=$(echo $VERIFY | tr '[:upper:]' '[:lower:]')
142*62c56f98SSadaf Ebrahimi        for MODE in $MODES; do
143*62c56f98SSadaf Ebrahimi            print_test_case m O "$O_CIPHERS"
144*62c56f98SSadaf Ebrahimi            print_test_case O m "$O_CIPHERS"
145*62c56f98SSadaf Ebrahimi            print_test_case m G "$G_CIPHERS"
146*62c56f98SSadaf Ebrahimi            print_test_case G m "$G_CIPHERS"
147*62c56f98SSadaf Ebrahimi            print_test_case m m "$M_CIPHERS"
148*62c56f98SSadaf Ebrahimi        done
149*62c56f98SSadaf Ebrahimi    done
150*62c56f98SSadaf Ebrahimi}
151*62c56f98SSadaf Ebrahimi
152*62c56f98SSadaf Ebrahimiget_options() {
153*62c56f98SSadaf Ebrahimi    while [ $# -gt 0 ]; do
154*62c56f98SSadaf Ebrahimi        case "$1" in
155*62c56f98SSadaf Ebrahimi            -f|--filter)
156*62c56f98SSadaf Ebrahimi                shift; FILTER=$1
157*62c56f98SSadaf Ebrahimi                ;;
158*62c56f98SSadaf Ebrahimi            -e|--exclude)
159*62c56f98SSadaf Ebrahimi                shift; EXCLUDE=$1
160*62c56f98SSadaf Ebrahimi                ;;
161*62c56f98SSadaf Ebrahimi            -m|--modes)
162*62c56f98SSadaf Ebrahimi                shift; MODES=$1
163*62c56f98SSadaf Ebrahimi                ;;
164*62c56f98SSadaf Ebrahimi            -t|--types)
165*62c56f98SSadaf Ebrahimi                shift; TYPES=$1
166*62c56f98SSadaf Ebrahimi                ;;
167*62c56f98SSadaf Ebrahimi            -V|--verify)
168*62c56f98SSadaf Ebrahimi                shift; VERIFIES=$1
169*62c56f98SSadaf Ebrahimi                ;;
170*62c56f98SSadaf Ebrahimi            -p|--peers)
171*62c56f98SSadaf Ebrahimi                shift; PEERS=$1
172*62c56f98SSadaf Ebrahimi                ;;
173*62c56f98SSadaf Ebrahimi            -v|--verbose)
174*62c56f98SSadaf Ebrahimi                VERBOSE=1
175*62c56f98SSadaf Ebrahimi                ;;
176*62c56f98SSadaf Ebrahimi            -M|--memcheck)
177*62c56f98SSadaf Ebrahimi                MEMCHECK=1
178*62c56f98SSadaf Ebrahimi                ;;
179*62c56f98SSadaf Ebrahimi            # Please check scripts/check_test_cases.py correspondingly
180*62c56f98SSadaf Ebrahimi            # if you have to modify option, --list-test-case
181*62c56f98SSadaf Ebrahimi            --list-test-case)
182*62c56f98SSadaf Ebrahimi                list_test_case
183*62c56f98SSadaf Ebrahimi                exit $?
184*62c56f98SSadaf Ebrahimi                ;;
185*62c56f98SSadaf Ebrahimi            --outcome-file)
186*62c56f98SSadaf Ebrahimi                shift; MBEDTLS_TEST_OUTCOME_FILE=$1
187*62c56f98SSadaf Ebrahimi                ;;
188*62c56f98SSadaf Ebrahimi            -h|--help)
189*62c56f98SSadaf Ebrahimi                print_usage
190*62c56f98SSadaf Ebrahimi                exit 0
191*62c56f98SSadaf Ebrahimi                ;;
192*62c56f98SSadaf Ebrahimi            *)
193*62c56f98SSadaf Ebrahimi                echo "Unknown argument: '$1'"
194*62c56f98SSadaf Ebrahimi                print_usage
195*62c56f98SSadaf Ebrahimi                exit 1
196*62c56f98SSadaf Ebrahimi                ;;
197*62c56f98SSadaf Ebrahimi        esac
198*62c56f98SSadaf Ebrahimi        shift
199*62c56f98SSadaf Ebrahimi    done
200*62c56f98SSadaf Ebrahimi
201*62c56f98SSadaf Ebrahimi    # sanitize some options (modes checked later)
202*62c56f98SSadaf Ebrahimi    VERIFIES="$( echo $VERIFIES | tr [a-z] [A-Z] )"
203*62c56f98SSadaf Ebrahimi    TYPES="$( echo $TYPES | tr [a-z] [A-Z] )"
204*62c56f98SSadaf Ebrahimi}
205*62c56f98SSadaf Ebrahimi
206*62c56f98SSadaf Ebrahimilog() {
207*62c56f98SSadaf Ebrahimi  if [ "X" != "X$VERBOSE" ]; then
208*62c56f98SSadaf Ebrahimi    echo ""
209*62c56f98SSadaf Ebrahimi    echo "$@"
210*62c56f98SSadaf Ebrahimi  fi
211*62c56f98SSadaf Ebrahimi}
212*62c56f98SSadaf Ebrahimi
213*62c56f98SSadaf Ebrahimi# is_dtls <mode>
214*62c56f98SSadaf Ebrahimiis_dtls()
215*62c56f98SSadaf Ebrahimi{
216*62c56f98SSadaf Ebrahimi    test "$1" = "dtls12"
217*62c56f98SSadaf Ebrahimi}
218*62c56f98SSadaf Ebrahimi
219*62c56f98SSadaf Ebrahimi# minor_ver <mode>
220*62c56f98SSadaf Ebrahimiminor_ver()
221*62c56f98SSadaf Ebrahimi{
222*62c56f98SSadaf Ebrahimi    case "$1" in
223*62c56f98SSadaf Ebrahimi        tls12|dtls12)
224*62c56f98SSadaf Ebrahimi            echo 3
225*62c56f98SSadaf Ebrahimi            ;;
226*62c56f98SSadaf Ebrahimi        *)
227*62c56f98SSadaf Ebrahimi            echo "error: invalid mode: $MODE" >&2
228*62c56f98SSadaf Ebrahimi            # exiting is no good here, typically called in a subshell
229*62c56f98SSadaf Ebrahimi            echo -1
230*62c56f98SSadaf Ebrahimi    esac
231*62c56f98SSadaf Ebrahimi}
232*62c56f98SSadaf Ebrahimi
233*62c56f98SSadaf Ebrahimifilter()
234*62c56f98SSadaf Ebrahimi{
235*62c56f98SSadaf Ebrahimi  LIST="$1"
236*62c56f98SSadaf Ebrahimi  NEW_LIST=""
237*62c56f98SSadaf Ebrahimi
238*62c56f98SSadaf Ebrahimi  EXCLMODE="$EXCLUDE"
239*62c56f98SSadaf Ebrahimi
240*62c56f98SSadaf Ebrahimi  for i in $LIST;
241*62c56f98SSadaf Ebrahimi  do
242*62c56f98SSadaf Ebrahimi    NEW_LIST="$NEW_LIST $( echo "$i" | grep "$FILTER" | grep -v "$EXCLMODE" )"
243*62c56f98SSadaf Ebrahimi  done
244*62c56f98SSadaf Ebrahimi
245*62c56f98SSadaf Ebrahimi  # normalize whitespace
246*62c56f98SSadaf Ebrahimi  echo "$NEW_LIST" | sed -e 's/[[:space:]][[:space:]]*/ /g' -e 's/^ //' -e 's/ $//'
247*62c56f98SSadaf Ebrahimi}
248*62c56f98SSadaf Ebrahimi
249*62c56f98SSadaf Ebrahimifilter_ciphersuites()
250*62c56f98SSadaf Ebrahimi{
251*62c56f98SSadaf Ebrahimi    if [ "X" != "X$FILTER" -o "X" != "X$EXCLUDE" ];
252*62c56f98SSadaf Ebrahimi    then
253*62c56f98SSadaf Ebrahimi        # Ciphersuite for Mbed TLS
254*62c56f98SSadaf Ebrahimi        M_CIPHERS=$( filter "$M_CIPHERS" )
255*62c56f98SSadaf Ebrahimi
256*62c56f98SSadaf Ebrahimi        # Ciphersuite for OpenSSL
257*62c56f98SSadaf Ebrahimi        O_CIPHERS=$( filter "$O_CIPHERS" )
258*62c56f98SSadaf Ebrahimi
259*62c56f98SSadaf Ebrahimi        # Ciphersuite for GnuTLS
260*62c56f98SSadaf Ebrahimi        G_CIPHERS=$( filter "$G_CIPHERS" )
261*62c56f98SSadaf Ebrahimi    fi
262*62c56f98SSadaf Ebrahimi
263*62c56f98SSadaf Ebrahimi    # For GnuTLS client -> Mbed TLS server,
264*62c56f98SSadaf Ebrahimi    # we need to force IPv4 by connecting to 127.0.0.1 but then auth fails
265*62c56f98SSadaf Ebrahimi    if is_dtls "$MODE" && [ "X$VERIFY" = "XYES" ]; then
266*62c56f98SSadaf Ebrahimi        G_CIPHERS=""
267*62c56f98SSadaf Ebrahimi    fi
268*62c56f98SSadaf Ebrahimi}
269*62c56f98SSadaf Ebrahimi
270*62c56f98SSadaf Ebrahimireset_ciphersuites()
271*62c56f98SSadaf Ebrahimi{
272*62c56f98SSadaf Ebrahimi    M_CIPHERS=""
273*62c56f98SSadaf Ebrahimi    O_CIPHERS=""
274*62c56f98SSadaf Ebrahimi    G_CIPHERS=""
275*62c56f98SSadaf Ebrahimi}
276*62c56f98SSadaf Ebrahimi
277*62c56f98SSadaf Ebrahimi# translate_ciphers {g|m|o} {STANDARD_CIPHER_SUITE_NAME...}
278*62c56f98SSadaf Ebrahimi# Set $ciphers to the cipher suite name translations for the specified
279*62c56f98SSadaf Ebrahimi# program (gnutls, mbedtls or openssl). $ciphers is a space-separated
280*62c56f98SSadaf Ebrahimi# list of entries of the form "STANDARD_NAME=PROGRAM_NAME".
281*62c56f98SSadaf Ebrahimitranslate_ciphers()
282*62c56f98SSadaf Ebrahimi{
283*62c56f98SSadaf Ebrahimi    ciphers=$(scripts/translate_ciphers.py "$@")
284*62c56f98SSadaf Ebrahimi    if [ $? -ne 0 ]; then
285*62c56f98SSadaf Ebrahimi        echo "translate_ciphers.py failed with exit code $1" >&2
286*62c56f98SSadaf Ebrahimi        echo "$2" >&2
287*62c56f98SSadaf Ebrahimi        exit 1
288*62c56f98SSadaf Ebrahimi    fi
289*62c56f98SSadaf Ebrahimi}
290*62c56f98SSadaf Ebrahimi
291*62c56f98SSadaf Ebrahimi# Ciphersuites that can be used with all peers.
292*62c56f98SSadaf Ebrahimi# Since we currently have three possible peers, each ciphersuite should appear
293*62c56f98SSadaf Ebrahimi# three times: in each peer's list (with the name that this peer uses).
294*62c56f98SSadaf Ebrahimiadd_common_ciphersuites()
295*62c56f98SSadaf Ebrahimi{
296*62c56f98SSadaf Ebrahimi    CIPHERS=""
297*62c56f98SSadaf Ebrahimi    case $TYPE in
298*62c56f98SSadaf Ebrahimi
299*62c56f98SSadaf Ebrahimi        "ECDSA")
300*62c56f98SSadaf Ebrahimi            CIPHERS="$CIPHERS                           \
301*62c56f98SSadaf Ebrahimi                TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA    \
302*62c56f98SSadaf Ebrahimi                TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 \
303*62c56f98SSadaf Ebrahimi                TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 \
304*62c56f98SSadaf Ebrahimi                TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA    \
305*62c56f98SSadaf Ebrahimi                TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 \
306*62c56f98SSadaf Ebrahimi                TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 \
307*62c56f98SSadaf Ebrahimi                TLS_ECDHE_ECDSA_WITH_NULL_SHA           \
308*62c56f98SSadaf Ebrahimi                "
309*62c56f98SSadaf Ebrahimi            ;;
310*62c56f98SSadaf Ebrahimi
311*62c56f98SSadaf Ebrahimi        "RSA")
312*62c56f98SSadaf Ebrahimi            CIPHERS="$CIPHERS                           \
313*62c56f98SSadaf Ebrahimi                TLS_DHE_RSA_WITH_AES_128_CBC_SHA        \
314*62c56f98SSadaf Ebrahimi                TLS_DHE_RSA_WITH_AES_128_CBC_SHA256     \
315*62c56f98SSadaf Ebrahimi                TLS_DHE_RSA_WITH_AES_128_GCM_SHA256     \
316*62c56f98SSadaf Ebrahimi                TLS_DHE_RSA_WITH_AES_256_CBC_SHA        \
317*62c56f98SSadaf Ebrahimi                TLS_DHE_RSA_WITH_AES_256_CBC_SHA256     \
318*62c56f98SSadaf Ebrahimi                TLS_DHE_RSA_WITH_AES_256_GCM_SHA384     \
319*62c56f98SSadaf Ebrahimi                TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA   \
320*62c56f98SSadaf Ebrahimi                TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA   \
321*62c56f98SSadaf Ebrahimi                TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA      \
322*62c56f98SSadaf Ebrahimi                TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256   \
323*62c56f98SSadaf Ebrahimi                TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256   \
324*62c56f98SSadaf Ebrahimi                TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA      \
325*62c56f98SSadaf Ebrahimi                TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384   \
326*62c56f98SSadaf Ebrahimi                TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384   \
327*62c56f98SSadaf Ebrahimi                TLS_ECDHE_RSA_WITH_NULL_SHA             \
328*62c56f98SSadaf Ebrahimi                TLS_RSA_WITH_AES_128_CBC_SHA            \
329*62c56f98SSadaf Ebrahimi                TLS_RSA_WITH_AES_128_CBC_SHA256         \
330*62c56f98SSadaf Ebrahimi                TLS_RSA_WITH_AES_128_GCM_SHA256         \
331*62c56f98SSadaf Ebrahimi                TLS_RSA_WITH_AES_256_CBC_SHA            \
332*62c56f98SSadaf Ebrahimi                TLS_RSA_WITH_AES_256_CBC_SHA256         \
333*62c56f98SSadaf Ebrahimi                TLS_RSA_WITH_AES_256_GCM_SHA384         \
334*62c56f98SSadaf Ebrahimi                TLS_RSA_WITH_CAMELLIA_128_CBC_SHA       \
335*62c56f98SSadaf Ebrahimi                TLS_RSA_WITH_CAMELLIA_256_CBC_SHA       \
336*62c56f98SSadaf Ebrahimi                TLS_RSA_WITH_NULL_MD5                   \
337*62c56f98SSadaf Ebrahimi                TLS_RSA_WITH_NULL_SHA                   \
338*62c56f98SSadaf Ebrahimi                TLS_RSA_WITH_NULL_SHA256                \
339*62c56f98SSadaf Ebrahimi                "
340*62c56f98SSadaf Ebrahimi            ;;
341*62c56f98SSadaf Ebrahimi
342*62c56f98SSadaf Ebrahimi        "PSK")
343*62c56f98SSadaf Ebrahimi            CIPHERS="$CIPHERS                           \
344*62c56f98SSadaf Ebrahimi                TLS_PSK_WITH_AES_128_CBC_SHA            \
345*62c56f98SSadaf Ebrahimi                TLS_PSK_WITH_AES_256_CBC_SHA            \
346*62c56f98SSadaf Ebrahimi                "
347*62c56f98SSadaf Ebrahimi            ;;
348*62c56f98SSadaf Ebrahimi    esac
349*62c56f98SSadaf Ebrahimi
350*62c56f98SSadaf Ebrahimi    O_CIPHERS="$O_CIPHERS $CIPHERS"
351*62c56f98SSadaf Ebrahimi    G_CIPHERS="$G_CIPHERS $CIPHERS"
352*62c56f98SSadaf Ebrahimi    M_CIPHERS="$M_CIPHERS $CIPHERS"
353*62c56f98SSadaf Ebrahimi}
354*62c56f98SSadaf Ebrahimi
355*62c56f98SSadaf Ebrahimi# Ciphersuites usable only with Mbed TLS and OpenSSL
356*62c56f98SSadaf Ebrahimi# A list of ciphersuites in the standard naming convention is appended
357*62c56f98SSadaf Ebrahimi# to the list of Mbed TLS ciphersuites $M_CIPHERS and
358*62c56f98SSadaf Ebrahimi# to the list of OpenSSL ciphersuites $O_CIPHERS respectively.
359*62c56f98SSadaf Ebrahimi# Based on client's naming convention, all ciphersuite names will be
360*62c56f98SSadaf Ebrahimi# translated into another naming format before sent to the client.
361*62c56f98SSadaf Ebrahimi#
362*62c56f98SSadaf Ebrahimi# NOTE: for some reason RSA-PSK doesn't work with OpenSSL,
363*62c56f98SSadaf Ebrahimi# so RSA-PSK ciphersuites need to go in other sections, see
364*62c56f98SSadaf Ebrahimi# https://github.com/Mbed-TLS/mbedtls/issues/1419
365*62c56f98SSadaf Ebrahimi#
366*62c56f98SSadaf Ebrahimi# ChachaPoly suites are here rather than in "common", as they were added in
367*62c56f98SSadaf Ebrahimi# GnuTLS in 3.5.0 and the CI only has 3.4.x so far.
368*62c56f98SSadaf Ebrahimiadd_openssl_ciphersuites()
369*62c56f98SSadaf Ebrahimi{
370*62c56f98SSadaf Ebrahimi    CIPHERS=""
371*62c56f98SSadaf Ebrahimi    case $TYPE in
372*62c56f98SSadaf Ebrahimi
373*62c56f98SSadaf Ebrahimi        "ECDSA")
374*62c56f98SSadaf Ebrahimi            CIPHERS="$CIPHERS                                   \
375*62c56f98SSadaf Ebrahimi                TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA             \
376*62c56f98SSadaf Ebrahimi                TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256          \
377*62c56f98SSadaf Ebrahimi                TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256          \
378*62c56f98SSadaf Ebrahimi                TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA             \
379*62c56f98SSadaf Ebrahimi                TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384          \
380*62c56f98SSadaf Ebrahimi                TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384          \
381*62c56f98SSadaf Ebrahimi                TLS_ECDH_ECDSA_WITH_NULL_SHA                    \
382*62c56f98SSadaf Ebrahimi                TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256        \
383*62c56f98SSadaf Ebrahimi                TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384        \
384*62c56f98SSadaf Ebrahimi                TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256   \
385*62c56f98SSadaf Ebrahimi                "
386*62c56f98SSadaf Ebrahimi            ;;
387*62c56f98SSadaf Ebrahimi
388*62c56f98SSadaf Ebrahimi        "RSA")
389*62c56f98SSadaf Ebrahimi            CIPHERS="$CIPHERS                                   \
390*62c56f98SSadaf Ebrahimi                TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256            \
391*62c56f98SSadaf Ebrahimi                TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384            \
392*62c56f98SSadaf Ebrahimi                TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256       \
393*62c56f98SSadaf Ebrahimi                TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256          \
394*62c56f98SSadaf Ebrahimi                TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384          \
395*62c56f98SSadaf Ebrahimi                TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256     \
396*62c56f98SSadaf Ebrahimi                TLS_RSA_WITH_ARIA_128_GCM_SHA256                \
397*62c56f98SSadaf Ebrahimi                TLS_RSA_WITH_ARIA_256_GCM_SHA384                \
398*62c56f98SSadaf Ebrahimi                "
399*62c56f98SSadaf Ebrahimi            ;;
400*62c56f98SSadaf Ebrahimi
401*62c56f98SSadaf Ebrahimi        "PSK")
402*62c56f98SSadaf Ebrahimi            CIPHERS="$CIPHERS                                   \
403*62c56f98SSadaf Ebrahimi                TLS_DHE_PSK_WITH_ARIA_128_GCM_SHA256            \
404*62c56f98SSadaf Ebrahimi                TLS_DHE_PSK_WITH_ARIA_256_GCM_SHA384            \
405*62c56f98SSadaf Ebrahimi                TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256       \
406*62c56f98SSadaf Ebrahimi                TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256     \
407*62c56f98SSadaf Ebrahimi                TLS_PSK_WITH_ARIA_128_GCM_SHA256                \
408*62c56f98SSadaf Ebrahimi                TLS_PSK_WITH_ARIA_256_GCM_SHA384                \
409*62c56f98SSadaf Ebrahimi                TLS_PSK_WITH_CHACHA20_POLY1305_SHA256           \
410*62c56f98SSadaf Ebrahimi                "
411*62c56f98SSadaf Ebrahimi            ;;
412*62c56f98SSadaf Ebrahimi    esac
413*62c56f98SSadaf Ebrahimi
414*62c56f98SSadaf Ebrahimi    O_CIPHERS="$O_CIPHERS $CIPHERS"
415*62c56f98SSadaf Ebrahimi    M_CIPHERS="$M_CIPHERS $CIPHERS"
416*62c56f98SSadaf Ebrahimi}
417*62c56f98SSadaf Ebrahimi
418*62c56f98SSadaf Ebrahimi# Ciphersuites usable only with Mbed TLS and GnuTLS
419*62c56f98SSadaf Ebrahimi# A list of ciphersuites in the standard naming convention is appended
420*62c56f98SSadaf Ebrahimi# to the list of Mbed TLS ciphersuites $M_CIPHERS and
421*62c56f98SSadaf Ebrahimi# to the list of GnuTLS ciphersuites $G_CIPHERS respectively.
422*62c56f98SSadaf Ebrahimi# Based on client's naming convention, all ciphersuite names will be
423*62c56f98SSadaf Ebrahimi# translated into another naming format before sent to the client.
424*62c56f98SSadaf Ebrahimiadd_gnutls_ciphersuites()
425*62c56f98SSadaf Ebrahimi{
426*62c56f98SSadaf Ebrahimi    CIPHERS=""
427*62c56f98SSadaf Ebrahimi    case $TYPE in
428*62c56f98SSadaf Ebrahimi
429*62c56f98SSadaf Ebrahimi        "ECDSA")
430*62c56f98SSadaf Ebrahimi            CIPHERS="$CIPHERS                                       \
431*62c56f98SSadaf Ebrahimi                TLS_ECDHE_ECDSA_WITH_AES_128_CCM                    \
432*62c56f98SSadaf Ebrahimi                TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8                  \
433*62c56f98SSadaf Ebrahimi                TLS_ECDHE_ECDSA_WITH_AES_256_CCM                    \
434*62c56f98SSadaf Ebrahimi                TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8                  \
435*62c56f98SSadaf Ebrahimi                TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256        \
436*62c56f98SSadaf Ebrahimi                TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256        \
437*62c56f98SSadaf Ebrahimi                TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384        \
438*62c56f98SSadaf Ebrahimi                TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384        \
439*62c56f98SSadaf Ebrahimi                "
440*62c56f98SSadaf Ebrahimi            ;;
441*62c56f98SSadaf Ebrahimi
442*62c56f98SSadaf Ebrahimi        "RSA")
443*62c56f98SSadaf Ebrahimi            CIPHERS="$CIPHERS                               \
444*62c56f98SSadaf Ebrahimi                TLS_DHE_RSA_WITH_AES_128_CCM                \
445*62c56f98SSadaf Ebrahimi                TLS_DHE_RSA_WITH_AES_128_CCM_8              \
446*62c56f98SSadaf Ebrahimi                TLS_DHE_RSA_WITH_AES_256_CCM                \
447*62c56f98SSadaf Ebrahimi                TLS_DHE_RSA_WITH_AES_256_CCM_8              \
448*62c56f98SSadaf Ebrahimi                TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256    \
449*62c56f98SSadaf Ebrahimi                TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256    \
450*62c56f98SSadaf Ebrahimi                TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256    \
451*62c56f98SSadaf Ebrahimi                TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384    \
452*62c56f98SSadaf Ebrahimi                TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256  \
453*62c56f98SSadaf Ebrahimi                TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256  \
454*62c56f98SSadaf Ebrahimi                TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384  \
455*62c56f98SSadaf Ebrahimi                TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384  \
456*62c56f98SSadaf Ebrahimi                TLS_RSA_WITH_AES_128_CCM                    \
457*62c56f98SSadaf Ebrahimi                TLS_RSA_WITH_AES_128_CCM_8                  \
458*62c56f98SSadaf Ebrahimi                TLS_RSA_WITH_AES_256_CCM                    \
459*62c56f98SSadaf Ebrahimi                TLS_RSA_WITH_AES_256_CCM_8                  \
460*62c56f98SSadaf Ebrahimi                TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256        \
461*62c56f98SSadaf Ebrahimi                TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256        \
462*62c56f98SSadaf Ebrahimi                TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256        \
463*62c56f98SSadaf Ebrahimi                TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384        \
464*62c56f98SSadaf Ebrahimi                "
465*62c56f98SSadaf Ebrahimi            ;;
466*62c56f98SSadaf Ebrahimi
467*62c56f98SSadaf Ebrahimi        "PSK")
468*62c56f98SSadaf Ebrahimi            CIPHERS="$CIPHERS                               \
469*62c56f98SSadaf Ebrahimi                TLS_DHE_PSK_WITH_AES_128_CBC_SHA            \
470*62c56f98SSadaf Ebrahimi                TLS_DHE_PSK_WITH_AES_128_CBC_SHA256         \
471*62c56f98SSadaf Ebrahimi                TLS_DHE_PSK_WITH_AES_128_CCM                \
472*62c56f98SSadaf Ebrahimi                TLS_DHE_PSK_WITH_AES_128_CCM_8              \
473*62c56f98SSadaf Ebrahimi                TLS_DHE_PSK_WITH_AES_128_GCM_SHA256         \
474*62c56f98SSadaf Ebrahimi                TLS_DHE_PSK_WITH_AES_256_CBC_SHA            \
475*62c56f98SSadaf Ebrahimi                TLS_DHE_PSK_WITH_AES_256_CBC_SHA384         \
476*62c56f98SSadaf Ebrahimi                TLS_DHE_PSK_WITH_AES_256_CCM                \
477*62c56f98SSadaf Ebrahimi                TLS_DHE_PSK_WITH_AES_256_CCM_8              \
478*62c56f98SSadaf Ebrahimi                TLS_DHE_PSK_WITH_AES_256_GCM_SHA384         \
479*62c56f98SSadaf Ebrahimi                TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256    \
480*62c56f98SSadaf Ebrahimi                TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256    \
481*62c56f98SSadaf Ebrahimi                TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384    \
482*62c56f98SSadaf Ebrahimi                TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384    \
483*62c56f98SSadaf Ebrahimi                TLS_DHE_PSK_WITH_NULL_SHA256                \
484*62c56f98SSadaf Ebrahimi                TLS_DHE_PSK_WITH_NULL_SHA384                \
485*62c56f98SSadaf Ebrahimi                TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA          \
486*62c56f98SSadaf Ebrahimi                TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256       \
487*62c56f98SSadaf Ebrahimi                TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA          \
488*62c56f98SSadaf Ebrahimi                TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384       \
489*62c56f98SSadaf Ebrahimi                TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256  \
490*62c56f98SSadaf Ebrahimi                TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384  \
491*62c56f98SSadaf Ebrahimi                TLS_ECDHE_PSK_WITH_NULL_SHA256              \
492*62c56f98SSadaf Ebrahimi                TLS_ECDHE_PSK_WITH_NULL_SHA384              \
493*62c56f98SSadaf Ebrahimi                TLS_PSK_WITH_AES_128_CBC_SHA256             \
494*62c56f98SSadaf Ebrahimi                TLS_PSK_WITH_AES_128_CCM                    \
495*62c56f98SSadaf Ebrahimi                TLS_PSK_WITH_AES_128_CCM_8                  \
496*62c56f98SSadaf Ebrahimi                TLS_PSK_WITH_AES_128_GCM_SHA256             \
497*62c56f98SSadaf Ebrahimi                TLS_PSK_WITH_AES_256_CBC_SHA384             \
498*62c56f98SSadaf Ebrahimi                TLS_PSK_WITH_AES_256_CCM                    \
499*62c56f98SSadaf Ebrahimi                TLS_PSK_WITH_AES_256_CCM_8                  \
500*62c56f98SSadaf Ebrahimi                TLS_PSK_WITH_AES_256_GCM_SHA384             \
501*62c56f98SSadaf Ebrahimi                TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256        \
502*62c56f98SSadaf Ebrahimi                TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256        \
503*62c56f98SSadaf Ebrahimi                TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384        \
504*62c56f98SSadaf Ebrahimi                TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384        \
505*62c56f98SSadaf Ebrahimi                TLS_PSK_WITH_NULL_SHA256                    \
506*62c56f98SSadaf Ebrahimi                TLS_PSK_WITH_NULL_SHA384                    \
507*62c56f98SSadaf Ebrahimi                TLS_RSA_PSK_WITH_AES_128_CBC_SHA            \
508*62c56f98SSadaf Ebrahimi                TLS_RSA_PSK_WITH_AES_128_CBC_SHA256         \
509*62c56f98SSadaf Ebrahimi                TLS_RSA_PSK_WITH_AES_128_GCM_SHA256         \
510*62c56f98SSadaf Ebrahimi                TLS_RSA_PSK_WITH_AES_256_CBC_SHA            \
511*62c56f98SSadaf Ebrahimi                TLS_RSA_PSK_WITH_AES_256_CBC_SHA384         \
512*62c56f98SSadaf Ebrahimi                TLS_RSA_PSK_WITH_AES_256_GCM_SHA384         \
513*62c56f98SSadaf Ebrahimi                TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256    \
514*62c56f98SSadaf Ebrahimi                TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256    \
515*62c56f98SSadaf Ebrahimi                TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384    \
516*62c56f98SSadaf Ebrahimi                TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384    \
517*62c56f98SSadaf Ebrahimi                TLS_RSA_PSK_WITH_NULL_SHA256                \
518*62c56f98SSadaf Ebrahimi                TLS_RSA_PSK_WITH_NULL_SHA384                \
519*62c56f98SSadaf Ebrahimi                "
520*62c56f98SSadaf Ebrahimi            ;;
521*62c56f98SSadaf Ebrahimi    esac
522*62c56f98SSadaf Ebrahimi
523*62c56f98SSadaf Ebrahimi    G_CIPHERS="$G_CIPHERS $CIPHERS"
524*62c56f98SSadaf Ebrahimi    M_CIPHERS="$M_CIPHERS $CIPHERS"
525*62c56f98SSadaf Ebrahimi}
526*62c56f98SSadaf Ebrahimi
527*62c56f98SSadaf Ebrahimi# Ciphersuites usable only with Mbed TLS (not currently supported by another
528*62c56f98SSadaf Ebrahimi# peer usable in this script). This provides only very rudimentaty testing, as
529*62c56f98SSadaf Ebrahimi# this is not interop testing, but it's better than nothing.
530*62c56f98SSadaf Ebrahimiadd_mbedtls_ciphersuites()
531*62c56f98SSadaf Ebrahimi{
532*62c56f98SSadaf Ebrahimi    case $TYPE in
533*62c56f98SSadaf Ebrahimi
534*62c56f98SSadaf Ebrahimi        "ECDSA")
535*62c56f98SSadaf Ebrahimi            M_CIPHERS="$M_CIPHERS                               \
536*62c56f98SSadaf Ebrahimi                TLS_ECDH_ECDSA_WITH_ARIA_128_CBC_SHA256         \
537*62c56f98SSadaf Ebrahimi                TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256         \
538*62c56f98SSadaf Ebrahimi                TLS_ECDH_ECDSA_WITH_ARIA_256_CBC_SHA384         \
539*62c56f98SSadaf Ebrahimi                TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384         \
540*62c56f98SSadaf Ebrahimi                TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256     \
541*62c56f98SSadaf Ebrahimi                TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256     \
542*62c56f98SSadaf Ebrahimi                TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384     \
543*62c56f98SSadaf Ebrahimi                TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384     \
544*62c56f98SSadaf Ebrahimi                TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256        \
545*62c56f98SSadaf Ebrahimi                TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384        \
546*62c56f98SSadaf Ebrahimi                "
547*62c56f98SSadaf Ebrahimi            ;;
548*62c56f98SSadaf Ebrahimi
549*62c56f98SSadaf Ebrahimi        "RSA")
550*62c56f98SSadaf Ebrahimi            M_CIPHERS="$M_CIPHERS                               \
551*62c56f98SSadaf Ebrahimi                TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256            \
552*62c56f98SSadaf Ebrahimi                TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384            \
553*62c56f98SSadaf Ebrahimi                TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256          \
554*62c56f98SSadaf Ebrahimi                TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384          \
555*62c56f98SSadaf Ebrahimi                TLS_RSA_WITH_ARIA_128_CBC_SHA256                \
556*62c56f98SSadaf Ebrahimi                TLS_RSA_WITH_ARIA_256_CBC_SHA384                \
557*62c56f98SSadaf Ebrahimi                "
558*62c56f98SSadaf Ebrahimi            ;;
559*62c56f98SSadaf Ebrahimi
560*62c56f98SSadaf Ebrahimi        "PSK")
561*62c56f98SSadaf Ebrahimi            # *PSK_NULL_SHA suites supported by GnuTLS 3.3.5 but not 3.2.15
562*62c56f98SSadaf Ebrahimi            M_CIPHERS="$M_CIPHERS                               \
563*62c56f98SSadaf Ebrahimi                TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256            \
564*62c56f98SSadaf Ebrahimi                TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384            \
565*62c56f98SSadaf Ebrahimi                TLS_DHE_PSK_WITH_NULL_SHA                       \
566*62c56f98SSadaf Ebrahimi                TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256          \
567*62c56f98SSadaf Ebrahimi                TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384          \
568*62c56f98SSadaf Ebrahimi                TLS_ECDHE_PSK_WITH_NULL_SHA                     \
569*62c56f98SSadaf Ebrahimi                TLS_PSK_WITH_ARIA_128_CBC_SHA256                \
570*62c56f98SSadaf Ebrahimi                TLS_PSK_WITH_ARIA_256_CBC_SHA384                \
571*62c56f98SSadaf Ebrahimi                TLS_PSK_WITH_NULL_SHA                           \
572*62c56f98SSadaf Ebrahimi                TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256            \
573*62c56f98SSadaf Ebrahimi                TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256            \
574*62c56f98SSadaf Ebrahimi                TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384            \
575*62c56f98SSadaf Ebrahimi                TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384            \
576*62c56f98SSadaf Ebrahimi                TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256       \
577*62c56f98SSadaf Ebrahimi                TLS_RSA_PSK_WITH_NULL_SHA                       \
578*62c56f98SSadaf Ebrahimi                "
579*62c56f98SSadaf Ebrahimi            ;;
580*62c56f98SSadaf Ebrahimi    esac
581*62c56f98SSadaf Ebrahimi}
582*62c56f98SSadaf Ebrahimi
583*62c56f98SSadaf Ebrahimi# o_check_ciphersuite STANDARD_CIPHER_SUITE
584*62c56f98SSadaf Ebrahimio_check_ciphersuite()
585*62c56f98SSadaf Ebrahimi{
586*62c56f98SSadaf Ebrahimi    if [ "${O_SUPPORT_ECDH}" = "NO" ]; then
587*62c56f98SSadaf Ebrahimi        case "$1" in
588*62c56f98SSadaf Ebrahimi            *ECDH_*) SKIP_NEXT="YES"
589*62c56f98SSadaf Ebrahimi        esac
590*62c56f98SSadaf Ebrahimi    fi
591*62c56f98SSadaf Ebrahimi}
592*62c56f98SSadaf Ebrahimi
593*62c56f98SSadaf Ebrahimisetup_arguments()
594*62c56f98SSadaf Ebrahimi{
595*62c56f98SSadaf Ebrahimi    O_MODE=""
596*62c56f98SSadaf Ebrahimi    G_MODE=""
597*62c56f98SSadaf Ebrahimi    case "$MODE" in
598*62c56f98SSadaf Ebrahimi        "tls12")
599*62c56f98SSadaf Ebrahimi            O_MODE="tls1_2"
600*62c56f98SSadaf Ebrahimi            G_PRIO_MODE="+VERS-TLS1.2"
601*62c56f98SSadaf Ebrahimi            ;;
602*62c56f98SSadaf Ebrahimi        "dtls12")
603*62c56f98SSadaf Ebrahimi            O_MODE="dtls1_2"
604*62c56f98SSadaf Ebrahimi            G_PRIO_MODE="+VERS-DTLS1.2"
605*62c56f98SSadaf Ebrahimi            G_MODE="-u"
606*62c56f98SSadaf Ebrahimi            ;;
607*62c56f98SSadaf Ebrahimi        *)
608*62c56f98SSadaf Ebrahimi            echo "error: invalid mode: $MODE" >&2
609*62c56f98SSadaf Ebrahimi            exit 1;
610*62c56f98SSadaf Ebrahimi    esac
611*62c56f98SSadaf Ebrahimi
612*62c56f98SSadaf Ebrahimi    # GnuTLS < 3.4 will choke if we try to allow CCM-8
613*62c56f98SSadaf Ebrahimi    if [ -z "${GNUTLS_MINOR_LT_FOUR-}" ]; then
614*62c56f98SSadaf Ebrahimi        G_PRIO_CCM="+AES-256-CCM-8:+AES-128-CCM-8:"
615*62c56f98SSadaf Ebrahimi    else
616*62c56f98SSadaf Ebrahimi        G_PRIO_CCM=""
617*62c56f98SSadaf Ebrahimi    fi
618*62c56f98SSadaf Ebrahimi
619*62c56f98SSadaf Ebrahimi    M_SERVER_ARGS="server_port=$PORT server_addr=0.0.0.0 force_version=$MODE"
620*62c56f98SSadaf Ebrahimi    O_SERVER_ARGS="-accept $PORT -cipher NULL,ALL -$O_MODE"
621*62c56f98SSadaf Ebrahimi    G_SERVER_ARGS="-p $PORT --http $G_MODE"
622*62c56f98SSadaf Ebrahimi    G_SERVER_PRIO="NORMAL:${G_PRIO_CCM}+NULL:+MD5:+PSK:+DHE-PSK:+ECDHE-PSK:+SHA256:+SHA384:+RSA-PSK:-VERS-TLS-ALL:$G_PRIO_MODE"
623*62c56f98SSadaf Ebrahimi
624*62c56f98SSadaf Ebrahimi    # The default prime for `openssl s_server` depends on the version:
625*62c56f98SSadaf Ebrahimi    # * OpenSSL <= 1.0.2a: 512-bit
626*62c56f98SSadaf Ebrahimi    # * OpenSSL 1.0.2b to 1.1.1b: 1024-bit
627*62c56f98SSadaf Ebrahimi    # * OpenSSL >= 1.1.1c: 2048-bit
628*62c56f98SSadaf Ebrahimi    # Mbed TLS wants >=1024, so force that for older versions. Don't force
629*62c56f98SSadaf Ebrahimi    # it for newer versions, which reject a 1024-bit prime. Indifferently
630*62c56f98SSadaf Ebrahimi    # force it or not for intermediate versions.
631*62c56f98SSadaf Ebrahimi    case $($OPENSSL version) in
632*62c56f98SSadaf Ebrahimi        "OpenSSL 1.0"*)
633*62c56f98SSadaf Ebrahimi            O_SERVER_ARGS="$O_SERVER_ARGS -dhparam data_files/dhparams.pem"
634*62c56f98SSadaf Ebrahimi            ;;
635*62c56f98SSadaf Ebrahimi    esac
636*62c56f98SSadaf Ebrahimi
637*62c56f98SSadaf Ebrahimi    # with OpenSSL 1.0.1h, -www, -WWW and -HTTP break DTLS handshakes
638*62c56f98SSadaf Ebrahimi    if is_dtls "$MODE"; then
639*62c56f98SSadaf Ebrahimi        O_SERVER_ARGS="$O_SERVER_ARGS"
640*62c56f98SSadaf Ebrahimi    else
641*62c56f98SSadaf Ebrahimi        O_SERVER_ARGS="$O_SERVER_ARGS -www"
642*62c56f98SSadaf Ebrahimi    fi
643*62c56f98SSadaf Ebrahimi
644*62c56f98SSadaf Ebrahimi    M_CLIENT_ARGS="server_port=$PORT server_addr=127.0.0.1 force_version=$MODE"
645*62c56f98SSadaf Ebrahimi    O_CLIENT_ARGS="-connect localhost:$PORT -$O_MODE"
646*62c56f98SSadaf Ebrahimi    G_CLIENT_ARGS="-p $PORT --debug 3 $G_MODE"
647*62c56f98SSadaf Ebrahimi
648*62c56f98SSadaf Ebrahimi    # Newer versions of OpenSSL have a syntax to enable all "ciphers", even
649*62c56f98SSadaf Ebrahimi    # low-security ones. This covers not just cipher suites but also protocol
650*62c56f98SSadaf Ebrahimi    # versions. It is necessary, for example, to use (D)TLS 1.0/1.1 on
651*62c56f98SSadaf Ebrahimi    # OpenSSL 1.1.1f from Ubuntu 20.04. The syntax was only introduced in
652*62c56f98SSadaf Ebrahimi    # OpenSSL 1.1.0 (21e0c1d23afff48601eb93135defddae51f7e2e3) and I can't find
653*62c56f98SSadaf Ebrahimi    # a way to discover it from -help, so check the openssl version.
654*62c56f98SSadaf Ebrahimi    case $($OPENSSL version) in
655*62c56f98SSadaf Ebrahimi        "OpenSSL 0"*|"OpenSSL 1.0"*) :;;
656*62c56f98SSadaf Ebrahimi        *)
657*62c56f98SSadaf Ebrahimi            O_CLIENT_ARGS="$O_CLIENT_ARGS -cipher ALL@SECLEVEL=0"
658*62c56f98SSadaf Ebrahimi            O_SERVER_ARGS="$O_SERVER_ARGS -cipher ALL@SECLEVEL=0"
659*62c56f98SSadaf Ebrahimi            ;;
660*62c56f98SSadaf Ebrahimi    esac
661*62c56f98SSadaf Ebrahimi
662*62c56f98SSadaf Ebrahimi    case $($OPENSSL ciphers ALL) in
663*62c56f98SSadaf Ebrahimi        *ECDH-ECDSA*|*ECDH-RSA*) O_SUPPORT_ECDH="YES";;
664*62c56f98SSadaf Ebrahimi        *) O_SUPPORT_ECDH="NO";;
665*62c56f98SSadaf Ebrahimi    esac
666*62c56f98SSadaf Ebrahimi
667*62c56f98SSadaf Ebrahimi    if [ "X$VERIFY" = "XYES" ];
668*62c56f98SSadaf Ebrahimi    then
669*62c56f98SSadaf Ebrahimi        M_SERVER_ARGS="$M_SERVER_ARGS ca_file=data_files/test-ca_cat12.crt auth_mode=required"
670*62c56f98SSadaf Ebrahimi        O_SERVER_ARGS="$O_SERVER_ARGS -CAfile data_files/test-ca_cat12.crt -Verify 10"
671*62c56f98SSadaf Ebrahimi        G_SERVER_ARGS="$G_SERVER_ARGS --x509cafile data_files/test-ca_cat12.crt --require-client-cert"
672*62c56f98SSadaf Ebrahimi
673*62c56f98SSadaf Ebrahimi        M_CLIENT_ARGS="$M_CLIENT_ARGS ca_file=data_files/test-ca_cat12.crt auth_mode=required"
674*62c56f98SSadaf Ebrahimi        O_CLIENT_ARGS="$O_CLIENT_ARGS -CAfile data_files/test-ca_cat12.crt -verify 10"
675*62c56f98SSadaf Ebrahimi        G_CLIENT_ARGS="$G_CLIENT_ARGS --x509cafile data_files/test-ca_cat12.crt"
676*62c56f98SSadaf Ebrahimi    else
677*62c56f98SSadaf Ebrahimi        # don't request a client cert at all
678*62c56f98SSadaf Ebrahimi        M_SERVER_ARGS="$M_SERVER_ARGS ca_file=none auth_mode=none"
679*62c56f98SSadaf Ebrahimi        G_SERVER_ARGS="$G_SERVER_ARGS --disable-client-cert"
680*62c56f98SSadaf Ebrahimi
681*62c56f98SSadaf Ebrahimi        M_CLIENT_ARGS="$M_CLIENT_ARGS ca_file=none auth_mode=none"
682*62c56f98SSadaf Ebrahimi        O_CLIENT_ARGS="$O_CLIENT_ARGS"
683*62c56f98SSadaf Ebrahimi        G_CLIENT_ARGS="$G_CLIENT_ARGS --insecure"
684*62c56f98SSadaf Ebrahimi    fi
685*62c56f98SSadaf Ebrahimi
686*62c56f98SSadaf Ebrahimi    case $TYPE in
687*62c56f98SSadaf Ebrahimi        "ECDSA")
688*62c56f98SSadaf Ebrahimi            M_SERVER_ARGS="$M_SERVER_ARGS crt_file=data_files/server5.crt key_file=data_files/server5.key"
689*62c56f98SSadaf Ebrahimi            O_SERVER_ARGS="$O_SERVER_ARGS -cert data_files/server5.crt -key data_files/server5.key"
690*62c56f98SSadaf Ebrahimi            G_SERVER_ARGS="$G_SERVER_ARGS --x509certfile data_files/server5.crt --x509keyfile data_files/server5.key"
691*62c56f98SSadaf Ebrahimi
692*62c56f98SSadaf Ebrahimi            if [ "X$VERIFY" = "XYES" ]; then
693*62c56f98SSadaf Ebrahimi                M_CLIENT_ARGS="$M_CLIENT_ARGS crt_file=data_files/server6.crt key_file=data_files/server6.key"
694*62c56f98SSadaf Ebrahimi                O_CLIENT_ARGS="$O_CLIENT_ARGS -cert data_files/server6.crt -key data_files/server6.key"
695*62c56f98SSadaf Ebrahimi                G_CLIENT_ARGS="$G_CLIENT_ARGS --x509certfile data_files/server6.crt --x509keyfile data_files/server6.key"
696*62c56f98SSadaf Ebrahimi            else
697*62c56f98SSadaf Ebrahimi                M_CLIENT_ARGS="$M_CLIENT_ARGS crt_file=none key_file=none"
698*62c56f98SSadaf Ebrahimi            fi
699*62c56f98SSadaf Ebrahimi            ;;
700*62c56f98SSadaf Ebrahimi
701*62c56f98SSadaf Ebrahimi        "RSA")
702*62c56f98SSadaf Ebrahimi            M_SERVER_ARGS="$M_SERVER_ARGS crt_file=data_files/server2-sha256.crt key_file=data_files/server2.key"
703*62c56f98SSadaf Ebrahimi            O_SERVER_ARGS="$O_SERVER_ARGS -cert data_files/server2-sha256.crt -key data_files/server2.key"
704*62c56f98SSadaf Ebrahimi            G_SERVER_ARGS="$G_SERVER_ARGS --x509certfile data_files/server2-sha256.crt --x509keyfile data_files/server2.key"
705*62c56f98SSadaf Ebrahimi
706*62c56f98SSadaf Ebrahimi            if [ "X$VERIFY" = "XYES" ]; then
707*62c56f98SSadaf Ebrahimi                M_CLIENT_ARGS="$M_CLIENT_ARGS crt_file=data_files/cert_sha256.crt key_file=data_files/server1.key"
708*62c56f98SSadaf Ebrahimi                O_CLIENT_ARGS="$O_CLIENT_ARGS -cert data_files/cert_sha256.crt -key data_files/server1.key"
709*62c56f98SSadaf Ebrahimi                G_CLIENT_ARGS="$G_CLIENT_ARGS --x509certfile data_files/cert_sha256.crt --x509keyfile data_files/server1.key"
710*62c56f98SSadaf Ebrahimi            else
711*62c56f98SSadaf Ebrahimi                M_CLIENT_ARGS="$M_CLIENT_ARGS crt_file=none key_file=none"
712*62c56f98SSadaf Ebrahimi            fi
713*62c56f98SSadaf Ebrahimi            ;;
714*62c56f98SSadaf Ebrahimi
715*62c56f98SSadaf Ebrahimi        "PSK")
716*62c56f98SSadaf Ebrahimi            # give RSA-PSK-capable server a RSA cert
717*62c56f98SSadaf Ebrahimi            # (should be a separate type, but harder to close with openssl)
718*62c56f98SSadaf Ebrahimi            M_SERVER_ARGS="$M_SERVER_ARGS psk=6162636465666768696a6b6c6d6e6f70 ca_file=none crt_file=data_files/server2-sha256.crt key_file=data_files/server2.key"
719*62c56f98SSadaf Ebrahimi            O_SERVER_ARGS="$O_SERVER_ARGS -psk 6162636465666768696a6b6c6d6e6f70 -nocert"
720*62c56f98SSadaf Ebrahimi            G_SERVER_ARGS="$G_SERVER_ARGS --x509certfile data_files/server2-sha256.crt --x509keyfile data_files/server2.key --pskpasswd data_files/passwd.psk"
721*62c56f98SSadaf Ebrahimi
722*62c56f98SSadaf Ebrahimi            M_CLIENT_ARGS="$M_CLIENT_ARGS psk=6162636465666768696a6b6c6d6e6f70 crt_file=none key_file=none"
723*62c56f98SSadaf Ebrahimi            O_CLIENT_ARGS="$O_CLIENT_ARGS -psk 6162636465666768696a6b6c6d6e6f70"
724*62c56f98SSadaf Ebrahimi            G_CLIENT_ARGS="$G_CLIENT_ARGS --pskusername Client_identity --pskkey=6162636465666768696a6b6c6d6e6f70"
725*62c56f98SSadaf Ebrahimi            ;;
726*62c56f98SSadaf Ebrahimi    esac
727*62c56f98SSadaf Ebrahimi}
728*62c56f98SSadaf Ebrahimi
729*62c56f98SSadaf Ebrahimi# is_mbedtls <cmd_line>
730*62c56f98SSadaf Ebrahimiis_mbedtls() {
731*62c56f98SSadaf Ebrahimi    case $1 in
732*62c56f98SSadaf Ebrahimi        *ssl_client2*) true;;
733*62c56f98SSadaf Ebrahimi        *ssl_server2*) true;;
734*62c56f98SSadaf Ebrahimi        *) false;;
735*62c56f98SSadaf Ebrahimi    esac
736*62c56f98SSadaf Ebrahimi}
737*62c56f98SSadaf Ebrahimi
738*62c56f98SSadaf Ebrahimi# has_mem_err <log_file_name>
739*62c56f98SSadaf Ebrahimihas_mem_err() {
740*62c56f98SSadaf Ebrahimi    if ( grep -F 'All heap blocks were freed -- no leaks are possible' "$1" &&
741*62c56f98SSadaf Ebrahimi         grep -F 'ERROR SUMMARY: 0 errors from 0 contexts' "$1" ) > /dev/null
742*62c56f98SSadaf Ebrahimi    then
743*62c56f98SSadaf Ebrahimi        return 1 # false: does not have errors
744*62c56f98SSadaf Ebrahimi    else
745*62c56f98SSadaf Ebrahimi        return 0 # true: has errors
746*62c56f98SSadaf Ebrahimi    fi
747*62c56f98SSadaf Ebrahimi}
748*62c56f98SSadaf Ebrahimi
749*62c56f98SSadaf Ebrahimi# Wait for process $2 to be listening on port $1
750*62c56f98SSadaf Ebrahimiif type lsof >/dev/null 2>/dev/null; then
751*62c56f98SSadaf Ebrahimi    wait_server_start() {
752*62c56f98SSadaf Ebrahimi        START_TIME=$(date +%s)
753*62c56f98SSadaf Ebrahimi        if is_dtls "$MODE"; then
754*62c56f98SSadaf Ebrahimi            proto=UDP
755*62c56f98SSadaf Ebrahimi        else
756*62c56f98SSadaf Ebrahimi            proto=TCP
757*62c56f98SSadaf Ebrahimi        fi
758*62c56f98SSadaf Ebrahimi        while ! lsof -a -n -b -i "$proto:$1" -p "$2" >/dev/null 2>/dev/null; do
759*62c56f98SSadaf Ebrahimi              if [ $(( $(date +%s) - $START_TIME )) -gt $DOG_DELAY ]; then
760*62c56f98SSadaf Ebrahimi                  echo "SERVERSTART TIMEOUT"
761*62c56f98SSadaf Ebrahimi                  echo "SERVERSTART TIMEOUT" >> $SRV_OUT
762*62c56f98SSadaf Ebrahimi                  break
763*62c56f98SSadaf Ebrahimi              fi
764*62c56f98SSadaf Ebrahimi              # Linux and *BSD support decimal arguments to sleep. On other
765*62c56f98SSadaf Ebrahimi              # OSes this may be a tight loop.
766*62c56f98SSadaf Ebrahimi              sleep 0.1 2>/dev/null || true
767*62c56f98SSadaf Ebrahimi        done
768*62c56f98SSadaf Ebrahimi    }
769*62c56f98SSadaf Ebrahimielse
770*62c56f98SSadaf Ebrahimi    echo "Warning: lsof not available, wait_server_start = sleep"
771*62c56f98SSadaf Ebrahimi    wait_server_start() {
772*62c56f98SSadaf Ebrahimi        sleep 2
773*62c56f98SSadaf Ebrahimi    }
774*62c56f98SSadaf Ebrahimifi
775*62c56f98SSadaf Ebrahimi
776*62c56f98SSadaf Ebrahimi
777*62c56f98SSadaf Ebrahimi# start_server <name>
778*62c56f98SSadaf Ebrahimi# also saves name and command
779*62c56f98SSadaf Ebrahimistart_server() {
780*62c56f98SSadaf Ebrahimi    case $1 in
781*62c56f98SSadaf Ebrahimi        [Oo]pen*)
782*62c56f98SSadaf Ebrahimi            SERVER_CMD="$OPENSSL s_server $O_SERVER_ARGS"
783*62c56f98SSadaf Ebrahimi            ;;
784*62c56f98SSadaf Ebrahimi        [Gg]nu*)
785*62c56f98SSadaf Ebrahimi            SERVER_CMD="$GNUTLS_SERV $G_SERVER_ARGS --priority $G_SERVER_PRIO"
786*62c56f98SSadaf Ebrahimi            ;;
787*62c56f98SSadaf Ebrahimi        mbed*)
788*62c56f98SSadaf Ebrahimi            SERVER_CMD="$M_SRV $M_SERVER_ARGS"
789*62c56f98SSadaf Ebrahimi            if [ "$MEMCHECK" -gt 0 ]; then
790*62c56f98SSadaf Ebrahimi                SERVER_CMD="valgrind --leak-check=full $SERVER_CMD"
791*62c56f98SSadaf Ebrahimi            fi
792*62c56f98SSadaf Ebrahimi            ;;
793*62c56f98SSadaf Ebrahimi        *)
794*62c56f98SSadaf Ebrahimi            echo "error: invalid server name: $1" >&2
795*62c56f98SSadaf Ebrahimi            exit 1
796*62c56f98SSadaf Ebrahimi            ;;
797*62c56f98SSadaf Ebrahimi    esac
798*62c56f98SSadaf Ebrahimi    SERVER_NAME=$1
799*62c56f98SSadaf Ebrahimi
800*62c56f98SSadaf Ebrahimi    log "$SERVER_CMD"
801*62c56f98SSadaf Ebrahimi    echo "$SERVER_CMD" > $SRV_OUT
802*62c56f98SSadaf Ebrahimi    # for servers without -www or equivalent
803*62c56f98SSadaf Ebrahimi    while :; do echo bla; sleep 1; done | $SERVER_CMD >> $SRV_OUT 2>&1 &
804*62c56f98SSadaf Ebrahimi    SRV_PID=$!
805*62c56f98SSadaf Ebrahimi
806*62c56f98SSadaf Ebrahimi    wait_server_start "$PORT" "$SRV_PID"
807*62c56f98SSadaf Ebrahimi}
808*62c56f98SSadaf Ebrahimi
809*62c56f98SSadaf Ebrahimi# terminate the running server
810*62c56f98SSadaf Ebrahimistop_server() {
811*62c56f98SSadaf Ebrahimi    # For Ubuntu 22.04, `Terminated` message is outputed by wait command.
812*62c56f98SSadaf Ebrahimi    # To remove it from stdout, redirect stdout/stderr to SRV_OUT
813*62c56f98SSadaf Ebrahimi    kill $SRV_PID >/dev/null 2>&1
814*62c56f98SSadaf Ebrahimi    wait $SRV_PID >> $SRV_OUT 2>&1
815*62c56f98SSadaf Ebrahimi
816*62c56f98SSadaf Ebrahimi    if [ "$MEMCHECK" -gt 0 ]; then
817*62c56f98SSadaf Ebrahimi        if is_mbedtls "$SERVER_CMD" && has_mem_err $SRV_OUT; then
818*62c56f98SSadaf Ebrahimi            echo "  ! Server had memory errors"
819*62c56f98SSadaf Ebrahimi            SRVMEM=$(( $SRVMEM + 1 ))
820*62c56f98SSadaf Ebrahimi            return
821*62c56f98SSadaf Ebrahimi        fi
822*62c56f98SSadaf Ebrahimi    fi
823*62c56f98SSadaf Ebrahimi
824*62c56f98SSadaf Ebrahimi    rm -f $SRV_OUT
825*62c56f98SSadaf Ebrahimi}
826*62c56f98SSadaf Ebrahimi
827*62c56f98SSadaf Ebrahimi# kill the running server (used when killed by signal)
828*62c56f98SSadaf Ebrahimicleanup() {
829*62c56f98SSadaf Ebrahimi    rm -f $SRV_OUT $CLI_OUT
830*62c56f98SSadaf Ebrahimi    kill $SRV_PID >/dev/null 2>&1
831*62c56f98SSadaf Ebrahimi    kill $WATCHDOG_PID >/dev/null 2>&1
832*62c56f98SSadaf Ebrahimi    exit 1
833*62c56f98SSadaf Ebrahimi}
834*62c56f98SSadaf Ebrahimi
835*62c56f98SSadaf Ebrahimi# wait for client to terminate and set EXIT
836*62c56f98SSadaf Ebrahimi# must be called right after starting the client
837*62c56f98SSadaf Ebrahimiwait_client_done() {
838*62c56f98SSadaf Ebrahimi    CLI_PID=$!
839*62c56f98SSadaf Ebrahimi
840*62c56f98SSadaf Ebrahimi    ( sleep "$DOG_DELAY"; echo "TIMEOUT" >> $CLI_OUT; kill $CLI_PID ) &
841*62c56f98SSadaf Ebrahimi    WATCHDOG_PID=$!
842*62c56f98SSadaf Ebrahimi
843*62c56f98SSadaf Ebrahimi    # For Ubuntu 22.04, `Terminated` message is outputed by wait command.
844*62c56f98SSadaf Ebrahimi    # To remove it from stdout, redirect stdout/stderr to CLI_OUT
845*62c56f98SSadaf Ebrahimi    wait $CLI_PID >> $CLI_OUT 2>&1
846*62c56f98SSadaf Ebrahimi    EXIT=$?
847*62c56f98SSadaf Ebrahimi
848*62c56f98SSadaf Ebrahimi    kill $WATCHDOG_PID >/dev/null 2>&1
849*62c56f98SSadaf Ebrahimi    wait $WATCHDOG_PID >> $CLI_OUT 2>&1
850*62c56f98SSadaf Ebrahimi
851*62c56f98SSadaf Ebrahimi    echo "EXIT: $EXIT" >> $CLI_OUT
852*62c56f98SSadaf Ebrahimi}
853*62c56f98SSadaf Ebrahimi
854*62c56f98SSadaf Ebrahimi# uniform_title <CLIENT> <SERVER> <STANDARD_CIPHER_SUITE>
855*62c56f98SSadaf Ebrahimi# $TITLE is considered as test case description for both --list-test-case and
856*62c56f98SSadaf Ebrahimi# MBEDTLS_TEST_OUTCOME_FILE. This function aims to control the format of
857*62c56f98SSadaf Ebrahimi# each test case description.
858*62c56f98SSadaf Ebrahimiuniform_title() {
859*62c56f98SSadaf Ebrahimi    TITLE="$1->$2 $MODE,$VERIF $3"
860*62c56f98SSadaf Ebrahimi}
861*62c56f98SSadaf Ebrahimi
862*62c56f98SSadaf Ebrahimi# record_outcome <outcome> [<failure-reason>]
863*62c56f98SSadaf Ebrahimirecord_outcome() {
864*62c56f98SSadaf Ebrahimi    echo "$1"
865*62c56f98SSadaf Ebrahimi    if [ -n "$MBEDTLS_TEST_OUTCOME_FILE" ]; then
866*62c56f98SSadaf Ebrahimi        # The test outcome file has the format (in single line):
867*62c56f98SSadaf Ebrahimi        # platform;configuration;
868*62c56f98SSadaf Ebrahimi        # test suite name;test case description;
869*62c56f98SSadaf Ebrahimi        # PASS/FAIL/SKIP;[failure cause]
870*62c56f98SSadaf Ebrahimi        printf '%s;%s;%s;%s;%s;%s\n'                                    \
871*62c56f98SSadaf Ebrahimi            "$MBEDTLS_TEST_PLATFORM" "$MBEDTLS_TEST_CONFIGURATION"      \
872*62c56f98SSadaf Ebrahimi            "compat" "$TITLE"                                           \
873*62c56f98SSadaf Ebrahimi            "$1" "${2-}"                                                \
874*62c56f98SSadaf Ebrahimi            >> "$MBEDTLS_TEST_OUTCOME_FILE"
875*62c56f98SSadaf Ebrahimi    fi
876*62c56f98SSadaf Ebrahimi}
877*62c56f98SSadaf Ebrahimi
878*62c56f98SSadaf Ebrahimi# display additional information if test case fails
879*62c56f98SSadaf Ebrahimireport_fail() {
880*62c56f98SSadaf Ebrahimi    FAIL_PROMPT="outputs saved to c-srv-${TESTS}.log, c-cli-${TESTS}.log"
881*62c56f98SSadaf Ebrahimi    record_outcome "FAIL" "$FAIL_PROMPT"
882*62c56f98SSadaf Ebrahimi    cp $SRV_OUT c-srv-${TESTS}.log
883*62c56f98SSadaf Ebrahimi    cp $CLI_OUT c-cli-${TESTS}.log
884*62c56f98SSadaf Ebrahimi    echo "  ! $FAIL_PROMPT"
885*62c56f98SSadaf Ebrahimi
886*62c56f98SSadaf Ebrahimi    if [ "${LOG_FAILURE_ON_STDOUT:-0}" != 0 ]; then
887*62c56f98SSadaf Ebrahimi        echo "  ! server output:"
888*62c56f98SSadaf Ebrahimi        cat c-srv-${TESTS}.log
889*62c56f98SSadaf Ebrahimi        echo "  ! ==================================================="
890*62c56f98SSadaf Ebrahimi        echo "  ! client output:"
891*62c56f98SSadaf Ebrahimi        cat c-cli-${TESTS}.log
892*62c56f98SSadaf Ebrahimi    fi
893*62c56f98SSadaf Ebrahimi}
894*62c56f98SSadaf Ebrahimi
895*62c56f98SSadaf Ebrahimi# run_client PROGRAM_NAME STANDARD_CIPHER_SUITE PROGRAM_CIPHER_SUITE
896*62c56f98SSadaf Ebrahimirun_client() {
897*62c56f98SSadaf Ebrahimi    # announce what we're going to do
898*62c56f98SSadaf Ebrahimi    TESTS=$(( $TESTS + 1 ))
899*62c56f98SSadaf Ebrahimi    uniform_title "${1%"${1#?}"}" "${SERVER_NAME%"${SERVER_NAME#?}"}" $2
900*62c56f98SSadaf Ebrahimi    DOTS72="........................................................................"
901*62c56f98SSadaf Ebrahimi    printf "%s %.*s " "$TITLE" "$((71 - ${#TITLE}))" "$DOTS72"
902*62c56f98SSadaf Ebrahimi
903*62c56f98SSadaf Ebrahimi    # should we skip?
904*62c56f98SSadaf Ebrahimi    if [ "X$SKIP_NEXT" = "XYES" ]; then
905*62c56f98SSadaf Ebrahimi        SKIP_NEXT="NO"
906*62c56f98SSadaf Ebrahimi        record_outcome "SKIP"
907*62c56f98SSadaf Ebrahimi        SKIPPED=$(( $SKIPPED + 1 ))
908*62c56f98SSadaf Ebrahimi        return
909*62c56f98SSadaf Ebrahimi    fi
910*62c56f98SSadaf Ebrahimi
911*62c56f98SSadaf Ebrahimi    # run the command and interpret result
912*62c56f98SSadaf Ebrahimi    case $1 in
913*62c56f98SSadaf Ebrahimi        [Oo]pen*)
914*62c56f98SSadaf Ebrahimi            CLIENT_CMD="$OPENSSL s_client $O_CLIENT_ARGS -cipher $3"
915*62c56f98SSadaf Ebrahimi            log "$CLIENT_CMD"
916*62c56f98SSadaf Ebrahimi            echo "$CLIENT_CMD" > $CLI_OUT
917*62c56f98SSadaf Ebrahimi            printf 'GET HTTP/1.0\r\n\r\n' | $CLIENT_CMD >> $CLI_OUT 2>&1 &
918*62c56f98SSadaf Ebrahimi            wait_client_done
919*62c56f98SSadaf Ebrahimi
920*62c56f98SSadaf Ebrahimi            if [ $EXIT -eq 0 ]; then
921*62c56f98SSadaf Ebrahimi                RESULT=0
922*62c56f98SSadaf Ebrahimi            else
923*62c56f98SSadaf Ebrahimi                # If it is NULL cipher ...
924*62c56f98SSadaf Ebrahimi                if grep 'Cipher is (NONE)' $CLI_OUT >/dev/null; then
925*62c56f98SSadaf Ebrahimi                    RESULT=1
926*62c56f98SSadaf Ebrahimi                else
927*62c56f98SSadaf Ebrahimi                    RESULT=2
928*62c56f98SSadaf Ebrahimi                fi
929*62c56f98SSadaf Ebrahimi            fi
930*62c56f98SSadaf Ebrahimi            ;;
931*62c56f98SSadaf Ebrahimi
932*62c56f98SSadaf Ebrahimi        [Gg]nu*)
933*62c56f98SSadaf Ebrahimi            # need to force IPv4 with UDP, but keep localhost for auth
934*62c56f98SSadaf Ebrahimi            if is_dtls "$MODE"; then
935*62c56f98SSadaf Ebrahimi                G_HOST="127.0.0.1"
936*62c56f98SSadaf Ebrahimi            else
937*62c56f98SSadaf Ebrahimi                G_HOST="localhost"
938*62c56f98SSadaf Ebrahimi            fi
939*62c56f98SSadaf Ebrahimi            CLIENT_CMD="$GNUTLS_CLI $G_CLIENT_ARGS --priority $G_PRIO_MODE:$3 $G_HOST"
940*62c56f98SSadaf Ebrahimi            log "$CLIENT_CMD"
941*62c56f98SSadaf Ebrahimi            echo "$CLIENT_CMD" > $CLI_OUT
942*62c56f98SSadaf Ebrahimi            printf 'GET HTTP/1.0\r\n\r\n' | $CLIENT_CMD >> $CLI_OUT 2>&1 &
943*62c56f98SSadaf Ebrahimi            wait_client_done
944*62c56f98SSadaf Ebrahimi
945*62c56f98SSadaf Ebrahimi            if [ $EXIT -eq 0 ]; then
946*62c56f98SSadaf Ebrahimi                RESULT=0
947*62c56f98SSadaf Ebrahimi            else
948*62c56f98SSadaf Ebrahimi                RESULT=2
949*62c56f98SSadaf Ebrahimi                # interpret early failure, with a handshake_failure alert
950*62c56f98SSadaf Ebrahimi                # before the server hello, as "no ciphersuite in common"
951*62c56f98SSadaf Ebrahimi                if grep -F 'Received alert [40]: Handshake failed' $CLI_OUT; then
952*62c56f98SSadaf Ebrahimi                    if grep -i 'SERVER HELLO .* was received' $CLI_OUT; then :
953*62c56f98SSadaf Ebrahimi                    else
954*62c56f98SSadaf Ebrahimi                        RESULT=1
955*62c56f98SSadaf Ebrahimi                    fi
956*62c56f98SSadaf Ebrahimi                fi >/dev/null
957*62c56f98SSadaf Ebrahimi            fi
958*62c56f98SSadaf Ebrahimi            ;;
959*62c56f98SSadaf Ebrahimi
960*62c56f98SSadaf Ebrahimi        mbed*)
961*62c56f98SSadaf Ebrahimi            CLIENT_CMD="$M_CLI $M_CLIENT_ARGS force_ciphersuite=$3"
962*62c56f98SSadaf Ebrahimi            if [ "$MEMCHECK" -gt 0 ]; then
963*62c56f98SSadaf Ebrahimi                CLIENT_CMD="valgrind --leak-check=full $CLIENT_CMD"
964*62c56f98SSadaf Ebrahimi            fi
965*62c56f98SSadaf Ebrahimi            log "$CLIENT_CMD"
966*62c56f98SSadaf Ebrahimi            echo "$CLIENT_CMD" > $CLI_OUT
967*62c56f98SSadaf Ebrahimi            $CLIENT_CMD >> $CLI_OUT 2>&1 &
968*62c56f98SSadaf Ebrahimi            wait_client_done
969*62c56f98SSadaf Ebrahimi
970*62c56f98SSadaf Ebrahimi            case $EXIT in
971*62c56f98SSadaf Ebrahimi                # Success
972*62c56f98SSadaf Ebrahimi                "0")    RESULT=0    ;;
973*62c56f98SSadaf Ebrahimi
974*62c56f98SSadaf Ebrahimi                # Ciphersuite not supported
975*62c56f98SSadaf Ebrahimi                "2")    RESULT=1    ;;
976*62c56f98SSadaf Ebrahimi
977*62c56f98SSadaf Ebrahimi                # Error
978*62c56f98SSadaf Ebrahimi                *)      RESULT=2    ;;
979*62c56f98SSadaf Ebrahimi            esac
980*62c56f98SSadaf Ebrahimi
981*62c56f98SSadaf Ebrahimi            if [ "$MEMCHECK" -gt 0 ]; then
982*62c56f98SSadaf Ebrahimi                if is_mbedtls "$CLIENT_CMD" && has_mem_err $CLI_OUT; then
983*62c56f98SSadaf Ebrahimi                    RESULT=2
984*62c56f98SSadaf Ebrahimi                fi
985*62c56f98SSadaf Ebrahimi            fi
986*62c56f98SSadaf Ebrahimi
987*62c56f98SSadaf Ebrahimi            ;;
988*62c56f98SSadaf Ebrahimi
989*62c56f98SSadaf Ebrahimi        *)
990*62c56f98SSadaf Ebrahimi            echo "error: invalid client name: $1" >&2
991*62c56f98SSadaf Ebrahimi            exit 1
992*62c56f98SSadaf Ebrahimi            ;;
993*62c56f98SSadaf Ebrahimi    esac
994*62c56f98SSadaf Ebrahimi
995*62c56f98SSadaf Ebrahimi    echo "EXIT: $EXIT" >> $CLI_OUT
996*62c56f98SSadaf Ebrahimi
997*62c56f98SSadaf Ebrahimi    # report and count result
998*62c56f98SSadaf Ebrahimi    case $RESULT in
999*62c56f98SSadaf Ebrahimi        "0")
1000*62c56f98SSadaf Ebrahimi            record_outcome "PASS"
1001*62c56f98SSadaf Ebrahimi            ;;
1002*62c56f98SSadaf Ebrahimi        "1")
1003*62c56f98SSadaf Ebrahimi            record_outcome "SKIP"
1004*62c56f98SSadaf Ebrahimi            SKIPPED=$(( $SKIPPED + 1 ))
1005*62c56f98SSadaf Ebrahimi            ;;
1006*62c56f98SSadaf Ebrahimi        "2")
1007*62c56f98SSadaf Ebrahimi            report_fail
1008*62c56f98SSadaf Ebrahimi            FAILED=$(( $FAILED + 1 ))
1009*62c56f98SSadaf Ebrahimi            ;;
1010*62c56f98SSadaf Ebrahimi    esac
1011*62c56f98SSadaf Ebrahimi
1012*62c56f98SSadaf Ebrahimi    rm -f $CLI_OUT
1013*62c56f98SSadaf Ebrahimi}
1014*62c56f98SSadaf Ebrahimi
1015*62c56f98SSadaf Ebrahimi#
1016*62c56f98SSadaf Ebrahimi# MAIN
1017*62c56f98SSadaf Ebrahimi#
1018*62c56f98SSadaf Ebrahimi
1019*62c56f98SSadaf Ebrahimiget_options "$@"
1020*62c56f98SSadaf Ebrahimi
1021*62c56f98SSadaf Ebrahimi# Make the outcome file path relative to the original directory, not
1022*62c56f98SSadaf Ebrahimi# to .../tests
1023*62c56f98SSadaf Ebrahimicase "$MBEDTLS_TEST_OUTCOME_FILE" in
1024*62c56f98SSadaf Ebrahimi    [!/]*)
1025*62c56f98SSadaf Ebrahimi        MBEDTLS_TEST_OUTCOME_FILE="$ORIGINAL_PWD/$MBEDTLS_TEST_OUTCOME_FILE"
1026*62c56f98SSadaf Ebrahimi        ;;
1027*62c56f98SSadaf Ebrahimiesac
1028*62c56f98SSadaf Ebrahimi
1029*62c56f98SSadaf Ebrahimi# sanity checks, avoid an avalanche of errors
1030*62c56f98SSadaf Ebrahimiif [ ! -x "$M_SRV" ]; then
1031*62c56f98SSadaf Ebrahimi    echo "Command '$M_SRV' is not an executable file" >&2
1032*62c56f98SSadaf Ebrahimi    exit 1
1033*62c56f98SSadaf Ebrahimifi
1034*62c56f98SSadaf Ebrahimiif [ ! -x "$M_CLI" ]; then
1035*62c56f98SSadaf Ebrahimi    echo "Command '$M_CLI' is not an executable file" >&2
1036*62c56f98SSadaf Ebrahimi    exit 1
1037*62c56f98SSadaf Ebrahimifi
1038*62c56f98SSadaf Ebrahimi
1039*62c56f98SSadaf Ebrahimiif echo "$PEERS" | grep -i openssl > /dev/null; then
1040*62c56f98SSadaf Ebrahimi    if which "$OPENSSL" >/dev/null 2>&1; then :; else
1041*62c56f98SSadaf Ebrahimi        echo "Command '$OPENSSL' not found" >&2
1042*62c56f98SSadaf Ebrahimi        exit 1
1043*62c56f98SSadaf Ebrahimi    fi
1044*62c56f98SSadaf Ebrahimifi
1045*62c56f98SSadaf Ebrahimi
1046*62c56f98SSadaf Ebrahimiif echo "$PEERS" | grep -i gnutls > /dev/null; then
1047*62c56f98SSadaf Ebrahimi    for CMD in "$GNUTLS_CLI" "$GNUTLS_SERV"; do
1048*62c56f98SSadaf Ebrahimi        if which "$CMD" >/dev/null 2>&1; then :; else
1049*62c56f98SSadaf Ebrahimi            echo "Command '$CMD' not found" >&2
1050*62c56f98SSadaf Ebrahimi            exit 1
1051*62c56f98SSadaf Ebrahimi        fi
1052*62c56f98SSadaf Ebrahimi    done
1053*62c56f98SSadaf Ebrahimifi
1054*62c56f98SSadaf Ebrahimi
1055*62c56f98SSadaf Ebrahimifor PEER in $PEERS; do
1056*62c56f98SSadaf Ebrahimi    case "$PEER" in
1057*62c56f98SSadaf Ebrahimi        mbed*|[Oo]pen*|[Gg]nu*)
1058*62c56f98SSadaf Ebrahimi            ;;
1059*62c56f98SSadaf Ebrahimi        *)
1060*62c56f98SSadaf Ebrahimi            echo "Unknown peers: $PEER" >&2
1061*62c56f98SSadaf Ebrahimi            exit 1
1062*62c56f98SSadaf Ebrahimi    esac
1063*62c56f98SSadaf Ebrahimidone
1064*62c56f98SSadaf Ebrahimi
1065*62c56f98SSadaf Ebrahimi# Pick a "unique" port in the range 10000-19999.
1066*62c56f98SSadaf EbrahimiPORT="0000$$"
1067*62c56f98SSadaf EbrahimiPORT="1$(echo $PORT | tail -c 5)"
1068*62c56f98SSadaf Ebrahimi
1069*62c56f98SSadaf Ebrahimi# Also pick a unique name for intermediate files
1070*62c56f98SSadaf EbrahimiSRV_OUT="srv_out.$$"
1071*62c56f98SSadaf EbrahimiCLI_OUT="cli_out.$$"
1072*62c56f98SSadaf Ebrahimi
1073*62c56f98SSadaf Ebrahimi# client timeout delay: be more patient with valgrind
1074*62c56f98SSadaf Ebrahimiif [ "$MEMCHECK" -gt 0 ]; then
1075*62c56f98SSadaf Ebrahimi    DOG_DELAY=30
1076*62c56f98SSadaf Ebrahimielse
1077*62c56f98SSadaf Ebrahimi    DOG_DELAY=10
1078*62c56f98SSadaf Ebrahimifi
1079*62c56f98SSadaf Ebrahimi
1080*62c56f98SSadaf EbrahimiSKIP_NEXT="NO"
1081*62c56f98SSadaf Ebrahimi
1082*62c56f98SSadaf Ebrahimitrap cleanup INT TERM HUP
1083*62c56f98SSadaf Ebrahimi
1084*62c56f98SSadaf Ebrahimifor MODE in $MODES; do
1085*62c56f98SSadaf Ebrahimi    for TYPE in $TYPES; do
1086*62c56f98SSadaf Ebrahimi
1087*62c56f98SSadaf Ebrahimi        # PSK cipher suites do not allow client certificate verification.
1088*62c56f98SSadaf Ebrahimi        # This means PSK test cases with VERIFY=YES should be replaced by
1089*62c56f98SSadaf Ebrahimi        # VERIFY=NO or be ignored. SUB_VERIFIES variable is used to constrain
1090*62c56f98SSadaf Ebrahimi        # verification option for PSK test cases.
1091*62c56f98SSadaf Ebrahimi        SUB_VERIFIES=$VERIFIES
1092*62c56f98SSadaf Ebrahimi        if [ "$TYPE" = "PSK" ]; then
1093*62c56f98SSadaf Ebrahimi            SUB_VERIFIES="NO"
1094*62c56f98SSadaf Ebrahimi        fi
1095*62c56f98SSadaf Ebrahimi
1096*62c56f98SSadaf Ebrahimi        for VERIFY in $SUB_VERIFIES; do
1097*62c56f98SSadaf Ebrahimi            VERIF=$(echo $VERIFY | tr '[:upper:]' '[:lower:]')
1098*62c56f98SSadaf Ebrahimi            for PEER in $PEERS; do
1099*62c56f98SSadaf Ebrahimi
1100*62c56f98SSadaf Ebrahimi            setup_arguments
1101*62c56f98SSadaf Ebrahimi
1102*62c56f98SSadaf Ebrahimi            case "$PEER" in
1103*62c56f98SSadaf Ebrahimi
1104*62c56f98SSadaf Ebrahimi                [Oo]pen*)
1105*62c56f98SSadaf Ebrahimi
1106*62c56f98SSadaf Ebrahimi                    if test "$OSSL_NO_DTLS" -gt 0 && is_dtls "$MODE"; then
1107*62c56f98SSadaf Ebrahimi                        continue;
1108*62c56f98SSadaf Ebrahimi                    fi
1109*62c56f98SSadaf Ebrahimi
1110*62c56f98SSadaf Ebrahimi                    # OpenSSL <1.0.2 doesn't support DTLS 1.2. Check if OpenSSL
1111*62c56f98SSadaf Ebrahimi                    # supports $O_MODE from the s_server help. (The s_client
1112*62c56f98SSadaf Ebrahimi                    # help isn't accurate as of 1.0.2g: it supports DTLS 1.2
1113*62c56f98SSadaf Ebrahimi                    # but doesn't list it. But the s_server help seems to be
1114*62c56f98SSadaf Ebrahimi                    # accurate.)
1115*62c56f98SSadaf Ebrahimi                    if ! $OPENSSL s_server -help 2>&1 | grep -q "^ *-$O_MODE "; then
1116*62c56f98SSadaf Ebrahimi                        continue;
1117*62c56f98SSadaf Ebrahimi                    fi
1118*62c56f98SSadaf Ebrahimi
1119*62c56f98SSadaf Ebrahimi                    reset_ciphersuites
1120*62c56f98SSadaf Ebrahimi                    add_common_ciphersuites
1121*62c56f98SSadaf Ebrahimi                    add_openssl_ciphersuites
1122*62c56f98SSadaf Ebrahimi                    filter_ciphersuites
1123*62c56f98SSadaf Ebrahimi
1124*62c56f98SSadaf Ebrahimi                    if [ "X" != "X$M_CIPHERS" ]; then
1125*62c56f98SSadaf Ebrahimi                        start_server "OpenSSL"
1126*62c56f98SSadaf Ebrahimi                        translate_ciphers m $M_CIPHERS
1127*62c56f98SSadaf Ebrahimi                        for i in $ciphers; do
1128*62c56f98SSadaf Ebrahimi                            o_check_ciphersuite "${i%%=*}"
1129*62c56f98SSadaf Ebrahimi                            run_client mbedTLS ${i%%=*} ${i#*=}
1130*62c56f98SSadaf Ebrahimi                        done
1131*62c56f98SSadaf Ebrahimi                        stop_server
1132*62c56f98SSadaf Ebrahimi                    fi
1133*62c56f98SSadaf Ebrahimi
1134*62c56f98SSadaf Ebrahimi                    if [ "X" != "X$O_CIPHERS" ]; then
1135*62c56f98SSadaf Ebrahimi                        start_server "mbedTLS"
1136*62c56f98SSadaf Ebrahimi                        translate_ciphers o $O_CIPHERS
1137*62c56f98SSadaf Ebrahimi                        for i in $ciphers; do
1138*62c56f98SSadaf Ebrahimi                            o_check_ciphersuite "${i%%=*}"
1139*62c56f98SSadaf Ebrahimi                            run_client OpenSSL ${i%%=*} ${i#*=}
1140*62c56f98SSadaf Ebrahimi                        done
1141*62c56f98SSadaf Ebrahimi                        stop_server
1142*62c56f98SSadaf Ebrahimi                    fi
1143*62c56f98SSadaf Ebrahimi
1144*62c56f98SSadaf Ebrahimi                    ;;
1145*62c56f98SSadaf Ebrahimi
1146*62c56f98SSadaf Ebrahimi                [Gg]nu*)
1147*62c56f98SSadaf Ebrahimi
1148*62c56f98SSadaf Ebrahimi                    reset_ciphersuites
1149*62c56f98SSadaf Ebrahimi                    add_common_ciphersuites
1150*62c56f98SSadaf Ebrahimi                    add_gnutls_ciphersuites
1151*62c56f98SSadaf Ebrahimi                    filter_ciphersuites
1152*62c56f98SSadaf Ebrahimi
1153*62c56f98SSadaf Ebrahimi                    if [ "X" != "X$M_CIPHERS" ]; then
1154*62c56f98SSadaf Ebrahimi                        start_server "GnuTLS"
1155*62c56f98SSadaf Ebrahimi                        translate_ciphers m $M_CIPHERS
1156*62c56f98SSadaf Ebrahimi                        for i in $ciphers; do
1157*62c56f98SSadaf Ebrahimi                            run_client mbedTLS ${i%%=*} ${i#*=}
1158*62c56f98SSadaf Ebrahimi                        done
1159*62c56f98SSadaf Ebrahimi                        stop_server
1160*62c56f98SSadaf Ebrahimi                    fi
1161*62c56f98SSadaf Ebrahimi
1162*62c56f98SSadaf Ebrahimi                    if [ "X" != "X$G_CIPHERS" ]; then
1163*62c56f98SSadaf Ebrahimi                        start_server "mbedTLS"
1164*62c56f98SSadaf Ebrahimi                        translate_ciphers g $G_CIPHERS
1165*62c56f98SSadaf Ebrahimi                        for i in $ciphers; do
1166*62c56f98SSadaf Ebrahimi                            run_client GnuTLS ${i%%=*} ${i#*=}
1167*62c56f98SSadaf Ebrahimi                        done
1168*62c56f98SSadaf Ebrahimi                        stop_server
1169*62c56f98SSadaf Ebrahimi                    fi
1170*62c56f98SSadaf Ebrahimi
1171*62c56f98SSadaf Ebrahimi                    ;;
1172*62c56f98SSadaf Ebrahimi
1173*62c56f98SSadaf Ebrahimi                mbed*)
1174*62c56f98SSadaf Ebrahimi
1175*62c56f98SSadaf Ebrahimi                    reset_ciphersuites
1176*62c56f98SSadaf Ebrahimi                    add_common_ciphersuites
1177*62c56f98SSadaf Ebrahimi                    add_openssl_ciphersuites
1178*62c56f98SSadaf Ebrahimi                    add_gnutls_ciphersuites
1179*62c56f98SSadaf Ebrahimi                    add_mbedtls_ciphersuites
1180*62c56f98SSadaf Ebrahimi                    filter_ciphersuites
1181*62c56f98SSadaf Ebrahimi
1182*62c56f98SSadaf Ebrahimi                    if [ "X" != "X$M_CIPHERS" ]; then
1183*62c56f98SSadaf Ebrahimi                        start_server "mbedTLS"
1184*62c56f98SSadaf Ebrahimi                        translate_ciphers m $M_CIPHERS
1185*62c56f98SSadaf Ebrahimi                        for i in $ciphers; do
1186*62c56f98SSadaf Ebrahimi                            run_client mbedTLS ${i%%=*} ${i#*=}
1187*62c56f98SSadaf Ebrahimi                        done
1188*62c56f98SSadaf Ebrahimi                        stop_server
1189*62c56f98SSadaf Ebrahimi                    fi
1190*62c56f98SSadaf Ebrahimi
1191*62c56f98SSadaf Ebrahimi                    ;;
1192*62c56f98SSadaf Ebrahimi
1193*62c56f98SSadaf Ebrahimi                *)
1194*62c56f98SSadaf Ebrahimi                    echo "Unknown peer: $PEER" >&2
1195*62c56f98SSadaf Ebrahimi                    exit 1
1196*62c56f98SSadaf Ebrahimi                    ;;
1197*62c56f98SSadaf Ebrahimi
1198*62c56f98SSadaf Ebrahimi                esac
1199*62c56f98SSadaf Ebrahimi
1200*62c56f98SSadaf Ebrahimi            done
1201*62c56f98SSadaf Ebrahimi        done
1202*62c56f98SSadaf Ebrahimi    done
1203*62c56f98SSadaf Ebrahimidone
1204*62c56f98SSadaf Ebrahimi
1205*62c56f98SSadaf Ebrahimiecho "------------------------------------------------------------------------"
1206*62c56f98SSadaf Ebrahimi
1207*62c56f98SSadaf Ebrahimiif [ $FAILED -ne 0 -o $SRVMEM -ne 0 ]; then
1208*62c56f98SSadaf Ebrahimi    printf "FAILED"
1209*62c56f98SSadaf Ebrahimielse
1210*62c56f98SSadaf Ebrahimi    printf "PASSED"
1211*62c56f98SSadaf Ebrahimifi
1212*62c56f98SSadaf Ebrahimi
1213*62c56f98SSadaf Ebrahimiif [ "$MEMCHECK" -gt 0 ]; then
1214*62c56f98SSadaf Ebrahimi    MEMREPORT=", $SRVMEM server memory errors"
1215*62c56f98SSadaf Ebrahimielse
1216*62c56f98SSadaf Ebrahimi    MEMREPORT=""
1217*62c56f98SSadaf Ebrahimifi
1218*62c56f98SSadaf Ebrahimi
1219*62c56f98SSadaf EbrahimiPASSED=$(( $TESTS - $FAILED ))
1220*62c56f98SSadaf Ebrahimiecho " ($PASSED / $TESTS tests ($SKIPPED skipped$MEMREPORT))"
1221*62c56f98SSadaf Ebrahimi
1222*62c56f98SSadaf EbrahimiFAILED=$(( $FAILED + $SRVMEM ))
1223*62c56f98SSadaf Ebrahimiif [ $FAILED -gt 255 ]; then
1224*62c56f98SSadaf Ebrahimi    # Clamp at 255 as caller gets exit code & 0xFF
1225*62c56f98SSadaf Ebrahimi    # (so 256 would be 0, or success, etc)
1226*62c56f98SSadaf Ebrahimi    FAILED=255
1227*62c56f98SSadaf Ebrahimifi
1228*62c56f98SSadaf Ebrahimiexit $FAILED
1229