1*141c93e2Stb /* $OpenBSD: configtest.c,v 1.5 2024/08/02 16:02:35 tb Exp $ */ 240317078Sjsing /* 340317078Sjsing * Copyright (c) 2017 Joel Sing <jsing@openbsd.org> 440317078Sjsing * 540317078Sjsing * Permission to use, copy, modify, and distribute this software for any 640317078Sjsing * purpose with or without fee is hereby granted, provided that the above 740317078Sjsing * copyright notice and this permission notice appear in all copies. 840317078Sjsing * 940317078Sjsing * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 1040317078Sjsing * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 1140317078Sjsing * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 1240317078Sjsing * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 1340317078Sjsing * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 1440317078Sjsing * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 1540317078Sjsing * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 1640317078Sjsing */ 1740317078Sjsing 1840317078Sjsing #include <err.h> 1940317078Sjsing #include <stdio.h> 2040317078Sjsing #include <stdlib.h> 2140317078Sjsing 2240317078Sjsing #include <tls.h> 2340317078Sjsing 2440317078Sjsing struct parse_protocols_test { 2540317078Sjsing const char *protostr; 2640317078Sjsing int want_return; 2740317078Sjsing uint32_t want_protocols; 2840317078Sjsing }; 2940317078Sjsing 3040317078Sjsing struct parse_protocols_test parse_protocols_tests[] = { 3140317078Sjsing { 3240317078Sjsing .protostr = NULL, 3340317078Sjsing .want_return = 0, 3440317078Sjsing .want_protocols = TLS_PROTOCOLS_DEFAULT, 3540317078Sjsing }, 3640317078Sjsing { 3740317078Sjsing .protostr = "default", 3840317078Sjsing .want_return = 0, 3940317078Sjsing .want_protocols = TLS_PROTOCOLS_DEFAULT, 4040317078Sjsing }, 4140317078Sjsing { 4240317078Sjsing .protostr = "secure", 4340317078Sjsing .want_return = 0, 4440317078Sjsing .want_protocols = TLS_PROTOCOLS_DEFAULT, 4540317078Sjsing }, 4640317078Sjsing { 4740317078Sjsing .protostr = "all", 4840317078Sjsing .want_return = 0, 4940317078Sjsing .want_protocols = TLS_PROTOCOLS_ALL, 5040317078Sjsing }, 5140317078Sjsing { 5240317078Sjsing .protostr = "tlsv1", 5340317078Sjsing .want_return = 0, 5440317078Sjsing .want_protocols = TLS_PROTOCOL_TLSv1, 5540317078Sjsing }, 5640317078Sjsing { 5740317078Sjsing .protostr = "tlsv1.2", 5840317078Sjsing .want_return = 0, 5940317078Sjsing .want_protocols = TLS_PROTOCOL_TLSv1_2, 6040317078Sjsing }, 6140317078Sjsing { 627bed9f40Sjsing .protostr = "tlsv1.3", 637bed9f40Sjsing .want_return = 0, 647bed9f40Sjsing .want_protocols = TLS_PROTOCOL_TLSv1_3, 657bed9f40Sjsing }, 667bed9f40Sjsing { 6740317078Sjsing .protostr = "", 6840317078Sjsing .want_return = -1, 6940317078Sjsing .want_protocols = 0, 7040317078Sjsing }, 7140317078Sjsing { 727bed9f40Sjsing .protostr = "tlsv1.0:tlsv1.1:tlsv1.2:tlsv1.3", 7340317078Sjsing .want_return = 0, 740c5dceccStb .want_protocols = TLS_PROTOCOL_TLSv1_0 | TLS_PROTOCOL_TLSv1_1 | 750c5dceccStb TLS_PROTOCOL_TLSv1_2 | TLS_PROTOCOL_TLSv1_3, 7640317078Sjsing }, 7740317078Sjsing { 787bed9f40Sjsing .protostr = "tlsv1.0,tlsv1.1,tlsv1.2,tlsv1.3", 7940317078Sjsing .want_return = 0, 800c5dceccStb .want_protocols = TLS_PROTOCOL_TLSv1_0 | TLS_PROTOCOL_TLSv1_1 | 810c5dceccStb TLS_PROTOCOL_TLSv1_2 | TLS_PROTOCOL_TLSv1_3, 8240317078Sjsing }, 8340317078Sjsing { 8440317078Sjsing .protostr = "tlsv1.1,tlsv1.2,tlsv1.0", 8540317078Sjsing .want_return = 0, 860c5dceccStb .want_protocols = TLS_PROTOCOL_TLSv1_0 | TLS_PROTOCOL_TLSv1_1 | 870c5dceccStb TLS_PROTOCOL_TLSv1_2, 8840317078Sjsing }, 8940317078Sjsing { 9040317078Sjsing .protostr = "tlsv1.1,tlsv1.2,tlsv1.1", 9140317078Sjsing .want_return = 0, 920c5dceccStb .want_protocols = TLS_PROTOCOL_TLSv1_1 | TLS_PROTOCOL_TLSv1_2, 9340317078Sjsing }, 9440317078Sjsing { 9540317078Sjsing .protostr = "tlsv1.1,tlsv1.2,!tlsv1.1", 9640317078Sjsing .want_return = 0, 970c5dceccStb .want_protocols = TLS_PROTOCOL_TLSv1_2, 9840317078Sjsing }, 9940317078Sjsing { 10040317078Sjsing .protostr = "unknown", 10140317078Sjsing .want_return = -1, 10240317078Sjsing .want_protocols = 0, 10340317078Sjsing }, 10440317078Sjsing { 10540317078Sjsing .protostr = "all,!unknown", 10640317078Sjsing .want_return = -1, 10740317078Sjsing .want_protocols = 0, 10840317078Sjsing }, 10940317078Sjsing { 11040317078Sjsing .protostr = "sslv3,tlsv1.0,tlsv1.1,tlsv1.2", 11140317078Sjsing .want_return = -1, 11240317078Sjsing .want_protocols = 0, 11340317078Sjsing }, 11440317078Sjsing { 11540317078Sjsing .protostr = "all,!tlsv1.0", 11640317078Sjsing .want_return = 0, 117*141c93e2Stb .want_protocols = TLS_PROTOCOL_TLSv1_2 | TLS_PROTOCOL_TLSv1_3, 11840317078Sjsing }, 11940317078Sjsing { 12040317078Sjsing .protostr = "!tlsv1.0", 12140317078Sjsing .want_return = 0, 122*141c93e2Stb .want_protocols = TLS_PROTOCOL_TLSv1_2 | TLS_PROTOCOL_TLSv1_3, 12340317078Sjsing }, 12440317078Sjsing { 1257bed9f40Sjsing .protostr = "!tlsv1.0,!tlsv1.1,!tlsv1.3", 12640317078Sjsing .want_return = 0, 1270c5dceccStb .want_protocols = TLS_PROTOCOL_TLSv1_2, 12840317078Sjsing }, 12940317078Sjsing { 1307bed9f40Sjsing .protostr = "!tlsv1.0,!tlsv1.1,tlsv1.2,!tlsv1.3", 13140317078Sjsing .want_return = 0, 13240317078Sjsing .want_protocols = TLS_PROTOCOL_TLSv1_2, 13340317078Sjsing }, 13440317078Sjsing }; 13540317078Sjsing 13640317078Sjsing #define N_PARSE_PROTOCOLS_TESTS \ 13740317078Sjsing (sizeof(parse_protocols_tests) / sizeof(*parse_protocols_tests)) 13840317078Sjsing 13940317078Sjsing static int 14040317078Sjsing do_parse_protocols_test(int test_no, struct parse_protocols_test *ppt) 14140317078Sjsing { 14240317078Sjsing uint32_t protocols = 0; 14340317078Sjsing int failed = 1; 14440317078Sjsing int rv; 14540317078Sjsing 14640317078Sjsing rv = tls_config_parse_protocols(&protocols, ppt->protostr); 14740317078Sjsing if (rv != ppt->want_return) { 14840317078Sjsing fprintf(stderr, "FAIL: test %i - tls_config_parse_protocols() " 14940317078Sjsing "returned %i, want %i\n", test_no, rv, ppt->want_return); 15040317078Sjsing goto done; 15140317078Sjsing } 15240317078Sjsing if (protocols != ppt->want_protocols) { 15340317078Sjsing fprintf(stderr, "FAIL: test %i - got protocols 0x%x, " 15440317078Sjsing "want 0x%x\n", test_no, protocols, ppt->want_protocols); 15540317078Sjsing goto done; 15640317078Sjsing } 15740317078Sjsing 15840317078Sjsing failed = 0; 15940317078Sjsing 16040317078Sjsing done: 16140317078Sjsing return (failed); 16240317078Sjsing } 16340317078Sjsing 16440317078Sjsing int 16540317078Sjsing main(int argc, char **argv) 16640317078Sjsing { 16740317078Sjsing int failed = 0; 16840317078Sjsing size_t i; 16940317078Sjsing 17040317078Sjsing tls_init(); 17140317078Sjsing 17240317078Sjsing for (i = 0; i < N_PARSE_PROTOCOLS_TESTS; i++) 17340317078Sjsing failed += do_parse_protocols_test(i, &parse_protocols_tests[i]); 17440317078Sjsing 17540317078Sjsing return (failed); 17640317078Sjsing } 177