fb69e7cd0d9b0c395534c0db1301cd1f43920abe
[openssl.git] / test / recipes / 70-test_tls13messages.t
1 #! /usr/bin/env perl
2 # Copyright 2015-2016 The OpenSSL Project Authors. All Rights Reserved.
3 #
4 # Licensed under the OpenSSL license (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 use strict;
10 use OpenSSL::Test qw/:DEFAULT cmdstr srctop_file srctop_dir bldtop_dir/;
11 use OpenSSL::Test::Utils;
12 use File::Temp qw(tempfile);
13 use TLSProxy::Proxy;
14 use checkhandshake qw(checkhandshake @handmessages @extensions);
15
16 my $test_name = "test_tls13messages";
17 setup($test_name);
18
19 plan skip_all => "TLSProxy isn't usable on $^O"
20     if $^O =~ /^(VMS|MSWin32)$/;
21
22 plan skip_all => "$test_name needs the dynamic engine feature enabled"
23     if disabled("engine") || disabled("dynamic-engine");
24
25 plan skip_all => "$test_name needs the sock feature enabled"
26     if disabled("sock");
27
28 plan skip_all => "$test_name needs TLSv1.3 enabled"
29     if disabled("tls1_3");
30
31 $ENV{OPENSSL_ia32cap} = '~0x200000200000000';
32 $ENV{CTLOG_FILE} = srctop_file("test", "ct", "log_list.conf");
33
34
35 @handmessages = (
36     [TLSProxy::Message::MT_CLIENT_HELLO,
37         checkhandshake::ALL_HANDSHAKES],
38     [TLSProxy::Message::MT_SERVER_HELLO,
39         checkhandshake::ALL_HANDSHAKES],
40     [TLSProxy::Message::MT_ENCRYPTED_EXTENSIONS,
41         checkhandshake::ALL_HANDSHAKES],
42     [TLSProxy::Message::MT_CERTIFICATE_REQUEST,
43         checkhandshake::CLIENT_AUTH_HANDSHAKE],
44     [TLSProxy::Message::MT_CERTIFICATE,
45         checkhandshake::ALL_HANDSHAKES & ~checkhandshake::RESUME_HANDSHAKE],
46     [TLSProxy::Message::MT_CERTIFICATE_VERIFY,
47         checkhandshake::ALL_HANDSHAKES & ~checkhandshake::RESUME_HANDSHAKE],
48     [TLSProxy::Message::MT_FINISHED,
49         checkhandshake::ALL_HANDSHAKES],
50     [TLSProxy::Message::MT_CERTIFICATE,
51         checkhandshake::CLIENT_AUTH_HANDSHAKE],
52     [TLSProxy::Message::MT_CERTIFICATE_VERIFY,
53         checkhandshake::CLIENT_AUTH_HANDSHAKE],
54     [TLSProxy::Message::MT_FINISHED,
55         checkhandshake::ALL_HANDSHAKES],
56     [0, 0]
57 );
58
59 @extensions = (
60     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_SERVER_NAME,
61         checkhandshake::SERVER_NAME_CLI_EXTENSION],
62     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_STATUS_REQUEST,
63         checkhandshake::STATUS_REQUEST_CLI_EXTENSION],
64     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_SUPPORTED_GROUPS,
65         checkhandshake::DEFAULT_EXTENSIONS],
66     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_EC_POINT_FORMATS,
67         checkhandshake::DEFAULT_EXTENSIONS],
68     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_SIG_ALGS,
69         checkhandshake::DEFAULT_EXTENSIONS],
70     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_ALPN,
71         checkhandshake::ALPN_CLI_EXTENSION],
72     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_SCT,
73         checkhandshake::SCT_CLI_EXTENSION],
74     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_ENCRYPT_THEN_MAC,
75         checkhandshake::DEFAULT_EXTENSIONS],
76     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_EXTENDED_MASTER_SECRET,
77         checkhandshake::DEFAULT_EXTENSIONS],
78     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_SESSION_TICKET,
79         checkhandshake::DEFAULT_EXTENSIONS],
80     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_KEY_SHARE,
81         checkhandshake::DEFAULT_EXTENSIONS],
82     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_SUPPORTED_VERSIONS,
83         checkhandshake::DEFAULT_EXTENSIONS],
84     [TLSProxy::Message::MT_CLIENT_HELLO, TLSProxy::Message::EXT_PSK_KEX_MODES,
85         checkhandshake::DEFAULT_EXTENSIONS],
86
87     [TLSProxy::Message::MT_SERVER_HELLO, TLSProxy::Message::EXT_KEY_SHARE,
88         checkhandshake::DEFAULT_EXTENSIONS],
89
90     [TLSProxy::Message::MT_ENCRYPTED_EXTENSIONS, TLSProxy::Message::EXT_SERVER_NAME,
91         checkhandshake::SERVER_NAME_SRV_EXTENSION],
92     [TLSProxy::Message::MT_ENCRYPTED_EXTENSIONS, TLSProxy::Message::EXT_ALPN,
93         checkhandshake::ALPN_SRV_EXTENSION],
94
95     [TLSProxy::Message::MT_CERTIFICATE, TLSProxy::Message::EXT_STATUS_REQUEST,
96         checkhandshake::STATUS_REQUEST_SRV_EXTENSION],
97
98     [0,0,0]
99 );
100
101 my $proxy = TLSProxy::Proxy->new(
102     undef,
103     cmdstr(app(["openssl"]), display => 1),
104     srctop_file("apps", "server.pem"),
105     (!$ENV{HARNESS_ACTIVE} || $ENV{HARNESS_VERBOSE})
106 );
107
108 #Test 1: Check we get all the right messages for a default handshake
109 (undef, my $session) = tempfile();
110 #$proxy->serverconnects(2);
111 $proxy->clientflags("-sess_out ".$session);
112 $proxy->start() or plan skip_all => "Unable to start up Proxy for tests";
113 plan tests => 12;
114 checkhandshake($proxy, checkhandshake::DEFAULT_HANDSHAKE,
115                checkhandshake::DEFAULT_EXTENSIONS,
116                "Default handshake test");
117
118 #TODO(TLS1.3): Test temporarily disabled until we implement TLS1.3 resumption
119 #Test 2: Resumption handshake
120 #$proxy->clearClient();
121 #$proxy->clientflags("-sess_in ".$session);
122 #$proxy->clientstart();
123 #checkmessages(RESUME_HANDSHAKE, "Resumption handshake test");
124 unlink $session;
125
126 #Test 3: A status_request handshake (client request only)
127 $proxy->clear();
128 $proxy->clientflags("-status");
129 $proxy->start();
130 checkhandshake($proxy, checkhandshake::DEFAULT_HANDSHAKE,
131                checkhandshake::DEFAULT_EXTENSIONS
132                | checkhandshake::STATUS_REQUEST_CLI_EXTENSION,
133                "status_request handshake test (client)");
134
135 #Test 4: A status_request handshake (server support only)
136 $proxy->clear();
137 $proxy->serverflags("-status_file "
138                     .srctop_file("test", "recipes", "ocsp-response.der"));
139 $proxy->start();
140 checkhandshake($proxy, checkhandshake::DEFAULT_HANDSHAKE,
141                checkhandshake::DEFAULT_EXTENSIONS,
142                "status_request handshake test (server)");
143
144 #Test 5: A status_request handshake (client and server)
145 #TODO(TLS1.3): TLS1.3 doesn't actually have CertificateStatus messages. This is
146 #a temporary test until such time as we do proper TLS1.3 style certificate
147 #status
148 $proxy->clear();
149 $proxy->clientflags("-status");
150 $proxy->serverflags("-status_file "
151                     .srctop_file("test", "recipes", "ocsp-response.der"));
152 $proxy->start();
153 checkhandshake($proxy, checkhandshake::DEFAULT_HANDSHAKE,
154                checkhandshake::DEFAULT_EXTENSIONS
155                | checkhandshake::STATUS_REQUEST_CLI_EXTENSION
156                | checkhandshake::STATUS_REQUEST_SRV_EXTENSION,
157                "status_request handshake test");
158
159 #Test 6: A client auth handshake
160 $proxy->clear();
161 $proxy->clientflags("-cert ".srctop_file("apps", "server.pem"));
162 $proxy->serverflags("-Verify 5");
163 $proxy->start();
164 checkhandshake($proxy, checkhandshake::CLIENT_AUTH_HANDSHAKE,
165                checkhandshake::DEFAULT_EXTENSIONS,
166                "Client auth handshake test");
167
168 #Test 7: Server name handshake (client request only)
169 $proxy->clear();
170 $proxy->clientflags("-servername testhost");
171 $proxy->start();
172 checkhandshake($proxy, checkhandshake::DEFAULT_HANDSHAKE,
173                checkhandshake::DEFAULT_EXTENSIONS
174                | checkhandshake::SERVER_NAME_CLI_EXTENSION,
175                "Server name handshake test (client)");
176
177 #Test 8: Server name handshake (server support only)
178 $proxy->clear();
179 $proxy->serverflags("-servername testhost");
180 $proxy->start();
181 checkhandshake($proxy, checkhandshake::DEFAULT_HANDSHAKE,
182                checkhandshake::DEFAULT_EXTENSIONS,
183                "Server name handshake test (server)");
184
185 #Test 9: Server name handshake (client and server)
186 $proxy->clear();
187 $proxy->clientflags("-servername testhost");
188 $proxy->serverflags("-servername testhost");
189 $proxy->start();
190 checkhandshake($proxy, checkhandshake::DEFAULT_HANDSHAKE,
191                checkhandshake::DEFAULT_EXTENSIONS
192                | checkhandshake::SERVER_NAME_CLI_EXTENSION
193                | checkhandshake::SERVER_NAME_SRV_EXTENSION,
194                "Server name handshake test");
195
196 #Test 10: ALPN handshake (client request only)
197 $proxy->clear();
198 $proxy->clientflags("-alpn test");
199 $proxy->start();
200 checkhandshake($proxy, checkhandshake::DEFAULT_HANDSHAKE,
201                checkhandshake::DEFAULT_EXTENSIONS
202                | checkhandshake::ALPN_CLI_EXTENSION,
203                "ALPN handshake test (client)");
204
205 #Test 11: ALPN handshake (server support only)
206 $proxy->clear();
207 $proxy->serverflags("-alpn test");
208 $proxy->start();
209 checkhandshake($proxy, checkhandshake::DEFAULT_HANDSHAKE,
210                checkhandshake::DEFAULT_EXTENSIONS,
211                "ALPN handshake test (server)");
212
213 #Test 12: ALPN handshake (client and server)
214 $proxy->clear();
215 $proxy->clientflags("-alpn test");
216 $proxy->serverflags("-alpn test");
217 $proxy->start();
218 checkhandshake($proxy, checkhandshake::DEFAULT_HANDSHAKE,
219                checkhandshake::DEFAULT_EXTENSIONS
220                | checkhandshake::ALPN_CLI_EXTENSION
221                | checkhandshake::ALPN_SRV_EXTENSION,
222                "ALPN handshake test");
223
224 #Test 13: SCT handshake (client request only)
225 #TODO(TLS1.3): This only checks that the client side extension appears. The
226 #SCT extension is unusual in that we have no built-in server side implementation
227 #The server side implementation can nomrally be added using the custom
228 #extensions framework (e.g. by using the "-serverinfo" s_server option). However
229 #currently we only support <= TLS1.2 for custom extensions because the existing
230 #framework and API has no knowledge of the TLS1.3 messages
231 $proxy->clear();
232 #Note: -ct also sends status_request
233 $proxy->clientflags("-ct");
234 $proxy->serverflags("-status_file "
235                     .srctop_file("test", "recipes", "ocsp-response.der"));
236 $proxy->start();
237 checkhandshake($proxy, checkhandshake::DEFAULT_HANDSHAKE,
238                checkhandshake::DEFAULT_EXTENSIONS
239                | checkhandshake::SCT_CLI_EXTENSION
240                | checkhandshake::STATUS_REQUEST_CLI_EXTENSION
241                | checkhandshake::STATUS_REQUEST_SRV_EXTENSION,
242                "SCT handshake test");