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