xref: /openbsd-src/regress/lib/libssl/unit/ssl_versions.c (revision 521ba2f2ab0e0e89d1776559874b3ecc227442fc)
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