diff options
-rw-r--r-- | src/lib/libssl/ssl_tlsext.c | 64 |
1 files changed, 16 insertions, 48 deletions
diff --git a/src/lib/libssl/ssl_tlsext.c b/src/lib/libssl/ssl_tlsext.c index a7c8f2d61d..6063991306 100644 --- a/src/lib/libssl/ssl_tlsext.c +++ b/src/lib/libssl/ssl_tlsext.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ssl_tlsext.c,v 1.120 2022/07/17 14:41:27 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_tlsext.c,v 1.121 2022/07/17 14:54:10 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2016, 2017, 2019 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2016, 2017, 2019 Joel Sing <jsing@openbsd.org> |
4 | * Copyright (c) 2017 Doug Hogan <doug@openbsd.org> | 4 | * Copyright (c) 2017 Doug Hogan <doug@openbsd.org> |
@@ -1950,32 +1950,23 @@ tlsext_psk_server_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert) | |||
1950 | } | 1950 | } |
1951 | 1951 | ||
1952 | /* | 1952 | /* |
1953 | * QUIC transport parameters extension. | 1953 | * QUIC transport parameters extension - RFC 9001 section 8.2. |
1954 | */ | 1954 | */ |
1955 | 1955 | ||
1956 | int | 1956 | int |
1957 | tlsext_quic_transport_parameters_client_needs(SSL *s, uint16_t msg_type) | 1957 | tlsext_quic_transport_parameters_client_needs(SSL *s, uint16_t msg_type) |
1958 | { | 1958 | { |
1959 | return (s->internal->quic_transport_params_len > 0 && | 1959 | return SSL_is_quic(s) && s->internal->quic_transport_params_len > 0; |
1960 | s->s3->hs.our_max_tls_version >= TLS1_3_VERSION); | ||
1961 | } | 1960 | } |
1962 | 1961 | ||
1963 | int | 1962 | int |
1964 | tlsext_quic_transport_parameters_client_build(SSL *s, uint16_t msg_type, | 1963 | tlsext_quic_transport_parameters_client_build(SSL *s, uint16_t msg_type, |
1965 | CBB *cbb) | 1964 | CBB *cbb) |
1966 | { | 1965 | { |
1967 | CBB contents; | 1966 | if (!CBB_add_bytes(cbb, s->internal->quic_transport_params, |
1968 | |||
1969 | if (!CBB_add_u16_length_prefixed(cbb, &contents)) | ||
1970 | return 0; | ||
1971 | |||
1972 | if (!CBB_add_bytes(&contents, s->internal->quic_transport_params, | ||
1973 | s->internal->quic_transport_params_len)) | 1967 | s->internal->quic_transport_params_len)) |
1974 | return 0; | 1968 | return 0; |
1975 | 1969 | ||
1976 | if (!CBB_flush(cbb)) | ||
1977 | return 0; | ||
1978 | |||
1979 | return 1; | 1970 | return 1; |
1980 | } | 1971 | } |
1981 | 1972 | ||
@@ -1983,20 +1974,16 @@ int | |||
1983 | tlsext_quic_transport_parameters_client_parse(SSL *s, uint16_t msg_type, | 1974 | tlsext_quic_transport_parameters_client_parse(SSL *s, uint16_t msg_type, |
1984 | CBS *cbs, int *alert) | 1975 | CBS *cbs, int *alert) |
1985 | { | 1976 | { |
1986 | CBS transport_data; | 1977 | if (!SSL_is_quic(s)) { |
1987 | |||
1988 | /* QUIC requires TLS 1.3. */ | ||
1989 | if (ssl_effective_tls_version(s) < TLS1_3_VERSION) { | ||
1990 | *alert = SSL_AD_UNSUPPORTED_EXTENSION; | 1978 | *alert = SSL_AD_UNSUPPORTED_EXTENSION; |
1991 | return 0; | 1979 | return 0; |
1992 | } | 1980 | } |
1993 | 1981 | ||
1994 | if (!CBS_get_u16_length_prefixed(cbs, &transport_data)) | 1982 | if (!CBS_stow(cbs, &s->s3->peer_quic_transport_params, |
1995 | return 0; | ||
1996 | |||
1997 | if (!CBS_stow(&transport_data, &s->s3->peer_quic_transport_params, | ||
1998 | &s->s3->peer_quic_transport_params_len)) | 1983 | &s->s3->peer_quic_transport_params_len)) |
1999 | return 0; | 1984 | return 0; |
1985 | if (!CBS_skip(cbs, s->s3->peer_quic_transport_params_len)) | ||
1986 | return 0; | ||
2000 | 1987 | ||
2001 | return 1; | 1988 | return 1; |
2002 | } | 1989 | } |
@@ -2004,25 +1991,17 @@ tlsext_quic_transport_parameters_client_parse(SSL *s, uint16_t msg_type, | |||
2004 | int | 1991 | int |
2005 | tlsext_quic_transport_parameters_server_needs(SSL *s, uint16_t msg_type) | 1992 | tlsext_quic_transport_parameters_server_needs(SSL *s, uint16_t msg_type) |
2006 | { | 1993 | { |
2007 | return s->internal->quic_transport_params_len > 0; | 1994 | return SSL_is_quic(s) && s->internal->quic_transport_params_len > 0; |
2008 | } | 1995 | } |
2009 | 1996 | ||
2010 | int | 1997 | int |
2011 | tlsext_quic_transport_parameters_server_build(SSL *s, uint16_t msg_type, | 1998 | tlsext_quic_transport_parameters_server_build(SSL *s, uint16_t msg_type, |
2012 | CBB *cbb) | 1999 | CBB *cbb) |
2013 | { | 2000 | { |
2014 | CBB contents; | 2001 | if (!CBB_add_bytes(cbb, s->internal->quic_transport_params, |
2015 | |||
2016 | if (!CBB_add_u16_length_prefixed(cbb, &contents)) | ||
2017 | return 0; | ||
2018 | |||
2019 | if (!CBB_add_bytes(&contents, s->internal->quic_transport_params, | ||
2020 | s->internal->quic_transport_params_len)) | 2002 | s->internal->quic_transport_params_len)) |
2021 | return 0; | 2003 | return 0; |
2022 | 2004 | ||
2023 | if (!CBB_flush(cbb)) | ||
2024 | return 0; | ||
2025 | |||
2026 | return 1; | 2005 | return 1; |
2027 | } | 2006 | } |
2028 | 2007 | ||
@@ -2030,27 +2009,16 @@ int | |||
2030 | tlsext_quic_transport_parameters_server_parse(SSL *s, uint16_t msg_type, | 2009 | tlsext_quic_transport_parameters_server_parse(SSL *s, uint16_t msg_type, |
2031 | CBS *cbs, int *alert) | 2010 | CBS *cbs, int *alert) |
2032 | { | 2011 | { |
2033 | CBS transport_data; | 2012 | if (!SSL_is_quic(s)) { |
2034 | 2013 | *alert = SSL_AD_UNSUPPORTED_EXTENSION; | |
2035 | /* | ||
2036 | * Ignore this extension if we don't have configured quic transport data | ||
2037 | * or if we are not TLS 1.3. | ||
2038 | */ | ||
2039 | if (s->internal->quic_transport_params_len == 0 || | ||
2040 | ssl_effective_tls_version(s) < TLS1_3_VERSION) { | ||
2041 | if (!CBS_skip(cbs, CBS_len(cbs))) { | ||
2042 | *alert = SSL_AD_INTERNAL_ERROR; | ||
2043 | return 0; | ||
2044 | } | ||
2045 | return 1; | ||
2046 | } | ||
2047 | |||
2048 | if (!CBS_get_u16_length_prefixed(cbs, &transport_data)) | ||
2049 | return 0; | 2014 | return 0; |
2015 | } | ||
2050 | 2016 | ||
2051 | if (!CBS_stow(&transport_data, &s->s3->peer_quic_transport_params, | 2017 | if (!CBS_stow(cbs, &s->s3->peer_quic_transport_params, |
2052 | &s->s3->peer_quic_transport_params_len)) | 2018 | &s->s3->peer_quic_transport_params_len)) |
2053 | return 0; | 2019 | return 0; |
2020 | if (!CBS_skip(cbs, s->s3->peer_quic_transport_params_len)) | ||
2021 | return 0; | ||
2054 | 2022 | ||
2055 | return 1; | 2023 | return 1; |
2056 | } | 2024 | } |