1# -*- mode: perl; -*-
2# Copyright 2016-2024 The OpenSSL Project Authors. All Rights Reserved.
3#
4# Licensed under the Apache License 2.0 (the "License").  You may not use
5# this file except in compliance with the License.  You can obtain a copy
6# in the file LICENSE in the source distribution or at
7# https://www.openssl.org/source/license.html
8
9
10## Test Renegotiation
11
12use strict;
13use warnings;
14
15package ssltests;
16use OpenSSL::Test::Utils;
17
18our $fips_mode;
19
20our @tests = ();
21
22foreach my $sctp ("No", "Yes")
23{
24    next if disabled("sctp") && $sctp eq "Yes";
25    next if disabled("dtls1_2") && $fips_mode;
26
27    my $suffix = ($sctp eq "No") ? "" : "-sctp";
28    our @tests_basic = (
29        {
30            name => "renegotiate-client-no-resume".$suffix,
31            server => {
32                "MaxProtocol" => "DTLSv1.2",
33                "CipherString" => 'DEFAULT:@SECLEVEL=0',
34                "Options" => "NoResumptionOnRenegotiation"
35            },
36            client => {
37                "CipherString" => 'DEFAULT:@SECLEVEL=0'
38            },
39            test => {
40                "Method" => "DTLS",
41                "UseSCTP" => $sctp,
42                "HandshakeMode" => "RenegotiateClient",
43                "ResumptionExpected" => "No",
44                "ExpectedResult" => "Success"
45            }
46        },
47        {
48            name => "renegotiate-client-resume".$suffix,
49            server => {
50                "MaxProtocol" => "DTLSv1.2",
51                "CipherString" => 'DEFAULT:@SECLEVEL=0'
52            },
53            client => {
54                "CipherString" => 'DEFAULT:@SECLEVEL=0'
55            },
56            test => {
57                "Method" => "DTLS",
58                "UseSCTP" => $sctp,
59                "HandshakeMode" => "RenegotiateClient",
60                "ResumptionExpected" => "Yes",
61                "ExpectedResult" => "Success"
62            }
63        },
64        # Note: Unlike the TLS tests, we will never do resumption with server
65        # initiated reneg. This is because an OpenSSL DTLS client will always do a full
66        # handshake (i.e. it doesn't supply a session id) when it receives a
67        # HelloRequest. This is different to the OpenSSL TLS implementation where an
68        # OpenSSL client will always try an abbreviated handshake (i.e. it will supply
69        # the session id). This goes all the way to commit 48ae85b6f when abbreviated
70        # handshake support was first added. Neither behaviour is wrong, but the
71        # discrepancy is strange. TODO: Should we harmonise the TLS and DTLS behaviour,
72        # and if so, what to?
73        {
74            name => "renegotiate-server-resume".$suffix,
75            server => {
76                "MaxProtocol" => "DTLSv1.2",
77                "CipherString" => 'DEFAULT:@SECLEVEL=0'
78            },
79            client => {
80                "CipherString" => 'DEFAULT:@SECLEVEL=0'
81            },
82            test => {
83                "Method" => "DTLS",
84                "UseSCTP" => $sctp,
85                "HandshakeMode" => "RenegotiateServer",
86                "ResumptionExpected" => "No",
87                "ExpectedResult" => "Success"
88            }
89        },
90        {
91            name => "renegotiate-client-auth-require".$suffix,
92            server => {
93                "MaxProtocol" => "DTLSv1.2",
94                "VerifyCAFile" => test_pem("root-cert.pem"),
95                "VerifyMode" => "Require",
96                "CipherString" => 'DEFAULT:@SECLEVEL=0'
97            },
98            client => {
99                "Certificate" => test_pem("ee-client-chain.pem"),
100                "PrivateKey"  => test_pem("ee-key.pem"),
101                "CipherString" => 'DEFAULT:@SECLEVEL=0'
102            },
103            test => {
104                "Method" => "DTLS",
105                "UseSCTP" => $sctp,
106                "HandshakeMode" => "RenegotiateServer",
107                "ResumptionExpected" => "No",
108                "ExpectedResult" => "Success"
109            }
110        },
111        {
112            name => "renegotiate-client-auth-once".$suffix,
113            server => {
114                "MaxProtocol" => "DTLSv1.2",
115                "VerifyCAFile" => test_pem("root-cert.pem"),
116                "VerifyMode" => "Once",
117                "CipherString" => 'DEFAULT:@SECLEVEL=0'
118            },
119            client => {
120                "Certificate" => test_pem("ee-client-chain.pem"),
121                "PrivateKey"  => test_pem("ee-key.pem"),
122                "CipherString" => 'DEFAULT:@SECLEVEL=0'
123            },
124            test => {
125                "Method" => "DTLS",
126                "UseSCTP" => $sctp,
127                "HandshakeMode" => "RenegotiateServer",
128                "ResumptionExpected" => "No",
129                "ExpectedResult" => "Success"
130            }
131        }
132    );
133    push @tests, @tests_basic;
134
135    next if disabled("dtls1_2");
136    our @tests_dtls1_2 = (
137        {
138            name => "renegotiate-aead-to-non-aead".$suffix,
139            server => {
140                "Options" => "NoResumptionOnRenegotiation"
141            },
142            client => {
143                "MaxProtocol" => "DTLSv1.2",
144                "CipherString" => "AES128-GCM-SHA256",
145                extra => {
146                    "RenegotiateCiphers" => "AES128-SHA"
147                }
148            },
149            test => {
150                "Method" => "DTLS",
151                "UseSCTP" => $sctp,
152                "HandshakeMode" => "RenegotiateClient",
153                "ResumptionExpected" => "No",
154                "ExpectedResult" => "Success"
155            }
156        },
157        {
158            name => "renegotiate-non-aead-to-aead".$suffix,
159            server => {
160                "Options" => "NoResumptionOnRenegotiation"
161            },
162            client => {
163                "MaxProtocol" => "DTLSv1.2",
164                "CipherString" => "AES128-SHA",
165                extra => {
166                    "RenegotiateCiphers" => "AES128-GCM-SHA256"
167                }
168            },
169            test => {
170                "Method" => "DTLS",
171                "UseSCTP" => $sctp,
172                "HandshakeMode" => "RenegotiateClient",
173                "ResumptionExpected" => "No",
174                "ExpectedResult" => "Success"
175            }
176        },
177        {
178            name => "renegotiate-non-aead-to-non-aead".$suffix,
179            server => {
180                "Options" => "NoResumptionOnRenegotiation"
181            },
182            client => {
183                "MaxProtocol" => "DTLSv1.2",
184                "CipherString" => "AES128-SHA",
185                extra => {
186                    "RenegotiateCiphers" => "AES256-SHA"
187                }
188            },
189            test => {
190                "Method" => "DTLS",
191                "UseSCTP" => $sctp,
192                "HandshakeMode" => "RenegotiateClient",
193                "ResumptionExpected" => "No",
194                "ExpectedResult" => "Success"
195            }
196        },
197        {
198            name => "renegotiate-aead-to-aead".$suffix,
199            server => {
200                "Options" => "NoResumptionOnRenegotiation"
201            },
202            client => {
203                "MaxProtocol" => "DTLSv1.2",
204                "CipherString" => "AES128-GCM-SHA256",
205                extra => {
206                    "RenegotiateCiphers" => "AES256-GCM-SHA384"
207                }
208            },
209            test => {
210                "Method" => "DTLS",
211                "UseSCTP" => $sctp,
212                "HandshakeMode" => "RenegotiateClient",
213                "ResumptionExpected" => "No",
214                "ExpectedResult" => "Success"
215            }
216        },
217    );
218    push @tests, @tests_dtls1_2;
219}
220