summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Eremin-Solenikov <dbaryshkov@gmail.com>2016-12-14 17:51:56 +0300
committerDmitry Eremin-Solenikov <dbaryshkov@gmail.com>2016-12-14 19:48:39 +0300
commita59c0ce7fb1ee34bf05e0936fd46d306d86b71f1 (patch)
tree5c8ceba8863d93670a78958e402a088b583b6245
parent90e82f8c37a5cc8ff1647bb088642ab50a89f936 (diff)
downloadgnutls-a59c0ce7fb1ee34bf05e0936fd46d306d86b71f1.tar.gz
Rework setting next cipher suite
Only update cipher_suite if all internal check succeed and next epoch will use this ciphe suite. Also while we are at at, actually check for _gnutls_set_cipher_suite() return value. Signed-off-by: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
-rw-r--r--lib/constate.c7
-rw-r--r--lib/constate.h4
-rw-r--r--lib/handshake.c55
3 files changed, 26 insertions, 40 deletions
diff --git a/lib/constate.c b/lib/constate.c
index 07140c8748..41071eaa69 100644
--- a/lib/constate.c
+++ b/lib/constate.c
@@ -231,8 +231,8 @@ _gnutls_init_record_state(record_parameters_st * params,
}
int
-_gnutls_epoch_set_cipher_suite(gnutls_session_t session,
- int epoch_rel, const uint8_t suite[2])
+_gnutls_set_cipher_suite(gnutls_session_t session,
+ const uint8_t suite[2])
{
const cipher_entry_st *cipher_algo;
const mac_entry_st *mac_algo;
@@ -240,7 +240,7 @@ _gnutls_epoch_set_cipher_suite(gnutls_session_t session,
const gnutls_cipher_suite_entry_st *cs;
int ret;
- ret = _gnutls_epoch_get(session, epoch_rel, &params);
+ ret = _gnutls_epoch_get(session, EPOCH_NEXT, &params);
if (ret < 0)
return gnutls_assert_val(ret);
@@ -274,6 +274,7 @@ _gnutls_epoch_set_cipher_suite(gnutls_session_t session,
session->security_parameters.prf_mac = GNUTLS_MAC_MD5_SHA1;
}
+ memcpy(session->security_parameters.cipher_suite, suite, 2);
params->cipher = cipher_algo;
params->mac = mac_algo;
diff --git a/lib/constate.h b/lib/constate.h
index bfec4534bb..9f0128b7e1 100644
--- a/lib/constate.h
+++ b/lib/constate.h
@@ -23,8 +23,8 @@
#ifndef GNUTLS_CONSTATE_H
#define GNUTLS_CONSTATE_H
-int _gnutls_epoch_set_cipher_suite(gnutls_session_t session, int epoch_rel,
- const uint8_t suite[2]);
+int _gnutls_set_cipher_suite(gnutls_session_t session,
+ const uint8_t suite[2]);
int _gnutls_epoch_set_compression(gnutls_session_t session, int epoch_rel,
gnutls_compression_method_t comp_algo);
int _gnutls_epoch_get_compression(gnutls_session_t session, int epoch_rel);
diff --git a/lib/handshake.c b/lib/handshake.c
index 4b73842403..eefd816af4 100644
--- a/lib/handshake.c
+++ b/lib/handshake.c
@@ -135,17 +135,14 @@ static int resume_copy_required_values(gnutls_session_t session)
* That is because the client must see these in our
* hello message.
*/
- memcpy(session->security_parameters.cipher_suite,
- session->internals.resumed_security_parameters.cipher_suite,
- 2);
session->security_parameters.compression_method =
session->internals.resumed_security_parameters.
compression_method;
- ret = _gnutls_epoch_set_cipher_suite(session, EPOCH_NEXT,
- session->internals.
- resumed_security_parameters.
- cipher_suite);
+ ret = _gnutls_set_cipher_suite(session,
+ session->internals.
+ resumed_security_parameters.
+ cipher_suite);
if (ret < 0)
return gnutls_assert_val(ret);
@@ -987,17 +984,9 @@ _gnutls_server_select_suite(gnutls_session_t session, uint8_t * data,
session,
_gnutls_cipher_suite_get_name
(&data[j]));
- memcpy(session->
- security_parameters.
- cipher_suite,
- &cipher_suites[i], 2);
- _gnutls_epoch_set_cipher_suite
- (session, EPOCH_NEXT,
- session->security_parameters.
- cipher_suite);
-
+ retval = _gnutls_set_cipher_suite
+ (session, &data[j]);
- retval = 0;
goto finish;
}
}
@@ -1013,17 +1002,9 @@ _gnutls_server_select_suite(gnutls_session_t session, uint8_t * data,
session,
_gnutls_cipher_suite_get_name
(&data[j]));
- memcpy(session->
- security_parameters.
- cipher_suite,
- &cipher_suites[i], 2);
- _gnutls_epoch_set_cipher_suite
- (session, EPOCH_NEXT,
- session->security_parameters.
- cipher_suite);
-
+ retval = _gnutls_set_cipher_suite
+ (session, &data[j]);
- retval = 0;
goto finish;
}
}
@@ -1546,6 +1527,7 @@ set_client_ciphersuite(gnutls_session_t session, uint8_t suite[2])
uint8_t cipher_suites[MAX_CIPHERSUITE_SIZE];
int cipher_suite_size;
int i;
+ int ret;
z = 1;
cipher_suite_size =
@@ -1572,10 +1554,9 @@ set_client_ciphersuite(gnutls_session_t session, uint8_t suite[2])
return GNUTLS_E_UNKNOWN_CIPHER_SUITE;
}
- memcpy(session->security_parameters.cipher_suite, suite, 2);
- _gnutls_epoch_set_cipher_suite(session, EPOCH_NEXT,
- session->security_parameters.
- cipher_suite);
+ ret = _gnutls_set_cipher_suite(session, suite);
+ if (ret < 0)
+ return gnutls_assert_val(ret);
_gnutls_handshake_log("HSK[%p]: Selected cipher suite: %s\n",
session,
@@ -1668,6 +1649,7 @@ client_check_if_resuming(gnutls_session_t session,
uint8_t * session_id, int session_id_len)
{
char buf[2 * GNUTLS_MAX_SESSION_ID_SIZE + 1];
+ int ret;
_gnutls_handshake_log("HSK[%p]: SessionID length: %d\n", session,
session_id_len);
@@ -1693,15 +1675,17 @@ client_check_if_resuming(gnutls_session_t session,
session->security_parameters.client_random,
GNUTLS_RANDOM_SIZE);
- memcpy(session->security_parameters.cipher_suite,
- session->internals.resumed_security_parameters.cipher_suite, 2);
session->security_parameters.compression_method =
session->internals.resumed_security_parameters.compression_method;
- _gnutls_epoch_set_cipher_suite
- (session, EPOCH_NEXT,
+ ret = _gnutls_set_cipher_suite
+ (session,
session->internals.resumed_security_parameters.
cipher_suite);
+ if (ret < 0) {
+ gnutls_assert();
+ goto no_resume;
+ }
_gnutls_epoch_set_compression(session, EPOCH_NEXT,
session->internals.
resumed_security_parameters.
@@ -1711,6 +1695,7 @@ client_check_if_resuming(gnutls_session_t session,
return 0;
} else {
+no_resume:
/* keep the new session id */
session->internals.resumed = RESUME_FALSE; /* we are not resuming */
session->security_parameters.session_id_size =