]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
Make version lookup transport dependent.
authorJonathan Bastien-Filiatrault <joe@x2a.org>
Wed, 29 Jul 2009 23:26:21 +0000 (19:26 -0400)
committerNikos Mavrogiannopoulos <nmav@gnutls.org>
Thu, 17 Feb 2011 21:24:30 +0000 (22:24 +0100)
Signed-off-by: Nikos Mavrogiannopoulos <nmav@gnutls.org>
lib/gnutls_algorithms.c
lib/gnutls_priority.c

index 566b2e0697056941081cd28990d1aba3434ac260..25f1454b0cd192ea5490281795e13030d18c7550 100644 (file)
@@ -136,15 +136,16 @@ typedef struct
   gnutls_protocol_t id;         /* gnutls internal version number */
   int major;                    /* defined by the protocol */
   int minor;                    /* defined by the protocol */
+  transport_t transport;       /* Type of transport, stream or datagram */
   int supported;                /* 0 not supported, > 0 is supported */
 } gnutls_version_entry;
 
 static const gnutls_version_entry sup_versions[] = {
-  {"SSL3.0", GNUTLS_SSL3, 3, 0, 1},
-  {"TLS1.0", GNUTLS_TLS1, 3, 1, 1},
-  {"TLS1.1", GNUTLS_TLS1_1, 3, 2, 1},
-  {"TLS1.2", GNUTLS_TLS1_2, 3, 3, 1},
-  {"DTLS1.0", GNUTLS_DTLS1_0, 254, 255, 1}, /* 1.1 over datagram */
+  {"SSL3.0", GNUTLS_SSL3, 3, 0, GNUTLS_STREAM, 1},
+  {"TLS1.0", GNUTLS_TLS1, 3, 1, GNUTLS_STREAM, 1},
+  {"TLS1.1", GNUTLS_TLS1_1, 3, 2, GNUTLS_STREAM, 1},
+  {"TLS1.2", GNUTLS_TLS1_2, 3, 3, GNUTLS_STREAM, 1},
+  {"DTLS1.0", GNUTLS_DTLS1_0, 254, 255, GNUTLS_DGRAM, 1}, /* 1.1 over datagram */
   {0, 0, 0, 0, 0}
 };
 
@@ -1250,11 +1251,14 @@ gnutls_protocol_t
 _gnutls_version_lowest (gnutls_session_t session)
 {                               /* returns the lowest version supported */
   unsigned int i, min = 0xff;
+  gnutls_protocol_t cur_prot;
 
   for (i = 0; i < session->internals.priorities.protocol.algorithms; i++)
     {
-      if (session->internals.priorities.protocol.priority[i] < min)
-        min = session->internals.priorities.protocol.priority[i];
+      cur_prot = session->internals.priorities.protocol.priority[i];
+
+      if (cur_prot < min && _gnutls_version_is_supported(session, cur_prot))
+       min = cur_prot;
     }
 
   if (min == 0xff)
@@ -1267,11 +1271,14 @@ gnutls_protocol_t
 _gnutls_version_max (gnutls_session_t session)
 {                               /* returns the maximum version supported */
   unsigned int i, max = 0x00;
+  gnutls_protocol_t cur_prot;
 
   for (i = 0; i < session->internals.priorities.protocol.algorithms; i++)
     {
-      if (session->internals.priorities.protocol.priority[i] > max)
-        max = session->internals.priorities.protocol.priority[i];
+      cur_prot = session->internals.priorities.protocol.priority[i];
+
+      if (cur_prot > max && _gnutls_version_is_supported(session, cur_prot))
+       max = cur_prot;
     }
 
   if (max == 0x00)
@@ -1370,7 +1377,8 @@ _gnutls_version_is_supported (gnutls_session_t session,
 {
   int ret = 0;
 
-  GNUTLS_VERSION_ALG_LOOP (ret = p->supported);
+  GNUTLS_VERSION_ALG_LOOP (ret = p->supported && p->transport == session->internals.transport);
+
   if (ret == 0)
     return 0;
 
index cb2593a5c93b7593b213f871835742df62face5e..c91b0d33046678dcb46a58708dd5f3abd403a5aa 100644 (file)
@@ -220,6 +220,7 @@ static const int protocol_priority[] = {
   GNUTLS_TLS1_1,
   GNUTLS_TLS1_0,
   GNUTLS_SSL3,
+  GNUTLS_DTLS1_0,
   0
 };