1*62c56f98SSadaf Ebrahimi#!/usr/bin/env perl 2*62c56f98SSadaf Ebrahimi 3*62c56f98SSadaf Ebrahimi# test-ref-configs.pl 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# For each reference configuration file in the configs directory, build the 11*62c56f98SSadaf Ebrahimi# configuration, run the test suites and compat.sh 12*62c56f98SSadaf Ebrahimi# 13*62c56f98SSadaf Ebrahimi# Usage: tests/scripts/test-ref-configs.pl [config-name [...]] 14*62c56f98SSadaf Ebrahimi 15*62c56f98SSadaf Ebrahimiuse warnings; 16*62c56f98SSadaf Ebrahimiuse strict; 17*62c56f98SSadaf Ebrahimi 18*62c56f98SSadaf Ebrahimimy %configs = ( 19*62c56f98SSadaf Ebrahimi 'config-ccm-psk-tls1_2.h' => { 20*62c56f98SSadaf Ebrahimi 'compat' => '-m tls12 -f \'^TLS-PSK-WITH-AES-...-CCM-8\'', 21*62c56f98SSadaf Ebrahimi 'test_again_with_use_psa' => 1 22*62c56f98SSadaf Ebrahimi }, 23*62c56f98SSadaf Ebrahimi 'config-ccm-psk-dtls1_2.h' => { 24*62c56f98SSadaf Ebrahimi 'compat' => '-m dtls12 -f \'^TLS-PSK-WITH-AES-...-CCM-8\'', 25*62c56f98SSadaf Ebrahimi 'opt' => ' ', 26*62c56f98SSadaf Ebrahimi 'opt_needs_debug' => 1, 27*62c56f98SSadaf Ebrahimi 'test_again_with_use_psa' => 1 28*62c56f98SSadaf Ebrahimi }, 29*62c56f98SSadaf Ebrahimi 'config-no-entropy.h' => { 30*62c56f98SSadaf Ebrahimi }, 31*62c56f98SSadaf Ebrahimi 'config-suite-b.h' => { 32*62c56f98SSadaf Ebrahimi 'compat' => "-m tls12 -f 'ECDHE-ECDSA.*AES.*GCM' -p mbedTLS", 33*62c56f98SSadaf Ebrahimi 'test_again_with_use_psa' => 1, 34*62c56f98SSadaf Ebrahimi 'opt' => ' ', 35*62c56f98SSadaf Ebrahimi 'opt_needs_debug' => 1, 36*62c56f98SSadaf Ebrahimi }, 37*62c56f98SSadaf Ebrahimi 'config-symmetric-only.h' => { 38*62c56f98SSadaf Ebrahimi 'test_again_with_use_psa' => 0, # Uses PSA by default, no need to test it twice 39*62c56f98SSadaf Ebrahimi }, 40*62c56f98SSadaf Ebrahimi 'config-thread.h' => { 41*62c56f98SSadaf Ebrahimi 'opt' => '-f ECJPAKE.*nolog', 42*62c56f98SSadaf Ebrahimi 'test_again_with_use_psa' => 1, 43*62c56f98SSadaf Ebrahimi }, 44*62c56f98SSadaf Ebrahimi); 45*62c56f98SSadaf Ebrahimi 46*62c56f98SSadaf Ebrahimi# If no config-name is provided, use all known configs. 47*62c56f98SSadaf Ebrahimi# Otherwise, use the provided names only. 48*62c56f98SSadaf Ebrahimimy @configs_to_test = sort keys %configs; 49*62c56f98SSadaf Ebrahimiif ($#ARGV >= 0) { 50*62c56f98SSadaf Ebrahimi foreach my $conf_name ( @ARGV ) { 51*62c56f98SSadaf Ebrahimi if( ! exists $configs{$conf_name} ) { 52*62c56f98SSadaf Ebrahimi die "Unknown configuration: $conf_name\n"; 53*62c56f98SSadaf Ebrahimi } 54*62c56f98SSadaf Ebrahimi } 55*62c56f98SSadaf Ebrahimi @configs_to_test = @ARGV; 56*62c56f98SSadaf Ebrahimi} 57*62c56f98SSadaf Ebrahimi 58*62c56f98SSadaf Ebrahimi-d 'library' && -d 'include' && -d 'tests' or die "Must be run from root\n"; 59*62c56f98SSadaf Ebrahimi 60*62c56f98SSadaf Ebrahimimy $config_h = 'include/mbedtls/mbedtls_config.h'; 61*62c56f98SSadaf Ebrahimi 62*62c56f98SSadaf Ebrahimisystem( "cp $config_h $config_h.bak" ) and die; 63*62c56f98SSadaf Ebrahimisub abort { 64*62c56f98SSadaf Ebrahimi system( "mv $config_h.bak $config_h" ) and warn "$config_h not restored\n"; 65*62c56f98SSadaf Ebrahimi # use an exit code between 1 and 124 for git bisect (die returns 255) 66*62c56f98SSadaf Ebrahimi warn $_[0]; 67*62c56f98SSadaf Ebrahimi exit 1; 68*62c56f98SSadaf Ebrahimi} 69*62c56f98SSadaf Ebrahimi 70*62c56f98SSadaf Ebrahimi# Create a seedfile for configurations that enable MBEDTLS_ENTROPY_NV_SEED. 71*62c56f98SSadaf Ebrahimi# For test purposes, this doesn't have to be cryptographically random. 72*62c56f98SSadaf Ebrahimiif (!-e "tests/seedfile" || -s "tests/seedfile" < 64) { 73*62c56f98SSadaf Ebrahimi local *SEEDFILE; 74*62c56f98SSadaf Ebrahimi open SEEDFILE, ">tests/seedfile" or die; 75*62c56f98SSadaf Ebrahimi print SEEDFILE "*" x 64 or die; 76*62c56f98SSadaf Ebrahimi close SEEDFILE or die; 77*62c56f98SSadaf Ebrahimi} 78*62c56f98SSadaf Ebrahimi 79*62c56f98SSadaf Ebrahimisub perform_test { 80*62c56f98SSadaf Ebrahimi my $conf_file = $_[0]; 81*62c56f98SSadaf Ebrahimi my $data = $_[1]; 82*62c56f98SSadaf Ebrahimi my $test_with_psa = $_[2]; 83*62c56f98SSadaf Ebrahimi 84*62c56f98SSadaf Ebrahimi my $conf_name = $conf_file; 85*62c56f98SSadaf Ebrahimi if ( $test_with_psa ) 86*62c56f98SSadaf Ebrahimi { 87*62c56f98SSadaf Ebrahimi $conf_name .= "+PSA"; 88*62c56f98SSadaf Ebrahimi } 89*62c56f98SSadaf Ebrahimi 90*62c56f98SSadaf Ebrahimi system( "cp $config_h.bak $config_h" ) and die; 91*62c56f98SSadaf Ebrahimi system( "make clean" ) and die; 92*62c56f98SSadaf Ebrahimi 93*62c56f98SSadaf Ebrahimi print "\n******************************************\n"; 94*62c56f98SSadaf Ebrahimi print "* Testing configuration: $conf_name\n"; 95*62c56f98SSadaf Ebrahimi print "******************************************\n"; 96*62c56f98SSadaf Ebrahimi 97*62c56f98SSadaf Ebrahimi $ENV{MBEDTLS_TEST_CONFIGURATION} = $conf_name; 98*62c56f98SSadaf Ebrahimi 99*62c56f98SSadaf Ebrahimi system( "cp configs/$conf_file $config_h" ) 100*62c56f98SSadaf Ebrahimi and abort "Failed to activate $conf_file\n"; 101*62c56f98SSadaf Ebrahimi 102*62c56f98SSadaf Ebrahimi if ( $test_with_psa ) 103*62c56f98SSadaf Ebrahimi { 104*62c56f98SSadaf Ebrahimi system( "scripts/config.py set MBEDTLS_PSA_CRYPTO_C" ); 105*62c56f98SSadaf Ebrahimi system( "scripts/config.py set MBEDTLS_USE_PSA_CRYPTO" ); 106*62c56f98SSadaf Ebrahimi } 107*62c56f98SSadaf Ebrahimi 108*62c56f98SSadaf Ebrahimi system( "CFLAGS='-Os -Werror -Wall -Wextra' make" ) and abort "Failed to build: $conf_name\n"; 109*62c56f98SSadaf Ebrahimi system( "make test" ) and abort "Failed test suite: $conf_name\n"; 110*62c56f98SSadaf Ebrahimi 111*62c56f98SSadaf Ebrahimi my $compat = $data->{'compat'}; 112*62c56f98SSadaf Ebrahimi if( $compat ) 113*62c56f98SSadaf Ebrahimi { 114*62c56f98SSadaf Ebrahimi print "\nrunning compat.sh $compat ($conf_name)\n"; 115*62c56f98SSadaf Ebrahimi system( "tests/compat.sh $compat" ) 116*62c56f98SSadaf Ebrahimi and abort "Failed compat.sh: $conf_name\n"; 117*62c56f98SSadaf Ebrahimi } 118*62c56f98SSadaf Ebrahimi else 119*62c56f98SSadaf Ebrahimi { 120*62c56f98SSadaf Ebrahimi print "\nskipping compat.sh ($conf_name)\n"; 121*62c56f98SSadaf Ebrahimi } 122*62c56f98SSadaf Ebrahimi 123*62c56f98SSadaf Ebrahimi my $opt = $data->{'opt'}; 124*62c56f98SSadaf Ebrahimi if( $opt ) 125*62c56f98SSadaf Ebrahimi { 126*62c56f98SSadaf Ebrahimi if( $data->{'opt_needs_debug'} ) 127*62c56f98SSadaf Ebrahimi { 128*62c56f98SSadaf Ebrahimi print "\nrebuilding with debug traces for ssl-opt ($conf_name)\n"; 129*62c56f98SSadaf Ebrahimi $conf_name .= '+DEBUG'; 130*62c56f98SSadaf Ebrahimi $ENV{MBEDTLS_TEST_CONFIGURATION} = $conf_name; 131*62c56f98SSadaf Ebrahimi system( "make clean" ); 132*62c56f98SSadaf Ebrahimi system( "scripts/config.py set MBEDTLS_DEBUG_C" ); 133*62c56f98SSadaf Ebrahimi system( "scripts/config.py set MBEDTLS_ERROR_C" ); 134*62c56f98SSadaf Ebrahimi system( "CFLAGS='-Os -Werror -Wall -Wextra' make" ) and abort "Failed to build: $conf_name\n"; 135*62c56f98SSadaf Ebrahimi } 136*62c56f98SSadaf Ebrahimi 137*62c56f98SSadaf Ebrahimi print "\nrunning ssl-opt.sh $opt ($conf_name)\n"; 138*62c56f98SSadaf Ebrahimi system( "tests/ssl-opt.sh $opt" ) 139*62c56f98SSadaf Ebrahimi and abort "Failed ssl-opt.sh: $conf_name\n"; 140*62c56f98SSadaf Ebrahimi } 141*62c56f98SSadaf Ebrahimi else 142*62c56f98SSadaf Ebrahimi { 143*62c56f98SSadaf Ebrahimi print "\nskipping ssl-opt.sh ($conf_name)\n"; 144*62c56f98SSadaf Ebrahimi } 145*62c56f98SSadaf Ebrahimi} 146*62c56f98SSadaf Ebrahimi 147*62c56f98SSadaf Ebrahimiforeach my $conf ( @configs_to_test ) { 148*62c56f98SSadaf Ebrahimi my $test_with_psa = $configs{$conf}{'test_again_with_use_psa'}; 149*62c56f98SSadaf Ebrahimi if ( $test_with_psa ) 150*62c56f98SSadaf Ebrahimi { 151*62c56f98SSadaf Ebrahimi perform_test( $conf, $configs{$conf}, $test_with_psa ); 152*62c56f98SSadaf Ebrahimi } 153*62c56f98SSadaf Ebrahimi perform_test( $conf, $configs{$conf}, 0 ); 154*62c56f98SSadaf Ebrahimi} 155*62c56f98SSadaf Ebrahimi 156*62c56f98SSadaf Ebrahimisystem( "mv $config_h.bak $config_h" ) and warn "$config_h not restored\n"; 157*62c56f98SSadaf Ebrahimisystem( "make clean" ); 158*62c56f98SSadaf Ebrahimiexit 0; 159