diff options
Diffstat (limited to 'src/regress/lib')
| -rw-r--r-- | src/regress/lib/libssl/tlsext/tlsexttest.c | 258 |
1 files changed, 257 insertions, 1 deletions
diff --git a/src/regress/lib/libssl/tlsext/tlsexttest.c b/src/regress/lib/libssl/tlsext/tlsexttest.c index 297aff2441..8166b883b8 100644 --- a/src/regress/lib/libssl/tlsext/tlsexttest.c +++ b/src/regress/lib/libssl/tlsext/tlsexttest.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: tlsexttest.c,v 1.63 2022/06/06 06:11:04 tb Exp $ */ | 1 | /* $OpenBSD: tlsexttest.c,v 1.64 2022/06/29 17:39:21 beck Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2017 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2017 Joel Sing <jsing@openbsd.org> |
| 4 | * Copyright (c) 2017 Doug Hogan <doug@openbsd.org> | 4 | * Copyright (c) 2017 Doug Hogan <doug@openbsd.org> |
| @@ -1896,6 +1896,259 @@ test_tlsext_sni_server(void) | |||
| 1896 | return (failure); | 1896 | return (failure); |
| 1897 | } | 1897 | } |
| 1898 | 1898 | ||
| 1899 | |||
| 1900 | /* | ||
| 1901 | * QUIC transport parameters extenstion - RFC 90210 :) | ||
| 1902 | */ | ||
| 1903 | |||
| 1904 | #define TEST_QUIC_TRANSPORT_DATA "0123456789abcdef" | ||
| 1905 | |||
| 1906 | static unsigned char tlsext_quic_transport_data[] = { | ||
| 1907 | 0x00, 0x10, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, | ||
| 1908 | 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, | ||
| 1909 | 0x65, 0x66, | ||
| 1910 | }; | ||
| 1911 | |||
| 1912 | static int | ||
| 1913 | test_tlsext_quic_transport_parameters_client(void) | ||
| 1914 | { | ||
| 1915 | unsigned char *data = NULL; | ||
| 1916 | SSL_CTX *ssl_ctx = NULL; | ||
| 1917 | SSL *ssl = NULL; | ||
| 1918 | int failure; | ||
| 1919 | size_t dlen; | ||
| 1920 | CBB cbb; | ||
| 1921 | CBS cbs; | ||
| 1922 | int alert; | ||
| 1923 | const uint8_t *out_bytes; | ||
| 1924 | size_t out_bytes_len; | ||
| 1925 | |||
| 1926 | failure = 1; | ||
| 1927 | |||
| 1928 | if ((ssl_ctx = SSL_CTX_new(TLS_client_method())) == NULL) | ||
| 1929 | errx(1, "failed to create SSL_CTX"); | ||
| 1930 | if ((ssl = SSL_new(ssl_ctx)) == NULL) | ||
| 1931 | errx(1, "failed to create SSL"); | ||
| 1932 | |||
| 1933 | CBB_init(&cbb, 0); | ||
| 1934 | |||
| 1935 | if (tlsext_quic_transport_parameters_client_needs(ssl, | ||
| 1936 | SSL_TLSEXT_MSG_CH)) { | ||
| 1937 | FAIL("client should not need QUIC\n"); | ||
| 1938 | goto err; | ||
| 1939 | } | ||
| 1940 | |||
| 1941 | if (!SSL_set_quic_transport_params(ssl, | ||
| 1942 | TEST_QUIC_TRANSPORT_DATA, strlen(TEST_QUIC_TRANSPORT_DATA))) { | ||
| 1943 | FAIL("client failed to set QUIC parametes\n"); | ||
| 1944 | goto err; | ||
| 1945 | } | ||
| 1946 | |||
| 1947 | if (tlsext_quic_transport_parameters_client_needs(ssl, | ||
| 1948 | SSL_TLSEXT_MSG_CH)) { | ||
| 1949 | FAIL("client should not need QUIC\n"); | ||
| 1950 | goto err; | ||
| 1951 | } | ||
| 1952 | |||
| 1953 | ssl->s3->hs.our_max_tls_version = TLS1_3_VERSION; | ||
| 1954 | ssl->s3->hs.negotiated_tls_version = TLS1_3_VERSION; | ||
| 1955 | |||
| 1956 | if (!tlsext_quic_transport_parameters_client_needs(ssl, | ||
| 1957 | SSL_TLSEXT_MSG_CH)) { | ||
| 1958 | FAIL("client should not need QUIC\n"); | ||
| 1959 | goto err; | ||
| 1960 | } | ||
| 1961 | |||
| 1962 | if (!tlsext_quic_transport_parameters_client_build(ssl, | ||
| 1963 | SSL_TLSEXT_MSG_CH, &cbb)) { | ||
| 1964 | FAIL("client failed to build QUIC\n"); | ||
| 1965 | goto err; | ||
| 1966 | } | ||
| 1967 | |||
| 1968 | if (!CBB_finish(&cbb, &data, &dlen)) { | ||
| 1969 | FAIL("failed to finish CBB"); | ||
| 1970 | goto err; | ||
| 1971 | } | ||
| 1972 | |||
| 1973 | if (dlen != sizeof(tlsext_quic_transport_data)) { | ||
| 1974 | FAIL("got client QUIC with length %zu, " | ||
| 1975 | "want length %zu\n", dlen, | ||
| 1976 | sizeof(tlsext_quic_transport_data)); | ||
| 1977 | goto err; | ||
| 1978 | } | ||
| 1979 | |||
| 1980 | if (memcmp(data, tlsext_quic_transport_data, dlen) != 0) { | ||
| 1981 | FAIL("client QUIC differs:\n"); | ||
| 1982 | fprintf(stderr, "received:\n"); | ||
| 1983 | hexdump(data, dlen); | ||
| 1984 | fprintf(stderr, "test data:\n"); | ||
| 1985 | hexdump(tlsext_quic_transport_data, | ||
| 1986 | sizeof(tlsext_quic_transport_data)); | ||
| 1987 | goto err; | ||
| 1988 | } | ||
| 1989 | |||
| 1990 | CBS_init(&cbs, tlsext_quic_transport_data, | ||
| 1991 | sizeof(tlsext_quic_transport_data)); | ||
| 1992 | |||
| 1993 | if (!tlsext_quic_transport_parameters_server_parse(ssl, | ||
| 1994 | SSL_TLSEXT_MSG_SH, &cbs, &alert)) { | ||
| 1995 | FAIL("server_parse of QUIC from server failed\n"); | ||
| 1996 | goto err; | ||
| 1997 | } | ||
| 1998 | if (CBS_len(&cbs) != 0) { | ||
| 1999 | FAIL("extension data remaining\n"); | ||
| 2000 | goto err; | ||
| 2001 | } | ||
| 2002 | |||
| 2003 | SSL_get_peer_quic_transport_params(ssl, &out_bytes, &out_bytes_len); | ||
| 2004 | |||
| 2005 | if (out_bytes_len != strlen(TEST_QUIC_TRANSPORT_DATA)) { | ||
| 2006 | FAIL("server_parse QUIC length differs, got %zu want %zu\n", | ||
| 2007 | out_bytes_len, | ||
| 2008 | sizeof(tlsext_quic_transport_data)); | ||
| 2009 | goto err; | ||
| 2010 | } | ||
| 2011 | |||
| 2012 | if (memcmp(out_bytes, TEST_QUIC_TRANSPORT_DATA, | ||
| 2013 | out_bytes_len) != 0) { | ||
| 2014 | FAIL("server_parse QUIC differs from sent:\n"); | ||
| 2015 | fprintf(stderr, "received:\n"); | ||
| 2016 | hexdump(data, dlen); | ||
| 2017 | fprintf(stderr, "test data:\n"); | ||
| 2018 | hexdump(tlsext_quic_transport_data, | ||
| 2019 | sizeof(tlsext_quic_transport_data)); | ||
| 2020 | goto err; | ||
| 2021 | } | ||
| 2022 | |||
| 2023 | failure = 0; | ||
| 2024 | |||
| 2025 | err: | ||
| 2026 | CBB_cleanup(&cbb); | ||
| 2027 | SSL_CTX_free(ssl_ctx); | ||
| 2028 | SSL_free(ssl); | ||
| 2029 | free(data); | ||
| 2030 | |||
| 2031 | return (failure); | ||
| 2032 | } | ||
| 2033 | |||
| 2034 | static int | ||
| 2035 | test_tlsext_quic_transport_parameters_server(void) | ||
| 2036 | { | ||
| 2037 | unsigned char *data = NULL; | ||
| 2038 | SSL_CTX *ssl_ctx = NULL; | ||
| 2039 | SSL *ssl = NULL; | ||
| 2040 | int failure; | ||
| 2041 | size_t dlen; | ||
| 2042 | int alert; | ||
| 2043 | CBB cbb; | ||
| 2044 | CBS cbs; | ||
| 2045 | const uint8_t *out_bytes; | ||
| 2046 | size_t out_bytes_len; | ||
| 2047 | |||
| 2048 | failure = 1; | ||
| 2049 | |||
| 2050 | CBB_init(&cbb, 0); | ||
| 2051 | |||
| 2052 | if ((ssl_ctx = SSL_CTX_new(TLS_server_method())) == NULL) | ||
| 2053 | errx(1, "failed to create SSL_CTX"); | ||
| 2054 | if ((ssl = SSL_new(ssl_ctx)) == NULL) | ||
| 2055 | errx(1, "failed to create SSL"); | ||
| 2056 | |||
| 2057 | if (tlsext_quic_transport_parameters_server_needs(ssl, SSL_TLSEXT_MSG_SH)) { | ||
| 2058 | FAIL("server should not need QUIC\n"); | ||
| 2059 | goto err; | ||
| 2060 | } | ||
| 2061 | |||
| 2062 | if (!SSL_set_quic_transport_params(ssl, | ||
| 2063 | TEST_QUIC_TRANSPORT_DATA, strlen(TEST_QUIC_TRANSPORT_DATA))) { | ||
| 2064 | FAIL("server failed to set QUIC parametes\n"); | ||
| 2065 | goto err; | ||
| 2066 | } | ||
| 2067 | |||
| 2068 | if (!tlsext_quic_transport_parameters_server_needs(ssl, SSL_TLSEXT_MSG_SH)) { | ||
| 2069 | FAIL("server should need QUIC\n"); | ||
| 2070 | goto err; | ||
| 2071 | } | ||
| 2072 | |||
| 2073 | if (!tlsext_quic_transport_parameters_server_build(ssl, | ||
| 2074 | SSL_TLSEXT_MSG_SH, &cbb)) { | ||
| 2075 | FAIL("server failed to build QUIC\n"); | ||
| 2076 | goto err; | ||
| 2077 | } | ||
| 2078 | |||
| 2079 | if (!CBB_finish(&cbb, &data, &dlen)) | ||
| 2080 | errx(1, "failed to finish CBB"); | ||
| 2081 | |||
| 2082 | if (dlen != sizeof(tlsext_quic_transport_data)) { | ||
| 2083 | FAIL("got server QUIC with length %zu, " | ||
| 2084 | "want length %zu\n", dlen, | ||
| 2085 | sizeof(tlsext_quic_transport_data)); | ||
| 2086 | goto err; | ||
| 2087 | } | ||
| 2088 | |||
| 2089 | if (memcmp(data, tlsext_quic_transport_data, dlen) != 0) { | ||
| 2090 | FAIL("saved server QUIC differs:\n"); | ||
| 2091 | fprintf(stderr, "received:\n"); | ||
| 2092 | hexdump(data, dlen); | ||
| 2093 | fprintf(stderr, "test data:\n"); | ||
| 2094 | hexdump(tlsext_quic_transport_data, | ||
| 2095 | sizeof(tlsext_quic_transport_data)); | ||
| 2096 | goto err; | ||
| 2097 | } | ||
| 2098 | |||
| 2099 | CBS_init(&cbs, tlsext_quic_transport_data, | ||
| 2100 | sizeof(tlsext_quic_transport_data)); | ||
| 2101 | |||
| 2102 | if (tlsext_quic_transport_parameters_client_parse(ssl, | ||
| 2103 | SSL_TLSEXT_MSG_SH, &cbs, &alert)) { | ||
| 2104 | FAIL("QUIC parse should have failed!\n"); | ||
| 2105 | goto err; | ||
| 2106 | } | ||
| 2107 | |||
| 2108 | ssl->s3->hs.our_max_tls_version = TLS1_3_VERSION; | ||
| 2109 | ssl->s3->hs.negotiated_tls_version = TLS1_3_VERSION; | ||
| 2110 | |||
| 2111 | if (!tlsext_quic_transport_parameters_client_parse(ssl, | ||
| 2112 | SSL_TLSEXT_MSG_SH, &cbs, &alert)) { | ||
| 2113 | FAIL("client_parse of QUIC from server failed\n"); | ||
| 2114 | goto err; | ||
| 2115 | } | ||
| 2116 | if (CBS_len(&cbs) != 0) { | ||
| 2117 | FAIL("extension data remaining\n"); | ||
| 2118 | goto err; | ||
| 2119 | } | ||
| 2120 | |||
| 2121 | SSL_get_peer_quic_transport_params(ssl, &out_bytes, &out_bytes_len); | ||
| 2122 | |||
| 2123 | if (out_bytes_len != strlen(TEST_QUIC_TRANSPORT_DATA)) { | ||
| 2124 | FAIL("client QUIC length differs, got %zu want %zu\n", | ||
| 2125 | out_bytes_len, | ||
| 2126 | sizeof(tlsext_quic_transport_data)); | ||
| 2127 | goto err; | ||
| 2128 | } | ||
| 2129 | |||
| 2130 | if (memcmp(out_bytes, TEST_QUIC_TRANSPORT_DATA, | ||
| 2131 | out_bytes_len) != 0) { | ||
| 2132 | FAIL("client QUIC differs from sent:\n"); | ||
| 2133 | fprintf(stderr, "received:\n"); | ||
| 2134 | hexdump(data, dlen); | ||
| 2135 | fprintf(stderr, "test data:\n"); | ||
| 2136 | hexdump(tlsext_quic_transport_data, | ||
| 2137 | sizeof(tlsext_quic_transport_data)); | ||
| 2138 | goto err; | ||
| 2139 | } | ||
| 2140 | |||
| 2141 | failure = 0; | ||
| 2142 | |||
| 2143 | err: | ||
| 2144 | CBB_cleanup(&cbb); | ||
| 2145 | SSL_CTX_free(ssl_ctx); | ||
| 2146 | SSL_free(ssl); | ||
| 2147 | free(data); | ||
| 2148 | |||
| 2149 | return (failure); | ||
| 2150 | } | ||
| 2151 | |||
| 1899 | static unsigned char tls_ocsp_client_default[] = { | 2152 | static unsigned char tls_ocsp_client_default[] = { |
| 1900 | 0x01, 0x00, 0x00, 0x00, 0x00 | 2153 | 0x01, 0x00, 0x00, 0x00, 0x00 |
| 1901 | }; | 2154 | }; |
| @@ -3991,5 +4244,8 @@ main(int argc, char **argv) | |||
| 3991 | 4244 | ||
| 3992 | failed |= test_tlsext_valid_hostnames(); | 4245 | failed |= test_tlsext_valid_hostnames(); |
| 3993 | 4246 | ||
| 4247 | failed |= test_tlsext_quic_transport_parameters_client(); | ||
| 4248 | failed |= test_tlsext_quic_transport_parameters_server(); | ||
| 4249 | |||
| 3994 | return (failed); | 4250 | return (failed); |
| 3995 | } | 4251 | } |
