xref: /openbsd-src/regress/lib/libssl/unit/ssl_methods.c (revision f9365f9fc295ecaa4e33b143c72271ef5c89908e)
1*f9365f9fStb /*	$OpenBSD: ssl_methods.c,v 1.4 2021/04/04 20:21:43 tb Exp $ */
20ab157b8Stb /*
30ab157b8Stb  * Copyright (c) 2020 Theo Buehler <tb@openbsd.org>
40ab157b8Stb  *
50ab157b8Stb  * Permission to use, copy, modify, and distribute this software for any
60ab157b8Stb  * purpose with or without fee is hereby granted, provided that the above
70ab157b8Stb  * copyright notice and this permission notice appear in all copies.
80ab157b8Stb  *
90ab157b8Stb  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
100ab157b8Stb  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
110ab157b8Stb  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
120ab157b8Stb  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
130ab157b8Stb  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
140ab157b8Stb  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
150ab157b8Stb  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
160ab157b8Stb  */
170ab157b8Stb 
180ab157b8Stb #include <stdio.h>
190ab157b8Stb 
200ab157b8Stb #include <openssl/ssl.h>
210ab157b8Stb 
220ab157b8Stb struct ssl_method_test_data {
230ab157b8Stb 	const SSL_METHOD *(*method)(void);
240ab157b8Stb 	const char *name;
250ab157b8Stb 	int server;
261396950dStb 	int dtls;
270ab157b8Stb };
280ab157b8Stb 
290ab157b8Stb struct ssl_method_test_data ssl_method_tests[] = {
300ab157b8Stb 	{
310ab157b8Stb 		.method = SSLv23_method,
320ab157b8Stb 		.name = "SSLv23_method",
330ab157b8Stb 		.server = 1,
341396950dStb 		.dtls = 0,
350ab157b8Stb 	},
360ab157b8Stb 	{
370ab157b8Stb 		.method = SSLv23_server_method,
380ab157b8Stb 		.name = "SSLv23_server_method",
390ab157b8Stb 		.server = 1,
401396950dStb 		.dtls = 0,
410ab157b8Stb 	},
420ab157b8Stb 	{
430ab157b8Stb 		.method = SSLv23_client_method,
440ab157b8Stb 		.name = "SSLv23_client_method",
450ab157b8Stb 		.server = 0,
461396950dStb 		.dtls = 0,
470ab157b8Stb 	},
480ab157b8Stb 
490ab157b8Stb 	{
500ab157b8Stb 		.method = TLSv1_method,
510ab157b8Stb 		.name = "TLSv1_method",
520ab157b8Stb 		.server = 1,
531396950dStb 		.dtls = 0,
540ab157b8Stb 	},
550ab157b8Stb 	{
560ab157b8Stb 		.method = TLSv1_server_method,
570ab157b8Stb 		.name = "TLSv1_server_method",
580ab157b8Stb 		.server = 1,
591396950dStb 		.dtls = 0,
600ab157b8Stb 	},
610ab157b8Stb 	{
620ab157b8Stb 		.method = TLSv1_client_method,
630ab157b8Stb 		.name = "TLSv1_client_method",
640ab157b8Stb 		.server = 0,
651396950dStb 		.dtls = 0,
660ab157b8Stb 	},
670ab157b8Stb 
680ab157b8Stb 	{
690ab157b8Stb 		.method = TLSv1_1_method,
700ab157b8Stb 		.name = "TLSv1_1_method",
710ab157b8Stb 		.server = 1,
721396950dStb 		.dtls = 0,
730ab157b8Stb 	},
740ab157b8Stb 	{
750ab157b8Stb 		.method = TLSv1_1_server_method,
760ab157b8Stb 		.name = "TLSv1_1_server_method",
770ab157b8Stb 		.server = 1,
781396950dStb 		.dtls = 0,
790ab157b8Stb 	},
800ab157b8Stb 	{
810ab157b8Stb 		.method = TLSv1_1_client_method,
820ab157b8Stb 		.name = "TLSv1_1_client_method",
830ab157b8Stb 		.server = 0,
841396950dStb 		.dtls = 0,
850ab157b8Stb 	},
860ab157b8Stb 
870ab157b8Stb 	{
880ab157b8Stb 		.method = TLSv1_2_method,
890ab157b8Stb 		.name = "TLSv1_2_method",
900ab157b8Stb 		.server = 1,
911396950dStb 		.dtls = 0,
920ab157b8Stb 	},
930ab157b8Stb 	{
940ab157b8Stb 		.method = TLSv1_2_server_method,
950ab157b8Stb 		.name = "TLSv1_2_server_method",
960ab157b8Stb 		.server = 1,
971396950dStb 		.dtls = 0,
980ab157b8Stb 	},
990ab157b8Stb 	{
1000ab157b8Stb 		.method = TLSv1_2_client_method,
1010ab157b8Stb 		.name = "TLSv1_2_client_method",
1020ab157b8Stb 		.server = 0,
1031396950dStb 		.dtls = 0,
1040ab157b8Stb 	},
1050ab157b8Stb 
1060ab157b8Stb 	{
1070ab157b8Stb 		.method = TLS_method,
1080ab157b8Stb 		.name = "TLS_method",
1090ab157b8Stb 		.server = 1,
1101396950dStb 		.dtls = 0,
1110ab157b8Stb 	},
1120ab157b8Stb 	{
1130ab157b8Stb 		.method = TLS_server_method,
1140ab157b8Stb 		.name = "TLS_server_method",
1150ab157b8Stb 		.server = 1,
1161396950dStb 		.dtls = 0,
1170ab157b8Stb 	},
1180ab157b8Stb 	{
1190ab157b8Stb 		.method = TLS_client_method,
1200ab157b8Stb 		.name = "TLS_client_method",
1210ab157b8Stb 		.server = 0,
1221396950dStb 		.dtls = 0,
1230ab157b8Stb 	},
1240ab157b8Stb 
1250ab157b8Stb 	{
1260ab157b8Stb 		.method = DTLSv1_method,
1270ab157b8Stb 		.name = "DTLSv1_method",
1280ab157b8Stb 		.server = 1,
1291396950dStb 		.dtls = 1,
1300ab157b8Stb 	},
1310ab157b8Stb 	{
1320ab157b8Stb 		.method = DTLSv1_server_method,
1330ab157b8Stb 		.name = "DTLSv1_server_method",
1340ab157b8Stb 		.server = 1,
1351396950dStb 		.dtls = 1,
1360ab157b8Stb 	},
1370ab157b8Stb 	{
1380ab157b8Stb 		.method = DTLSv1_client_method,
1390ab157b8Stb 		.name = "DTLSv1_client_method",
1400ab157b8Stb 		.server = 0,
1411396950dStb 		.dtls = 1,
1420ab157b8Stb 	},
1430ab157b8Stb 
1440ab157b8Stb 	{
14590a896e3Stb 		.method = DTLSv1_2_method,
14690a896e3Stb 		.name = "DTLSv1_2_method",
14790a896e3Stb 		.server = 1,
14890a896e3Stb 		.dtls = 1,
14990a896e3Stb 	},
15090a896e3Stb 	{
15190a896e3Stb 		.method = DTLSv1_2_server_method,
15290a896e3Stb 		.name = "DTLSv1_2_server_method",
15390a896e3Stb 		.server = 1,
15490a896e3Stb 		.dtls = 1,
15590a896e3Stb 	},
15690a896e3Stb 	{
15790a896e3Stb 		.method = DTLSv1_2_client_method,
15890a896e3Stb 		.name = "DTLSv1_2_client_method",
15990a896e3Stb 		.server = 0,
16090a896e3Stb 		.dtls = 1,
16190a896e3Stb 	},
16290a896e3Stb 
16390a896e3Stb 	{
1640ab157b8Stb 		.method = DTLS_method,
1650ab157b8Stb 		.name = "DTLS_method",
1660ab157b8Stb 		.server = 1,
1671396950dStb 		.dtls = 1,
1680ab157b8Stb 	},
1690ab157b8Stb 	{
1700ab157b8Stb 		.method = DTLS_server_method,
1710ab157b8Stb 		.name = "DTLS_server_method",
1720ab157b8Stb 		.server = 1,
1731396950dStb 		.dtls = 1,
1740ab157b8Stb 	},
1750ab157b8Stb 	{
1760ab157b8Stb 		.method = DTLS_client_method,
1770ab157b8Stb 		.name = "DTLS_client_method",
1780ab157b8Stb 		.server = 0,
1791396950dStb 		.dtls = 1,
1800ab157b8Stb 	},
1810ab157b8Stb };
1820ab157b8Stb 
1830ab157b8Stb #define N_METHOD_TESTS (sizeof(ssl_method_tests) / sizeof(ssl_method_tests[0]))
1840ab157b8Stb 
1850ab157b8Stb int test_client_or_server_method(struct ssl_method_test_data *);
1861396950dStb int test_dtls_method(struct ssl_method_test_data *);
1870ab157b8Stb 
1880ab157b8Stb int
test_client_or_server_method(struct ssl_method_test_data * testcase)1890ab157b8Stb test_client_or_server_method(struct ssl_method_test_data *testcase)
1900ab157b8Stb {
1910ab157b8Stb 	SSL_CTX *ssl_ctx;
1920ab157b8Stb 	SSL *ssl = NULL;
1930ab157b8Stb 	int failed = 1;
1940ab157b8Stb 
1950ab157b8Stb 	if ((ssl_ctx = SSL_CTX_new(testcase->method())) == NULL) {
1960ab157b8Stb 		fprintf(stderr, "SSL_CTX_new returned NULL\n");
1970ab157b8Stb 		goto err;
1980ab157b8Stb 	}
1990ab157b8Stb 
2000ab157b8Stb 	if ((ssl = SSL_new(ssl_ctx)) == NULL) {
201*f9365f9fStb 		fprintf(stderr, "SSL_new returned NULL\n");
2020ab157b8Stb 		goto err;
2030ab157b8Stb 	}
2040ab157b8Stb 
2050ab157b8Stb 	if (SSL_is_server(ssl) != testcase->server) {
2060ab157b8Stb 		fprintf(stderr, "%s: SSL_is_server: want %d, got %d\n",
2070ab157b8Stb 		    testcase->name, testcase->server, SSL_is_server(ssl));
2080ab157b8Stb 		goto err;
2090ab157b8Stb 	}
2100ab157b8Stb 
2110ab157b8Stb 	failed = 0;
2120ab157b8Stb 
2130ab157b8Stb  err:
2140ab157b8Stb 	SSL_free(ssl);
2150ab157b8Stb 	SSL_CTX_free(ssl_ctx);
2160ab157b8Stb 
2170ab157b8Stb 	return failed;
2180ab157b8Stb }
2190ab157b8Stb 
2200ab157b8Stb int
test_dtls_method(struct ssl_method_test_data * testcase)2211396950dStb test_dtls_method(struct ssl_method_test_data *testcase)
2221396950dStb {
2231396950dStb 	SSL_CTX *ssl_ctx;
2241396950dStb 	SSL *ssl = NULL;
2251396950dStb 	int failed = 1;
2261396950dStb 
2271396950dStb 	if ((ssl_ctx = SSL_CTX_new(testcase->method())) == NULL) {
2281396950dStb 		fprintf(stderr, "SSL_CTX_new returned NULL\n");
2291396950dStb 		goto err;
2301396950dStb 	}
2311396950dStb 
2321396950dStb 	if ((ssl = SSL_new(ssl_ctx)) == NULL) {
233*f9365f9fStb 		fprintf(stderr, "SSL_new returned NULL\n");
2341396950dStb 		goto err;
2351396950dStb 	}
2361396950dStb 
2371396950dStb 	if (SSL_is_dtls(ssl) != testcase->dtls) {
2381396950dStb 		fprintf(stderr, "%s: SSL_is_dtls: want %d, got %d\n",
2391396950dStb 		    testcase->name, testcase->dtls, SSL_is_dtls(ssl));
2401396950dStb 		goto err;
2411396950dStb 	}
2421396950dStb 
2431396950dStb 	failed = 0;
2441396950dStb 
2451396950dStb  err:
2461396950dStb 	SSL_free(ssl);
2471396950dStb 	SSL_CTX_free(ssl_ctx);
2481396950dStb 
2491396950dStb 	return failed;
2501396950dStb }
2511396950dStb 
2521396950dStb int
main(int argc,char ** argv)2530ab157b8Stb main(int argc, char **argv)
2540ab157b8Stb {
2550ab157b8Stb 	size_t i;
2560ab157b8Stb 	int failed = 0;
2570ab157b8Stb 
2580ab157b8Stb 	for (i = 0; i < N_METHOD_TESTS; i++) {
2590ab157b8Stb 		failed |= test_client_or_server_method(&ssl_method_tests[i]);
2601396950dStb 		failed |= test_dtls_method(&ssl_method_tests[i]);
2610ab157b8Stb 	}
2620ab157b8Stb 
2630ab157b8Stb 	if (failed == 0)
2640ab157b8Stb 		printf("PASS %s\n", __FILE__);
2650ab157b8Stb 
2660ab157b8Stb 	return failed;
2670ab157b8Stb }
268