summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@redhat.com>2017-09-29 09:01:41 +0200
committerNikos Mavrogiannopoulos <nmav@redhat.com>2017-11-14 15:00:32 +0100
commit29df09815d08177cbf970a20b05320004d596d0e (patch)
tree03ac22bf7185dbe50d8d84789c2e6d321a46c767
parent133885bd4bbc8e39e65eeaa86b070691f6cb0e3d (diff)
downloadgnutls-29df09815d08177cbf970a20b05320004d596d0e.tar.gz
handshake: simplified version parsing
Signed-off-by: Nikos Mavrogiannopoulos <nmav@redhat.com>
-rw-r--r--lib/algorithms.h1
-rw-r--r--lib/algorithms/protocols.c9
-rw-r--r--lib/handshake.c14
3 files changed, 17 insertions, 7 deletions
diff --git a/lib/algorithms.h b/lib/algorithms.h
index 1d91860694..1bba48a12b 100644
--- a/lib/algorithms.h
+++ b/lib/algorithms.h
@@ -43,6 +43,7 @@
/* Functions for version handling. */
const version_entry_st *version_to_entry(gnutls_protocol_t version);
+const version_entry_st *nversion_to_entry(uint8_t major, uint8_t minor);
const version_entry_st *_gnutls_version_lowest(gnutls_session_t session);
const version_entry_st *_gnutls_legacy_version_max(gnutls_session_t session);
diff --git a/lib/algorithms/protocols.c b/lib/algorithms/protocols.c
index 15a20061fa..db50ce9858 100644
--- a/lib/algorithms/protocols.c
+++ b/lib/algorithms/protocols.c
@@ -196,6 +196,15 @@ const version_entry_st *version_to_entry(gnutls_protocol_t version)
return NULL;
}
+const version_entry_st *nversion_to_entry(uint8_t major, uint8_t minor)
+{
+ GNUTLS_VERSION_LOOP(
+ if ((p->major == major) && (p->minor == minor))
+ return p;
+ );
+ return NULL;
+}
+
static int
version_is_valid_for_session(gnutls_session_t session,
const version_entry_st *v)
diff --git a/lib/handshake.c b/lib/handshake.c
index bf2b029db3..2a041ec611 100644
--- a/lib/handshake.c
+++ b/lib/handshake.c
@@ -1566,7 +1566,6 @@ read_server_hello(gnutls_session_t session,
uint8_t session_id_len = 0;
int pos = 0;
int ret = 0;
- gnutls_protocol_t version;
int len = datalen;
const version_entry_st *vers;
gnutls_ext_flags_t ext_parse_flag;
@@ -1580,21 +1579,22 @@ read_server_hello(gnutls_session_t session,
session, data[pos], data[pos + 1]);
DECR_LEN(len, 2);
- version = _gnutls_version_get(data[pos], data[pos + 1]);
- if (_gnutls_version_is_supported(session, version) == 0) {
+ vers = nversion_to_entry(data[pos], data[pos + 1]);
+ if (unlikely(vers == NULL))
+ return gnutls_assert_val(GNUTLS_E_UNSUPPORTED_VERSION_PACKET);
+
+ if (_gnutls_version_is_supported(session, vers->id) == 0) {
gnutls_assert();
return GNUTLS_E_UNSUPPORTED_VERSION_PACKET;
}
- if (_gnutls_set_current_version(session, version) < 0)
+ if (_gnutls_set_current_version(session, vers->id) < 0)
return gnutls_assert_val(GNUTLS_E_UNSUPPORTED_VERSION_PACKET);
- vers = get_version(session);
-
pos += 2;
DECR_LEN(len, GNUTLS_RANDOM_SIZE);
- ret = _gnutls_set_server_random(session, version, &data[pos]);
+ ret = _gnutls_set_server_random(session, vers->id, &data[pos]);
if (ret < 0)
return gnutls_assert_val(ret);