summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libssl/s3_lib.c10
-rw-r--r--src/lib/libssl/ssl.h26
-rw-r--r--src/lib/libssl/ssl_lib.c30
-rw-r--r--src/lib/libssl/ssl_locl.h10
-rw-r--r--src/lib/libssl/ssl_tlsext.c122
-rw-r--r--src/lib/libssl/ssl_tlsext.h13
-rw-r--r--src/lib/libssl/tls1.h5
7 files changed, 209 insertions, 7 deletions
diff --git a/src/lib/libssl/s3_lib.c b/src/lib/libssl/s3_lib.c
index 66d0eba9a0..12eb9f4af4 100644
--- a/src/lib/libssl/s3_lib.c
+++ b/src/lib/libssl/s3_lib.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: s3_lib.c,v 1.230 2022/06/29 08:37:18 tb Exp $ */ 1/* $OpenBSD: s3_lib.c,v 1.231 2022/06/29 17:39:20 beck Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -1575,6 +1575,9 @@ ssl3_free(SSL *s)
1575 1575
1576 free(s->s3->alpn_selected); 1576 free(s->s3->alpn_selected);
1577 1577
1578 freezero(s->s3->peer_quic_transport_params,
1579 s->s3->peer_quic_transport_params_len);
1580
1578 freezero(s->s3, sizeof(*s->s3)); 1581 freezero(s->s3, sizeof(*s->s3));
1579 1582
1580 s->s3 = NULL; 1583 s->s3 = NULL;
@@ -1619,6 +1622,11 @@ ssl3_clear(SSL *s)
1619 s->s3->alpn_selected = NULL; 1622 s->s3->alpn_selected = NULL;
1620 s->s3->alpn_selected_len = 0; 1623 s->s3->alpn_selected_len = 0;
1621 1624
1625 freezero(s->s3->peer_quic_transport_params,
1626 s->s3->peer_quic_transport_params_len);
1627 s->s3->peer_quic_transport_params = NULL;
1628 s->s3->peer_quic_transport_params_len = 0;
1629
1622 memset(s->s3, 0, sizeof(*s->s3)); 1630 memset(s->s3, 0, sizeof(*s->s3));
1623 1631
1624 s->s3->rbuf.buf = rp; 1632 s->s3->rbuf.buf = rp;
diff --git a/src/lib/libssl/ssl.h b/src/lib/libssl/ssl.h
index aed3fea1d0..c733992848 100644
--- a/src/lib/libssl/ssl.h
+++ b/src/lib/libssl/ssl.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl.h,v 1.217 2022/06/28 20:57:33 tb Exp $ */ 1/* $OpenBSD: ssl.h,v 1.218 2022/06/29 17:39:20 beck Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -1578,6 +1578,30 @@ void SSL_CTX_set_security_level(SSL_CTX *ctx, int level);
1578int SSL_CTX_get_security_level(const SSL_CTX *ctx); 1578int SSL_CTX_get_security_level(const SSL_CTX *ctx);
1579#endif /* LIBRESSL_INTERNAL */ 1579#endif /* LIBRESSL_INTERNAL */
1580 1580
1581#ifdef LIBRESSL_INTERNAL
1582/*
1583 * SSL_set_quic_transport_params configures |ssl| to send |params| (of length
1584 * |params_len|) in the quic_transport_parameters extension in either the
1585 * ClientHello or EncryptedExtensions handshake message. This extension will
1586 * only be sent if the TLS version is at least 1.3, and for a server, only if
1587 * the client sent the extension. The buffer pointed to by |params| only need be
1588 * valid for the duration of the call to this function. This function returns 1
1589 *on success and 0 on failure.
1590 */
1591int SSL_set_quic_transport_params(SSL *ssl, const uint8_t *params,
1592 size_t params_len);
1593
1594/*
1595 * SSL_get_peer_quic_transport_params provides the caller with the value of the
1596 * quic_transport_parameters extension sent by the peer. A pointer to the buffer
1597 * containing the TransportParameters will be put in |*out_params|, and its
1598 * length in |*params_len|. This buffer will be valid for the lifetime of the
1599 * |SSL|. If no params were received from the peer, |*out_params_len| will be 0.
1600 */
1601void SSL_get_peer_quic_transport_params(const SSL *ssl,
1602 const uint8_t **out_params, size_t *out_params_len);
1603#endif
1604
1581/* BEGIN ERROR CODES */ 1605/* BEGIN ERROR CODES */
1582/* The following lines are auto generated by the script mkerr.pl. Any changes 1606/* The following lines are auto generated by the script mkerr.pl. Any changes
1583 * made after this point may be overwritten when the script is next run. 1607 * made after this point may be overwritten when the script is next run.
diff --git a/src/lib/libssl/ssl_lib.c b/src/lib/libssl/ssl_lib.c
index be01f771e0..b959d3428f 100644
--- a/src/lib/libssl/ssl_lib.c
+++ b/src/lib/libssl/ssl_lib.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_lib.c,v 1.292 2022/06/29 08:39:08 tb Exp $ */ 1/* $OpenBSD: ssl_lib.c,v 1.293 2022/06/29 17:39:20 beck Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -573,6 +573,8 @@ SSL_free(SSL *s)
573 573
574 free(s->internal->alpn_client_proto_list); 574 free(s->internal->alpn_client_proto_list);
575 575
576 free(s->internal->quic_transport_params);
577
576#ifndef OPENSSL_NO_SRTP 578#ifndef OPENSSL_NO_SRTP
577 sk_SRTP_PROTECTION_PROFILE_free(s->internal->srtp_profiles); 579 sk_SRTP_PROTECTION_PROFILE_free(s->internal->srtp_profiles);
578#endif 580#endif
@@ -3312,3 +3314,29 @@ OBJ_bsearch_ssl_cipher_id(SSL_CIPHER *key, SSL_CIPHER const *base, int num)
3312 return (SSL_CIPHER *)OBJ_bsearch_(key, base, num, sizeof(SSL_CIPHER), 3314 return (SSL_CIPHER *)OBJ_bsearch_(key, base, num, sizeof(SSL_CIPHER),
3313 ssl_cipher_id_cmp_BSEARCH_CMP_FN); 3315 ssl_cipher_id_cmp_BSEARCH_CMP_FN);
3314} 3316}
3317
3318int
3319SSL_set_quic_transport_params(SSL *ssl, const uint8_t *params,
3320 size_t params_len)
3321{
3322 freezero(ssl->internal->quic_transport_params,
3323 ssl->internal->quic_transport_params_len);
3324 ssl->internal->quic_transport_params = NULL;
3325 ssl->internal->quic_transport_params_len = 0;
3326
3327 if ((ssl->internal->quic_transport_params = malloc(params_len)) == NULL)
3328 return 0;
3329
3330 memcpy(ssl->internal->quic_transport_params, params, params_len);
3331 ssl->internal->quic_transport_params_len = params_len;
3332
3333 return 1;
3334}
3335
3336void
3337SSL_get_peer_quic_transport_params(const SSL *ssl, const uint8_t **out_params,
3338 size_t *out_params_len)
3339{
3340 *out_params = ssl->s3->peer_quic_transport_params;
3341 *out_params_len = ssl->s3->peer_quic_transport_params_len;
3342}
diff --git a/src/lib/libssl/ssl_locl.h b/src/lib/libssl/ssl_locl.h
index da21758815..102f7deaf5 100644
--- a/src/lib/libssl/ssl_locl.h
+++ b/src/lib/libssl/ssl_locl.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_locl.h,v 1.401 2022/06/29 12:03:38 tb Exp $ */ 1/* $OpenBSD: ssl_locl.h,v 1.402 2022/06/29 17:39:20 beck Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -932,6 +932,10 @@ typedef struct ssl_internal_st {
932 unsigned char *alpn_client_proto_list; 932 unsigned char *alpn_client_proto_list;
933 unsigned int alpn_client_proto_list_len; 933 unsigned int alpn_client_proto_list_len;
934 934
935 /* QUIC transport params we will send */
936 uint8_t *quic_transport_params;
937 size_t quic_transport_params_len;
938
935 /* XXX Callbacks */ 939 /* XXX Callbacks */
936 940
937 /* true when we are actually in SSL_accept() or SSL_connect() */ 941 /* true when we are actually in SSL_accept() or SSL_connect() */
@@ -1218,6 +1222,10 @@ typedef struct ssl3_state_st {
1218 */ 1222 */
1219 unsigned char *alpn_selected; 1223 unsigned char *alpn_selected;
1220 size_t alpn_selected_len; 1224 size_t alpn_selected_len;
1225
1226 /* Contains the QUIC transport params received from our peer. */
1227 uint8_t *peer_quic_transport_params;
1228 size_t peer_quic_transport_params_len;
1221} SSL3_STATE; 1229} SSL3_STATE;
1222 1230
1223/* 1231/*
diff --git a/src/lib/libssl/ssl_tlsext.c b/src/lib/libssl/ssl_tlsext.c
index 8faf90fde0..fc6c11daa6 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.114 2022/06/29 07:53:58 tb Exp $ */ 1/* $OpenBSD: ssl_tlsext.c,v 1.115 2022/06/29 17:39:20 beck 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>
@@ -1943,6 +1943,112 @@ tlsext_psk_server_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert)
1943 return CBS_skip(cbs, CBS_len(cbs)); 1943 return CBS_skip(cbs, CBS_len(cbs));
1944} 1944}
1945 1945
1946/*
1947 * QUIC transport parameters extension.
1948 */
1949
1950int
1951tlsext_quic_transport_parameters_client_needs(SSL *s, uint16_t msg_type)
1952{
1953 return (s->internal->quic_transport_params_len > 0 &&
1954 s->s3->hs.our_max_tls_version >= TLS1_3_VERSION);
1955}
1956
1957int
1958tlsext_quic_transport_parameters_client_build(SSL *s, uint16_t msg_type,
1959 CBB *cbb)
1960{
1961 CBB contents;
1962
1963 if (!CBB_add_u16_length_prefixed(cbb, &contents))
1964 return 0;
1965
1966 if (!CBB_add_bytes(&contents, s->internal->quic_transport_params,
1967 s->internal->quic_transport_params_len))
1968 return 0;
1969
1970 if (!CBB_flush(cbb))
1971 return 0;
1972
1973 return 1;
1974}
1975
1976int
1977tlsext_quic_transport_parameters_client_parse(SSL *s, uint16_t msg_type,
1978 CBS *cbs, int *alert)
1979{
1980 CBS transport_data;
1981
1982 /* QUIC requires TLS 1.3. */
1983 if (ssl_effective_tls_version(s) < TLS1_3_VERSION) {
1984 *alert = SSL_AD_UNSUPPORTED_EXTENSION;
1985 return 0;
1986 }
1987
1988 if (!CBS_get_u16_length_prefixed(cbs, &transport_data))
1989 return 0;
1990
1991 if (!CBS_stow(&transport_data, &s->s3->peer_quic_transport_params,
1992 &s->s3->peer_quic_transport_params_len))
1993 return 0;
1994
1995 return 1;
1996}
1997
1998int
1999tlsext_quic_transport_parameters_server_needs(SSL *s, uint16_t msg_type)
2000{
2001 return s->internal->quic_transport_params_len > 0;
2002}
2003
2004int
2005tlsext_quic_transport_parameters_server_build(SSL *s, uint16_t msg_type,
2006 CBB *cbb)
2007{
2008 CBB contents;
2009
2010 if (!CBB_add_u16_length_prefixed(cbb, &contents))
2011 return 0;
2012
2013 if (!CBB_add_bytes(&contents, s->internal->quic_transport_params,
2014 s->internal->quic_transport_params_len))
2015 return 0;
2016
2017 if (!CBB_flush(cbb))
2018 return 0;
2019
2020 return 1;
2021}
2022
2023int
2024tlsext_quic_transport_parameters_server_parse(SSL *s, uint16_t msg_type,
2025 CBS *cbs, int *alert)
2026{
2027 CBS transport_data;
2028
2029 /*
2030 * Ignore this extension if we don't have configured quic transport data
2031 * or if we are not TLS 1.3.
2032 */
2033 if (s->internal->quic_transport_params_len == 0 ||
2034 ssl_effective_tls_version(s) < TLS1_3_VERSION) {
2035 if (!CBS_skip(cbs, CBS_len(cbs))) {
2036 *alert = SSL_AD_INTERNAL_ERROR;
2037 return 0;
2038 }
2039 return 1;
2040 }
2041
2042 if (!CBS_get_u16_length_prefixed(cbs, &transport_data))
2043 return 0;
2044
2045 if (!CBS_stow(&transport_data, &s->s3->peer_quic_transport_params,
2046 &s->s3->peer_quic_transport_params_len))
2047 return 0;
2048
2049 return 1;
2050}
2051
1946struct tls_extension_funcs { 2052struct tls_extension_funcs {
1947 int (*needs)(SSL *s, uint16_t msg_type); 2053 int (*needs)(SSL *s, uint16_t msg_type);
1948 int (*build)(SSL *s, uint16_t msg_type, CBB *cbb); 2054 int (*build)(SSL *s, uint16_t msg_type, CBB *cbb);
@@ -2132,6 +2238,20 @@ static const struct tls_extension tls_extensions[] = {
2132 }, 2238 },
2133#endif /* OPENSSL_NO_SRTP */ 2239#endif /* OPENSSL_NO_SRTP */
2134 { 2240 {
2241 .type = TLSEXT_TYPE_quic_transport_parameters,
2242 .messages = SSL_TLSEXT_MSG_CH | SSL_TLSEXT_MSG_SH,
2243 .client = {
2244 .needs = tlsext_quic_transport_parameters_client_needs,
2245 .build = tlsext_quic_transport_parameters_client_build,
2246 .parse = tlsext_quic_transport_parameters_client_parse,
2247 },
2248 .server = {
2249 .needs = tlsext_quic_transport_parameters_server_needs,
2250 .build = tlsext_quic_transport_parameters_server_build,
2251 .parse = tlsext_quic_transport_parameters_server_parse,
2252 },
2253 },
2254 {
2135 .type = TLSEXT_TYPE_psk_key_exchange_modes, 2255 .type = TLSEXT_TYPE_psk_key_exchange_modes,
2136 .messages = SSL_TLSEXT_MSG_CH, 2256 .messages = SSL_TLSEXT_MSG_CH,
2137 .client = { 2257 .client = {
diff --git a/src/lib/libssl/ssl_tlsext.h b/src/lib/libssl/ssl_tlsext.h
index 3439255fd6..268b274948 100644
--- a/src/lib/libssl/ssl_tlsext.h
+++ b/src/lib/libssl/ssl_tlsext.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_tlsext.h,v 1.29 2022/06/03 13:31:49 tb Exp $ */ 1/* $OpenBSD: ssl_tlsext.h,v 1.30 2022/06/29 17:39:20 beck Exp $ */
2/* 2/*
3 * Copyright (c) 2016, 2017 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2016, 2017 Joel Sing <jsing@openbsd.org>
4 * Copyright (c) 2017 Doug Hogan <doug@openbsd.org> 4 * Copyright (c) 2017 Doug Hogan <doug@openbsd.org>
@@ -144,6 +144,17 @@ int tlsext_srtp_server_build(SSL *s, uint16_t msg_type, CBB *cbb);
144int tlsext_srtp_server_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert); 144int tlsext_srtp_server_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert);
145#endif 145#endif
146 146
147int tlsext_quic_transport_parameters_client_needs(SSL *s, uint16_t msg_type);
148int tlsext_quic_transport_parameters_client_build(SSL *s, uint16_t msg_type,
149 CBB *cbb);
150int tlsext_quic_transport_parameters_client_parse(SSL *s, uint16_t msg_type,
151 CBS *cbs, int *alert);
152int tlsext_quic_transport_parameters_server_needs(SSL *s, uint16_t msg_type);
153int tlsext_quic_transport_parameters_server_build(SSL *s, uint16_t msg_type,
154 CBB *cbb);
155int tlsext_quic_transport_parameters_server_parse(SSL *s, uint16_t msg_type,
156 CBS *cbs, int *alert);
157
147int tlsext_client_build(SSL *s, uint16_t msg_type, CBB *cbb); 158int tlsext_client_build(SSL *s, uint16_t msg_type, CBB *cbb);
148int tlsext_client_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert); 159int tlsext_client_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert);
149 160
diff --git a/src/lib/libssl/tls1.h b/src/lib/libssl/tls1.h
index aa05f37cc8..2f6e2e3bd0 100644
--- a/src/lib/libssl/tls1.h
+++ b/src/lib/libssl/tls1.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls1.h,v 1.52 2022/06/28 20:36:55 tb Exp $ */ 1/* $OpenBSD: tls1.h,v 1.53 2022/06/29 17:39:20 beck Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -259,6 +259,9 @@ extern "C" {
259/* ExtensionType value from RFC 7685. */ 259/* ExtensionType value from RFC 7685. */
260#define TLSEXT_TYPE_padding 21 260#define TLSEXT_TYPE_padding 21
261 261
262/* ExtensionType value from draft-ietf-quic-tls */
263#define TLSEXT_TYPE_quic_transport_parameters 26
264
262/* ExtensionType value from RFC 4507. */ 265/* ExtensionType value from RFC 4507. */
263#define TLSEXT_TYPE_session_ticket 35 266#define TLSEXT_TYPE_session_ticket 35
264 267