]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
corrected and optimized handshake.
authorNikos Mavrogiannopoulos <nmav@gnutls.org>
Mon, 28 Jan 2002 10:38:36 +0000 (10:38 +0000)
committerNikos Mavrogiannopoulos <nmav@gnutls.org>
Mon, 28 Jan 2002 10:38:36 +0000 (10:38 +0000)
lib/gnutls_buffers.c
lib/gnutls_buffers.h
lib/gnutls_handshake.c

index 5ff7b8406c04caa686c99aaa145ba0c36fccb6c2..66ee056f497034cb6ec7281459f6ff4e1b35807f 100644 (file)
@@ -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)
index 3b92ffc95b655dbc1e2c1e8c199e9cb51483caab..604535fd392ee1600a752781f753b80d17d8b192 100644 (file)
@@ -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) \
index 5a00e389ad952cde4f58705a98583419ff5fab11..04d914d1d0b35f32cdb30ca2589704df134aa112 100644 (file)
@@ -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,