1c7da899bSchristos#! /usr/bin/env perl 2*b0d17251Schristos# Copyright 2016-2021 The OpenSSL Project Authors. All Rights Reserved. 3c7da899bSchristos# 4*b0d17251Schristos# Licensed under the Apache License 2.0 (the "License"). You may not use 5c7da899bSchristos# this file except in compliance with the License. You can obtain a copy 6c7da899bSchristos# in the file LICENSE in the source distribution or at 7c7da899bSchristos# https://www.openssl.org/source/license.html 8c7da899bSchristos 9c7da899bSchristos## SSL testcase generator 10c7da899bSchristos 11c7da899bSchristosuse strict; 12c7da899bSchristosuse warnings; 13c7da899bSchristos 14*b0d17251Schristosuse Cwd qw/abs_path/; 15c7da899bSchristosuse File::Basename; 16c7da899bSchristosuse File::Spec::Functions; 17c7da899bSchristos 18c7da899bSchristosuse OpenSSL::Test qw/srctop_dir srctop_file/; 19c7da899bSchristosuse OpenSSL::Test::Utils; 20c7da899bSchristos 21*b0d17251Schristosuse FindBin; 22*b0d17251Schristosuse lib "$FindBin::Bin/../util/perl"; 23*b0d17251Schristosuse OpenSSL::fallback "$FindBin::Bin/../external/perl/MODULES.txt"; 24*b0d17251Schristosuse Text::Template 1.46; 25*b0d17251Schristos 26*b0d17251Schristosmy $input_file; 27*b0d17251Schristosmy $provider; 28*b0d17251Schristos 29c7da899bSchristosBEGIN { 30*b0d17251Schristos #Input file may be relative to cwd, but setup below changes the cwd, so 31*b0d17251Schristos #figure out the absolute path first 32*b0d17251Schristos $input_file = abs_path(shift); 33*b0d17251Schristos $provider = shift // ''; 34*b0d17251Schristos 35*b0d17251Schristos OpenSSL::Test::setup("no_test_here", quiet => 1); 36c7da899bSchristos} 37c7da899bSchristos 38*b0d17251Schristosuse lib "$FindBin::Bin/ssl-tests"; 39c7da899bSchristos 40c7da899bSchristosuse vars qw/@ISA/; 41c7da899bSchristospush (@ISA, qw/Text::Template/); 42c7da899bSchristos 43c7da899bSchristosuse ssltests_base; 44c7da899bSchristos 45c7da899bSchristossub print_templates { 46c7da899bSchristos my $source = srctop_file("test", "ssl_test.tmpl"); 47c7da899bSchristos my $template = Text::Template->new(TYPE => 'FILE', SOURCE => $source); 48c7da899bSchristos 49c7da899bSchristos print "# Generated with generate_ssl_tests.pl\n\n"; 50c7da899bSchristos 51c7da899bSchristos my $num = scalar @ssltests::tests; 52c7da899bSchristos 53c7da899bSchristos # Add the implicit base configuration. 54c7da899bSchristos foreach my $test (@ssltests::tests) { 55c7da899bSchristos $test->{"server"} = { (%ssltests::base_server, %{$test->{"server"}}) }; 56c7da899bSchristos if (defined $test->{"server2"}) { 57c7da899bSchristos $test->{"server2"} = { (%ssltests::base_server, %{$test->{"server2"}}) }; 58c7da899bSchristos } else { 59c7da899bSchristos if ($test->{"server"}->{"extra"} && 60c7da899bSchristos defined $test->{"server"}->{"extra"}->{"ServerNameCallback"}) { 61c7da899bSchristos # Default is the same as server. 62c7da899bSchristos $test->{"reuse_server2"} = 1; 63c7da899bSchristos } 64c7da899bSchristos # Do not emit an empty/duplicate "server2" section. 65c7da899bSchristos $test->{"server2"} = { }; 66c7da899bSchristos } 67c7da899bSchristos if (defined $test->{"resume_server"}) { 68c7da899bSchristos $test->{"resume_server"} = { (%ssltests::base_server, %{$test->{"resume_server"}}) }; 69c7da899bSchristos } else { 70c7da899bSchristos if (defined $test->{"test"}->{"HandshakeMode"} && 71c7da899bSchristos $test->{"test"}->{"HandshakeMode"} eq "Resume") { 72c7da899bSchristos # Default is the same as server. 73c7da899bSchristos $test->{"reuse_resume_server"} = 1; 74c7da899bSchristos } 75c7da899bSchristos # Do not emit an empty/duplicate "resume-server" section. 76c7da899bSchristos $test->{"resume_server"} = { }; 77c7da899bSchristos } 78c7da899bSchristos $test->{"client"} = { (%ssltests::base_client, %{$test->{"client"}}) }; 79c7da899bSchristos if (defined $test->{"resume_client"}) { 80c7da899bSchristos $test->{"resume_client"} = { (%ssltests::base_client, %{$test->{"resume_client"}}) }; 81c7da899bSchristos } else { 82c7da899bSchristos if (defined $test->{"test"}->{"HandshakeMode"} && 83c7da899bSchristos $test->{"test"}->{"HandshakeMode"} eq "Resume") { 84c7da899bSchristos # Default is the same as client. 85c7da899bSchristos $test->{"reuse_resume_client"} = 1; 86c7da899bSchristos } 87c7da899bSchristos # Do not emit an empty/duplicate "resume-client" section. 88c7da899bSchristos $test->{"resume_client"} = { }; 89c7da899bSchristos } 90c7da899bSchristos } 91c7da899bSchristos 92c7da899bSchristos # ssl_test expects to find a 93c7da899bSchristos # 94c7da899bSchristos # num_tests = n 95c7da899bSchristos # 96c7da899bSchristos # directive in the file. It'll then look for configuration directives 97c7da899bSchristos # for n tests, that each look like this: 98c7da899bSchristos # 99c7da899bSchristos # test-n = test-section 100c7da899bSchristos # 101c7da899bSchristos # [test-section] 102c7da899bSchristos # (SSL modules for client and server configuration go here.) 103c7da899bSchristos # 104c7da899bSchristos # [test-n] 105c7da899bSchristos # (Test configuration goes here.) 106c7da899bSchristos print "num_tests = $num\n\n"; 107c7da899bSchristos 108c7da899bSchristos # The conf module locations must come before everything else, because 109c7da899bSchristos # they look like 110c7da899bSchristos # 111c7da899bSchristos # test-n = test-section 112c7da899bSchristos # 113c7da899bSchristos # and you can't mix and match them with sections. 114c7da899bSchristos my $idx = 0; 115c7da899bSchristos 116c7da899bSchristos foreach my $test (@ssltests::tests) { 117c7da899bSchristos my $testname = "${idx}-" . $test->{'name'}; 118c7da899bSchristos print "test-$idx = $testname\n"; 119c7da899bSchristos $idx++; 120c7da899bSchristos } 121c7da899bSchristos 122c7da899bSchristos $idx = 0; 123c7da899bSchristos 124c7da899bSchristos foreach my $test (@ssltests::tests) { 125c7da899bSchristos my $testname = "${idx}-" . $test->{'name'}; 126c7da899bSchristos my $text = $template->fill_in( 127c7da899bSchristos HASH => [{ idx => $idx, testname => $testname } , $test], 128c7da899bSchristos DELIMITERS => [ "{-", "-}" ]); 129c7da899bSchristos print "# ===========================================================\n\n"; 130c7da899bSchristos print "$text\n"; 131c7da899bSchristos $idx++; 132c7da899bSchristos } 133c7da899bSchristos} 134c7da899bSchristos 135c7da899bSchristos# Shamelessly copied from Configure. 136c7da899bSchristossub read_config { 137c7da899bSchristos my $fname = shift; 138*b0d17251Schristos my $provider = shift; 139*b0d17251Schristos local $ssltests::fips_mode = $provider eq "fips"; 140*b0d17251Schristos local $ssltests::no_deflt_libctx = 141*b0d17251Schristos $provider eq "default" || $provider eq "fips"; 142*b0d17251Schristos 143c7da899bSchristos open(INPUT, "< $fname") or die "Can't open input file '$fname'!\n"; 144c7da899bSchristos local $/ = undef; 145c7da899bSchristos my $content = <INPUT>; 146c7da899bSchristos close(INPUT); 147c7da899bSchristos eval $content; 148c7da899bSchristos warn $@ if $@; 149c7da899bSchristos} 150c7da899bSchristos 151c7da899bSchristos# Reads the tests into ssltests::tests. 152*b0d17251Schristosread_config($input_file, $provider); 153c7da899bSchristosprint_templates(); 154c7da899bSchristos 155c7da899bSchristos1; 156