gnutls_kx_algorithm kx;
GNUTLS_CipherSuite cs;
+ if (datalen % 2 != 0) {
+ gnutls_assert();
+ return GNUTLS_E_UNEXPECTED_PACKET_LENGTH;
+ }
+
for (j = 0; j < datalen; j += 2) {
memcpy( &cs.CipherSuite, &data[j], 2);
kx = _gnutls_cipher_suite_get_kx_algo( &cs);
else return GNUTLS_E_UNKNOWN_CIPHER_SUITE;
}
+ /* Data length should be zero mod 2 since
+ * every ciphersuite is 2 bytes. (this check is needed
+ * see below).
+ */
+ if (datalen % 2 == 0) {
+ gnutls_assert();
+ return GNUTLS_E_UNEXPECTED_PACKET_LENGTH;
+ }
+
#ifdef HANDSHAKE_DEBUG
_gnutls_handshake_log("HSK[%x]: Requested cipher suites: \n", session);
for (j = 0; j < datalen; j += 2) {
memcpy( &cs.CipherSuite, &data[j], 2);
-
_gnutls_handshake_log("\t%s\n",
_gnutls_cipher_suite_get_name(&cs));
}
int i, j, ret;
opaque* _data;
int _datalen;
+
+ _gnutls_handshake_log( "HSK[%x]: Parsing a version 2.0 client hello.\n", session);
_data = gnutls_malloc( datalen);
if (_data==NULL) {
return GNUTLS_E_MEMORY_ERROR;
}
- _gnutls_handshake_log( "HSK[%x]: Parsing a version 2.0 client hello.\n", session);
+ if (datalen % 3 != 0) {
+ gnutls_assert();
+ return GNUTLS_E_UNEXPECTED_PACKET_LENGTH;
+ }
i = _datalen = 0;
for (j = 0; j < datalen; j += 3) {
/* read random new values -skip session id for now */
DECR_LEN(len, session_id_len); /* skip session id for now */
memcpy( session_id, &data[pos], session_id_len);
- pos+=session_id_len;
+ pos += session_id_len;
DECR_LEN(len, challenge);
memset( random, 0, TLS_RANDOM_SIZE);