From: Viktor Szakats Date: Thu, 29 Jan 2026 16:01:21 +0000 (+0100) Subject: vtls: dedupe common on-session-reuse logic X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9c3fcb8a321882232409f9b05b07098821378219;p=thirdparty%2Fcurl.git vtls: dedupe common on-session-reuse logic Closes #20475 --- diff --git a/lib/vtls/gtls.c b/lib/vtls/gtls.c index 7c62271326..cc58d23e0e 100644 --- a/lib/vtls/gtls.c +++ b/lib/vtls/gtls.c @@ -1079,29 +1079,14 @@ static CURLcode gtls_on_session_reuse(struct Curl_cfilter *cf, struct ssl_connect_data *connssl = cf->ctx; struct gtls_ssl_backend_data *backend = (struct gtls_ssl_backend_data *)connssl->backend; - CURLcode result = CURLE_OK; - *do_early_data = FALSE; connssl->earlydata_max = gnutls_record_get_max_early_data_size(backend->gtls.session); - if((!connssl->earlydata_max || connssl->earlydata_max == 0xFFFFFFFFUL)) { - /* Seems to be no GnuTLS way to signal no EarlyData in session */ - CURL_TRC_CF(data, cf, "SSL session does not allow earlydata"); - } - else if(!Curl_alpn_contains_proto(alpns, scs->alpn)) { - CURL_TRC_CF(data, cf, "SSL session has different ALPN, no early data"); - } - else { - infof(data, "SSL session allows %zu bytes of early data, " - "reusing ALPN '%s'", connssl->earlydata_max, scs->alpn); - connssl->earlydata_state = ssl_earlydata_await; - connssl->state = ssl_connection_deferred; - result = Curl_alpn_set_negotiated(cf, data, connssl, - (const unsigned char *)scs->alpn, - scs->alpn ? strlen(scs->alpn) : 0); - *do_early_data = !result; - } - return result; + + /* Seems to be no GnuTLS way to signal no EarlyData in session */ + return Curl_on_session_reuse(cf, data, alpns, scs, do_early_data, + connssl->earlydata_max && + connssl->earlydata_max != 0xFFFFFFFFUL); } #endif diff --git a/lib/vtls/openssl.c b/lib/vtls/openssl.c index d6996d680f..d5913538cb 100644 --- a/lib/vtls/openssl.c +++ b/lib/vtls/openssl.c @@ -3969,27 +3969,11 @@ static CURLcode ossl_on_session_reuse(struct Curl_cfilter *cf, bool *do_early_data) { struct ssl_connect_data *connssl = cf->ctx; - CURLcode result = CURLE_OK; - *do_early_data = FALSE; connssl->earlydata_max = scs->earlydata_max; - if(!connssl->earlydata_max) { - CURL_TRC_CF(data, cf, "SSL session does not allow earlydata"); - } - else if(!Curl_alpn_contains_proto(alpns, scs->alpn)) { - CURL_TRC_CF(data, cf, "SSL session has different ALPN, no early data"); - } - else { - infof(data, "SSL session allows %zu bytes of early data, " - "reusing ALPN '%s'", connssl->earlydata_max, scs->alpn); - connssl->earlydata_state = ssl_earlydata_await; - connssl->state = ssl_connection_deferred; - result = Curl_alpn_set_negotiated(cf, data, connssl, - (const unsigned char *)scs->alpn, - scs->alpn ? strlen(scs->alpn) : 0); - *do_early_data = !result; - } - return result; + + return Curl_on_session_reuse(cf, data, alpns, scs, do_early_data, + connssl->earlydata_max); } void Curl_ossl_report_handshake(struct Curl_easy *data, struct ossl_ctx *octx) diff --git a/lib/vtls/vtls.c b/lib/vtls/vtls.c index b8dc9273ab..e4f910b85c 100644 --- a/lib/vtls/vtls.c +++ b/lib/vtls/vtls.c @@ -2061,4 +2061,34 @@ out: return result; } +CURLcode Curl_on_session_reuse(struct Curl_cfilter *cf, + struct Curl_easy *data, + struct alpn_spec *alpns, + struct Curl_ssl_session *scs, + bool *do_early_data, bool early_data_allowed) +{ + struct ssl_connect_data *connssl = cf->ctx; + CURLcode result = CURLE_OK; + + *do_early_data = FALSE; + + if(!early_data_allowed) { + CURL_TRC_CF(data, cf, "SSL session does not allow earlydata"); + } + else if(!Curl_alpn_contains_proto(alpns, scs->alpn)) { + CURL_TRC_CF(data, cf, "SSL session has different ALPN, no early data"); + } + else { + infof(data, "SSL session allows %zu bytes of early data, " + "reusing ALPN '%s'", connssl->earlydata_max, scs->alpn); + connssl->earlydata_state = ssl_earlydata_await; + connssl->state = ssl_connection_deferred; + result = Curl_alpn_set_negotiated(cf, data, connssl, + (const unsigned char *)scs->alpn, + scs->alpn ? strlen(scs->alpn) : 0); + *do_early_data = !result; + } + return result; +} + #endif /* USE_SSL */ diff --git a/lib/vtls/vtls_int.h b/lib/vtls/vtls_int.h index ec72b6475b..7ed40549a4 100644 --- a/lib/vtls/vtls_int.h +++ b/lib/vtls/vtls_int.h @@ -34,6 +34,7 @@ struct Curl_ssl; struct ssl_connect_data; +struct Curl_ssl_session; /* see https://www.iana.org/assignments/tls-extensiontype-values/ */ #define ALPN_HTTP_1_1_LENGTH 8 @@ -198,6 +199,11 @@ CURLcode Curl_ssl_adjust_pollset(struct Curl_cfilter *cf, */ bool Curl_ssl_cf_is_proxy(struct Curl_cfilter *cf); +CURLcode Curl_on_session_reuse(struct Curl_cfilter *cf, + struct Curl_easy *data, + struct alpn_spec *alpns, + struct Curl_ssl_session *scs, + bool *do_early_data, bool early_data_allowed); #endif /* USE_SSL */ #endif /* HEADER_CURL_VTLS_INT_H */ diff --git a/lib/vtls/wolfssl.c b/lib/vtls/wolfssl.c index a90b5bf439..1225063c99 100644 --- a/lib/vtls/wolfssl.c +++ b/lib/vtls/wolfssl.c @@ -498,36 +498,18 @@ static CURLcode wssl_on_session_reuse(struct Curl_cfilter *cf, bool *do_early_data) { struct ssl_connect_data *connssl = cf->ctx; +#ifdef WOLFSSL_EARLY_DATA struct wssl_ctx *wssl = (struct wssl_ctx *)connssl->backend; - CURLcode result = CURLE_OK; - *do_early_data = FALSE; -#ifdef WOLFSSL_EARLY_DATA connssl->earlydata_max = wolfSSL_SESSION_get_max_early_data( wolfSSL_get_session(wssl->ssl)); #else - (void)wssl; connssl->earlydata_max = 0; #endif - if(!connssl->earlydata_max) { - /* Seems to be no WolfSSL way to signal no EarlyData in session */ - CURL_TRC_CF(data, cf, "SSL session does not allow earlydata"); - } - else if(!Curl_alpn_contains_proto(alpns, scs->alpn)) { - CURL_TRC_CF(data, cf, "SSL session has different ALPN, no early data"); - } - else { - infof(data, "SSL session allows %zu bytes of early data, " - "reusing ALPN '%s'", connssl->earlydata_max, scs->alpn); - connssl->earlydata_state = ssl_earlydata_await; - connssl->state = ssl_connection_deferred; - result = Curl_alpn_set_negotiated(cf, data, connssl, - (const unsigned char *)scs->alpn, - scs->alpn ? strlen(scs->alpn) : 0); - *do_early_data = !result; - } - return result; + /* Seems to be no wolfSSL way to signal no EarlyData in session */ + return Curl_on_session_reuse(cf, data, alpns, scs, do_early_data, + connssl->earlydata_max); } static CURLcode