123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448 |
- #!/bin/sh
- # context-info.sh
- #
- # Copyright The Mbed TLS Contributors
- # SPDX-License-Identifier: Apache-2.0
- #
- # Licensed under the Apache License, Version 2.0 (the "License"); you may
- # not use this file except in compliance with the License.
- # You may obtain a copy of the License at
- #
- # http://www.apache.org/licenses/LICENSE-2.0
- #
- # Unless required by applicable law or agreed to in writing, software
- # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- # See the License for the specific language governing permissions and
- # limitations under the License.
- #
- # 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 <name>
- print_name() {
- printf "%s %.*s " "$1" $(( 71 - ${#1} )) \
- "........................................................................"
- }
- # Print header to the test output file <test name> <file path> <test command>
- 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 <file path>
- 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 <name> <input file with b64 code> [ -arg <extra arguments for tested program> ] [option [...]]
- # Options: -m <pattern that MUST be present in the output of tested program>
- # -n <pattern that must NOT be present in the output of tested program>
- # -u <pattern that must be UNIQUE in the output of tested program>
- 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_TRUNCATED_HMAC$" \
- -u "MBEDTLS_SSL_ENCRYPT_THEN_MAC$" \
- -u "MBEDTLS_SSL_SESSION_TICKETS$" \
- -u "MBEDTLS_SSL_SESSION_TICKETS and client$" \
- -u "MBEDTLS_SSL_DTLS_BADMAC_LIMIT$" \
- -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_TRUNCATED_HMAC$" \
- -u "MBEDTLS_SSL_ENCRYPT_THEN_MAC$" \
- -u "MBEDTLS_SSL_SESSION_TICKETS$" \
- -u "MBEDTLS_SSL_SESSION_TICKETS and client$" \
- -u "MBEDTLS_SSL_DTLS_BADMAC_LIMIT$" \
- -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_TRUNCATED_HMAC$" \
- -n "MBEDTLS_SSL_ENCRYPT_THEN_MAC$" \
- -n "MBEDTLS_SSL_SESSION_TICKETS$" \
- -n "MBEDTLS_SSL_SESSION_TICKETS and client$" \
- -n "MBEDTLS_SSL_DTLS_BADMAC_LIMIT$" \
- -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_TRUNCATED_HMAC$" \
- -n "MBEDTLS_SSL_ENCRYPT_THEN_MAC$" \
- -n "MBEDTLS_SSL_SESSION_TICKETS$" \
- -n "MBEDTLS_SSL_SESSION_TICKETS and client$" \
- -n "MBEDTLS_SSL_DTLS_BADMAC_LIMIT$" \
- -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
|