ssl_choose_server_version(): With ECH check if connection is TLSv1.3

Fixes DEF-02-005

Reviewed-by: Paul Dale <paul.dale@oracle.com>
Reviewed-by: Matt Caswell <matt@openssl.org>
MergeDate: Wed Feb 11 17:19:11 2026
(Merged from https://github.com/openssl/openssl/pull/29593)
This commit is contained in:
sftcd
2026-02-17 13:35:01 +00:00
committed by Matt Caswell
parent afe1a29740
commit 6587f78652
+17
View File
@@ -2139,6 +2139,18 @@ int ssl_choose_server_version(SSL_CONNECTION *s, CLIENTHELLO_MSG *hello,
suppversions = &hello->pre_proc_exts[TLSEXT_IDX_supported_versions];
#ifndef OPENSSL_NO_ECH
/*
* Check we're dealing with a TLSv1.3 connection when ECH has
* succeeded, and not with a smuggled earlier version ClientHello
* (which could be a form of attack).
* This bit checks there is a supported version present, a little
* bit further below, we check that that version is TLSv1.3
*/
if (!suppversions->present && s->ext.ech.success == 1)
return SSL_R_UNSUPPORTED_PROTOCOL;
#endif
/* If we did an HRR then supported versions is mandatory */
if (!suppversions->present && s->hello_retry_request != SSL_HRR_NONE)
return SSL_R_UNSUPPORTED_PROTOCOL;
@@ -2180,6 +2192,11 @@ int ssl_choose_server_version(SSL_CONNECTION *s, CLIENTHELLO_MSG *hello,
}
if (best_vers > 0) {
#ifndef OPENSSL_NO_ECH
/* ECH needs TLSV1.3 also */
if (s->ext.ech.success == 1 && best_vers != TLS1_3_VERSION)
return SSL_R_UNSUPPORTED_PROTOCOL;
#endif
if (s->hello_retry_request != SSL_HRR_NONE) {
/*
* This is after a HelloRetryRequest so we better check that we