xref: /netbsd-src/crypto/external/bsd/openssl/dist/test/generate_ssl_tests.pl (revision b0d1725196a7921d003d2c66a14f186abda4176b)
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