763f7e8304dd10864b8799fea209e7d0a1f5895d
[openssl.git] / test / recipes / 70-test_tlsextms.t
1 #!/usr/bin/perl
2 # Written by Stephen Henson for the OpenSSL project.
3 # ====================================================================
4 # Copyright (c) 1998-2015 The OpenSSL Project.  All rights reserved.
5 #
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
8 # are met:
9 #
10 # 1. Redistributions of source code must retain the above copyright
11 #    notice, this list of conditions and the following disclaimer.
12 #
13 # 2. Redistributions in binary form must reproduce the above copyright
14 #    notice, this list of conditions and the following disclaimer in
15 #    the documentation and/or other materials provided with the
16 #    distribution.
17 #
18 # 3. All advertising materials mentioning features or use of this
19 #    software must display the following acknowledgment:
20 #    "This product includes software developed by the OpenSSL Project
21 #    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
22 #
23 # 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
24 #    endorse or promote products derived from this software without
25 #    prior written permission. For written permission, please contact
26 #    openssl-core@openssl.org.
27 #
28 # 5. Products derived from this software may not be called "OpenSSL"
29 #    nor may "OpenSSL" appear in their names without prior written
30 #    permission of the OpenSSL Project.
31 #
32 # 6. Redistributions of any form whatsoever must retain the following
33 #    acknowledgment:
34 #    "This product includes software developed by the OpenSSL Project
35 #    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
36 #
37 # THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
38 # EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
39 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
40 # PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
41 # ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
42 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
43 # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
44 # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
45 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
46 # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
47 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
48 # OF THE POSSIBILITY OF SUCH DAMAGE.
49 # ====================================================================
50 #
51 # This product includes cryptographic software written by Eric Young
52 # (eay@cryptsoft.com).  This product includes software written by Tim
53 # Hudson (tjh@cryptsoft.com).
54
55 use strict;
56 use OpenSSL::Test qw/:DEFAULT cmdstr top_file top_dir/;
57 use TLSProxy::Proxy;
58 use File::Temp qw(tempfile);
59
60 my $test_name = "test_tlsextms";
61 setup($test_name);
62
63 plan skip_all => "TLSProxy isn't usable on $^O"
64     if $^O =~ /^VMS$/;
65
66 plan skip_all => "$test_name can only be performed with OpenSSL configured shared"
67     unless (map { s/\R//; s/^SHARED_LIBS=\s*//; $_ }
68         grep { /^SHARED_LIBS=/ }
69         do { local @ARGV = ( top_file("Makefile") ); <> })[0] ne "";
70
71 $ENV{OPENSSL_ENGINES} = top_dir("engines");
72 $ENV{OPENSSL_ia32cap} = '~0x200000200000000';
73
74 sub checkmessages($$$$$);
75 sub setrmextms($$);
76 sub clearall();
77
78 my $crmextms = 0;
79 my $srmextms = 0;
80 my $cextms = 0;
81 my $sextms = 0;
82 my $fullhand = 0;
83
84 my $proxy = TLSProxy::Proxy->new(
85     \&extms_filter,
86     cmdstr(app(["openssl"])),
87     top_file("apps", "server.pem"),
88     1
89 );
90
91 plan tests => 9;
92
93 #Test 1: By default server and client should send extended master secret
94 # extension.
95 #Expected result: ClientHello extension seen; ServerHello extension seen
96 #                 Full handshake
97
98 setrmextms(0, 0);
99 $proxy->start();
100 checkmessages(1, "Default extended master secret test", 1, 1, 1);
101
102 #Test 2: If client omits extended master secret extension, server should too.
103 #Expected result: ClientHello extension not seen; ServerHello extension not seen
104 #                 Full handshake
105
106 clearall();
107 setrmextms(1, 0);
108 $proxy->start();
109 checkmessages(2, "No client extension extended master secret test", 0, 0, 1);
110
111 # Test 3: same as 1 but with session tickets disabled.
112 # Expected result: same as test 1.
113
114 clearall();
115 $proxy->clientflags("-no_ticket");
116 setrmextms(0, 0);
117 $proxy->start();
118 checkmessages(3, "No ticket extended master secret test", 1, 1, 1);
119
120 # Test 4: same as 2 but with session tickets disabled.
121 # Expected result: same as test 2.
122
123 clearall();
124 $proxy->clientflags("-no_ticket");
125 setrmextms(1, 0);
126 $proxy->start();
127 checkmessages(2, "No ticket, no client extension extended master secret test", 0, 0, 1);
128
129 #Test 5: Session resumption extended master secret test
130 #
131 #Expected result: ClientHello extension seen; ServerHello extension seen
132 #                 Abbreviated handshake
133
134 clearall();
135 setrmextms(0, 0);
136 (my $fh, my $session) = tempfile();
137 $proxy->serverconnects(2);
138 $proxy->clientflags("-sess_out ".$session);
139 $proxy->start();
140 $proxy->clear();
141 $proxy->clientflags("-sess_in ".$session);
142 $proxy->clientstart();
143 checkmessages(5, "Session resumption extended master secret test", 1, 1, 0);
144
145 #Test 6: Session resumption extended master secret test orginial session
146 # omits extension. Server must not resume session.
147 #Expected result: ClientHello extension seen; ServerHello extension seen
148 #                 Full handshake
149
150 clearall();
151 setrmextms(1, 0);
152 ($fh, $session) = tempfile();
153 $proxy->serverconnects(2);
154 $proxy->clientflags("-sess_out ".$session);
155 $proxy->start();
156 $proxy->clear();
157 $proxy->clientflags("-sess_in ".$session);
158 setrmextms(0, 0);
159 $proxy->clientstart();
160 checkmessages(6, "Session resumption extended master secret test", 1, 1, 1);
161
162 #Test 7: Session resumption extended master secret test resumed session
163 # omits client extension. Server must abort connection.
164 #Expected result: aborted connection.
165
166 clearall();
167 setrmextms(0, 0);
168 ($fh, $session) = tempfile();
169 $proxy->serverconnects(2);
170 $proxy->clientflags("-sess_out ".$session);
171 $proxy->start();
172 $proxy->clear();
173 $proxy->clientflags("-sess_in ".$session);
174 setrmextms(1, 0);
175 $proxy->clientstart();
176 ok(TLSProxy::Message->fail(), "Client inconsistent session resupmption");
177
178 #Test 8: Session resumption extended master secret test resumed session
179 # omits server extension. Client must abort connection.
180 #Expected result: aborted connection.
181
182 clearall();
183 setrmextms(0, 0);
184 ($fh, $session) = tempfile();
185 $proxy->serverconnects(2);
186 $proxy->clientflags("-sess_out ".$session);
187 $proxy->start();
188 $proxy->clear();
189 $proxy->clientflags("-sess_in ".$session);
190 setrmextms(0, 1);
191 $proxy->clientstart();
192 ok(TLSProxy::Message->fail(), "Server inconsistent session resumption 1");
193
194 #Test 9: Session resumption extended master secret test initial session
195 # omits server extension. Client must abort connection.
196 #Expected result: aborted connection.
197
198 clearall();
199 setrmextms(0, 1);
200 ($fh, $session) = tempfile();
201 $proxy->serverconnects(2);
202 $proxy->clientflags("-sess_out ".$session);
203 $proxy->start();
204 $proxy->clear();
205 $proxy->clientflags("-sess_in ".$session);
206 setrmextms(0, 0);
207 $proxy->clientstart();
208 ok(TLSProxy::Message->fail(), "Server inconsistent session resumption 2");
209
210 sub extms_filter
211 {
212     my $proxy = shift;
213
214     foreach my $message (@{$proxy->message_list}) {
215         if ($crmextms && $message->mt == TLSProxy::Message::MT_CLIENT_HELLO) {
216             $message->delete_extension(TLSProxy::ClientHello::EXT_EXTENDED_MASTER_SECRET);
217             $message->repack();
218         }
219         if ($srmextms && $message->mt == TLSProxy::Message::MT_SERVER_HELLO) {
220             $message->delete_extension(TLSProxy::ClientHello::EXT_EXTENDED_MASTER_SECRET);
221             $message->repack();
222         }
223     }
224 }
225
226 sub checkmessages($$$$$)
227 {
228     my ($testno, $testname, $testcextms, $testsextms, $testhand) = @_;
229
230     subtest $testname => sub {
231
232     foreach my $message (@{$proxy->message_list}) {
233         if ($message->mt == TLSProxy::Message::MT_CLIENT_HELLO
234             || $message->mt == TLSProxy::Message::MT_SERVER_HELLO) {
235         #Get the extensions data
236         my %extensions = %{$message->extension_data};
237         if (defined
238             $extensions{TLSProxy::ClientHello::EXT_EXTENDED_MASTER_SECRET}) {
239             if ($message->mt == TLSProxy::Message::MT_CLIENT_HELLO) {
240                 $cextms = 1;
241             } else {
242                 $sextms = 1;
243             }
244         }
245         } elsif ($message->mt == TLSProxy::Message::MT_CLIENT_KEY_EXCHANGE) {
246             #Must be doing a full handshake
247             $fullhand = 1;
248         }
249     }
250
251     plan tests => 4;
252
253     ok(TLSProxy::Message->success, "Handshake");
254
255     ok($testcextms == $cextms,
256        "ClientHello extension extended master secret check");
257     ok($testsextms == $sextms,
258        "ServerHello extension extended master secret check");
259     ok($testhand == $fullhand,
260        "Extended master secret full handshake check");
261
262     }
263 }
264
265 sub setrmextms($$)
266 {
267     ($crmextms, $srmextms) = @_;
268 }
269
270 sub clearall()
271 {
272     $cextms = 0;
273     $sextms = 0;
274     $fullhand = 0;
275     $proxy->clear();
276 }