From: Nikos Mavrogiannopoulos Date: Mon, 28 Jan 2002 10:38:36 +0000 (+0000) Subject: corrected and optimized handshake. X-Git-Tag: gnutls_0_3_90~169 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=968c7fb844a194dbfdfdf9708076204544babc0e;p=thirdparty%2Fgnutls.git corrected and optimized handshake. --- diff --git a/lib/gnutls_buffers.c b/lib/gnutls_buffers.c index 5ff7b8406c..66ee056f49 100644 --- a/lib/gnutls_buffers.c +++ b/lib/gnutls_buffers.c @@ -922,6 +922,17 @@ int _gnutls_handshake_buffer_get_ptr( GNUTLS_STATE state, char **data_ptr, int * return 0; } +/* Does not free the buffer + */ +int _gnutls_handshake_buffer_empty( GNUTLS_STATE state) +{ + + _gnutls_buffers_log( "BUF[HSK]: Emptied buffer\n"); + + state->gnutls_internals.handshake_hash_buffer.size = 0; + + return 0; +} int _gnutls_handshake_buffer_clear( GNUTLS_STATE state) diff --git a/lib/gnutls_buffers.h b/lib/gnutls_buffers.h index 3b92ffc95b..604535fd39 100644 --- a/lib/gnutls_buffers.h +++ b/lib/gnutls_buffers.h @@ -31,6 +31,7 @@ int _gnutls_handshake_buffer_get_size( GNUTLS_STATE state); int _gnutls_handshake_buffer_peek( GNUTLS_STATE state, char *data, int length); int _gnutls_handshake_buffer_put( GNUTLS_STATE state, char *data, int length); int _gnutls_handshake_buffer_clear( GNUTLS_STATE state); +int _gnutls_handshake_buffer_empty( GNUTLS_STATE state); int _gnutls_handshake_buffer_get_ptr( GNUTLS_STATE state, char **data_ptr, int *length); #define _gnutls_handshake_io_buffer_clear( state) \ diff --git a/lib/gnutls_handshake.c b/lib/gnutls_handshake.c index 5a00e389ad..04d914d1d0 100644 --- a/lib/gnutls_handshake.c +++ b/lib/gnutls_handshake.c @@ -352,26 +352,28 @@ int _gnutls_read_client_hello(GNUTLS_STATE state, opaque * data, */ inline static int _gnutls_handshake_hash_pending( GNUTLS_STATE state) { -int siz; +int siz, ret; char * data; + if (state->gnutls_internals.handshake_mac_handle_sha==NULL || + state->gnutls_internals.handshake_mac_handle_md5==NULL) { + gnutls_assert(); + return GNUTLS_E_INTERNAL; + } + /* We check if there are pending data to hash. */ - siz = _gnutls_handshake_buffer_get_size(state); - if (siz < 0) { + if ((ret=_gnutls_handshake_buffer_get_ptr(state, &data, &siz)) < 0) { gnutls_assert(); - return siz; + return ret; } - if (siz > 0) { /* if there are data to hash */ - - _gnutls_handshake_buffer_get_ptr(state, &data, &siz); - + if (siz > 0) { gnutls_hash( state->gnutls_internals.handshake_mac_handle_sha, data, siz); gnutls_hash( state->gnutls_internals.handshake_mac_handle_md5, data, siz); - } - _gnutls_handshake_buffer_clear( state); + + _gnutls_handshake_buffer_empty( state); return 0; } @@ -726,11 +728,12 @@ int _gnutls_send_handshake(GNUTLS_STATE state, void *i_data, /* Here we keep the handshake messages in order to hash them... */ - if ( (ret= _gnutls_handshake_hash_add_sent( state, type, data, datasize)) < 0) { - gnutls_assert(); - gnutls_free(data); - return ret; - } + if ( type != GNUTLS_HELLO_REQUEST) + if ( (ret= _gnutls_handshake_hash_add_sent( state, type, data, datasize)) < 0) { + gnutls_assert(); + gnutls_free(data); + return ret; + } ret = _gnutls_handshake_io_send_int(state, GNUTLS_HANDSHAKE, type,