#!/bin/sh # context-info.sh # # Copyright The Mbed TLS Contributors # SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later # # This program is intended for testing the ssl_context_info program # set -eu if ! cd "$(dirname "$0")"; then exit 125 fi # Variables THIS_SCRIPT_NAME=$(basename "$0") PROG_PATH="../programs/ssl/ssl_context_info" OUT_FILE="ssl_context_info.log" IN_DIR="data_files/base64" USE_VALGRIND=0 T_COUNT=0 T_PASSED=0 T_FAILED=0 # Functions print_usage() { echo "Usage: $0 [options]" printf " -h|--help\tPrint this help.\n" printf " -m|--memcheck\tUse valgrind to check the memory.\n" } # Print test name print_name() { printf "%s %.*s " "$1" $(( 71 - ${#1} )) \ "........................................................................" } # Print header to the test output file print_header() { date="$(date)" echo "******************************************************************" > $2 echo "* File created by: $THIS_SCRIPT_NAME" >> $2 echo "* Test name: $1" >> $2 echo "* Date: $date" >> $2 echo "* Command: $3" >> $2 echo "******************************************************************" >> $2 echo "" >> $2 } # Print footer at the end of file print_footer() { echo "" >> $1 echo "******************************************************************" >> $1 echo "* End command" >> $1 echo "******************************************************************" >> $1 echo "" >> $1 } # Use the arguments of this script get_options() { while [ $# -gt 0 ]; do case "$1" in -h|--help) print_usage exit 0 ;; -m|--memcheck) USE_VALGRIND=1 ;; *) echo "Unknown argument: '$1'" print_usage exit 1 ;; esac shift done } # Current test failed fail() { T_FAILED=$(( $T_FAILED + 1)) FAIL_OUT="Fail.$T_FAILED""_$OUT_FILE" echo "FAIL" echo " Error: $1" cp -f "$OUT_FILE" "$FAIL_OUT" echo "Error: $1" >> "$FAIL_OUT" } # Current test passed pass() { T_PASSED=$(( $T_PASSED + 1)) echo "PASS" } # Usage: run_test [ -arg ] [option [...]] # Options: -m # -n # -u run_test() { TEST_NAME="$1" RUN_CMD="$PROG_PATH -f $IN_DIR/$2" if [ "-arg" = "$3" ]; then RUN_CMD="$RUN_CMD $4" shift 4 else shift 2 fi # prepend valgrind to our commands if active if [ "$USE_VALGRIND" -gt 0 ]; then RUN_CMD="valgrind --leak-check=full $RUN_CMD" fi T_COUNT=$(( $T_COUNT + 1)) print_name "$TEST_NAME" # run tested program print_header "$TEST_NAME" "$OUT_FILE" "$RUN_CMD" eval "$RUN_CMD" >> "$OUT_FILE" 2>&1 print_footer "$OUT_FILE" # check valgrind's results if [ "$USE_VALGRIND" -gt 0 ]; then if ! ( grep -F 'All heap blocks were freed -- no leaks are possible' "$OUT_FILE" && grep -F 'ERROR SUMMARY: 0 errors from 0 contexts' "$OUT_FILE" ) > /dev/null then fail "Memory error detected" return fi fi # check other assertions # lines beginning with == are added by valgrind, ignore them, because we already checked them before # lines with 'Serious error when reading debug info', are valgrind issues as well # lines beginning with * are added by this script, ignore too while [ $# -gt 0 ] do case $1 in "-m") if grep -v '^==' "$OUT_FILE" | grep -v 'Serious error when reading debug info' | grep -v "^*" | grep "$2" >/dev/null; then :; else fail "pattern '$2' MUST be present in the output" return fi ;; "-n") if grep -v '^==' "$OUT_FILE" | grep -v 'Serious error when reading debug info' | grep -v "^*" | grep "$2" >/dev/null; then fail "pattern '$2' MUST NOT be present in the output" return fi ;; "-u") if [ $(grep -v '^==' "$OUT_FILE"| grep -v 'Serious error when reading debug info' | grep -v "^*" | grep "$2" | wc -l) -ne 1 ]; then fail "lines following pattern '$2' must be once in the output" return fi ;; *) echo "Unknown test: $1" >&2 exit 1 esac shift 2 done rm -f "$OUT_FILE" pass } get_options "$@" # Tests run_test "Default configuration, server" \ "srv_def.txt" \ -n "ERROR" \ -u "major.* 2$" \ -u "minor.* 21$" \ -u "path.* 0$" \ -u "MBEDTLS_HAVE_TIME$" \ -u "MBEDTLS_X509_CRT_PARSE_C$" \ -u "MBEDTLS_SSL_MAX_FRAGMENT_LENGTH$" \ -u "MBEDTLS_SSL_ENCRYPT_THEN_MAC$" \ -u "MBEDTLS_SSL_SESSION_TICKETS$" \ -u "MBEDTLS_SSL_SESSION_TICKETS and client$" \ -u "MBEDTLS_SSL_DTLS_ANTI_REPLAY$" \ -u "MBEDTLS_SSL_ALPN$" \ -u "ciphersuite.* TLS-ECDHE-RSA-WITH-CHACHA20-POLY1305-SHA256$" \ -u "cipher flags.* 0x00$" \ -u "Message-Digest.* SHA256$" \ -u "compression.* disabled$" \ -u "DTLS datagram packing.* enabled$" \ -n "Certificate" \ -n "bytes left to analyze from context" run_test "Default configuration, client" \ "cli_def.txt" \ -n "ERROR" \ -u "major.* 2$" \ -u "minor.* 21$" \ -u "path.* 0$" \ -u "MBEDTLS_HAVE_TIME$" \ -u "MBEDTLS_X509_CRT_PARSE_C$" \ -u "MBEDTLS_SSL_MAX_FRAGMENT_LENGTH$" \ -u "MBEDTLS_SSL_ENCRYPT_THEN_MAC$" \ -u "MBEDTLS_SSL_SESSION_TICKETS$" \ -u "MBEDTLS_SSL_SESSION_TICKETS and client$" \ -u "MBEDTLS_SSL_DTLS_ANTI_REPLAY$" \ -u "MBEDTLS_SSL_ALPN$" \ -u "ciphersuite.* TLS-ECDHE-RSA-WITH-CHACHA20-POLY1305-SHA256$" \ -u "cipher flags.* 0x00$" \ -u "Message-Digest.* SHA256$" \ -u "compression.* disabled$" \ -u "DTLS datagram packing.* enabled$" \ -u "cert. version .* 3$" \ -u "serial number.* 02$" \ -u "issuer name.* C=NL, O=PolarSSL, CN=PolarSSL Test CA$" \ -u "subject name.* C=NL, O=PolarSSL, CN=localhost$" \ -u "issued on.* 2019-02-10 14:44:06$" \ -u "expires on.* 2029-02-10 14:44:06$" \ -u "signed using.* RSA with SHA-256$" \ -u "RSA key size.* 2048 bits$" \ -u "basic constraints.* CA=false$" \ -n "bytes left to analyze from context" run_test "Ciphersuite TLS-RSA-WITH-AES-256-CCM-8, server" \ "srv_ciphersuite.txt" \ -n "ERROR" \ -u "ciphersuite.* TLS-RSA-WITH-AES-256-CCM-8$" \ run_test "Ciphersuite TLS-RSA-WITH-AES-256-CCM-8, client" \ "cli_ciphersuite.txt" \ -n "ERROR" \ -u "ciphersuite.* TLS-RSA-WITH-AES-256-CCM-8$" \ run_test "No packing, server" \ "srv_no_packing.txt" \ -n "ERROR" \ -u "DTLS datagram packing.* disabled" run_test "No packing, client" \ "cli_no_packing.txt" \ -n "ERROR" \ -u "DTLS datagram packing.* disabled" run_test "DTLS CID, server" \ "srv_cid.txt" \ -n "ERROR" \ -u "in CID.* DE AD" \ -u "out CID.* BE EF" run_test "DTLS CID, client" \ "cli_cid.txt" \ -n "ERROR" \ -u "in CID.* BE EF" \ -u "out CID.* DE AD" run_test "No MBEDTLS_SSL_MAX_FRAGMENT_LENGTH, server" \ "srv_no_mfl.txt" \ -n "ERROR" \ -n "MBEDTLS_SSL_MAX_FRAGMENT_LENGTH" run_test "No MBEDTLS_SSL_MAX_FRAGMENT_LENGTH, client" \ "cli_no_mfl.txt" \ -n "ERROR" \ -n "MBEDTLS_SSL_MAX_FRAGMENT_LENGTH" run_test "No MBEDTLS_SSL_ALPN, server" \ "srv_no_alpn.txt" \ -n "ERROR" \ -n "MBEDTLS_SSL_ALPN" run_test "No MBEDTLS_SSL_ALPN, client" \ "cli_no_alpn.txt" \ -n "ERROR" \ -n "MBEDTLS_SSL_ALPN" run_test "No MBEDTLS_SSL_KEEP_PEER_CERTIFICATE, server" \ "srv_no_keep_cert.txt" \ -arg "--keep-peer-cert=0" \ -u "ciphersuite.* TLS-ECDHE-RSA-WITH-CHACHA20-POLY1305-SHA256$" \ -u "cipher flags.* 0x00" \ -u "compression.* disabled" \ -u "DTLS datagram packing.* enabled" \ -n "ERROR" run_test "No MBEDTLS_SSL_KEEP_PEER_CERTIFICATE, client" \ "cli_no_keep_cert.txt" \ -arg "--keep-peer-cert=0" \ -u "ciphersuite.* TLS-ECDHE-RSA-WITH-CHACHA20-POLY1305-SHA256$" \ -u "cipher flags.* 0x00" \ -u "compression.* disabled" \ -u "DTLS datagram packing.* enabled" \ -n "ERROR" run_test "No MBEDTLS_SSL_KEEP_PEER_CERTIFICATE, negative, server" \ "srv_no_keep_cert.txt" \ -m "Deserializing" \ -m "ERROR" run_test "No MBEDTLS_SSL_KEEP_PEER_CERTIFICATE, negative, client" \ "cli_no_keep_cert.txt" \ -m "Deserializing" \ -m "ERROR" run_test "Minimal configuration, server" \ "srv_min_cfg.txt" \ -n "ERROR" \ -n "MBEDTLS_SSL_MAX_FRAGMENT_LENGTH$" \ -n "MBEDTLS_SSL_ENCRYPT_THEN_MAC$" \ -n "MBEDTLS_SSL_SESSION_TICKETS$" \ -n "MBEDTLS_SSL_SESSION_TICKETS and client$" \ -n "MBEDTLS_SSL_DTLS_ANTI_REPLAY$" \ -n "MBEDTLS_SSL_ALPN$" \ run_test "Minimal configuration, client" \ "cli_min_cfg.txt" \ -n "ERROR" \ -n "MBEDTLS_SSL_MAX_FRAGMENT_LENGTH$" \ -n "MBEDTLS_SSL_ENCRYPT_THEN_MAC$" \ -n "MBEDTLS_SSL_SESSION_TICKETS$" \ -n "MBEDTLS_SSL_SESSION_TICKETS and client$" \ -n "MBEDTLS_SSL_DTLS_ANTI_REPLAY$" \ -n "MBEDTLS_SSL_ALPN$" \ run_test "MTU=10000" \ "mtu_10000.txt" \ -n "ERROR" \ -u "MTU.* 10000$" run_test "MFL=1024" \ "mfl_1024.txt" \ -n "ERROR" \ -u "MFL.* 1024$" run_test "Older version (v2.19.1)" \ "v2.19.1.txt" \ -n "ERROR" \ -u "major.* 2$" \ -u "minor.* 19$" \ -u "path.* 1$" \ -u "ciphersuite.* TLS-ECDHE-ECDSA-WITH-AES-128-CCM-8$" \ -u "Message-Digest.* SHA256$" \ -u "compression.* disabled$" \ -u "serial number.* 01:70:AF:40:B4:E6$" \ -u "issuer name.* CN=ca$" \ -u "subject name.* L=160001, OU=acc1, CN=device01$" \ -u "issued on.* 2020-03-06 09:50:18$" \ -u "expires on.* 2056-02-26 09:50:18$" \ -u "signed using.* ECDSA with SHA256$" \ -u "lifetime.* 0 sec.$" \ -u "MFL.* none$" \ -u "negotiate truncated HMAC.* disabled$" \ -u "Encrypt-then-MAC.* enabled$" \ -u "DTLS datagram packing.* enabled$" \ -u "verify result.* 0x00000000$" \ -n "bytes left to analyze from context" run_test "Wrong base64 format" \ "def_bad_b64.txt" \ -m "ERROR" \ -u "The length of the base64 code found should be a multiple of 4" \ -n "bytes left to analyze from context" run_test "Too much data at the beginning of base64 code" \ "def_b64_too_big_1.txt" \ -m "ERROR" \ -n "The length of the base64 code found should be a multiple of 4" \ run_test "Too much data in the middle of base64 code" \ "def_b64_too_big_2.txt" \ -m "ERROR" \ -n "The length of the base64 code found should be a multiple of 4" \ run_test "Too much data at the end of base64 code" \ "def_b64_too_big_3.txt" \ -m "ERROR" \ -n "The length of the base64 code found should be a multiple of 4" \ -u "bytes left to analyze from context" run_test "Empty file as input" \ "empty.txt" \ -u "Finished. No valid base64 code found" run_test "Not empty file without base64 code" \ "../../context-info.sh" \ -n "Deserializing" run_test "Binary file instead of text file" \ "../../../programs/ssl/ssl_context_info" \ -m "ERROR" \ -u "Too many bad symbols detected. File check aborted" \ -n "Deserializing" run_test "Decoder continues past 0xff character" \ "def_b64_ff.bin" \ -n "No valid base64" \ -u "ciphersuite.* TLS-" # End of tests echo if [ $T_FAILED -eq 0 ]; then echo "PASSED ( $T_COUNT tests )" else echo "FAILED ( $T_FAILED / $T_COUNT tests )" fi exit $T_FAILED