quickjs-tart

quickjs-based runtime for wallet-core logic
Log | Files | Refs | README | LICENSE

compat.sh (44098B)


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