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