]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
Fix version check to avoid unsupported protocol error in ssl_choose_server_version()
authorFrederik Wedel-Heinen <frederik.wedel-heinen@dencrypt.dk>
Tue, 9 Apr 2024 10:57:12 +0000 (12:57 +0200)
committerTomas Mraz <tomas@openssl.org>
Thu, 2 Oct 2025 12:45:13 +0000 (14:45 +0200)
Reviewed-by: Tomas Mraz <tomas@openssl.org>
Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/22275)

ssl/statem/statem_lib.c

index 6b63e84d39a0b8a2af7ab141ce205bb50a14f41c..260b7b48d9c4323fcda7fafa82905858aa4d0ae8 100644 (file)
@@ -2178,6 +2178,8 @@ int ssl_choose_server_version(SSL_CONNECTION *s, CLIENTHELLO_MSG *hello,
     RAW_EXTENSION *suppversions;
     const int version1_3 = SSL_CONNECTION_IS_DTLS(s) ? DTLS1_3_VERSION
                                                      : TLS1_3_VERSION;
+    const int version1_2 = SSL_CONNECTION_IS_DTLS(s) ? DTLS1_2_VERSION
+                                                     : TLS1_2_VERSION;
 
     if (client_version <= 0)
         return SSL_R_WRONG_SSL_VERSION;
@@ -2265,7 +2267,7 @@ int ssl_choose_server_version(SSL_CONNECTION *s, CLIENTHELLO_MSG *hello,
                  * This is after a HelloRetryRequest so we better check that we
                  * negotiated (D)TLSv1.3
                  */
-                if (best_vers != TLS1_3_VERSION && best_vers != DTLS1_3_VERSION)
+                if (best_vers != version1_3)
                     return SSL_R_UNSUPPORTED_PROTOCOL;
                 return 0;
             }
@@ -2285,8 +2287,7 @@ int ssl_choose_server_version(SSL_CONNECTION *s, CLIENTHELLO_MSG *hello,
      * version we can negotiate is (D)TLSv1.2
      */
     if (ssl_version_cmp(s, client_version, version1_3) >= 0)
-        client_version = SSL_CONNECTION_IS_DTLS(s) ? DTLS1_2_VERSION
-                                                   : TLS1_2_VERSION;
+        client_version = version1_2;
 
     /*
      * No supported versions extension, so we just use the version supplied in
@@ -2331,6 +2332,8 @@ int ssl_choose_client_version(SSL_CONNECTION *s, int version,
     const version_info *table;
     int ret, ver_min, ver_max, real_max, origv;
     SSL *ssl = SSL_CONNECTION_GET_SSL(s);
+    const int version1_3 = SSL_CONNECTION_IS_DTLS(s) ? DTLS1_3_VERSION
+                                                     : TLS1_3_VERSION;
 
     origv = s->version;
     s->version = version;
@@ -2344,8 +2347,7 @@ int ssl_choose_client_version(SSL_CONNECTION *s, int version,
         return 0;
     }
 
-    if (s->hello_retry_request != SSL_HRR_NONE
-            && (s->version != TLS1_3_VERSION && s->version != DTLS1_3_VERSION)) {
+    if (s->hello_retry_request != SSL_HRR_NONE && s->version != version1_3) {
         s->version = origv;
         SSLfatal(s, SSL_AD_PROTOCOL_VERSION, SSL_R_WRONG_SSL_VERSION);
         return 0;