1# -*- mode: perl; -*-
2
3## SSL test configurations
4
5package ssltests;
6
7use strict;
8use warnings;
9
10use OpenSSL::Test;
11use OpenSSL::Test::Utils qw(anydisabled);
12
13our $fips_mode;
14
15my @curves = ("prime256v1", "secp384r1", "secp521r1");
16
17my @curves_no_fips = ("X25519", "X448");
18
19push @curves, @curves_no_fips if !$fips_mode;
20
21#Curves *only* suitable for use in TLSv1.3
22my @curves_tls_1_3 = ("ffdhe2048", "ffdhe3072", "ffdhe4096", "ffdhe6144",
23                      "ffdhe8192");
24
25push @curves, @curves_tls_1_3;
26
27my @curves_tls_1_2 = ("sect233k1", "sect233r1",
28              "sect283k1", "sect283r1", "sect409k1", "sect409r1",
29              "sect571k1", "sect571r1", "secp224r1");
30
31my @curves_non_fips = ("sect163k1", "sect163r2", "prime192v1",
32                       "sect163r1", "sect193r1", "sect193r2", "sect239k1",
33                       "secp160k1", "secp160r1", "secp160r2", "secp192k1",
34                       "secp224k1",  "secp256k1", "brainpoolP256r1",
35                       "brainpoolP384r1", "brainpoolP512r1");
36
37push @curves_tls_1_2, @curves_non_fips if !$fips_mode;
38
39our @tests = ();
40
41sub get_key_type {
42    my $group = shift;
43    my $keyType;
44
45    if ($group =~ /ffdhe/) {
46        $keyType = "dhKeyAgreement";
47    } else {
48        $keyType = $group;
49    }
50
51    return $keyType;
52}
53
54sub generate_tests() {
55    foreach (0..$#curves) {
56        my $curve = $curves[$_];
57        push @tests, {
58            name => "curve-${curve}",
59            server => {
60                "Curves" => $curve,
61                "MaxProtocol" => "TLSv1.3"
62            },
63            client => {
64                "CipherString" => "ECDHE",
65                "MaxProtocol" => "TLSv1.3",
66                "Curves" => $curve
67            },
68            test   => {
69                "ExpectedTmpKeyType" => get_key_type($curve),
70                "ExpectedProtocol" => "TLSv1.3",
71                "ExpectedResult" => "Success"
72            },
73        };
74    }
75    foreach (0..$#curves_tls_1_2) {
76        my $curve = $curves_tls_1_2[$_];
77        push @tests, {
78            name => "curve-${curve}",
79            server => {
80                "Curves" => $curve,
81                "MaxProtocol" => "TLSv1.3"
82            },
83            client => {
84                "CipherString" => "ECDHE",
85                "MaxProtocol" => "TLSv1.2",
86                "Curves" => $curve
87            },
88            test   => {
89                "ExpectedTmpKeyType" => get_key_type($curve),
90                "ExpectedProtocol" => "TLSv1.2",
91                "ExpectedResult" => "Success"
92            },
93        };
94    }
95    foreach (0..$#curves_tls_1_2) {
96        my $curve = $curves_tls_1_2[$_];
97        push @tests, {
98            name => "curve-${curve}-tls12-in-tls13",
99            server => {
100                "Curves" => "$curve:P-256",
101                "CipherString" => 'DEFAULT@SECLEVEL=1',
102                "MaxProtocol" => "TLSv1.3"
103            },
104            client => {
105                "CipherString" => 'ECDHE@SECLEVEL=1',
106                "MaxProtocol" => "TLSv1.3",
107                "MinProtocol" => "TLSv1.3",
108                "Curves" => "$curve:P-256"
109            },
110            test   => {
111                #This curve is not allowed in a TLSv1.3 key_share. We should
112                #succeed but fallback to P-256
113                "ExpectedTmpKeyType" => "P-256",
114                "ExpectedProtocol" => "TLSv1.3",
115                "ExpectedResult" => "Success"
116            },
117        };
118    }
119    foreach (0..$#curves_tls_1_2) {
120        my $curve = $curves_tls_1_2[$_];
121        push @tests, {
122            name => "curve-${curve}-tls13",
123            server => {
124                "Curves" => $curve,
125                "MaxProtocol" => "TLSv1.3"
126            },
127            client => {
128                "CipherString" => "ECDHE",
129                "MinProtocol" => "TLSv1.3",
130                "Curves" => $curve
131            },
132            test   => {
133                "ExpectedResult" => "ClientFail"
134            },
135        };
136    }
137    foreach (0..$#curves_tls_1_3) {
138        my $curve = $curves_tls_1_3[$_];
139        push @tests, {
140            name => "curve-${curve}-tls13-in-tls12",
141            server => {
142                "Curves" => $curve,
143                "CipherString" => 'DEFAULT@SECLEVEL=1',
144                "MaxProtocol" => "TLSv1.3"
145            },
146            client => {
147                "CipherString" => 'ECDHE@SECLEVEL=1',
148                "MaxProtocol" => "TLSv1.2",
149                "Curves" => $curve
150            },
151            test   => {
152                #These curves are only suitable for TLSv1.3 so we expect the
153                #server to fail because it has no shared groups for TLSv1.2
154                #ECDHE key exchange
155                "ExpectedResult" => "ServerFail"
156            },
157        };
158        push @tests, {
159            name => "curve-${curve}-tls13-in-tls12-2",
160            server => {
161                "Curves" => $curve,
162                "CipherString" => 'DEFAULT@SECLEVEL=1',
163                "MaxProtocol" => "TLSv1.2"
164            },
165            client => {
166                "CipherString" => 'DEFAULT@SECLEVEL=1',
167                "MaxProtocol" => "TLSv1.3",
168                "Curves" => $curve
169            },
170            test   => {
171                #These curves are only suitable for TLSv1.3. We expect TLSv1.2
172                #negotiation to succeed because we fall back to some other
173                #ciphersuite
174                "ExpectedResult" => "Success"
175            },
176        };
177    }
178}
179
180generate_tests();
181