xref: /freebsd/crypto/openssl/test/recipes/70-test_sslmessages.t (revision e7be843b4a162e68651d3911f0357ed464915629)
1e0c4386eSCy Schubert#! /usr/bin/env perl
2*e7be843bSPierre Pronchery# Copyright 2015-2024 The OpenSSL Project Authors. All Rights Reserved.
3e0c4386eSCy Schubert#
4e0c4386eSCy Schubert# Licensed under the Apache License 2.0 (the "License").  You may not use
5e0c4386eSCy Schubert# this file except in compliance with the License.  You can obtain a copy
6e0c4386eSCy Schubert# in the file LICENSE in the source distribution or at
7e0c4386eSCy Schubert# https://www.openssl.org/source/license.html
8e0c4386eSCy Schubert
9e0c4386eSCy Schubertuse strict;
10e0c4386eSCy Schubertuse OpenSSL::Test qw/:DEFAULT cmdstr srctop_file srctop_dir bldtop_dir/;
11e0c4386eSCy Schubertuse OpenSSL::Test::Utils;
12e0c4386eSCy Schubertuse File::Temp qw(tempfile);
13e0c4386eSCy Schubertuse TLSProxy::Proxy;
14e0c4386eSCy Schubertuse checkhandshake qw(checkhandshake @handmessages @extensions);
15e0c4386eSCy Schubert
16e0c4386eSCy Schubertmy $test_name = "test_sslmessages";
17e0c4386eSCy Schubertsetup($test_name);
18e0c4386eSCy Schubert
19e0c4386eSCy Schubertplan skip_all => "TLSProxy isn't usable on $^O"
20e0c4386eSCy Schubert    if $^O =~ /^(VMS)$/;
21e0c4386eSCy Schubert
22e0c4386eSCy Schubertplan skip_all => "$test_name needs the dynamic engine feature enabled"
23e0c4386eSCy Schubert    if disabled("engine") || disabled("dynamic-engine");
24e0c4386eSCy Schubert
25e0c4386eSCy Schubertplan skip_all => "$test_name needs the sock feature enabled"
26e0c4386eSCy Schubert    if disabled("sock");
27e0c4386eSCy Schubert
28e0c4386eSCy Schubertplan skip_all => "$test_name needs TLS enabled"
29e0c4386eSCy Schubert    if alldisabled(available_protocols("tls"))
30e0c4386eSCy Schubert       || (!disabled("tls1_3") && disabled("tls1_2"));
31e0c4386eSCy Schubert
32e0c4386eSCy Schubertmy $proxy = TLSProxy::Proxy->new(
33e0c4386eSCy Schubert    undef,
34e0c4386eSCy Schubert    cmdstr(app(["openssl"]), display => 1),
35e0c4386eSCy Schubert    srctop_file("apps", "server.pem"),
36e0c4386eSCy Schubert    (!$ENV{HARNESS_ACTIVE} || $ENV{HARNESS_VERBOSE})
37e0c4386eSCy Schubert);
38e0c4386eSCy Schubert
39e0c4386eSCy Schubert@handmessages = (
40e0c4386eSCy Schubert    [TLSProxy::Message::MT_CLIENT_HELLO,
41e0c4386eSCy Schubert        checkhandshake::ALL_HANDSHAKES],
42e0c4386eSCy Schubert    [TLSProxy::Message::MT_SERVER_HELLO,
43e0c4386eSCy Schubert        checkhandshake::ALL_HANDSHAKES],
44e0c4386eSCy Schubert    [TLSProxy::Message::MT_CERTIFICATE,
45e0c4386eSCy Schubert        checkhandshake::ALL_HANDSHAKES
46e0c4386eSCy Schubert        & ~checkhandshake::RESUME_HANDSHAKE],
47e0c4386eSCy Schubert    (disabled("ec") ? () :
48e0c4386eSCy Schubert                      [TLSProxy::Message::MT_SERVER_KEY_EXCHANGE,
49e0c4386eSCy Schubert                          checkhandshake::EC_HANDSHAKE]),
50e0c4386eSCy Schubert    [TLSProxy::Message::MT_CERTIFICATE_STATUS,
51e0c4386eSCy Schubert        checkhandshake::OCSP_HANDSHAKE],
52e0c4386eSCy Schubert    #ServerKeyExchange handshakes not currently supported by TLSProxy
53e0c4386eSCy Schubert    [TLSProxy::Message::MT_CERTIFICATE_REQUEST,
54e0c4386eSCy Schubert        checkhandshake::CLIENT_AUTH_HANDSHAKE],
55e0c4386eSCy Schubert    [TLSProxy::Message::MT_SERVER_HELLO_DONE,
56e0c4386eSCy Schubert        checkhandshake::ALL_HANDSHAKES
57e0c4386eSCy Schubert        & ~checkhandshake::RESUME_HANDSHAKE],
58e0c4386eSCy Schubert    [TLSProxy::Message::MT_CERTIFICATE,
59e0c4386eSCy Schubert        checkhandshake::CLIENT_AUTH_HANDSHAKE],
60e0c4386eSCy Schubert    [TLSProxy::Message::MT_CLIENT_KEY_EXCHANGE,
61e0c4386eSCy Schubert        checkhandshake::ALL_HANDSHAKES
62e0c4386eSCy Schubert        & ~checkhandshake::RESUME_HANDSHAKE],
63e0c4386eSCy Schubert    [TLSProxy::Message::MT_CERTIFICATE_VERIFY,
64e0c4386eSCy Schubert        checkhandshake::CLIENT_AUTH_HANDSHAKE],
65e0c4386eSCy Schubert    [TLSProxy::Message::MT_NEXT_PROTO,
66e0c4386eSCy Schubert        checkhandshake::NPN_HANDSHAKE],
67e0c4386eSCy Schubert    [TLSProxy::Message::MT_FINISHED,
68e0c4386eSCy Schubert        checkhandshake::ALL_HANDSHAKES],
69e0c4386eSCy Schubert    [TLSProxy::Message::MT_NEW_SESSION_TICKET,
70e0c4386eSCy Schubert        checkhandshake::ALL_HANDSHAKES
71e0c4386eSCy Schubert        & ~checkhandshake::RESUME_HANDSHAKE],
72e0c4386eSCy Schubert    [TLSProxy::Message::MT_FINISHED,
73e0c4386eSCy Schubert        checkhandshake::ALL_HANDSHAKES],
74e0c4386eSCy Schubert    [TLSProxy::Message::MT_CLIENT_HELLO,
75e0c4386eSCy Schubert        checkhandshake::RENEG_HANDSHAKE],
76e0c4386eSCy Schubert    [TLSProxy::Message::MT_SERVER_HELLO,
77e0c4386eSCy Schubert        checkhandshake::RENEG_HANDSHAKE],
78e0c4386eSCy Schubert    [TLSProxy::Message::MT_CERTIFICATE,
79e0c4386eSCy Schubert        checkhandshake::RENEG_HANDSHAKE],
80e0c4386eSCy Schubert    [TLSProxy::Message::MT_SERVER_HELLO_DONE,
81e0c4386eSCy Schubert        checkhandshake::RENEG_HANDSHAKE],
82e0c4386eSCy Schubert    [TLSProxy::Message::MT_CLIENT_KEY_EXCHANGE,
83e0c4386eSCy Schubert        checkhandshake::RENEG_HANDSHAKE],
84e0c4386eSCy Schubert    [TLSProxy::Message::MT_FINISHED,
85e0c4386eSCy Schubert        checkhandshake::RENEG_HANDSHAKE],
86e0c4386eSCy Schubert    [TLSProxy::Message::MT_NEW_SESSION_TICKET,
87e0c4386eSCy Schubert        checkhandshake::RENEG_HANDSHAKE],
88e0c4386eSCy Schubert    [TLSProxy::Message::MT_FINISHED,
89e0c4386eSCy Schubert        checkhandshake::RENEG_HANDSHAKE],
90e0c4386eSCy Schubert    [0, 0]
91e0c4386eSCy Schubert);
92e0c4386eSCy Schubert
93e0c4386eSCy Schubert@extensions = (
94e0c4386eSCy Schubert    [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_SERVER_NAME,
95e0c4386eSCy Schubert        TLSProxy::Message::CLIENT,
96e0c4386eSCy Schubert        checkhandshake::SERVER_NAME_CLI_EXTENSION],
97e0c4386eSCy Schubert    [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_STATUS_REQUEST,
98e0c4386eSCy Schubert        TLSProxy::Message::CLIENT,
99e0c4386eSCy Schubert        checkhandshake::STATUS_REQUEST_CLI_EXTENSION],
100e0c4386eSCy Schubert    (disabled("ec") ? () :
101e0c4386eSCy Schubert                      [TLSProxy::Message::MT_CLIENT_HELLO,
102e0c4386eSCy Schubert                       TLSProxy::Message::EXT_SUPPORTED_GROUPS,
103e0c4386eSCy Schubert                       TLSProxy::Message::CLIENT,
104e0c4386eSCy Schubert                       checkhandshake::DEFAULT_EXTENSIONS]),
105e0c4386eSCy Schubert    (disabled("ec") ? () :
106e0c4386eSCy Schubert                      [TLSProxy::Message::MT_CLIENT_HELLO,
107e0c4386eSCy Schubert                       TLSProxy::Message::EXT_EC_POINT_FORMATS,
108e0c4386eSCy Schubert                       TLSProxy::Message::CLIENT,
109e0c4386eSCy Schubert                       checkhandshake::DEFAULT_EXTENSIONS]),
110e0c4386eSCy Schubert    (disabled("tls1_2") ? () :
111e0c4386eSCy Schubert     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_SIG_ALGS,
112e0c4386eSCy Schubert        TLSProxy::Message::CLIENT,
113e0c4386eSCy Schubert         checkhandshake::DEFAULT_EXTENSIONS]),
114e0c4386eSCy Schubert    [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_ALPN,
115e0c4386eSCy Schubert        TLSProxy::Message::CLIENT,
116e0c4386eSCy Schubert        checkhandshake::ALPN_CLI_EXTENSION],
117e0c4386eSCy Schubert    [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_SCT,
118e0c4386eSCy Schubert        TLSProxy::Message::CLIENT,
119e0c4386eSCy Schubert        checkhandshake::SCT_CLI_EXTENSION],
120e0c4386eSCy Schubert    [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_ENCRYPT_THEN_MAC,
121e0c4386eSCy Schubert        TLSProxy::Message::CLIENT,
122e0c4386eSCy Schubert        checkhandshake::DEFAULT_EXTENSIONS],
123e0c4386eSCy Schubert    [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_EXTENDED_MASTER_SECRET,
124e0c4386eSCy Schubert        TLSProxy::Message::CLIENT,
125e0c4386eSCy Schubert        checkhandshake::DEFAULT_EXTENSIONS],
126e0c4386eSCy Schubert    [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_SESSION_TICKET,
127e0c4386eSCy Schubert        TLSProxy::Message::CLIENT,
128e0c4386eSCy Schubert        checkhandshake::DEFAULT_EXTENSIONS],
129e0c4386eSCy Schubert    [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_RENEGOTIATE,
130e0c4386eSCy Schubert        TLSProxy::Message::CLIENT,
131*e7be843bSPierre Pronchery        checkhandshake::DEFAULT_EXTENSIONS],
132e0c4386eSCy Schubert    [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_NPN,
133e0c4386eSCy Schubert        TLSProxy::Message::CLIENT,
134e0c4386eSCy Schubert        checkhandshake::NPN_CLI_EXTENSION],
135e0c4386eSCy Schubert    [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_SRP,
136e0c4386eSCy Schubert        TLSProxy::Message::CLIENT,
137e0c4386eSCy Schubert        checkhandshake::SRP_CLI_EXTENSION],
138e0c4386eSCy Schubert
139e0c4386eSCy Schubert    [TLSProxy::Message::MT_SERVER_HELLO, TLSProxy::Message::EXT_RENEGOTIATE,
140e0c4386eSCy Schubert        TLSProxy::Message::SERVER,
141e0c4386eSCy Schubert        checkhandshake::DEFAULT_EXTENSIONS],
142e0c4386eSCy Schubert    [TLSProxy::Message::MT_SERVER_HELLO, TLSProxy::Message::EXT_ENCRYPT_THEN_MAC,
143e0c4386eSCy Schubert        TLSProxy::Message::SERVER,
144e0c4386eSCy Schubert        checkhandshake::DEFAULT_EXTENSIONS],
145e0c4386eSCy Schubert    [TLSProxy::Message::MT_SERVER_HELLO, TLSProxy::Message::EXT_EXTENDED_MASTER_SECRET,
146e0c4386eSCy Schubert        TLSProxy::Message::SERVER,
147e0c4386eSCy Schubert        checkhandshake::DEFAULT_EXTENSIONS],
148e0c4386eSCy Schubert    [TLSProxy::Message::MT_SERVER_HELLO, TLSProxy::Message::EXT_SESSION_TICKET,
149e0c4386eSCy Schubert        TLSProxy::Message::SERVER,
150e0c4386eSCy Schubert        checkhandshake::SESSION_TICKET_SRV_EXTENSION],
151e0c4386eSCy Schubert    [TLSProxy::Message::MT_SERVER_HELLO, TLSProxy::Message::EXT_SERVER_NAME,
152e0c4386eSCy Schubert        TLSProxy::Message::SERVER,
153e0c4386eSCy Schubert        checkhandshake::SERVER_NAME_SRV_EXTENSION],
154e0c4386eSCy Schubert    [TLSProxy::Message::MT_SERVER_HELLO, TLSProxy::Message::EXT_STATUS_REQUEST,
155e0c4386eSCy Schubert        TLSProxy::Message::SERVER,
156e0c4386eSCy Schubert        checkhandshake::STATUS_REQUEST_SRV_EXTENSION],
157e0c4386eSCy Schubert    [TLSProxy::Message::MT_SERVER_HELLO, TLSProxy::Message::EXT_ALPN,
158e0c4386eSCy Schubert        TLSProxy::Message::SERVER,
159e0c4386eSCy Schubert        checkhandshake::ALPN_SRV_EXTENSION],
160e0c4386eSCy Schubert    [TLSProxy::Message::MT_SERVER_HELLO, TLSProxy::Message::EXT_SCT,
161e0c4386eSCy Schubert        TLSProxy::Message::SERVER,
162e0c4386eSCy Schubert        checkhandshake::SCT_SRV_EXTENSION],
163e0c4386eSCy Schubert    [TLSProxy::Message::MT_SERVER_HELLO, TLSProxy::Message::EXT_NPN,
164e0c4386eSCy Schubert        TLSProxy::Message::SERVER,
165e0c4386eSCy Schubert        checkhandshake::NPN_SRV_EXTENSION],
166e0c4386eSCy Schubert    [TLSProxy::Message::MT_SERVER_HELLO, TLSProxy::Message::EXT_EC_POINT_FORMATS,
167e0c4386eSCy Schubert        TLSProxy::Message::SERVER,
168e0c4386eSCy Schubert        checkhandshake::EC_POINT_FORMAT_SRV_EXTENSION],
169e0c4386eSCy Schubert    [0,0,0,0]
170e0c4386eSCy Schubert);
171e0c4386eSCy Schubert
172e0c4386eSCy Schubert#Test 1: Check we get all the right messages for a default handshake
173e0c4386eSCy Schubert(undef, my $session) = tempfile();
174e0c4386eSCy Schubert$proxy->serverconnects(2);
175*e7be843bSPierre Pronchery$proxy->cipherc("DEFAULT:\@SECLEVEL=2");
176e0c4386eSCy Schubert$proxy->clientflags("-no_tls1_3 -sess_out ".$session);
177e0c4386eSCy Schubert$proxy->start() or plan skip_all => "Unable to start up Proxy for tests";
178e0c4386eSCy Schubertplan tests => 21;
179e0c4386eSCy Schubertcheckhandshake($proxy, checkhandshake::DEFAULT_HANDSHAKE,
180e0c4386eSCy Schubert               checkhandshake::DEFAULT_EXTENSIONS,
181e0c4386eSCy Schubert               "Default handshake test");
182e0c4386eSCy Schubert
183e0c4386eSCy Schubert#Test 2: Resumption handshake
184e0c4386eSCy Schubert$proxy->clearClient();
185*e7be843bSPierre Pronchery$proxy->cipherc("DEFAULT:\@SECLEVEL=2");
186e0c4386eSCy Schubert$proxy->clientflags("-no_tls1_3 -sess_in ".$session);
187e0c4386eSCy Schubert$proxy->clientstart();
188e0c4386eSCy Schubertcheckhandshake($proxy, checkhandshake::RESUME_HANDSHAKE,
189e0c4386eSCy Schubert               checkhandshake::DEFAULT_EXTENSIONS
190e0c4386eSCy Schubert               & ~checkhandshake::SESSION_TICKET_SRV_EXTENSION,
191e0c4386eSCy Schubert               "Resumption handshake test");
192e0c4386eSCy Schubertunlink $session;
193e0c4386eSCy Schubert
194e0c4386eSCy SchubertSKIP: {
195e0c4386eSCy Schubert    skip "No OCSP support in this OpenSSL build", 3
196e0c4386eSCy Schubert        if disabled("ocsp");
197e0c4386eSCy Schubert
198e0c4386eSCy Schubert    #Test 3: A status_request handshake (client request only)
199e0c4386eSCy Schubert    $proxy->clear();
200*e7be843bSPierre Pronchery    $proxy->cipherc("DEFAULT:\@SECLEVEL=2");
201e0c4386eSCy Schubert    $proxy->clientflags("-no_tls1_3 -status");
202e0c4386eSCy Schubert    $proxy->start();
203e0c4386eSCy Schubert    checkhandshake($proxy, checkhandshake::DEFAULT_HANDSHAKE,
204e0c4386eSCy Schubert                   checkhandshake::DEFAULT_EXTENSIONS
205e0c4386eSCy Schubert                   | checkhandshake::STATUS_REQUEST_CLI_EXTENSION,
206e0c4386eSCy Schubert                   "status_request handshake test (client)");
207e0c4386eSCy Schubert
208e0c4386eSCy Schubert    #Test 4: A status_request handshake (server support only)
209e0c4386eSCy Schubert    $proxy->clear();
210*e7be843bSPierre Pronchery    $proxy->cipherc("DEFAULT:\@SECLEVEL=2");
211e0c4386eSCy Schubert    $proxy->clientflags("-no_tls1_3");
212e0c4386eSCy Schubert    $proxy->serverflags("-status_file "
213e0c4386eSCy Schubert                        .srctop_file("test", "recipes", "ocsp-response.der"));
214e0c4386eSCy Schubert    $proxy->start();
215e0c4386eSCy Schubert    checkhandshake($proxy, checkhandshake::DEFAULT_HANDSHAKE,
216e0c4386eSCy Schubert                   checkhandshake::DEFAULT_EXTENSIONS,
217e0c4386eSCy Schubert                   "status_request handshake test (server)");
218e0c4386eSCy Schubert
219e0c4386eSCy Schubert    #Test 5: A status_request handshake (client and server)
220e0c4386eSCy Schubert    $proxy->clear();
221*e7be843bSPierre Pronchery    $proxy->cipherc("DEFAULT:\@SECLEVEL=2");
222e0c4386eSCy Schubert    $proxy->clientflags("-no_tls1_3 -status");
223e0c4386eSCy Schubert    $proxy->serverflags("-status_file "
224e0c4386eSCy Schubert                        .srctop_file("test", "recipes", "ocsp-response.der"));
225e0c4386eSCy Schubert    $proxy->start();
226e0c4386eSCy Schubert    checkhandshake($proxy, checkhandshake::OCSP_HANDSHAKE,
227e0c4386eSCy Schubert                   checkhandshake::DEFAULT_EXTENSIONS
228e0c4386eSCy Schubert                   | checkhandshake::STATUS_REQUEST_CLI_EXTENSION
229e0c4386eSCy Schubert                   | checkhandshake::STATUS_REQUEST_SRV_EXTENSION,
230e0c4386eSCy Schubert                   "status_request handshake test");
231e0c4386eSCy Schubert}
232e0c4386eSCy Schubert
233e0c4386eSCy Schubert#Test 6: A client auth handshake
234e0c4386eSCy Schubert$proxy->clear();
235*e7be843bSPierre Pronchery$proxy->cipherc("DEFAULT:\@SECLEVEL=2");
236e0c4386eSCy Schubert$proxy->clientflags("-no_tls1_3 -cert ".srctop_file("apps", "server.pem"));
237e0c4386eSCy Schubert$proxy->serverflags("-Verify 5");
238e0c4386eSCy Schubert$proxy->start();
239e0c4386eSCy Schubertcheckhandshake($proxy, checkhandshake::CLIENT_AUTH_HANDSHAKE,
240e0c4386eSCy Schubert               checkhandshake::DEFAULT_EXTENSIONS,
241e0c4386eSCy Schubert               "Client auth handshake test");
242e0c4386eSCy Schubert
243e0c4386eSCy Schubert#Test 7: A handshake with a renegotiation
244e0c4386eSCy Schubert$proxy->clear();
245*e7be843bSPierre Pronchery$proxy->cipherc("DEFAULT:\@SECLEVEL=2");
246e0c4386eSCy Schubert$proxy->clientflags("-no_tls1_3");
247e0c4386eSCy Schubert$proxy->serverflags("-client_renegotiation");
248e0c4386eSCy Schubert$proxy->reneg(1);
249e0c4386eSCy Schubert$proxy->start();
250e0c4386eSCy Schubertcheckhandshake($proxy, checkhandshake::RENEG_HANDSHAKE,
251e0c4386eSCy Schubert               checkhandshake::DEFAULT_EXTENSIONS,
252e0c4386eSCy Schubert               "Renegotiation handshake test");
253e0c4386eSCy Schubert
254e0c4386eSCy Schubert#Test 8: Server name handshake (no client request)
255e0c4386eSCy Schubert$proxy->clear();
256*e7be843bSPierre Pronchery$proxy->cipherc("DEFAULT:\@SECLEVEL=2");
257e0c4386eSCy Schubert$proxy->clientflags("-no_tls1_3 -noservername");
258e0c4386eSCy Schubert$proxy->start();
259e0c4386eSCy Schubertcheckhandshake($proxy, checkhandshake::DEFAULT_HANDSHAKE,
260e0c4386eSCy Schubert               checkhandshake::DEFAULT_EXTENSIONS
261e0c4386eSCy Schubert               & ~checkhandshake::SERVER_NAME_CLI_EXTENSION,
262e0c4386eSCy Schubert               "Server name handshake test (client)");
263e0c4386eSCy Schubert
264e0c4386eSCy Schubert#Test 9: Server name handshake (server support only)
265e0c4386eSCy Schubert$proxy->clear();
266*e7be843bSPierre Pronchery$proxy->cipherc("DEFAULT:\@SECLEVEL=2");
267e0c4386eSCy Schubert$proxy->clientflags("-no_tls1_3 -noservername");
268e0c4386eSCy Schubert$proxy->serverflags("-servername testhost");
269e0c4386eSCy Schubert$proxy->start();
270e0c4386eSCy Schubertcheckhandshake($proxy, checkhandshake::DEFAULT_HANDSHAKE,
271e0c4386eSCy Schubert               checkhandshake::DEFAULT_EXTENSIONS
272e0c4386eSCy Schubert               & ~checkhandshake::SERVER_NAME_CLI_EXTENSION,
273e0c4386eSCy Schubert               "Server name handshake test (server)");
274e0c4386eSCy Schubert
275e0c4386eSCy Schubert#Test 10: Server name handshake (client and server)
276e0c4386eSCy Schubert$proxy->clear();
277*e7be843bSPierre Pronchery$proxy->cipherc("DEFAULT:\@SECLEVEL=2");
278e0c4386eSCy Schubert$proxy->clientflags("-no_tls1_3 -servername testhost");
279e0c4386eSCy Schubert$proxy->serverflags("-servername testhost");
280e0c4386eSCy Schubert$proxy->start();
281e0c4386eSCy Schubertcheckhandshake($proxy, checkhandshake::DEFAULT_HANDSHAKE,
282e0c4386eSCy Schubert               checkhandshake::DEFAULT_EXTENSIONS
283e0c4386eSCy Schubert               | checkhandshake::SERVER_NAME_SRV_EXTENSION,
284e0c4386eSCy Schubert               "Server name handshake test");
285e0c4386eSCy Schubert
286e0c4386eSCy Schubert#Test 11: ALPN handshake (client request only)
287e0c4386eSCy Schubert$proxy->clear();
288*e7be843bSPierre Pronchery$proxy->cipherc("DEFAULT:\@SECLEVEL=2");
289e0c4386eSCy Schubert$proxy->clientflags("-no_tls1_3 -alpn test");
290e0c4386eSCy Schubert$proxy->start();
291e0c4386eSCy Schubertcheckhandshake($proxy, checkhandshake::DEFAULT_HANDSHAKE,
292e0c4386eSCy Schubert               checkhandshake::DEFAULT_EXTENSIONS
293e0c4386eSCy Schubert               | checkhandshake::ALPN_CLI_EXTENSION,
294e0c4386eSCy Schubert               "ALPN handshake test (client)");
295e0c4386eSCy Schubert
296e0c4386eSCy Schubert#Test 12: ALPN handshake (server support only)
297e0c4386eSCy Schubert$proxy->clear();
298*e7be843bSPierre Pronchery$proxy->cipherc("DEFAULT:\@SECLEVEL=2");
299e0c4386eSCy Schubert$proxy->clientflags("-no_tls1_3");
300e0c4386eSCy Schubert$proxy->serverflags("-alpn test");
301e0c4386eSCy Schubert$proxy->start();
302e0c4386eSCy Schubertcheckhandshake($proxy, checkhandshake::DEFAULT_HANDSHAKE,
303e0c4386eSCy Schubert               checkhandshake::DEFAULT_EXTENSIONS,
304e0c4386eSCy Schubert               "ALPN handshake test (server)");
305e0c4386eSCy Schubert
306e0c4386eSCy Schubert#Test 13: ALPN handshake (client and server)
307e0c4386eSCy Schubert$proxy->clear();
308*e7be843bSPierre Pronchery$proxy->cipherc("DEFAULT:\@SECLEVEL=2");
309e0c4386eSCy Schubert$proxy->clientflags("-no_tls1_3 -alpn test");
310e0c4386eSCy Schubert$proxy->serverflags("-alpn test");
311e0c4386eSCy Schubert$proxy->start();
312e0c4386eSCy Schubertcheckhandshake($proxy, checkhandshake::DEFAULT_HANDSHAKE,
313e0c4386eSCy Schubert               checkhandshake::DEFAULT_EXTENSIONS
314e0c4386eSCy Schubert               | checkhandshake::ALPN_CLI_EXTENSION
315e0c4386eSCy Schubert               | checkhandshake::ALPN_SRV_EXTENSION,
316e0c4386eSCy Schubert               "ALPN handshake test");
317e0c4386eSCy Schubert
318e0c4386eSCy SchubertSKIP: {
319e0c4386eSCy Schubert    skip "No CT, EC or OCSP support in this OpenSSL build", 1
320e0c4386eSCy Schubert        if disabled("ct") || disabled("ec") || disabled("ocsp");
321e0c4386eSCy Schubert
322e0c4386eSCy Schubert    #Test 14: SCT handshake (client request only)
323e0c4386eSCy Schubert    $proxy->clear();
324*e7be843bSPierre Pronchery    $proxy->cipherc("DEFAULT:\@SECLEVEL=2");
325e0c4386eSCy Schubert    #Note: -ct also sends status_request
326e0c4386eSCy Schubert    $proxy->clientflags("-no_tls1_3 -ct");
327e0c4386eSCy Schubert    $proxy->serverflags("-status_file "
328e0c4386eSCy Schubert                        .srctop_file("test", "recipes", "ocsp-response.der"));
329e0c4386eSCy Schubert    $proxy->start();
330e0c4386eSCy Schubert    checkhandshake($proxy, checkhandshake::OCSP_HANDSHAKE,
331e0c4386eSCy Schubert                   checkhandshake::DEFAULT_EXTENSIONS
332e0c4386eSCy Schubert                   | checkhandshake::SCT_CLI_EXTENSION
333e0c4386eSCy Schubert                   | checkhandshake::STATUS_REQUEST_CLI_EXTENSION
334e0c4386eSCy Schubert                   | checkhandshake::STATUS_REQUEST_SRV_EXTENSION,
335e0c4386eSCy Schubert                   "SCT handshake test (client)");
336e0c4386eSCy Schubert}
337e0c4386eSCy Schubert
338e0c4386eSCy SchubertSKIP: {
339e0c4386eSCy Schubert    skip "No OCSP support in this OpenSSL build", 1
340e0c4386eSCy Schubert        if disabled("ocsp");
341e0c4386eSCy Schubert
342e0c4386eSCy Schubert    #Test 15: SCT handshake (server support only)
343e0c4386eSCy Schubert    $proxy->clear();
344*e7be843bSPierre Pronchery    $proxy->cipherc("DEFAULT:\@SECLEVEL=2");
345e0c4386eSCy Schubert    #Note: -ct also sends status_request
346e0c4386eSCy Schubert    $proxy->clientflags("-no_tls1_3");
347e0c4386eSCy Schubert    $proxy->serverflags("-status_file "
348e0c4386eSCy Schubert                        .srctop_file("test", "recipes", "ocsp-response.der"));
349e0c4386eSCy Schubert    $proxy->start();
350e0c4386eSCy Schubert    checkhandshake($proxy, checkhandshake::DEFAULT_HANDSHAKE,
351e0c4386eSCy Schubert                   checkhandshake::DEFAULT_EXTENSIONS,
352e0c4386eSCy Schubert                   "SCT handshake test (server)");
353e0c4386eSCy Schubert}
354e0c4386eSCy Schubert
355e0c4386eSCy SchubertSKIP: {
356e0c4386eSCy Schubert    skip "No CT, EC or OCSP support in this OpenSSL build", 1
357e0c4386eSCy Schubert        if disabled("ct") || disabled("ec") || disabled("ocsp");
358e0c4386eSCy Schubert
359e0c4386eSCy Schubert    #Test 16: SCT handshake (client and server)
360e0c4386eSCy Schubert    #There is no built-in server side support for this so we are actually also
361e0c4386eSCy Schubert    #testing custom extensions here
362e0c4386eSCy Schubert    $proxy->clear();
363*e7be843bSPierre Pronchery    $proxy->cipherc("DEFAULT:\@SECLEVEL=2");
364e0c4386eSCy Schubert    #Note: -ct also sends status_request
365e0c4386eSCy Schubert    $proxy->clientflags("-no_tls1_3 -ct");
366e0c4386eSCy Schubert    $proxy->serverflags("-status_file "
367e0c4386eSCy Schubert                        .srctop_file("test", "recipes", "ocsp-response.der")
368e0c4386eSCy Schubert                        ." -serverinfo ".srctop_file("test", "serverinfo.pem"));
369e0c4386eSCy Schubert    $proxy->start();
370e0c4386eSCy Schubert    checkhandshake($proxy, checkhandshake::OCSP_HANDSHAKE,
371e0c4386eSCy Schubert                   checkhandshake::DEFAULT_EXTENSIONS
372e0c4386eSCy Schubert                   | checkhandshake::SCT_CLI_EXTENSION
373e0c4386eSCy Schubert                   | checkhandshake::SCT_SRV_EXTENSION
374e0c4386eSCy Schubert                   | checkhandshake::STATUS_REQUEST_CLI_EXTENSION
375e0c4386eSCy Schubert                   | checkhandshake::STATUS_REQUEST_SRV_EXTENSION,
376e0c4386eSCy Schubert                   "SCT handshake test");
377e0c4386eSCy Schubert}
378e0c4386eSCy Schubert
379e0c4386eSCy Schubert
380e0c4386eSCy SchubertSKIP: {
381e0c4386eSCy Schubert    skip "No NPN support in this OpenSSL build", 3
382e0c4386eSCy Schubert        if disabled("nextprotoneg");
383e0c4386eSCy Schubert
384e0c4386eSCy Schubert    #Test 17: NPN handshake (client request only)
385e0c4386eSCy Schubert    $proxy->clear();
386*e7be843bSPierre Pronchery    $proxy->cipherc("DEFAULT:\@SECLEVEL=2");
387e0c4386eSCy Schubert    $proxy->clientflags("-no_tls1_3 -nextprotoneg test");
388e0c4386eSCy Schubert    $proxy->start();
389e0c4386eSCy Schubert    checkhandshake($proxy, checkhandshake::DEFAULT_HANDSHAKE,
390e0c4386eSCy Schubert                   checkhandshake::DEFAULT_EXTENSIONS
391e0c4386eSCy Schubert                   | checkhandshake::NPN_CLI_EXTENSION,
392e0c4386eSCy Schubert                   "NPN handshake test (client)");
393e0c4386eSCy Schubert
394e0c4386eSCy Schubert    #Test 18: NPN handshake (server support only)
395e0c4386eSCy Schubert    $proxy->clear();
396*e7be843bSPierre Pronchery    $proxy->cipherc("DEFAULT:\@SECLEVEL=2");
397e0c4386eSCy Schubert    $proxy->clientflags("-no_tls1_3");
398e0c4386eSCy Schubert    $proxy->serverflags("-nextprotoneg test");
399e0c4386eSCy Schubert    $proxy->start();
400e0c4386eSCy Schubert    checkhandshake($proxy, checkhandshake::DEFAULT_HANDSHAKE,
401e0c4386eSCy Schubert                   checkhandshake::DEFAULT_EXTENSIONS,
402e0c4386eSCy Schubert                   "NPN handshake test (server)");
403e0c4386eSCy Schubert
404e0c4386eSCy Schubert    #Test 19: NPN handshake (client and server)
405e0c4386eSCy Schubert    $proxy->clear();
406*e7be843bSPierre Pronchery    $proxy->cipherc("DEFAULT:\@SECLEVEL=2");
407e0c4386eSCy Schubert    $proxy->clientflags("-no_tls1_3 -nextprotoneg test");
408e0c4386eSCy Schubert    $proxy->serverflags("-nextprotoneg test");
409e0c4386eSCy Schubert    $proxy->start();
410e0c4386eSCy Schubert    checkhandshake($proxy, checkhandshake::NPN_HANDSHAKE,
411e0c4386eSCy Schubert                   checkhandshake::DEFAULT_EXTENSIONS
412e0c4386eSCy Schubert                   | checkhandshake::NPN_CLI_EXTENSION
413e0c4386eSCy Schubert                   | checkhandshake::NPN_SRV_EXTENSION,
414e0c4386eSCy Schubert                   "NPN handshake test");
415e0c4386eSCy Schubert}
416e0c4386eSCy Schubert
417e0c4386eSCy SchubertSKIP: {
418e0c4386eSCy Schubert    skip "No SRP support in this OpenSSL build", 1
419e0c4386eSCy Schubert        if disabled("srp");
420e0c4386eSCy Schubert
421e0c4386eSCy Schubert    #Test 20: SRP extension
422e0c4386eSCy Schubert    #Note: We are not actually going to perform an SRP handshake (TLSProxy
423e0c4386eSCy Schubert    #does not support it). However it is sufficient for us to check that the
424e0c4386eSCy Schubert    #SRP extension gets added on the client side. There is no SRP extension
425e0c4386eSCy Schubert    #generated on the server side anyway.
426e0c4386eSCy Schubert    $proxy->clear();
427*e7be843bSPierre Pronchery    $proxy->cipherc("DEFAULT:\@SECLEVEL=2");
428e0c4386eSCy Schubert    $proxy->clientflags("-no_tls1_3 -srpuser user -srppass pass:pass");
429e0c4386eSCy Schubert    $proxy->start();
430e0c4386eSCy Schubert    checkhandshake($proxy, checkhandshake::DEFAULT_HANDSHAKE,
431e0c4386eSCy Schubert                   checkhandshake::DEFAULT_EXTENSIONS
432e0c4386eSCy Schubert                   | checkhandshake::SRP_CLI_EXTENSION,
433e0c4386eSCy Schubert                   "SRP extension test");
434e0c4386eSCy Schubert}
435e0c4386eSCy Schubert
436e0c4386eSCy Schubert#Test 21: EC handshake
437e0c4386eSCy SchubertSKIP: {
438e0c4386eSCy Schubert    skip "No EC support in this OpenSSL build", 1 if disabled("ec");
439e0c4386eSCy Schubert    $proxy->clear();
440*e7be843bSPierre Pronchery    $proxy->cipherc("DEFAULT:\@SECLEVEL=2");
441e0c4386eSCy Schubert    $proxy->clientflags("-no_tls1_3");
442e0c4386eSCy Schubert    $proxy->serverflags("-no_tls1_3");
443e0c4386eSCy Schubert    $proxy->ciphers("ECDHE-RSA-AES128-SHA");
444e0c4386eSCy Schubert    $proxy->start();
445e0c4386eSCy Schubert    checkhandshake($proxy, checkhandshake::EC_HANDSHAKE,
446e0c4386eSCy Schubert                   checkhandshake::DEFAULT_EXTENSIONS
447e0c4386eSCy Schubert                   | checkhandshake::EC_POINT_FORMAT_SRV_EXTENSION,
448e0c4386eSCy Schubert                   "EC handshake test");
449e0c4386eSCy Schubert}
450