Unified copyright for test recipes
[openssl.git] / test / recipes / 70-test_tlsextms.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 bldtop_dir/;
11 use OpenSSL::Test::Utils;
12 use TLSProxy::Proxy;
13 use File::Temp qw(tempfile);
14
15 my $test_name = "test_tlsextms";
16 setup($test_name);
17
18 plan skip_all => "TLSProxy isn't usable on $^O"
19     if $^O =~ /^(VMS|MSWin32)$/;
20
21 plan skip_all => "$test_name needs the dynamic engine feature enabled"
22     if disabled("engine") || disabled("dynamic-engine");
23
24 plan skip_all => "$test_name needs the sock feature enabled"
25     if disabled("sock");
26
27 $ENV{OPENSSL_ia32cap} = '~0x200000200000000';
28
29 sub checkmessages($$$$$);
30 sub setrmextms($$);
31 sub clearall();
32
33 my $crmextms = 0;
34 my $srmextms = 0;
35 my $cextms = 0;
36 my $sextms = 0;
37 my $fullhand = 0;
38
39 my $proxy = TLSProxy::Proxy->new(
40     \&extms_filter,
41     cmdstr(app(["openssl"]), display => 1),
42     srctop_file("apps", "server.pem"),
43     (!$ENV{HARNESS_ACTIVE} || $ENV{HARNESS_VERBOSE})
44 );
45
46 plan tests => 9;
47
48 #Test 1: By default server and client should send extended master secret
49 # extension.
50 #Expected result: ClientHello extension seen; ServerHello extension seen
51 #                 Full handshake
52
53 setrmextms(0, 0);
54 $proxy->start();
55 checkmessages(1, "Default extended master secret test", 1, 1, 1);
56
57 #Test 2: If client omits extended master secret extension, server should too.
58 #Expected result: ClientHello extension not seen; ServerHello extension not seen
59 #                 Full handshake
60
61 clearall();
62 setrmextms(1, 0);
63 $proxy->start();
64 checkmessages(2, "No client extension extended master secret test", 0, 0, 1);
65
66 # Test 3: same as 1 but with session tickets disabled.
67 # Expected result: same as test 1.
68
69 clearall();
70 $proxy->clientflags("-no_ticket");
71 setrmextms(0, 0);
72 $proxy->start();
73 checkmessages(3, "No ticket extended master secret test", 1, 1, 1);
74
75 # Test 4: same as 2 but with session tickets disabled.
76 # Expected result: same as test 2.
77
78 clearall();
79 $proxy->clientflags("-no_ticket");
80 setrmextms(1, 0);
81 $proxy->start();
82 checkmessages(2, "No ticket, no client extension extended master secret test", 0, 0, 1);
83
84 #Test 5: Session resumption extended master secret test
85 #
86 #Expected result: ClientHello extension seen; ServerHello extension seen
87 #                 Abbreviated handshake
88
89 clearall();
90 setrmextms(0, 0);
91 (my $fh, my $session) = tempfile();
92 $proxy->serverconnects(2);
93 $proxy->clientflags("-sess_out ".$session);
94 $proxy->start();
95 $proxy->clearClient();
96 $proxy->clientflags("-sess_in ".$session);
97 $proxy->clientstart();
98 checkmessages(5, "Session resumption extended master secret test", 1, 1, 0);
99
100 #Test 6: Session resumption extended master secret test original session
101 # omits extension. Server must not resume session.
102 #Expected result: ClientHello extension seen; ServerHello extension seen
103 #                 Full handshake
104
105 clearall();
106 setrmextms(1, 0);
107 ($fh, $session) = tempfile();
108 $proxy->serverconnects(2);
109 $proxy->clientflags("-sess_out ".$session);
110 $proxy->start();
111 $proxy->clearClient();
112 $proxy->clientflags("-sess_in ".$session);
113 setrmextms(0, 0);
114 $proxy->clientstart();
115 checkmessages(6, "Session resumption extended master secret test", 1, 1, 1);
116
117 #Test 7: Session resumption extended master secret test resumed session
118 # omits client extension. Server must abort connection.
119 #Expected result: aborted connection.
120
121 clearall();
122 setrmextms(0, 0);
123 ($fh, $session) = tempfile();
124 $proxy->serverconnects(2);
125 $proxy->clientflags("-sess_out ".$session);
126 $proxy->start();
127 $proxy->clearClient();
128 $proxy->clientflags("-sess_in ".$session);
129 setrmextms(1, 0);
130 $proxy->clientstart();
131 ok(TLSProxy::Message->fail(), "Client inconsistent session resumption");
132
133 #Test 8: Session resumption extended master secret test resumed session
134 # omits server extension. Client must abort connection.
135 #Expected result: aborted connection.
136
137 clearall();
138 setrmextms(0, 0);
139 ($fh, $session) = tempfile();
140 $proxy->serverconnects(2);
141 $proxy->clientflags("-sess_out ".$session);
142 $proxy->start();
143 $proxy->clearClient();
144 $proxy->clientflags("-sess_in ".$session);
145 setrmextms(0, 1);
146 $proxy->clientstart();
147 ok(TLSProxy::Message->fail(), "Server inconsistent session resumption 1");
148
149 #Test 9: Session resumption extended master secret test initial session
150 # omits server extension. Client must abort connection.
151 #Expected result: aborted connection.
152
153 clearall();
154 setrmextms(0, 1);
155 ($fh, $session) = tempfile();
156 $proxy->serverconnects(2);
157 $proxy->clientflags("-sess_out ".$session);
158 $proxy->start();
159 $proxy->clearClient();
160 $proxy->clientflags("-sess_in ".$session);
161 setrmextms(0, 0);
162 $proxy->clientstart();
163 ok(TLSProxy::Message->fail(), "Server inconsistent session resumption 2");
164
165 sub extms_filter
166 {
167     my $proxy = shift;
168
169     foreach my $message (@{$proxy->message_list}) {
170         if ($crmextms && $message->mt == TLSProxy::Message::MT_CLIENT_HELLO) {
171             $message->delete_extension(TLSProxy::Message::EXT_EXTENDED_MASTER_SECRET);
172             $message->repack();
173         }
174         if ($srmextms && $message->mt == TLSProxy::Message::MT_SERVER_HELLO) {
175             $message->delete_extension(TLSProxy::Message::EXT_EXTENDED_MASTER_SECRET);
176             $message->repack();
177         }
178     }
179 }
180
181 sub checkmessages($$$$$)
182 {
183     my ($testno, $testname, $testcextms, $testsextms, $testhand) = @_;
184
185     subtest $testname => sub {
186
187     foreach my $message (@{$proxy->message_list}) {
188         if ($message->mt == TLSProxy::Message::MT_CLIENT_HELLO
189             || $message->mt == TLSProxy::Message::MT_SERVER_HELLO) {
190         #Get the extensions data
191         my %extensions = %{$message->extension_data};
192         if (defined
193             $extensions{TLSProxy::Message::EXT_EXTENDED_MASTER_SECRET}) {
194             if ($message->mt == TLSProxy::Message::MT_CLIENT_HELLO) {
195                 $cextms = 1;
196             } else {
197                 $sextms = 1;
198             }
199         }
200         } elsif ($message->mt == TLSProxy::Message::MT_CLIENT_KEY_EXCHANGE) {
201             #Must be doing a full handshake
202             $fullhand = 1;
203         }
204     }
205
206     plan tests => 4;
207
208     ok(TLSProxy::Message->success, "Handshake");
209
210     ok($testcextms == $cextms,
211        "ClientHello extension extended master secret check");
212     ok($testsextms == $sextms,
213        "ServerHello extension extended master secret check");
214     ok($testhand == $fullhand,
215        "Extended master secret full handshake check");
216
217     }
218 }
219
220 sub setrmextms($$)
221 {
222     ($crmextms, $srmextms) = @_;
223 }
224
225 sub clearall()
226 {
227     $cextms = 0;
228     $sextms = 0;
229     $fullhand = 0;
230     $proxy->clear();
231 }