1296177Sjhibbits# -*- mode: perl; -*-
2296177Sjhibbits# Copyright 2016-2020 The OpenSSL Project Authors. All Rights Reserved.
3296177Sjhibbits#
4296177Sjhibbits# Licensed under the Apache License 2.0 (the "License").  You may not use
5296177Sjhibbits# this file except in compliance with the License.  You can obtain a copy
6296177Sjhibbits# in the file LICENSE in the source distribution or at
7296177Sjhibbits# https://www.openssl.org/source/license.html
8296177Sjhibbits
9296177Sjhibbits
10296177Sjhibbits## Test NPN. Note that NPN is only supported up to TLSv1.2
11296177Sjhibbits
12296177Sjhibbitsuse strict;
13296177Sjhibbitsuse warnings;
14296177Sjhibbits
15296177Sjhibbitspackage ssltests;
16296177Sjhibbits
17296177Sjhibbitsour @tests = (
18296177Sjhibbits    {
19296177Sjhibbits        name => "npn-simple",
20296177Sjhibbits        server => {
21296177Sjhibbits            extra => {
22296177Sjhibbits                "NPNProtocols" => "foo",
23296177Sjhibbits            },
24296177Sjhibbits        },
25296177Sjhibbits        client => {
26296177Sjhibbits            extra => {
27296177Sjhibbits                "NPNProtocols" => "foo",
28296177Sjhibbits            },
29296177Sjhibbits            "MaxProtocol" => "TLSv1.2"
30296177Sjhibbits        },
31296177Sjhibbits        test => {
32296177Sjhibbits            "ExpectedNPNProtocol" => "foo",
33296177Sjhibbits        },
34296177Sjhibbits    },
35296177Sjhibbits    {
36296177Sjhibbits        name => "npn-client-finds-match",
37296177Sjhibbits        server => {
38296177Sjhibbits            extra => {
39296177Sjhibbits                "NPNProtocols" => "baz,bar",
40296177Sjhibbits            },
41296177Sjhibbits        },
42296177Sjhibbits        client => {
43296177Sjhibbits            extra => {
44296177Sjhibbits                "NPNProtocols" => "foo,bar",
45296177Sjhibbits            },
46296177Sjhibbits            "MaxProtocol" => "TLSv1.2"
47296177Sjhibbits        },
48296177Sjhibbits        test => {
49296177Sjhibbits            "ExpectedNPNProtocol" => "bar",
50296177Sjhibbits        },
51296177Sjhibbits    },
52296177Sjhibbits    {
53296177Sjhibbits        name => "npn-client-honours-server-pref",
54296177Sjhibbits        server => {
55296177Sjhibbits            extra => {
56296177Sjhibbits                "NPNProtocols" => "bar,foo",
57296177Sjhibbits            },
58296177Sjhibbits        },
59296177Sjhibbits        client => {
60296177Sjhibbits            extra => {
61296177Sjhibbits                "NPNProtocols" => "foo,bar",
62296177Sjhibbits            },
63296177Sjhibbits            "MaxProtocol" => "TLSv1.2"
64296177Sjhibbits        },
65296177Sjhibbits        test => {
66296177Sjhibbits            "ExpectedNPNProtocol" => "bar",
67296177Sjhibbits        },
68296177Sjhibbits    },
69296177Sjhibbits    {
70296177Sjhibbits        name => "npn-client-first-pref-on-mismatch",
71296177Sjhibbits        server => {
72296177Sjhibbits            extra => {
73296177Sjhibbits                "NPNProtocols" => "baz",
74296177Sjhibbits            },
75296177Sjhibbits        },
76296177Sjhibbits        client => {
77296177Sjhibbits            extra => {
78296177Sjhibbits                "NPNProtocols" => "foo,bar",
79296177Sjhibbits            },
80296177Sjhibbits            "MaxProtocol" => "TLSv1.2"
81296177Sjhibbits        },
82296177Sjhibbits        test => {
83296177Sjhibbits            "ExpectedNPNProtocol" => "foo",
84296177Sjhibbits        },
85296177Sjhibbits    },
86296177Sjhibbits    {
87296177Sjhibbits        name => "npn-no-server-support",
88296177Sjhibbits        server => {},
89296177Sjhibbits        client => {
90296177Sjhibbits            extra => {
91296177Sjhibbits                "NPNProtocols" => "foo",
92296177Sjhibbits            },
93296177Sjhibbits            "MaxProtocol" => "TLSv1.2"
94296177Sjhibbits        },
95296177Sjhibbits        test => {
96296177Sjhibbits            "ExpectedNPNProtocol" => undef,
97296177Sjhibbits        },
98296177Sjhibbits    },
99296177Sjhibbits    {
100296177Sjhibbits        name => "npn-no-client-support",
101296177Sjhibbits        server => {
102296177Sjhibbits            extra => {
103296177Sjhibbits                "NPNProtocols" => "foo",
104296177Sjhibbits            },
105296177Sjhibbits        },
106296177Sjhibbits        client => {
107296177Sjhibbits            "MaxProtocol" => "TLSv1.2"
108296177Sjhibbits        },
109296177Sjhibbits        test => {
110296177Sjhibbits            "ExpectedNPNProtocol" => undef,
111296177Sjhibbits        },
112296177Sjhibbits    },
113296177Sjhibbits    {
114296177Sjhibbits        name => "npn-with-sni-no-context-switch",
115296177Sjhibbits        server => {
116296177Sjhibbits            extra => {
117296177Sjhibbits                "NPNProtocols" => "foo",
118296177Sjhibbits                "ServerNameCallback" => "IgnoreMismatch",
119296177Sjhibbits            },
120296177Sjhibbits        },
121296177Sjhibbits        server2 => {
122296177Sjhibbits            extra => {
123296177Sjhibbits                "NPNProtocols" => "bar",
124296177Sjhibbits            },
125296177Sjhibbits        },
126296177Sjhibbits        client => {
127296177Sjhibbits            extra => {
128296177Sjhibbits                "NPNProtocols" => "foo,bar",
129296177Sjhibbits                "ServerName" => "server1",
130296177Sjhibbits            },
131296177Sjhibbits            "MaxProtocol" => "TLSv1.2"
132296177Sjhibbits        },
133296177Sjhibbits        test => {
134296177Sjhibbits            "ExpectedServerName" => "server1",
135296177Sjhibbits            "ExpectedNPNProtocol" => "foo",
136296177Sjhibbits        },
137296177Sjhibbits    },
138296177Sjhibbits    {
139296177Sjhibbits        name => "npn-with-sni-context-switch",
140296177Sjhibbits        server => {
141296177Sjhibbits            extra => {
142296177Sjhibbits                "NPNProtocols" => "foo",
143296177Sjhibbits                "ServerNameCallback" => "IgnoreMismatch",
144296177Sjhibbits            },
145296177Sjhibbits        },
146296177Sjhibbits        server2 => {
147296177Sjhibbits            extra => {
148296177Sjhibbits                "NPNProtocols" => "bar",
149296177Sjhibbits            },
150296177Sjhibbits        },
151296177Sjhibbits        client => {
152296177Sjhibbits            extra => {
153296177Sjhibbits                "NPNProtocols" => "foo,bar",
154296177Sjhibbits                "ServerName" => "server2",
155296177Sjhibbits            },
156296177Sjhibbits            "MaxProtocol" => "TLSv1.2"
157296177Sjhibbits        },
158296177Sjhibbits        test => {
159296177Sjhibbits            "ExpectedServerName" => "server2",
160296177Sjhibbits            "ExpectedNPNProtocol" => "bar",
161296177Sjhibbits        },
162296177Sjhibbits    },
163296177Sjhibbits    {
164296177Sjhibbits        name => "npn-selected-sni-server-supports-npn",
165296177Sjhibbits        server => {
166296177Sjhibbits            extra => {
167296177Sjhibbits                "ServerNameCallback" => "IgnoreMismatch",
168296177Sjhibbits            },
169296177Sjhibbits        },
170296177Sjhibbits        server2 => {
171296177Sjhibbits            extra => {
172296177Sjhibbits                "NPNProtocols" => "bar",
173296177Sjhibbits            },
174296177Sjhibbits        },
175296177Sjhibbits        client => {
176296177Sjhibbits            extra => {
177296177Sjhibbits                "NPNProtocols" => "foo,bar",
178296177Sjhibbits                "ServerName" => "server2",
179296177Sjhibbits            },
180296177Sjhibbits            "MaxProtocol" => "TLSv1.2"
181296177Sjhibbits        },
182296177Sjhibbits        test => {
183296177Sjhibbits            "ExpectedServerName" => "server2",
184296177Sjhibbits            "ExpectedNPNProtocol" => "bar",
185296177Sjhibbits        },
186296177Sjhibbits    },
187296177Sjhibbits    {
188296177Sjhibbits        name => "npn-selected-sni-server-does-not-support-npn",
189296177Sjhibbits        server => {
190296177Sjhibbits            extra => {
191296177Sjhibbits                "NPNProtocols" => "bar",
192296177Sjhibbits                "ServerNameCallback" => "IgnoreMismatch",
193296177Sjhibbits            },
194296177Sjhibbits        },
195296177Sjhibbits        server2 => { },
196296177Sjhibbits        client => {
197296177Sjhibbits            extra => {
198296177Sjhibbits                "NPNProtocols" => "foo,bar",
199296177Sjhibbits                "ServerName" => "server2",
200296177Sjhibbits            },
201296177Sjhibbits            "MaxProtocol" => "TLSv1.2"
202296177Sjhibbits        },
203296177Sjhibbits        test => {
204296177Sjhibbits             "ExpectedServerName" => "server2",
205296177Sjhibbits             "ExpectedNPNProtocol" => undef,
206296177Sjhibbits        },
207296177Sjhibbits    },
208296177Sjhibbits    {
209296177Sjhibbits        name => "alpn-preferred-over-npn",
210296177Sjhibbits        server => {
211296177Sjhibbits            extra => {
212296177Sjhibbits                "ALPNProtocols" => "foo",
213296177Sjhibbits                "NPNProtocols" => "bar",
214296177Sjhibbits            },
215296177Sjhibbits        },
216296177Sjhibbits        client => {
217296177Sjhibbits            extra => {
218296177Sjhibbits                "ALPNProtocols" => "foo",
219296177Sjhibbits                "NPNProtocols" => "bar",
220296177Sjhibbits            },
221296177Sjhibbits            "MaxProtocol" => "TLSv1.2"
222296177Sjhibbits        },
223296177Sjhibbits        test => {
224296177Sjhibbits            "ExpectedALPNProtocol" => "foo",
225296177Sjhibbits            "ExpectedNPNProtocol" => undef,
226296177Sjhibbits        },
227296177Sjhibbits    },
228296177Sjhibbits    {
229296177Sjhibbits        name => "sni-npn-preferred-over-alpn",
230296177Sjhibbits        server => {
231296177Sjhibbits            extra => {
232296177Sjhibbits                "ServerNameCallback" => "IgnoreMismatch",
233296177Sjhibbits                "ALPNProtocols" => "foo",
234296177Sjhibbits            },
235296177Sjhibbits        },
236296177Sjhibbits        server2 => {
237296177Sjhibbits            extra => {
238296177Sjhibbits                "NPNProtocols" => "bar",
239296177Sjhibbits            },
240296177Sjhibbits        },
241296177Sjhibbits        client => {
242296177Sjhibbits            extra => {
243296177Sjhibbits                "ServerName" => "server2",
244296177Sjhibbits                "ALPNProtocols" => "foo",
245296177Sjhibbits                "NPNProtocols" => "bar",
246296177Sjhibbits            },
247296177Sjhibbits            "MaxProtocol" => "TLSv1.2"
248296177Sjhibbits        },
249296177Sjhibbits        test => {
250296177Sjhibbits            "ExpectedALPNProtocol" => undef,
251296177Sjhibbits            "ExpectedNPNProtocol" => "bar",
252296177Sjhibbits            "ExpectedServerName" => "server2",  
253296177Sjhibbits        },
254296177Sjhibbits    },
255296177Sjhibbits    {
256296177Sjhibbits        name => "npn-simple-resumption",
257296177Sjhibbits        server => {
258296177Sjhibbits            extra => {
259296177Sjhibbits                "NPNProtocols" => "foo",
260296177Sjhibbits            },
261296177Sjhibbits        },
262296177Sjhibbits        client => {
263296177Sjhibbits            extra => {
264296177Sjhibbits                "NPNProtocols" => "foo",
265296177Sjhibbits            },
266296177Sjhibbits            "MaxProtocol" => "TLSv1.2"
267296177Sjhibbits        },
268296177Sjhibbits        test => {
269296177Sjhibbits            "HandshakeMode" => "Resume",
270296177Sjhibbits            "ResumptionExpected" => "Yes",
271296177Sjhibbits            "ExpectedNPNProtocol" => "foo",
272296177Sjhibbits        },
273296177Sjhibbits    },
274296177Sjhibbits    {
275296177Sjhibbits        name => "npn-server-switch-resumption",
276296177Sjhibbits        server => {
277296177Sjhibbits            extra => {
278296177Sjhibbits                "NPNProtocols" => "bar,foo",
279296177Sjhibbits            },
280296177Sjhibbits        },
281296177Sjhibbits        resume_server => {
282296177Sjhibbits            extra => {
283296177Sjhibbits                "NPNProtocols" => "baz,foo",
284296177Sjhibbits            },
285296177Sjhibbits        },
286296177Sjhibbits        client => {
287296177Sjhibbits            extra => {
288296177Sjhibbits                "NPNProtocols" => "foo,bar,baz",
289296177Sjhibbits            },
290296177Sjhibbits            "MaxProtocol" => "TLSv1.2"
291296177Sjhibbits        },
292296177Sjhibbits        test => {
293296177Sjhibbits            "HandshakeMode" => "Resume",
294296177Sjhibbits            "ResumptionExpected" => "Yes",
295296177Sjhibbits            "ExpectedNPNProtocol" => "baz",
296296177Sjhibbits        },
297296177Sjhibbits    },
298296177Sjhibbits    {
299296177Sjhibbits        name => "npn-client-switch-resumption",
300296177Sjhibbits        server => {
301296177Sjhibbits            extra => {
302296177Sjhibbits                "NPNProtocols" => "foo,bar,baz",
303296177Sjhibbits            },
304296177Sjhibbits        },
305296177Sjhibbits        client => {
306296177Sjhibbits            extra => {
307296177Sjhibbits                "NPNProtocols" => "foo,baz",
308296177Sjhibbits            },
309296177Sjhibbits            "MaxProtocol" => "TLSv1.2"
310296177Sjhibbits        },
311296177Sjhibbits        resume_client => {
312296177Sjhibbits            extra => {
313296177Sjhibbits                "NPNProtocols" => "bar,baz",
314296177Sjhibbits            },
315296177Sjhibbits            "MaxProtocol" => "TLSv1.2"
316296177Sjhibbits        },
317296177Sjhibbits        test => {
318296177Sjhibbits            "HandshakeMode" => "Resume",
319296177Sjhibbits            "ResumptionExpected" => "Yes",
320296177Sjhibbits            "ExpectedNPNProtocol" => "bar",
321296177Sjhibbits        },
322296177Sjhibbits    },
323296177Sjhibbits    {
324296177Sjhibbits        name => "npn-client-first-pref-on-mismatch-resumption",
325296177Sjhibbits        server => {
326296177Sjhibbits            extra => {
327296177Sjhibbits                "NPNProtocols" => "bar",
328296177Sjhibbits            },
329296177Sjhibbits        },
330296177Sjhibbits        resume_server => {
331296177Sjhibbits            extra => {
332296177Sjhibbits                "NPNProtocols" => "baz",
333296177Sjhibbits            },
334296177Sjhibbits        },
335296177Sjhibbits        client => {
336296177Sjhibbits            extra => {
337296177Sjhibbits                "NPNProtocols" => "foo,bar",
338296177Sjhibbits            },
339296177Sjhibbits            "MaxProtocol" => "TLSv1.2"
340296177Sjhibbits        },
341296177Sjhibbits        test => {
342296177Sjhibbits            "HandshakeMode" => "Resume",
343296177Sjhibbits            "ResumptionExpected" => "Yes",
344296177Sjhibbits            "ExpectedNPNProtocol" => "foo",
345296177Sjhibbits        },
346296177Sjhibbits    },
347296177Sjhibbits    {
348296177Sjhibbits        name => "npn-no-server-support-resumption",
349296177Sjhibbits        server => {
350296177Sjhibbits            extra => {
351296177Sjhibbits                "NPNProtocols" => "foo",
352296177Sjhibbits            },
353296177Sjhibbits        },
354296177Sjhibbits        resume_server => { },
355296177Sjhibbits        client => {
356296177Sjhibbits            extra => {
357296177Sjhibbits                "NPNProtocols" => "foo",
358296177Sjhibbits            },
359296177Sjhibbits            "MaxProtocol" => "TLSv1.2"
360296177Sjhibbits        },
361296177Sjhibbits        test => {
362296177Sjhibbits            "HandshakeMode" => "Resume",
363296177Sjhibbits            "ResumptionExpected" => "Yes",
364296177Sjhibbits            "ExpectedNPNProtocol" => undef,
365296177Sjhibbits        },
366296177Sjhibbits    },
367296177Sjhibbits    {
368296177Sjhibbits        name => "npn-no-client-support-resumption",
369296177Sjhibbits        server => {
370296177Sjhibbits            extra => {
371296177Sjhibbits                "NPNProtocols" => "foo",
372296177Sjhibbits            },
373296177Sjhibbits        },
374296177Sjhibbits        client => {
375296177Sjhibbits            extra => {
376296177Sjhibbits                "NPNProtocols" => "foo",
377296177Sjhibbits            },
378296177Sjhibbits            "MaxProtocol" => "TLSv1.2"
379296177Sjhibbits        },
380296177Sjhibbits        resume_client => {
381296177Sjhibbits            "MaxProtocol" => "TLSv1.2"
382296177Sjhibbits        },
383296177Sjhibbits        test => {
384296177Sjhibbits            "HandshakeMode" => "Resume",
385296177Sjhibbits            "ResumptionExpected" => "Yes",
386296177Sjhibbits            "ExpectedNPNProtocol" => undef,
387296177Sjhibbits        },
388296177Sjhibbits    },
389296177Sjhibbits    {
390296177Sjhibbits        name => "alpn-preferred-over-npn-resumption",
391296177Sjhibbits        server => {
392296177Sjhibbits            extra => {
393296177Sjhibbits                "NPNProtocols" => "bar",
394296177Sjhibbits            },
395296177Sjhibbits        },
396296177Sjhibbits        resume_server => {
397296177Sjhibbits            extra => {
398296177Sjhibbits                "ALPNProtocols" => "foo",
399296177Sjhibbits                "NPNProtocols" => "baz",
400296177Sjhibbits            },
401296177Sjhibbits        },
402296177Sjhibbits        client => {
403296177Sjhibbits            extra => {
404296177Sjhibbits                "ALPNProtocols" => "foo",
405296177Sjhibbits                "NPNProtocols" => "bar,baz",
406296177Sjhibbits            },
407296177Sjhibbits            "MaxProtocol" => "TLSv1.2"
408296177Sjhibbits        },
409296177Sjhibbits        test => {
410296177Sjhibbits            "HandshakeMode" => "Resume",
411296177Sjhibbits            "ResumptionExpected" => "Yes",
412296177Sjhibbits            "ExpectedALPNProtocol" => "foo",
413296177Sjhibbits            "ExpectedNPNProtocol" => undef,
414296177Sjhibbits        },
415296177Sjhibbits    },
416296177Sjhibbits    {
417296177Sjhibbits        name => "npn-used-if-alpn-not-supported-resumption",
418296177Sjhibbits        server => {
419296177Sjhibbits            extra => {
420296177Sjhibbits                "ALPNProtocols" => "foo",
421296177Sjhibbits                "NPNProtocols" => "bar",
422296177Sjhibbits            },
423296177Sjhibbits        },
424296177Sjhibbits        resume_server => {
425296177Sjhibbits            extra => {
426296177Sjhibbits                "NPNProtocols" => "baz",
427296177Sjhibbits            },
428296177Sjhibbits        },
429296177Sjhibbits        client => {
430296177Sjhibbits            extra => {
431296177Sjhibbits                "ALPNProtocols" => "foo",
432296177Sjhibbits                "NPNProtocols" => "bar,baz",
433296177Sjhibbits            },
434296177Sjhibbits            "MaxProtocol" => "TLSv1.2"
435296177Sjhibbits        },
436296177Sjhibbits        test => {
437296177Sjhibbits            "HandshakeMode" => "Resume",
438296177Sjhibbits            "ResumptionExpected" => "Yes",
439296177Sjhibbits            "ExpectedALPNProtocol" => undef,
440296177Sjhibbits            "ExpectedNPNProtocol" => "baz",
441296177Sjhibbits        },
442296177Sjhibbits    },
443296177Sjhibbits);
444296177Sjhibbits