1*521ba2f2Sbeck /* $OpenBSD: ssl_versions.c,v 1.20 2023/07/02 17:21:33 beck Exp $ */
2e866b102Sjsing /*
366d46328Sjsing * Copyright (c) 2016, 2017 Joel Sing <jsing@openbsd.org>
4e866b102Sjsing *
5e866b102Sjsing * Permission to use, copy, modify, and distribute this software for any
6e866b102Sjsing * purpose with or without fee is hereby granted, provided that the above
7e866b102Sjsing * copyright notice and this permission notice appear in all copies.
8e866b102Sjsing *
9e866b102Sjsing * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10e866b102Sjsing * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11e866b102Sjsing * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12e866b102Sjsing * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13e866b102Sjsing * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14e866b102Sjsing * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15e866b102Sjsing * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16e866b102Sjsing */
17e866b102Sjsing
18e866b102Sjsing #include <openssl/ssl.h>
19e866b102Sjsing
20c9675a23Stb #include "ssl_local.h"
21e866b102Sjsing
22e866b102Sjsing struct version_range_test {
23e866b102Sjsing const long options;
24e866b102Sjsing const uint16_t minver;
25e866b102Sjsing const uint16_t maxver;
2676110930Sjsing const uint16_t want_minver;
2776110930Sjsing const uint16_t want_maxver;
28e866b102Sjsing };
29e866b102Sjsing
30e866b102Sjsing static struct version_range_test version_range_tests[] = {
31e866b102Sjsing {
32e866b102Sjsing .options = 0,
33e866b102Sjsing .minver = TLS1_VERSION,
34276c6803Sjsing .maxver = TLS1_3_VERSION,
35*521ba2f2Sbeck .want_minver = TLS1_2_VERSION,
36276c6803Sjsing .want_maxver = TLS1_3_VERSION,
37276c6803Sjsing },
38276c6803Sjsing {
39276c6803Sjsing .options = 0,
40276c6803Sjsing .minver = TLS1_VERSION,
41e866b102Sjsing .maxver = TLS1_2_VERSION,
42*521ba2f2Sbeck .want_minver = TLS1_2_VERSION,
4376110930Sjsing .want_maxver = TLS1_2_VERSION,
44e866b102Sjsing },
45e866b102Sjsing {
46e866b102Sjsing .options = SSL_OP_NO_TLSv1,
4776110930Sjsing .minver = TLS1_VERSION,
48e866b102Sjsing .maxver = TLS1_2_VERSION,
49*521ba2f2Sbeck .want_minver = TLS1_2_VERSION,
5076110930Sjsing .want_maxver = TLS1_2_VERSION,
51e866b102Sjsing },
52e866b102Sjsing {
53276c6803Sjsing .options = SSL_OP_NO_TLSv1_3,
54276c6803Sjsing .minver = TLS1_VERSION,
55276c6803Sjsing .maxver = TLS1_3_VERSION,
56*521ba2f2Sbeck .want_minver = TLS1_2_VERSION,
57276c6803Sjsing .want_maxver = TLS1_2_VERSION,
58276c6803Sjsing },
59276c6803Sjsing {
60e866b102Sjsing .options = SSL_OP_NO_TLSv1_2,
61e866b102Sjsing .minver = TLS1_VERSION,
6276110930Sjsing .maxver = TLS1_2_VERSION,
63*521ba2f2Sbeck .want_minver = 0,
64*521ba2f2Sbeck .want_maxver = 0,
65e866b102Sjsing },
66e866b102Sjsing {
67e866b102Sjsing .options = SSL_OP_NO_TLSv1_1,
68e866b102Sjsing .minver = TLS1_VERSION,
6976110930Sjsing .maxver = TLS1_2_VERSION,
70*521ba2f2Sbeck .want_minver = TLS1_2_VERSION,
71*521ba2f2Sbeck .want_maxver = TLS1_2_VERSION,
72e866b102Sjsing },
73e866b102Sjsing {
74e866b102Sjsing .options = SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1,
7576110930Sjsing .minver = TLS1_VERSION,
76e866b102Sjsing .maxver = TLS1_2_VERSION,
7776110930Sjsing .want_minver = TLS1_2_VERSION,
7876110930Sjsing .want_maxver = TLS1_2_VERSION,
79e866b102Sjsing },
80e866b102Sjsing {
81e866b102Sjsing .options = SSL_OP_NO_TLSv1_1 | SSL_OP_NO_TLSv1_2,
82e866b102Sjsing .minver = TLS1_VERSION,
8376110930Sjsing .maxver = TLS1_2_VERSION,
84*521ba2f2Sbeck .want_minver = 0,
85*521ba2f2Sbeck .want_maxver = 0,
86e866b102Sjsing },
87e866b102Sjsing {
88e866b102Sjsing .options = SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_2,
8976110930Sjsing .minver = TLS1_VERSION,
9076110930Sjsing .maxver = TLS1_2_VERSION,
91*521ba2f2Sbeck .want_minver = 0,
92*521ba2f2Sbeck .want_maxver = 0,
93e866b102Sjsing },
94e866b102Sjsing {
95276c6803Sjsing .options = SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1 |
96276c6803Sjsing SSL_OP_NO_TLSv1_2,
9776110930Sjsing .minver = TLS1_VERSION,
9876110930Sjsing .maxver = TLS1_2_VERSION,
9976110930Sjsing .want_minver = 0,
10076110930Sjsing .want_maxver = 0,
10176110930Sjsing },
10276110930Sjsing {
103276c6803Sjsing .options = SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1 |
104276c6803Sjsing SSL_OP_NO_TLSv1_2,
105276c6803Sjsing .minver = TLS1_VERSION,
106276c6803Sjsing .maxver = TLS1_3_VERSION,
107276c6803Sjsing .want_minver = TLS1_3_VERSION,
108276c6803Sjsing .want_maxver = TLS1_3_VERSION,
109276c6803Sjsing },
110276c6803Sjsing {
111276c6803Sjsing .options = SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1 |
112276c6803Sjsing SSL_OP_NO_TLSv1_2 | SSL_OP_NO_TLSv1_3,
113276c6803Sjsing .minver = TLS1_VERSION,
114276c6803Sjsing .maxver = TLS1_3_VERSION,
115276c6803Sjsing .want_minver = 0,
116276c6803Sjsing .want_maxver = 0,
117276c6803Sjsing },
118276c6803Sjsing {
11976110930Sjsing .options = 0,
12076110930Sjsing .minver = TLS1_VERSION,
12176110930Sjsing .maxver = TLS1_2_VERSION,
122*521ba2f2Sbeck .want_minver = TLS1_2_VERSION,
12376110930Sjsing .want_maxver = TLS1_2_VERSION,
12476110930Sjsing },
12576110930Sjsing {
12676110930Sjsing .options = 0,
12776110930Sjsing .minver = TLS1_1_VERSION,
12876110930Sjsing .maxver = TLS1_2_VERSION,
129*521ba2f2Sbeck .want_minver = TLS1_2_VERSION,
13076110930Sjsing .want_maxver = TLS1_2_VERSION,
13176110930Sjsing },
13276110930Sjsing {
13376110930Sjsing .options = 0,
13476110930Sjsing .minver = TLS1_2_VERSION,
13576110930Sjsing .maxver = TLS1_2_VERSION,
13676110930Sjsing .want_minver = TLS1_2_VERSION,
13776110930Sjsing .want_maxver = TLS1_2_VERSION,
13876110930Sjsing },
13976110930Sjsing {
14076110930Sjsing .options = 0,
14176110930Sjsing .minver = TLS1_VERSION,
142276c6803Sjsing .maxver = TLS1_3_VERSION,
143*521ba2f2Sbeck .want_minver = TLS1_2_VERSION,
144276c6803Sjsing .want_maxver = TLS1_3_VERSION,
145276c6803Sjsing },
146276c6803Sjsing {
147276c6803Sjsing .options = 0,
148276c6803Sjsing .minver = TLS1_1_VERSION,
149276c6803Sjsing .maxver = TLS1_3_VERSION,
150*521ba2f2Sbeck .want_minver = TLS1_2_VERSION,
151276c6803Sjsing .want_maxver = TLS1_3_VERSION,
152276c6803Sjsing },
153276c6803Sjsing {
154276c6803Sjsing .options = 0,
155276c6803Sjsing .minver = TLS1_2_VERSION,
156276c6803Sjsing .maxver = TLS1_3_VERSION,
157276c6803Sjsing .want_minver = TLS1_2_VERSION,
158276c6803Sjsing .want_maxver = TLS1_3_VERSION,
159276c6803Sjsing },
160276c6803Sjsing {
161276c6803Sjsing .options = 0,
162276c6803Sjsing .minver = TLS1_3_VERSION,
163276c6803Sjsing .maxver = TLS1_3_VERSION,
164276c6803Sjsing .want_minver = TLS1_3_VERSION,
165276c6803Sjsing .want_maxver = TLS1_3_VERSION,
166276c6803Sjsing },
167276c6803Sjsing {
168276c6803Sjsing .options = 0,
169276c6803Sjsing .minver = TLS1_VERSION,
17076110930Sjsing .maxver = TLS1_1_VERSION,
171*521ba2f2Sbeck .want_minver = 0,
172*521ba2f2Sbeck .want_maxver = 0,
17376110930Sjsing },
17476110930Sjsing {
17576110930Sjsing .options = 0,
17676110930Sjsing .minver = TLS1_VERSION,
17776110930Sjsing .maxver = TLS1_VERSION,
178*521ba2f2Sbeck .want_minver = 0,
179*521ba2f2Sbeck .want_maxver = 0,
180e866b102Sjsing },
181e866b102Sjsing };
182e866b102Sjsing
183e866b102Sjsing #define N_VERSION_RANGE_TESTS \
184e866b102Sjsing (sizeof(version_range_tests) / sizeof(*version_range_tests))
185e866b102Sjsing
186e866b102Sjsing static int
test_ssl_enabled_version_range(void)187e866b102Sjsing test_ssl_enabled_version_range(void)
188e866b102Sjsing {
189e866b102Sjsing struct version_range_test *vrt;
190e866b102Sjsing uint16_t minver, maxver;
191e866b102Sjsing SSL_CTX *ssl_ctx = NULL;
192e866b102Sjsing SSL *ssl = NULL;
193e866b102Sjsing int failed = 1;
194e866b102Sjsing size_t i;
195e866b102Sjsing
1969136ce66Sjsing fprintf(stderr, "INFO: starting enabled version range tests...\n");
1979136ce66Sjsing
198e866b102Sjsing if ((ssl_ctx = SSL_CTX_new(TLS_method())) == NULL) {
199e866b102Sjsing fprintf(stderr, "SSL_CTX_new() returned NULL\n");
200e866b102Sjsing goto failure;
201e866b102Sjsing }
202e866b102Sjsing if ((ssl = SSL_new(ssl_ctx)) == NULL) {
203e866b102Sjsing fprintf(stderr, "SSL_new() returned NULL\n");
204e866b102Sjsing goto failure;
205e866b102Sjsing }
206e866b102Sjsing
207e866b102Sjsing failed = 0;
208e866b102Sjsing
209e866b102Sjsing for (i = 0; i < N_VERSION_RANGE_TESTS; i++) {
210e866b102Sjsing vrt = &version_range_tests[i];
211e866b102Sjsing
212e866b102Sjsing SSL_clear_options(ssl, SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1 |
213276c6803Sjsing SSL_OP_NO_TLSv1_2 | SSL_OP_NO_TLSv1_3);
214e866b102Sjsing SSL_set_options(ssl, vrt->options);
215e866b102Sjsing
216e866b102Sjsing minver = maxver = 0xffff;
2171ce7ecd4Sjsing ssl->min_tls_version = vrt->minver;
2181ce7ecd4Sjsing ssl->max_tls_version = vrt->maxver;
219e866b102Sjsing
22049ebc234Sjsing if (ssl_enabled_tls_version_range(ssl, &minver, &maxver) != 1) {
22176110930Sjsing if (vrt->want_minver != 0 || vrt->want_maxver != 0) {
222e866b102Sjsing fprintf(stderr, "FAIL: test %zu - failed but "
223e866b102Sjsing "wanted non-zero versions\n", i);
224e866b102Sjsing failed++;
225e866b102Sjsing }
226e866b102Sjsing continue;
227e866b102Sjsing }
22876110930Sjsing if (minver != vrt->want_minver) {
229e866b102Sjsing fprintf(stderr, "FAIL: test %zu - got minver %x, "
23076110930Sjsing "want %x\n", i, minver, vrt->want_minver);
231e866b102Sjsing failed++;
232e866b102Sjsing }
23376110930Sjsing if (maxver != vrt->want_maxver) {
234e866b102Sjsing fprintf(stderr, "FAIL: test %zu - got maxver %x, "
23576110930Sjsing "want %x\n", i, maxver, vrt->want_maxver);
236e866b102Sjsing failed++;
237e866b102Sjsing }
238e866b102Sjsing }
239e866b102Sjsing
240e866b102Sjsing failure:
241e866b102Sjsing SSL_CTX_free(ssl_ctx);
242e866b102Sjsing SSL_free(ssl);
243e866b102Sjsing
244e866b102Sjsing return (failed);
245e866b102Sjsing }
246e866b102Sjsing
247de46607aSjsing struct shared_version_test {
24876110930Sjsing const SSL_METHOD *(*ssl_method)(void);
249de46607aSjsing const long options;
25076110930Sjsing const uint16_t minver;
251de46607aSjsing const uint16_t maxver;
25276110930Sjsing const uint16_t peerver;
25376110930Sjsing const uint16_t want_maxver;
254de46607aSjsing };
255de46607aSjsing
256de46607aSjsing static struct shared_version_test shared_version_tests[] = {
257de46607aSjsing {
25876110930Sjsing .ssl_method = TLS_method,
259de46607aSjsing .options = 0,
26076110930Sjsing .minver = TLS1_VERSION,
26176110930Sjsing .maxver = TLS1_2_VERSION,
262de46607aSjsing .peerver = SSL2_VERSION,
26376110930Sjsing .want_maxver = 0,
264de46607aSjsing },
265de46607aSjsing {
26676110930Sjsing .ssl_method = TLS_method,
267de46607aSjsing .options = 0,
26876110930Sjsing .minver = TLS1_VERSION,
26976110930Sjsing .maxver = TLS1_2_VERSION,
270de46607aSjsing .peerver = SSL3_VERSION,
27176110930Sjsing .want_maxver = 0,
272de46607aSjsing },
273de46607aSjsing {
27476110930Sjsing .ssl_method = TLS_method,
275de46607aSjsing .options = 0,
27676110930Sjsing .minver = TLS1_VERSION,
277de46607aSjsing .maxver = TLS1_2_VERSION,
27876110930Sjsing .peerver = TLS1_VERSION,
279*521ba2f2Sbeck .want_maxver = 0,
280de46607aSjsing },
281de46607aSjsing {
28276110930Sjsing .ssl_method = TLS_method,
283de46607aSjsing .options = 0,
28476110930Sjsing .minver = TLS1_VERSION,
28576110930Sjsing .maxver = TLS1_2_VERSION,
28676110930Sjsing .peerver = TLS1_1_VERSION,
287*521ba2f2Sbeck .want_maxver = 0,
28876110930Sjsing },
28976110930Sjsing {
29076110930Sjsing .ssl_method = TLS_method,
29176110930Sjsing .options = 0,
29276110930Sjsing .minver = TLS1_VERSION,
29376110930Sjsing .maxver = TLS1_2_VERSION,
29476110930Sjsing .peerver = TLS1_2_VERSION,
29576110930Sjsing .want_maxver = TLS1_2_VERSION,
29676110930Sjsing },
29776110930Sjsing {
29876110930Sjsing .ssl_method = TLS_method,
29976110930Sjsing .options = 0,
30076110930Sjsing .minver = TLS1_VERSION,
30176110930Sjsing .maxver = TLS1_2_VERSION,
302276c6803Sjsing .peerver = TLS1_3_VERSION,
303276c6803Sjsing .want_maxver = TLS1_2_VERSION,
304276c6803Sjsing },
305276c6803Sjsing {
306276c6803Sjsing .ssl_method = TLS_method,
307276c6803Sjsing .options = 0,
308276c6803Sjsing .minver = TLS1_VERSION,
309276c6803Sjsing .maxver = TLS1_2_VERSION,
310de46607aSjsing .peerver = 0x7f12,
31176110930Sjsing .want_maxver = TLS1_2_VERSION,
312de46607aSjsing },
313de46607aSjsing {
31476110930Sjsing .ssl_method = TLS_method,
315de46607aSjsing .options = SSL_OP_NO_TLSv1_2,
31676110930Sjsing .minver = TLS1_VERSION,
31776110930Sjsing .maxver = TLS1_2_VERSION,
318de46607aSjsing .peerver = TLS1_2_VERSION,
319*521ba2f2Sbeck .want_maxver = 0,
320de46607aSjsing },
321de46607aSjsing {
32276110930Sjsing .ssl_method = TLS_method,
323de46607aSjsing .options = SSL_OP_NO_TLSv1_1 | SSL_OP_NO_TLSv1_2,
32476110930Sjsing .minver = TLS1_VERSION,
32576110930Sjsing .maxver = TLS1_2_VERSION,
326de46607aSjsing .peerver = TLS1_2_VERSION,
327*521ba2f2Sbeck .want_maxver = 0,
328de46607aSjsing },
329de46607aSjsing {
33076110930Sjsing .ssl_method = TLS_method,
331de46607aSjsing .options = SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1 | SSL_OP_NO_TLSv1_2,
33276110930Sjsing .minver = TLS1_VERSION,
33376110930Sjsing .maxver = TLS1_2_VERSION,
334de46607aSjsing .peerver = TLS1_2_VERSION,
33576110930Sjsing .want_maxver = 0,
336de46607aSjsing },
337de46607aSjsing {
33876110930Sjsing .ssl_method = TLS_method,
339de46607aSjsing .options = SSL_OP_NO_TLSv1,
34076110930Sjsing .minver = TLS1_VERSION,
34176110930Sjsing .maxver = TLS1_2_VERSION,
342de46607aSjsing .peerver = TLS1_1_VERSION,
343*521ba2f2Sbeck .want_maxver = 0,
344de46607aSjsing },
345de46607aSjsing {
34676110930Sjsing .ssl_method = TLS_method,
347de46607aSjsing .options = SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1,
34876110930Sjsing .minver = TLS1_VERSION,
34976110930Sjsing .maxver = TLS1_2_VERSION,
350de46607aSjsing .peerver = TLS1_1_VERSION,
35176110930Sjsing .want_maxver = 0,
352de46607aSjsing },
353de46607aSjsing {
35476110930Sjsing .ssl_method = TLS_method,
355de46607aSjsing .options = SSL_OP_NO_TLSv1_1 | SSL_OP_NO_TLSv1_2,
35676110930Sjsing .minver = TLS1_VERSION,
35776110930Sjsing .maxver = TLS1_2_VERSION,
358de46607aSjsing .peerver = TLS1_1_VERSION,
359*521ba2f2Sbeck .want_maxver = 0,
360de46607aSjsing },
361de46607aSjsing {
36276110930Sjsing .ssl_method = TLS_method,
363de46607aSjsing .options = SSL_OP_NO_TLSv1,
36476110930Sjsing .minver = TLS1_VERSION,
36576110930Sjsing .maxver = TLS1_2_VERSION,
366de46607aSjsing .peerver = TLS1_VERSION,
36776110930Sjsing .want_maxver = 0,
36876110930Sjsing },
36976110930Sjsing {
37076110930Sjsing .ssl_method = TLS_method,
37176110930Sjsing .options = 0,
37276110930Sjsing .minver = TLS1_VERSION,
37376110930Sjsing .maxver = TLS1_1_VERSION,
37476110930Sjsing .peerver = TLS1_2_VERSION,
375*521ba2f2Sbeck .want_maxver = 0,
37676110930Sjsing },
37776110930Sjsing {
37876110930Sjsing .ssl_method = TLS_method,
37976110930Sjsing .options = 0,
38076110930Sjsing .minver = TLS1_VERSION,
38176110930Sjsing .maxver = TLS1_VERSION,
38276110930Sjsing .peerver = TLS1_2_VERSION,
383*521ba2f2Sbeck .want_maxver = 0,
38476110930Sjsing },
38576110930Sjsing {
38676110930Sjsing .ssl_method = TLSv1_method,
38776110930Sjsing .options = 0,
38876110930Sjsing .minver = TLS1_VERSION,
38976110930Sjsing .maxver = TLS1_2_VERSION,
39076110930Sjsing .peerver = TLS1_VERSION,
391*521ba2f2Sbeck .want_maxver = 0,
39276110930Sjsing },
39376110930Sjsing {
39476110930Sjsing .ssl_method = TLSv1_method,
39576110930Sjsing .options = 0,
39676110930Sjsing .minver = TLS1_1_VERSION,
39776110930Sjsing .maxver = TLS1_2_VERSION,
39876110930Sjsing .peerver = TLS1_VERSION,
39976110930Sjsing .want_maxver = 0,
40076110930Sjsing },
40176110930Sjsing {
40276110930Sjsing .ssl_method = TLSv1_1_method,
40376110930Sjsing .options = 0,
40476110930Sjsing .minver = TLS1_VERSION,
40576110930Sjsing .maxver = TLS1_2_VERSION,
40676110930Sjsing .peerver = TLS1_1_VERSION,
407*521ba2f2Sbeck .want_maxver = 0,
40876110930Sjsing },
40976110930Sjsing {
410d6cbd19bSjsing .ssl_method = DTLS_method,
41176110930Sjsing .options = 0,
412d6cbd19bSjsing .minver = TLS1_1_VERSION,
41376110930Sjsing .maxver = TLS1_2_VERSION,
41476110930Sjsing .peerver = DTLS1_VERSION,
415*521ba2f2Sbeck .want_maxver = 0,
41676110930Sjsing },
41776110930Sjsing {
418d6cbd19bSjsing .ssl_method = DTLS_method,
419d6cbd19bSjsing .options = 0,
420d6cbd19bSjsing .minver = TLS1_1_VERSION,
421d6cbd19bSjsing .maxver = TLS1_2_VERSION,
422d6cbd19bSjsing .peerver = DTLS1_2_VERSION,
4238918b4e8Sjsing .want_maxver = DTLS1_2_VERSION,
424d6cbd19bSjsing },
425d6cbd19bSjsing {
426d6cbd19bSjsing .ssl_method = DTLS_method,
427d6cbd19bSjsing .options = 0,
428d6cbd19bSjsing .minver = TLS1_1_VERSION,
429d6cbd19bSjsing .maxver = TLS1_2_VERSION,
430d6cbd19bSjsing .peerver = 0xfefc, /* DTLSv1.3, probably. */
4318918b4e8Sjsing .want_maxver = DTLS1_2_VERSION,
432d6cbd19bSjsing },
433d6cbd19bSjsing {
43476110930Sjsing .ssl_method = DTLSv1_method,
43576110930Sjsing .options = 0,
436d6cbd19bSjsing .minver = TLS1_1_VERSION,
437d6cbd19bSjsing .maxver = TLS1_1_VERSION,
438d6cbd19bSjsing .peerver = DTLS1_2_VERSION,
439*521ba2f2Sbeck .want_maxver = 0,
440d6cbd19bSjsing },
441d6cbd19bSjsing {
442d6cbd19bSjsing .ssl_method = DTLSv1_2_method,
443d6cbd19bSjsing .options = 0,
444d6cbd19bSjsing .minver = TLS1_2_VERSION,
44576110930Sjsing .maxver = TLS1_2_VERSION,
446d6cbd19bSjsing .peerver = DTLS1_2_VERSION,
447d6cbd19bSjsing .want_maxver = DTLS1_2_VERSION,
448d6cbd19bSjsing },
449d6cbd19bSjsing {
450d6cbd19bSjsing .ssl_method = DTLSv1_method,
451d6cbd19bSjsing .options = 0,
452d6cbd19bSjsing .minver = TLS1_1_VERSION,
453d6cbd19bSjsing .maxver = TLS1_1_VERSION,
45476110930Sjsing .peerver = TLS1_2_VERSION,
45576110930Sjsing .want_maxver = 0,
456de46607aSjsing },
457d6cbd19bSjsing {
458d6cbd19bSjsing .ssl_method = DTLS_method,
459d6cbd19bSjsing .options = SSL_OP_NO_DTLSv1,
460d6cbd19bSjsing .minver = TLS1_1_VERSION,
461d6cbd19bSjsing .maxver = TLS1_2_VERSION,
462d6cbd19bSjsing .peerver = DTLS1_VERSION,
463d6cbd19bSjsing .want_maxver = 0,
464d6cbd19bSjsing },
465d6cbd19bSjsing {
466d6cbd19bSjsing .ssl_method = DTLS_method,
4671e036664Sjsing .options = SSL_OP_NO_DTLSv1,
4681e036664Sjsing .minver = TLS1_1_VERSION,
4691e036664Sjsing .maxver = TLS1_2_VERSION,
4701e036664Sjsing .peerver = DTLS1_2_VERSION,
4711e036664Sjsing .want_maxver = DTLS1_2_VERSION,
4721e036664Sjsing },
4731e036664Sjsing {
4741e036664Sjsing .ssl_method = DTLS_method,
475d6cbd19bSjsing .options = SSL_OP_NO_DTLSv1_2,
476d6cbd19bSjsing .minver = TLS1_1_VERSION,
477d6cbd19bSjsing .maxver = TLS1_2_VERSION,
478d6cbd19bSjsing .peerver = DTLS1_2_VERSION,
479*521ba2f2Sbeck .want_maxver = 0,
480d6cbd19bSjsing },
481de46607aSjsing };
482de46607aSjsing
483de46607aSjsing #define N_SHARED_VERSION_TESTS \
484de46607aSjsing (sizeof(shared_version_tests) / sizeof(*shared_version_tests))
485de46607aSjsing
486de46607aSjsing static int
test_ssl_max_shared_version(void)487de46607aSjsing test_ssl_max_shared_version(void)
488de46607aSjsing {
48966d46328Sjsing struct shared_version_test *svt;
490de46607aSjsing SSL_CTX *ssl_ctx = NULL;
491de46607aSjsing SSL *ssl = NULL;
492de46607aSjsing uint16_t maxver;
49376110930Sjsing int failed = 0;
494de46607aSjsing size_t i;
495de46607aSjsing
496de46607aSjsing failed = 0;
497de46607aSjsing
4989136ce66Sjsing fprintf(stderr, "INFO: starting max shared version tests...\n");
4999136ce66Sjsing
500de46607aSjsing for (i = 0; i < N_SHARED_VERSION_TESTS; i++) {
50166d46328Sjsing svt = &shared_version_tests[i];
502de46607aSjsing
50366d46328Sjsing if ((ssl_ctx = SSL_CTX_new(svt->ssl_method())) == NULL) {
50476110930Sjsing fprintf(stderr, "SSL_CTX_new() returned NULL\n");
5054fa78445Stb failed++;
5064fa78445Stb goto err;
50776110930Sjsing }
50876110930Sjsing if ((ssl = SSL_new(ssl_ctx)) == NULL) {
50976110930Sjsing fprintf(stderr, "SSL_new() returned NULL\n");
5104fa78445Stb failed++;
5114fa78445Stb goto err;
51276110930Sjsing }
51376110930Sjsing
514de46607aSjsing SSL_clear_options(ssl, SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1 |
515276c6803Sjsing SSL_OP_NO_TLSv1_2 | SSL_OP_NO_TLSv1_3);
51666d46328Sjsing SSL_set_options(ssl, svt->options);
517de46607aSjsing
518de46607aSjsing maxver = 0;
5191ce7ecd4Sjsing ssl->min_tls_version = svt->minver;
5201ce7ecd4Sjsing ssl->max_tls_version = svt->maxver;
521de46607aSjsing
522d6cbd19bSjsing if (!ssl_max_shared_version(ssl, svt->peerver, &maxver)) {
52366d46328Sjsing if (svt->want_maxver != 0) {
524de46607aSjsing fprintf(stderr, "FAIL: test %zu - failed but "
525d6cbd19bSjsing "wanted non-zero shared version (peer %x)\n",
526d6cbd19bSjsing i, svt->peerver);
527de46607aSjsing failed++;
528de46607aSjsing }
5296471f2aaStb SSL_CTX_free(ssl_ctx);
5306471f2aaStb SSL_free(ssl);
5316471f2aaStb ssl_ctx = NULL;
5326471f2aaStb ssl = NULL;
533de46607aSjsing continue;
534de46607aSjsing }
53566d46328Sjsing if (maxver != svt->want_maxver) {
536de46607aSjsing fprintf(stderr, "FAIL: test %zu - got shared "
53776110930Sjsing "version %x, want %x\n", i, maxver,
53866d46328Sjsing svt->want_maxver);
539de46607aSjsing failed++;
540de46607aSjsing }
541de46607aSjsing
542de46607aSjsing SSL_CTX_free(ssl_ctx);
543de46607aSjsing SSL_free(ssl);
5444fa78445Stb ssl_ctx = NULL;
5454fa78445Stb ssl = NULL;
54676110930Sjsing }
547de46607aSjsing
5484fa78445Stb err:
5494fa78445Stb SSL_CTX_free(ssl_ctx);
5504fa78445Stb SSL_free(ssl);
5514fa78445Stb
552de46607aSjsing return (failed);
553de46607aSjsing }
554de46607aSjsing
55566d46328Sjsing struct min_max_version_test {
55666d46328Sjsing const SSL_METHOD *(*ssl_method)(void);
55766d46328Sjsing const uint16_t minver;
55866d46328Sjsing const uint16_t maxver;
55966d46328Sjsing const uint16_t want_minver;
56066d46328Sjsing const uint16_t want_maxver;
5619136ce66Sjsing const int want_min_fail;
5629136ce66Sjsing const int want_max_fail;
56366d46328Sjsing };
56466d46328Sjsing
56566d46328Sjsing static struct min_max_version_test min_max_version_tests[] = {
56666d46328Sjsing {
56766d46328Sjsing .ssl_method = TLS_method,
56866d46328Sjsing .minver = 0,
56966d46328Sjsing .maxver = 0,
5709136ce66Sjsing .want_minver = 0,
5719136ce66Sjsing .want_maxver = 0,
57266d46328Sjsing },
57366d46328Sjsing {
57466d46328Sjsing .ssl_method = TLS_method,
57566d46328Sjsing .minver = TLS1_VERSION,
57666d46328Sjsing .maxver = 0,
57766d46328Sjsing .want_minver = TLS1_VERSION,
5789136ce66Sjsing .want_maxver = 0,
57966d46328Sjsing },
58066d46328Sjsing {
58166d46328Sjsing .ssl_method = TLS_method,
58266d46328Sjsing .minver = 0,
58366d46328Sjsing .maxver = TLS1_2_VERSION,
5849136ce66Sjsing .want_minver = 0,
58566d46328Sjsing .want_maxver = TLS1_2_VERSION,
58666d46328Sjsing },
58766d46328Sjsing {
58866d46328Sjsing .ssl_method = TLS_method,
589276c6803Sjsing .minver = 0,
590276c6803Sjsing .maxver = TLS1_3_VERSION,
5919136ce66Sjsing .want_minver = 0,
592cd429388Sjsing .want_maxver = TLS1_3_VERSION,
593276c6803Sjsing },
594276c6803Sjsing {
595276c6803Sjsing .ssl_method = TLS_method,
59666d46328Sjsing .minver = TLS1_VERSION,
59766d46328Sjsing .maxver = TLS1_2_VERSION,
59866d46328Sjsing .want_minver = TLS1_VERSION,
59966d46328Sjsing .want_maxver = TLS1_2_VERSION,
60066d46328Sjsing },
60166d46328Sjsing {
60266d46328Sjsing .ssl_method = TLS_method,
60366d46328Sjsing .minver = TLS1_1_VERSION,
60466d46328Sjsing .maxver = 0,
60566d46328Sjsing .want_minver = TLS1_1_VERSION,
6069136ce66Sjsing .want_maxver = 0,
60766d46328Sjsing },
60866d46328Sjsing {
60966d46328Sjsing .ssl_method = TLS_method,
61066d46328Sjsing .minver = TLS1_2_VERSION,
61166d46328Sjsing .maxver = 0,
61266d46328Sjsing .want_minver = TLS1_2_VERSION,
6139136ce66Sjsing .want_maxver = 0,
61466d46328Sjsing },
61566d46328Sjsing {
61666d46328Sjsing .ssl_method = TLS_method,
61766d46328Sjsing .minver = 0x0300,
61866d46328Sjsing .maxver = 0,
61966d46328Sjsing .want_minver = TLS1_VERSION,
6209136ce66Sjsing .want_maxver = 0,
62166d46328Sjsing },
62266d46328Sjsing {
62366d46328Sjsing .ssl_method = TLS_method,
62466d46328Sjsing .minver = 0x0305,
62566d46328Sjsing .maxver = 0,
6269136ce66Sjsing .want_min_fail = 1,
62766d46328Sjsing },
62866d46328Sjsing {
62966d46328Sjsing .ssl_method = TLS_method,
63066d46328Sjsing .minver = 0,
63166d46328Sjsing .maxver = 0x0305,
6329136ce66Sjsing .want_minver = 0,
633cd429388Sjsing .want_maxver = TLS1_3_VERSION,
63466d46328Sjsing },
63566d46328Sjsing {
63666d46328Sjsing .ssl_method = TLS_method,
63766d46328Sjsing .minver = 0,
63866d46328Sjsing .maxver = TLS1_1_VERSION,
6399136ce66Sjsing .want_minver = 0,
64066d46328Sjsing .want_maxver = TLS1_1_VERSION,
64166d46328Sjsing },
64266d46328Sjsing {
64366d46328Sjsing .ssl_method = TLS_method,
64466d46328Sjsing .minver = 0,
64566d46328Sjsing .maxver = TLS1_VERSION,
6469136ce66Sjsing .want_minver = 0,
64766d46328Sjsing .want_maxver = TLS1_VERSION,
64866d46328Sjsing },
64966d46328Sjsing {
65066d46328Sjsing .ssl_method = TLS_method,
65166d46328Sjsing .minver = 0,
65266d46328Sjsing .maxver = 0x0300,
6539136ce66Sjsing .want_max_fail = 1,
65466d46328Sjsing },
65566d46328Sjsing {
65666d46328Sjsing .ssl_method = TLS_method,
65766d46328Sjsing .minver = TLS1_2_VERSION,
65866d46328Sjsing .maxver = TLS1_1_VERSION,
65966d46328Sjsing .want_minver = TLS1_2_VERSION,
66066d46328Sjsing .want_maxver = 0,
6619136ce66Sjsing .want_max_fail = 1,
66266d46328Sjsing },
66366d46328Sjsing {
66466d46328Sjsing .ssl_method = TLSv1_1_method,
66566d46328Sjsing .minver = 0,
66666d46328Sjsing .maxver = 0,
6679136ce66Sjsing .want_minver = 0,
6689136ce66Sjsing .want_maxver = 0,
66966d46328Sjsing },
67066d46328Sjsing {
67166d46328Sjsing .ssl_method = TLSv1_1_method,
67266d46328Sjsing .minver = TLS1_VERSION,
67366d46328Sjsing .maxver = TLS1_2_VERSION,
67466d46328Sjsing .want_minver = TLS1_1_VERSION,
67566d46328Sjsing .want_maxver = TLS1_1_VERSION,
67666d46328Sjsing },
67766d46328Sjsing {
67866d46328Sjsing .ssl_method = TLSv1_1_method,
67966d46328Sjsing .minver = TLS1_2_VERSION,
68066d46328Sjsing .maxver = 0,
68166d46328Sjsing .want_minver = 0,
68266d46328Sjsing .want_maxver = 0,
6839136ce66Sjsing .want_min_fail = 1,
68466d46328Sjsing },
68566d46328Sjsing {
68666d46328Sjsing .ssl_method = TLSv1_1_method,
68766d46328Sjsing .minver = 0,
68866d46328Sjsing .maxver = TLS1_VERSION,
68966d46328Sjsing .want_minver = 0,
69066d46328Sjsing .want_maxver = 0,
6919136ce66Sjsing .want_max_fail = 1,
69266d46328Sjsing },
69366d46328Sjsing {
694d6cbd19bSjsing .ssl_method = DTLS_method,
695d6cbd19bSjsing .minver = 0,
696d6cbd19bSjsing .maxver = 0,
697d6cbd19bSjsing .want_minver = 0,
698d6cbd19bSjsing .want_maxver = 0,
699d6cbd19bSjsing },
700d6cbd19bSjsing {
701d6cbd19bSjsing .ssl_method = DTLS_method,
702d6cbd19bSjsing .minver = 0,
703d6cbd19bSjsing .maxver = DTLS1_VERSION,
704d6cbd19bSjsing .want_minver = 0,
705d6cbd19bSjsing .want_maxver = DTLS1_VERSION,
706d6cbd19bSjsing },
707d6cbd19bSjsing {
708d6cbd19bSjsing .ssl_method = DTLS_method,
709d6cbd19bSjsing .minver = DTLS1_VERSION,
710d6cbd19bSjsing .maxver = 0,
711d6cbd19bSjsing .want_minver = DTLS1_VERSION,
712d6cbd19bSjsing .want_maxver = 0,
713d6cbd19bSjsing },
714d6cbd19bSjsing {
715d6cbd19bSjsing .ssl_method = DTLS_method,
716d6cbd19bSjsing .minver = DTLS1_VERSION,
717d6cbd19bSjsing .maxver = DTLS1_2_VERSION,
718d6cbd19bSjsing .want_minver = DTLS1_VERSION,
7198918b4e8Sjsing .want_maxver = DTLS1_2_VERSION,
720d6cbd19bSjsing },
721d6cbd19bSjsing {
72266d46328Sjsing .ssl_method = DTLSv1_method,
72366d46328Sjsing .minver = 0,
72466d46328Sjsing .maxver = 0,
7259136ce66Sjsing .want_minver = 0,
7269136ce66Sjsing .want_maxver = 0,
72766d46328Sjsing },
72866d46328Sjsing {
72966d46328Sjsing .ssl_method = DTLSv1_method,
73066d46328Sjsing .minver = DTLS1_VERSION,
73166d46328Sjsing .maxver = 0,
73266d46328Sjsing .want_minver = DTLS1_VERSION,
7339136ce66Sjsing .want_maxver = 0,
73466d46328Sjsing },
73566d46328Sjsing {
73666d46328Sjsing .ssl_method = DTLSv1_method,
73766d46328Sjsing .minver = 0,
73866d46328Sjsing .maxver = DTLS1_VERSION,
7399136ce66Sjsing .want_minver = 0,
74066d46328Sjsing .want_maxver = DTLS1_VERSION,
74166d46328Sjsing },
74266d46328Sjsing {
74366d46328Sjsing .ssl_method = DTLSv1_method,
744d6cbd19bSjsing .minver = 0,
745d6cbd19bSjsing .maxver = DTLS1_2_VERSION,
746d6cbd19bSjsing .want_minver = 0,
747d6cbd19bSjsing .want_maxver = DTLS1_VERSION,
748d6cbd19bSjsing },
749d6cbd19bSjsing {
750d6cbd19bSjsing .ssl_method = DTLSv1_method,
75166d46328Sjsing .minver = TLS1_VERSION,
75266d46328Sjsing .maxver = TLS1_2_VERSION,
75366d46328Sjsing .want_minver = 0,
75466d46328Sjsing .want_maxver = 0,
7559136ce66Sjsing .want_min_fail = 1,
7569136ce66Sjsing .want_max_fail = 1,
75766d46328Sjsing },
75866d46328Sjsing };
75966d46328Sjsing
76066d46328Sjsing #define N_MIN_MAX_VERSION_TESTS \
76166d46328Sjsing (sizeof(min_max_version_tests) / sizeof(*min_max_version_tests))
76266d46328Sjsing
76366d46328Sjsing static int
test_ssl_min_max_version(void)76466d46328Sjsing test_ssl_min_max_version(void)
76566d46328Sjsing {
76666d46328Sjsing struct min_max_version_test *mmvt;
76766d46328Sjsing SSL_CTX *ssl_ctx = NULL;
76866d46328Sjsing SSL *ssl = NULL;
76966d46328Sjsing int failed = 0;
77066d46328Sjsing size_t i;
77166d46328Sjsing
77266d46328Sjsing failed = 0;
77366d46328Sjsing
7749136ce66Sjsing fprintf(stderr, "INFO: starting min max version tests...\n");
7759136ce66Sjsing
776ce5323beSjsing for (i = 0; i < N_MIN_MAX_VERSION_TESTS; i++) {
77766d46328Sjsing mmvt = &min_max_version_tests[i];
77866d46328Sjsing
77966d46328Sjsing if ((ssl_ctx = SSL_CTX_new(mmvt->ssl_method())) == NULL) {
78066d46328Sjsing fprintf(stderr, "SSL_CTX_new() returned NULL\n");
78166d46328Sjsing return 1;
78266d46328Sjsing }
78366d46328Sjsing
7849136ce66Sjsing if (!SSL_CTX_set_min_proto_version(ssl_ctx, mmvt->minver)) {
7859136ce66Sjsing if (!mmvt->want_min_fail) {
78666d46328Sjsing fprintf(stderr, "FAIL: test %zu - failed to set "
78766d46328Sjsing "SSL_CTX min version\n", i);
78866d46328Sjsing failed++;
78966d46328Sjsing }
79066d46328Sjsing goto next;
79166d46328Sjsing }
7929136ce66Sjsing if (!SSL_CTX_set_max_proto_version(ssl_ctx, mmvt->maxver)) {
7939136ce66Sjsing if (!mmvt->want_max_fail) {
79466d46328Sjsing fprintf(stderr, "FAIL: test %zu - failed to set "
79566d46328Sjsing "SSL_CTX min version\n", i);
79666d46328Sjsing failed++;
79766d46328Sjsing }
79866d46328Sjsing goto next;
79966d46328Sjsing }
80066d46328Sjsing
8019136ce66Sjsing if (mmvt->want_min_fail) {
80266d46328Sjsing fprintf(stderr, "FAIL: test %zu - successfully set "
80366d46328Sjsing "SSL_CTX min version, should have failed\n", i);
80482cfcb9fSjsing failed++;
80566d46328Sjsing goto next;
80666d46328Sjsing }
8079136ce66Sjsing if (mmvt->want_max_fail) {
80866d46328Sjsing fprintf(stderr, "FAIL: test %zu - successfully set "
80966d46328Sjsing "SSL_CTX max version, should have failed\n", i);
81082cfcb9fSjsing failed++;
81166d46328Sjsing goto next;
81266d46328Sjsing }
81366d46328Sjsing
814870628e8Sjca if (SSL_CTX_get_min_proto_version(ssl_ctx) != mmvt->want_minver) {
81566d46328Sjsing fprintf(stderr, "FAIL: test %zu - got SSL_CTX min "
81666d46328Sjsing "version 0x%x, want 0x%x\n", i,
817870628e8Sjca SSL_CTX_get_min_proto_version(ssl_ctx), mmvt->want_minver);
81882cfcb9fSjsing failed++;
81966d46328Sjsing goto next;
82066d46328Sjsing }
821870628e8Sjca if (SSL_CTX_get_max_proto_version(ssl_ctx) != mmvt->want_maxver) {
82266d46328Sjsing fprintf(stderr, "FAIL: test %zu - got SSL_CTX max "
82366d46328Sjsing "version 0x%x, want 0x%x\n", i,
824870628e8Sjca SSL_CTX_get_max_proto_version(ssl_ctx), mmvt->want_maxver);
82582cfcb9fSjsing failed++;
82666d46328Sjsing goto next;
82766d46328Sjsing }
82866d46328Sjsing
82966d46328Sjsing if ((ssl = SSL_new(ssl_ctx)) == NULL) {
83066d46328Sjsing fprintf(stderr, "SSL_new() returned NULL\n");
83166d46328Sjsing return 1;
83266d46328Sjsing }
83366d46328Sjsing
834870628e8Sjca if (SSL_get_min_proto_version(ssl) != mmvt->want_minver) {
83566d46328Sjsing fprintf(stderr, "FAIL: test %zu - initial SSL min "
83666d46328Sjsing "version 0x%x, want 0x%x\n", i,
837870628e8Sjca SSL_get_min_proto_version(ssl), mmvt->want_minver);
83882cfcb9fSjsing failed++;
83966d46328Sjsing goto next;
84066d46328Sjsing }
841870628e8Sjca if (SSL_get_max_proto_version(ssl) != mmvt->want_maxver) {
84266d46328Sjsing fprintf(stderr, "FAIL: test %zu - initial SSL max "
84366d46328Sjsing "version 0x%x, want 0x%x\n", i,
844870628e8Sjca SSL_get_max_proto_version(ssl), mmvt->want_maxver);
84582cfcb9fSjsing failed++;
84666d46328Sjsing goto next;
84766d46328Sjsing }
84866d46328Sjsing
8499136ce66Sjsing if (!SSL_set_min_proto_version(ssl, mmvt->minver)) {
8509136ce66Sjsing if (mmvt->want_min_fail) {
85166d46328Sjsing fprintf(stderr, "FAIL: test %zu - failed to set "
85266d46328Sjsing "SSL min version\n", i);
85366d46328Sjsing failed++;
85466d46328Sjsing }
85566d46328Sjsing goto next;
85666d46328Sjsing }
8579136ce66Sjsing if (!SSL_set_max_proto_version(ssl, mmvt->maxver)) {
8589136ce66Sjsing if (mmvt->want_max_fail) {
85966d46328Sjsing fprintf(stderr, "FAIL: test %zu - failed to set "
86066d46328Sjsing "SSL min version\n", i);
86166d46328Sjsing failed++;
86266d46328Sjsing }
86366d46328Sjsing goto next;
86466d46328Sjsing }
86566d46328Sjsing
8669136ce66Sjsing if (mmvt->want_min_fail) {
86766d46328Sjsing fprintf(stderr, "FAIL: test %zu - successfully set SSL "
86866d46328Sjsing "min version, should have failed\n", i);
86982cfcb9fSjsing failed++;
87066d46328Sjsing goto next;
87166d46328Sjsing }
8729136ce66Sjsing if (mmvt->want_max_fail) {
87366d46328Sjsing fprintf(stderr, "FAIL: test %zu - successfully set SSL "
87466d46328Sjsing "max version, should have failed\n", i);
87582cfcb9fSjsing failed++;
87666d46328Sjsing goto next;
87766d46328Sjsing }
87866d46328Sjsing
879870628e8Sjca if (SSL_get_min_proto_version(ssl) != mmvt->want_minver) {
88066d46328Sjsing fprintf(stderr, "FAIL: test %zu - got SSL min "
88166d46328Sjsing "version 0x%x, want 0x%x\n", i,
882870628e8Sjca SSL_get_min_proto_version(ssl), mmvt->want_minver);
88382cfcb9fSjsing failed++;
88466d46328Sjsing goto next;
88566d46328Sjsing }
886870628e8Sjca if (SSL_get_max_proto_version(ssl) != mmvt->want_maxver) {
88766d46328Sjsing fprintf(stderr, "FAIL: test %zu - got SSL max "
88866d46328Sjsing "version 0x%x, want 0x%x\n", i,
889870628e8Sjca SSL_get_max_proto_version(ssl), mmvt->want_maxver);
89082cfcb9fSjsing failed++;
89166d46328Sjsing goto next;
89266d46328Sjsing }
89366d46328Sjsing
89466d46328Sjsing next:
89566d46328Sjsing SSL_CTX_free(ssl_ctx);
89666d46328Sjsing SSL_free(ssl);
89766d46328Sjsing
89866d46328Sjsing ssl_ctx = NULL;
89966d46328Sjsing ssl = NULL;
90066d46328Sjsing }
90166d46328Sjsing
90266d46328Sjsing return (failed);
90366d46328Sjsing }
90466d46328Sjsing
905e866b102Sjsing int
main(int argc,char ** argv)906e866b102Sjsing main(int argc, char **argv)
907e866b102Sjsing {
908e866b102Sjsing int failed = 0;
909e866b102Sjsing
910e866b102Sjsing SSL_library_init();
911e866b102Sjsing
912276c6803Sjsing /* XXX - Test ssl_supported_version_range() */
913276c6803Sjsing
914e866b102Sjsing failed |= test_ssl_enabled_version_range();
915de46607aSjsing failed |= test_ssl_max_shared_version();
91666d46328Sjsing failed |= test_ssl_min_max_version();
917e866b102Sjsing
918e866b102Sjsing if (failed == 0)
919e866b102Sjsing printf("PASS %s\n", __FILE__);
920e866b102Sjsing
921e866b102Sjsing return (failed);
922e866b102Sjsing }
923