From: Nikos Mavrogiannopoulos Date: Fri, 24 Mar 2000 10:32:24 +0000 (+0000) Subject: *** empty log message *** X-Git-Tag: gnutls0-0-4~104 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=4014964c688fec06f154feea27dcbe0a2be79dc1;p=thirdparty%2Fgnutls.git *** empty log message *** --- diff --git a/src/gnutls.c b/src/gnutls.c index 2e97d2dcb1..b88e234038 100644 --- a/src/gnutls.c +++ b/src/gnutls.c @@ -413,13 +413,11 @@ int gnutls_recv_int(int cd, GNUTLS_STATE state, ContentType type, int tmplen; int ret = 0; - if (sizeofdata == 0) - return 0; + if (state->gnutls_internals.valid_connection == VALID_FALSE) return GNUTLS_E_INVALID_SESSION; - while (gnutls_getDataBufferSize(state) < sizeofdata) { - + while (gnutls_getDataBufferSize(type, state) < sizeofdata) { if (read(cd, &gcipher.type, sizeof(ContentType)) != sizeof(ContentType)) { @@ -576,6 +574,10 @@ int gnutls_recv_int(int cd, GNUTLS_STATE state, ContentType type, GNUTLS_E_UNEXPECTED_PACKET_LENGTH; } break; + case GNUTLS_HANDSHAKE: + if (type == GNUTLS_HANDSHAKE) { + ret = _gnutls_recv_hello( cd, state, tmpdata, sizeofdata, NULL, 0); + } } } @@ -586,6 +588,7 @@ int gnutls_recv_int(int cd, GNUTLS_STATE state, ContentType type, } + /* Insert Application data to buffer */ if (gcipher.type == type == GNUTLS_APPLICATION_DATA) { ret = gnutls_getDataFromBuffer(state, data, sizeofdata); gnutls_free(tmpdata); @@ -597,8 +600,15 @@ int gnutls_recv_int(int cd, GNUTLS_STATE state, ContentType type, if (sizeofdata != tmplen) return GNUTLS_E_RECEIVED_MORE_DATA; memmove(data, tmpdata, sizeofdata); + gnutls_free(tmpdata); ret = sizeofdata; } return ret; } + +int _gnutls_send_change_cipher_spec( int cd, GNUTLS_STATE state) { + ChangeCipherSpecType x = GNUTLS_TYPE_CHANGE_CIPHER_SPEC; + + return gnutls_send_int( cd, state, GNUTLS_CHANGE_CIPHER_SPEC, (void*) &x, 1); +} \ No newline at end of file diff --git a/src/gnutls_buffers.c b/src/gnutls_buffers.c index 477cc491c4..59bc3faa2e 100644 --- a/src/gnutls_buffers.c +++ b/src/gnutls_buffers.c @@ -14,9 +14,9 @@ int gnutls_insertDataBuffer(GNUTLS_STATE state, char *data, int length) } -int gnutls_getDataBufferSize(GNUTLS_STATE state) { - return state->gnutls_internals.bufferSize; - return 0; +int gnutls_getDataBufferSize(ContentType type, GNUTLS_STATE state) { + if (type==GNUTLS_APPLICATION_DATA) return state->gnutls_internals.bufferSize; + return -1; } int gnutls_getDataFromBuffer(GNUTLS_STATE state, char *data, int length) diff --git a/src/gnutls_buffers.h b/src/gnutls_buffers.h index 87f3752eef..78d63581f5 100644 --- a/src/gnutls_buffers.h +++ b/src/gnutls_buffers.h @@ -1,3 +1,3 @@ int gnutls_insertDataBuffer(GNUTLS_STATE state, char *data, int length); -int gnutls_getDataBufferSize(GNUTLS_STATE state); +int gnutls_getDataBufferSize(ContentType type, GNUTLS_STATE state); int gnutls_getDataFromBuffer(GNUTLS_STATE state, char *data, int length); diff --git a/src/gnutls_handshake.c b/src/gnutls_handshake.c index 5fc8d5593b..404772d504 100644 --- a/src/gnutls_handshake.c +++ b/src/gnutls_handshake.c @@ -112,14 +112,16 @@ int _gnutls_send_handshake(int cd, GNUTLS_STATE state, void* i_data, uint32 i_da memmove( &data[pos++], &length.pint[0], 1); memmove( &data[pos++], &length.pint[1], 1); memmove( &data[pos++], &length.pint[2], 1); - memmove( &data[pos], i_data, i_datasize); + if (i_datasize > 0) memmove( &data[pos], i_data, i_datasize); ret = gnutls_send_int( cd, state, GNUTLS_HANDSHAKE, data, i_datasize); return ret; } - +int _gnutls_send_hello_request(int cd, GNUTLS_STATE state) { + return _gnutls_send_handshake( cd, state, NULL, 0, GNUTLS_HELLO_REQUEST); +} int _gnutls_send_hello(int cd, GNUTLS_STATE state, opaque* SessionID) { @@ -139,6 +141,9 @@ int _gnutls_send_hello(int cd, GNUTLS_STATE state, opaque* SessionID) { if (state->security_parameters.entity == GNUTLS_CLIENT) { + datalen = sizeof(uint32) + session_id_len + 28; + data = gnutls_malloc ( datalen); + data[pos++] = GNUTLS_VERSION_MAJOR; data[pos++] = GNUTLS_VERSION_MINOR; #ifdef WORDS_BIGENDIAN @@ -148,8 +153,6 @@ int _gnutls_send_hello(int cd, GNUTLS_STATE state, opaque* SessionID) { #endif memmove( state->security_parameters.client_random, &cur_time, 4); memmove( &state->security_parameters.client_random[4], rand, 28); - datalen = sizeof(uint32) + session_id_len + 28; - data = gnutls_malloc ( datalen); memmove( &data[pos], &cur_time, sizeof(uint32)); pos += sizeof(uint32); @@ -180,9 +183,8 @@ int _gnutls_send_hello(int cd, GNUTLS_STATE state, opaque* SessionID) { } z = _gnutls_supported_compression_methods( &compression_methods); -#ifdef WORDS_BIGENDIAN + memmove( &data[pos++], &z, sizeof(uint8)); -#endif for (i=0;isecurity_parameters.server_random, &cur_time, 4); + memmove( &state->security_parameters.server_random[4], rand, 28); + + memmove( &data[pos], &cur_time, sizeof(uint32)); + pos += sizeof(uint32); + memmove( &data[pos], rand, 28); + pos+=28; + + memmove( &data[pos++], &session_id_len, sizeof(uint8)); + if (session_id_len>0) { + memmove( &data[pos], SessionID, session_id_len); + } + pos+=session_id_len; + + datalen += 2; + data = gnutls_realloc( data, datalen); + memmove( &data[pos], &state->gnutls_internals.current_cipher_suite.CipherSuite, 2); + pos+=2; + + datalen += 1; + data = gnutls_realloc( data, datalen); + memmove( &data[pos++], &state->gnutls_internals.compression_method, 1); + + ret = _gnutls_send_handshake( cd, state, data, datalen, GNUTLS_CLIENT_HELLO); + gnutls_free(data); + gcry_free(rand); + + gnutls_free(cipher_suites); + gnutls_free(compression_methods); } return ret; @@ -306,3 +347,39 @@ int _gnutls_recv_hello(int cd, GNUTLS_STATE state, char* data, int datalen, opaq return ret; } + +gnutls_handshake(int cd, GNUTLS_STATE state) { +int ret; + + if (state->security_parameters.entity == GNUTLS_CLIENT) { + ret = _gnutls_send_hello( cd, state, NULL); + if (ret<0) { + fprintf(stderr, "handshake error(%d)\n", ret); + return ret; + } + /* receive the server handshake */ + ret = gnutls_recv_int( cd, state, GNUTLS_HANDSHAKE, NULL, 0); + if (ret<0) { + fprintf(stderr, "handshake error(%d)\n", ret); + return ret; + } + ret = _gnutls_send_change_cipher_spec( cd, state); + + } else { /* SERVER */ + + ret = gnutls_recv_int( cd, state, GNUTLS_HANDSHAKE, NULL, 0); + if (ret<0) { + fprintf(stderr, "handshake error(%d)\n", ret); + return ret; + } + ret = _gnutls_send_hello( cd, state, NULL); + if (ret<0) { + fprintf(stderr, "handshake error(%d)\n", ret); + return ret; + } + ret = _gnutls_send_change_cipher_spec( cd, state); + } + + return ret; + +} \ No newline at end of file