mirror of
https://github.com/curl/curl.git
synced 2026-08-25 02:53:32 +03:00
OpenSSL/quictls: add support for TLSv1.3 early data
based on #16450 Adds support for TLSv1.3 early data for TCP and QUIC via ngtcp2. Closes #16477
This commit is contained in:
parent
b5d99a5474
commit
0d3b5937b3
12 changed files with 308 additions and 69 deletions
|
|
@ -482,6 +482,11 @@ static int cf_ngtcp2_handshake_completed(ngtcp2_conn *tconn, void *user_data)
|
|||
if(ctx->use_earlydata)
|
||||
Curl_pgrsTimeWas(data, TIMER_APPCONNECT, ctx->handshake_at);
|
||||
if(ctx->use_earlydata) {
|
||||
#if defined(USE_OPENSSL) && defined(HAVE_OPENSSL_EARLYDATA)
|
||||
ctx->earlydata_accepted =
|
||||
(SSL_get_early_data_status(ctx->tls.ossl.ssl) !=
|
||||
SSL_EARLY_DATA_REJECTED);
|
||||
#endif
|
||||
#ifdef USE_GNUTLS
|
||||
int flags = gnutls_session_get_flags(ctx->tls.gtls.session);
|
||||
ctx->earlydata_accepted = !!(flags & GNUTLS_SFLAGS_EARLY_DATA);
|
||||
|
|
@ -2183,8 +2188,24 @@ static int quic_ossl_new_session_cb(SSL *ssl, SSL_SESSION *ssl_sessionid)
|
|||
ctx = cf ? cf->ctx : NULL;
|
||||
data = cf ? CF_DATA_CURRENT(cf) : NULL;
|
||||
if(cf && data && ctx) {
|
||||
unsigned char *quic_tp = NULL;
|
||||
size_t quic_tp_len = 0;
|
||||
#ifdef HAVE_OPENSSL_EARLYDATA
|
||||
ngtcp2_ssize tplen;
|
||||
uint8_t tpbuf[256];
|
||||
|
||||
tplen = ngtcp2_conn_encode_0rtt_transport_params(ctx->qconn, tpbuf,
|
||||
sizeof(tpbuf));
|
||||
if(tplen < 0)
|
||||
CURL_TRC_CF(data, cf, "error encoding 0RTT transport data: %s",
|
||||
ngtcp2_strerror((int)tplen));
|
||||
else {
|
||||
quic_tp = (unsigned char *)tpbuf;
|
||||
quic_tp_len = (size_t)tplen;
|
||||
}
|
||||
#endif
|
||||
Curl_ossl_add_session(cf, data, ctx->peer.scache_key, ssl_sessionid,
|
||||
SSL_version(ssl), "h3");
|
||||
SSL_version(ssl), "h3", quic_tp, quic_tp_len);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
|
|
@ -2355,6 +2376,9 @@ static CURLcode cf_ngtcp2_on_session_reuse(struct Curl_cfilter *cf,
|
|||
CURLcode result = CURLE_OK;
|
||||
|
||||
*do_early_data = FALSE;
|
||||
#if defined(USE_OPENSSL) && defined(HAVE_OPENSSL_EARLYDATA)
|
||||
ctx->earlydata_max = scs->earlydata_max;
|
||||
#endif
|
||||
#ifdef USE_GNUTLS
|
||||
ctx->earlydata_max =
|
||||
gnutls_record_get_max_early_data_size(ctx->tls.gtls.session);
|
||||
|
|
@ -2366,7 +2390,8 @@ static CURLcode cf_ngtcp2_on_session_reuse(struct Curl_cfilter *cf,
|
|||
ctx->earlydata_max = 0;
|
||||
#endif /* WOLFSSL_EARLY_DATA */
|
||||
#endif
|
||||
#if defined(USE_GNUTLS) || defined(USE_WOLFSSL)
|
||||
#if defined(USE_GNUTLS) || defined(USE_WOLFSSL) || \
|
||||
(defined(USE_OPENSSL) && defined(HAVE_OPENSSL_EARLYDATA))
|
||||
if((!ctx->earlydata_max)) {
|
||||
CURL_TRC_CF(data, cf, "SSL session does not allow earlydata");
|
||||
}
|
||||
|
|
@ -2394,7 +2419,7 @@ static CURLcode cf_ngtcp2_on_session_reuse(struct Curl_cfilter *cf,
|
|||
}
|
||||
}
|
||||
}
|
||||
#else /* USE_GNUTLS */
|
||||
#else /* not supported in the TLS backend */
|
||||
(void)data;
|
||||
(void)ctx;
|
||||
(void)scs;
|
||||
|
|
|
|||
|
|
@ -88,7 +88,8 @@ CURLcode Curl_vquic_tls_init(struct curl_tls_ctx *ctx,
|
|||
#ifdef USE_OPENSSL
|
||||
(void)result;
|
||||
return Curl_ossl_ctx_init(&ctx->ossl, cf, data, peer, alpns,
|
||||
cb_setup, cb_user_data, NULL, ssl_user_data);
|
||||
cb_setup, cb_user_data, NULL, ssl_user_data,
|
||||
session_reuse_cb);
|
||||
#elif defined(USE_GNUTLS)
|
||||
return Curl_gtls_ctx_init(&ctx->gtls, cf, data, peer, alpns,
|
||||
cb_setup, cb_user_data, ssl_user_data,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue