From: Jonathan Bastien-Filiatrault Date: Wed, 29 Jul 2009 23:26:21 +0000 (-0400) Subject: Make version lookup transport dependent. X-Git-Tag: gnutls_2_99_0~255 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=81f08604fb30ebc9762d2e3f152b993ecc40fde4;p=thirdparty%2Fgnutls.git Make version lookup transport dependent. Signed-off-by: Nikos Mavrogiannopoulos --- diff --git a/lib/gnutls_algorithms.c b/lib/gnutls_algorithms.c index 566b2e0697..25f1454b0c 100644 --- a/lib/gnutls_algorithms.c +++ b/lib/gnutls_algorithms.c @@ -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; diff --git a/lib/gnutls_priority.c b/lib/gnutls_priority.c index cb2593a5c9..c91b0d3304 100644 --- a/lib/gnutls_priority.c +++ b/lib/gnutls_priority.c @@ -220,6 +220,7 @@ static const int protocol_priority[] = { GNUTLS_TLS1_1, GNUTLS_TLS1_0, GNUTLS_SSL3, + GNUTLS_DTLS1_0, 0 };