Fix version handling so it can cope with a major version >3.
authorDr. Stephen Henson <steve@openssl.org>
Wed, 13 Jan 2010 19:08:02 +0000 (19:08 +0000)
committerDr. Stephen Henson <steve@openssl.org>
Wed, 13 Jan 2010 19:08:02 +0000 (19:08 +0000)
Although it will be many years before TLS v2.0 or later appears old versions
of servers have a habit of hanging around for a considerable time so best
if we handle this properly now.

CHANGES
ssl/s23_srvr.c

diff --git a/CHANGES b/CHANGES
index 54e643f80f5728340b23863d96e74dbe19227a16..00ea5eecb2fd28d0a6ac734983bf3cf8c52ef86e 100644 (file)
--- a/CHANGES
+++ b/CHANGES
 
  Changes between 0.9.8l (?) and 0.9.8m (?)  [xx XXX xxxx]
 
 
  Changes between 0.9.8l (?) and 0.9.8m (?)  [xx XXX xxxx]
 
+  *) Handle TLS versions 2.0 and later properly and correctly use the
+     highest version of TLS/SSL supported. Although TLS >= 2.0 is some way
+     off ancient servers have a habit of sticking around for a while...
+     [Steve Henson]
+
   *) Modify compression code so it frees up structures without using the
      ex_data callbacks. This works around a problem where some applications
      call CRYPTO_free_all_ex_data() before application exit (e.g. when
   *) Modify compression code so it frees up structures without using the
      ex_data callbacks. This works around a problem where some applications
      call CRYPTO_free_all_ex_data() before application exit (e.g. when
index 03efdf74c1b44d803b350765da252ce32b3bdf51..05e4e0b47b64d97ec05d96803a46da1105fbf7a5 100644 (file)
@@ -323,7 +323,7 @@ int ssl23_get_client_hello(SSL *s)
                         (p[1] == SSL3_VERSION_MAJOR) &&
                         (p[5] == SSL3_MT_CLIENT_HELLO) &&
                         ((p[3] == 0 && p[4] < 5 /* silly record length? */)
                         (p[1] == SSL3_VERSION_MAJOR) &&
                         (p[5] == SSL3_MT_CLIENT_HELLO) &&
                         ((p[3] == 0 && p[4] < 5 /* silly record length? */)
-                               || (p[9] == p[1])))
+                               || (p[9] >= p[1])))
                        {
                        /*
                         * SSLv3 or tls1 header
                        {
                        /*
                         * SSLv3 or tls1 header
@@ -347,6 +347,13 @@ int ssl23_get_client_hello(SSL *s)
                                v[1] = TLS1_VERSION_MINOR;
 #endif
                                }
                                v[1] = TLS1_VERSION_MINOR;
 #endif
                                }
+                       /* if major version number > 3 set minor to a value
+                        * which will use the highest version 3 we support.
+                        * If TLS 2.0 ever appears we will need to revise
+                        * this....
+                        */
+                       else if (p[9] > SSL3_VERSION_MAJOR)
+                               v[1]=0xff;
                        else
                                v[1]=p[10]; /* minor version according to client_version */
                        if (v[1] >= TLS1_VERSION_MINOR)
                        else
                                v[1]=p[10]; /* minor version according to client_version */
                        if (v[1] >= TLS1_VERSION_MINOR)