From: Nikos Mavrogiannopoulos Date: Sun, 3 Feb 2002 12:38:09 +0000 (+0000) Subject: Moved functions unrelated to record layer to gnutls_state.c X-Git-Tag: gnutls_0_3_90~125 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a31ab45c265f12812e2c834dfba060e71228f160;p=thirdparty%2Fgnutls.git Moved functions unrelated to record layer to gnutls_state.c --- diff --git a/lib/gnutls_record.c b/lib/gnutls_record.c index e018be37ba..f5328dbc48 100644 --- a/lib/gnutls_record.c +++ b/lib/gnutls_record.c @@ -98,162 +98,6 @@ GNUTLS_TRANSPORT_PTR gnutls_transport_get_ptr(GNUTLS_STATE state) { return state->gnutls_internals.transport_ptr; } -#define _gnutls_free(x) if(x!=NULL) gnutls_free(x) -/** - * gnutls_init - This function initializes the state to null (null encryption etc...). - * @con_end: is used to indicate if this state is to be used for server or - * client. Can be one of GNUTLS_CLIENT and GNUTLS_SERVER. - * @state: is a pointer to a &GNUTLS_STATE structure. - * - * This function initializes the current state to null. Every state - * must be initialized before use, so internal structures can be allocated. - * This function allocates structures which can only be free'd - * by calling gnutls_deinit(). Returns zero on success. - **/ -int gnutls_init(GNUTLS_STATE * state, GNUTLS_ConnectionEnd con_end) -{ -int default_protocol_list[] = { GNUTLS_TLS1, 0 }; - - *state = gnutls_calloc(1, sizeof(struct GNUTLS_STATE_INT)); - if (*state==NULL) return GNUTLS_E_MEMORY_ERROR; - - (*state)->security_parameters.entity = con_end; - - /* the default certificate type for TLS */ - (*state)->security_parameters.cert_type = GNUTLS_CRT_X509; - -/* Set the defaults for initial handshake */ - (*state)->security_parameters.read_bulk_cipher_algorithm = - (*state)->security_parameters.write_bulk_cipher_algorithm = GNUTLS_CIPHER_NULL; - - (*state)->security_parameters.read_mac_algorithm = - (*state)->security_parameters.write_mac_algorithm = GNUTLS_MAC_NULL; - - (*state)->security_parameters.read_compression_algorithm = GNUTLS_COMP_NULL; - (*state)->security_parameters.write_compression_algorithm = GNUTLS_COMP_NULL; - - (*state)->gnutls_internals.resumable = RESUME_TRUE; - - gnutls_protocol_set_priority( *state, default_protocol_list); /* default */ - - (*state)->gnutls_key = gnutls_calloc(1, sizeof(struct GNUTLS_KEY_INT)); - if ( (*state)->gnutls_key == NULL) { - gnutls_free( *state); - return GNUTLS_E_MEMORY_ERROR; - } - - (*state)->gnutls_internals.resumed = RESUME_FALSE; - - (*state)->gnutls_internals.expire_time = DEFAULT_EXPIRE_TIME; /* one hour default */ - - gnutls_dh_set_bits( (*state), MIN_BITS); - - gnutls_transport_set_lowat((*state), DEFAULT_LOWAT); /* the default for tcp */ - - gnutls_handshake_set_max_packet_length( (*state), MAX_HANDSHAKE_PACKET_SIZE); - - /* Allocate a minimum size for recv_data - * This is allocated in order to avoid small messages, makeing - * the receive procedure slow. - */ - (*state)->gnutls_internals.record_recv_buffer.data = gnutls_malloc(INITIAL_RECV_BUFFER_SIZE); - - /* set the default maximum record size for TLS - */ - (*state)->security_parameters.max_record_size = DEFAULT_MAX_RECORD_SIZE; - (*state)->gnutls_internals.proposed_record_size = DEFAULT_MAX_RECORD_SIZE; - - /* by default no selected certificate */ - (*state)->gnutls_internals.selected_cert_index = -1; - - /* everything else not initialized here is initialized - * as NULL or 0. This is why calloc is used. - */ - - return 0; -} - -/** - * gnutls_deinit - This function clears all buffers associated with the &state - * @state: is a &GNUTLS_STATE structure. - * - * This function clears all buffers associated with the &state. - **/ -void gnutls_deinit(GNUTLS_STATE state) -{ - /* if the session has failed abnormally it has to be removed from the db */ - if ( state->gnutls_internals.resumable==RESUME_FALSE) { - _gnutls_db_remove_session( state, state->security_parameters.session_id, state->security_parameters.session_id_size); - } - - /* remove auth info firstly */ - _gnutls_free_auth_info(state ); - -#ifdef HAVE_LIBGDBM - /* close the database - resuming sessions */ - if ( state->gnutls_internals.db_reader != NULL) - gdbm_close(state->gnutls_internals.db_reader); -#endif - - _gnutls_handshake_io_buffer_clear( state); - - gnutls_sfree_datum(&state->connection_state.read_mac_secret); - gnutls_sfree_datum(&state->connection_state.write_mac_secret); - - _gnutls_free(state->gnutls_internals.application_data_buffer.data); - _gnutls_free(state->gnutls_internals.handshake_data_buffer.data); - _gnutls_free(state->gnutls_internals.handshake_hash_buffer.data); - _gnutls_free(state->gnutls_internals.record_recv_buffer.data); - _gnutls_free(state->gnutls_internals.record_send_buffer.data); - - gnutls_clear_creds( state); - - if (state->connection_state.read_cipher_state != NULL) - gnutls_cipher_deinit(state->connection_state.read_cipher_state); - if (state->connection_state.write_cipher_state != NULL) - gnutls_cipher_deinit(state->connection_state.write_cipher_state); - - gnutls_sfree_datum( &state->cipher_specs.server_write_mac_secret); - gnutls_sfree_datum( &state->cipher_specs.client_write_mac_secret); - gnutls_sfree_datum( &state->cipher_specs.server_write_IV); - gnutls_sfree_datum( &state->cipher_specs.client_write_IV); - gnutls_sfree_datum( &state->cipher_specs.server_write_key); - gnutls_sfree_datum( &state->cipher_specs.client_write_key); - - if (state->gnutls_key != NULL) { - _gnutls_mpi_release(&state->gnutls_key->KEY); - _gnutls_mpi_release(&state->gnutls_key->client_Y); - _gnutls_mpi_release(&state->gnutls_key->client_p); - _gnutls_mpi_release(&state->gnutls_key->client_g); - - _gnutls_mpi_release(&state->gnutls_key->u); - _gnutls_mpi_release(&state->gnutls_key->a); - _gnutls_mpi_release(&state->gnutls_key->x); - _gnutls_mpi_release(&state->gnutls_key->A); - _gnutls_mpi_release(&state->gnutls_key->B); - _gnutls_mpi_release(&state->gnutls_key->b); - - _gnutls_mpi_release(&state->gnutls_key->dh_secret); - _gnutls_free(state->gnutls_key); - - state->gnutls_key = NULL; - } - - /* free priorities */ - _gnutls_free(state->gnutls_internals.MACAlgorithmPriority.algorithm_priority); - _gnutls_free(state->gnutls_internals.ProtocolPriority.algorithm_priority); - _gnutls_free(state->gnutls_internals.KXAlgorithmPriority.algorithm_priority); - _gnutls_free(state->gnutls_internals.BulkCipherAlgorithmPriority.algorithm_priority); - _gnutls_free(state->gnutls_internals.CompressionMethodPriority.algorithm_priority); - - _gnutls_free(state->gnutls_internals.db_name); - - memset( state, 0, sizeof(struct GNUTLS_STATE_INT)); - gnutls_free(state); - - return; -} - inline static void _gnutls_cal_PRF_A( MACAlgorithm algorithm, void *secret, int secret_size, void *seed, int seed_size, void* result) { diff --git a/lib/gnutls_record.h b/lib/gnutls_record.h index a9bf8ea64d..ea0872cdfb 100644 --- a/lib/gnutls_record.h +++ b/lib/gnutls_record.h @@ -1,3 +1,4 @@ ssize_t gnutls_send_int( GNUTLS_STATE state, ContentType type, HandshakeType htype, const void* data, size_t sizeofdata); ssize_t gnutls_recv_int( GNUTLS_STATE state, ContentType type, HandshakeType, char* data, size_t sizeofdata); ssize_t _gnutls_send_change_cipher_spec( GNUTLS_STATE state, int again); +void gnutls_transport_set_lowat(GNUTLS_STATE state, int num); diff --git a/lib/gnutls_state.c b/lib/gnutls_state.c index 8e21420813..e59b1cc303 100644 --- a/lib/gnutls_state.c +++ b/lib/gnutls_state.c @@ -21,6 +21,15 @@ #include #include #include +#include +#include +#include "gnutls_datum.h" +#include "gnutls_db.h" +#include +#include +#include +#include +#include #define CHECK_AUTH(auth, ret) if (gnutls_auth_get_type(state) != auth) { \ gnutls_assert(); \ @@ -82,3 +91,168 @@ GNUTLS_MACAlgorithm gnutls_mac_get( GNUTLS_STATE state) { GNUTLS_CompressionMethod gnutls_compression_get( GNUTLS_STATE state) { return state->security_parameters.read_compression_algorithm; } + +int _gnutls_state_cert_type_supported( GNUTLS_STATE state, CertificateType cert_type) { +int i; + + if (state->gnutls_internals.cert_type_priority.algorithms==0 && cert_type == + DEFAULT_CERT_TYPE) return 0; + + for (i=0;ignutls_internals.cert_type_priority.algorithms;i++) { + if (state->gnutls_internals.cert_type_priority.algorithm_priority[i] + == cert_type) { + return 0; /* ok */ + } + } + + return GNUTLS_E_UNSUPPORTED_CERTIFICATE_TYPE; +} + +#define _gnutls_free(x) if(x!=NULL) gnutls_free(x) +/** + * gnutls_init - This function initializes the state to null (null encryption etc...). + * @con_end: is used to indicate if this state is to be used for server or + * client. Can be one of GNUTLS_CLIENT and GNUTLS_SERVER. + * @state: is a pointer to a &GNUTLS_STATE structure. + * + * This function initializes the current state to null. Every state + * must be initialized before use, so internal structures can be allocated. + * This function allocates structures which can only be free'd + * by calling gnutls_deinit(). Returns zero on success. + **/ +int gnutls_init(GNUTLS_STATE * state, GNUTLS_ConnectionEnd con_end) +{ +int default_protocol_list[] = { GNUTLS_TLS1, 0 }; + + *state = gnutls_calloc(1, sizeof(struct GNUTLS_STATE_INT)); + if (*state==NULL) return GNUTLS_E_MEMORY_ERROR; + + (*state)->security_parameters.entity = con_end; + + /* the default certificate type for TLS */ + (*state)->security_parameters.cert_type = DEFAULT_CERT_TYPE; + +/* Set the defaults for initial handshake */ + (*state)->security_parameters.read_bulk_cipher_algorithm = + (*state)->security_parameters.write_bulk_cipher_algorithm = GNUTLS_CIPHER_NULL; + + (*state)->security_parameters.read_mac_algorithm = + (*state)->security_parameters.write_mac_algorithm = GNUTLS_MAC_NULL; + + (*state)->security_parameters.read_compression_algorithm = GNUTLS_COMP_NULL; + (*state)->security_parameters.write_compression_algorithm = GNUTLS_COMP_NULL; + + (*state)->gnutls_internals.resumable = RESUME_TRUE; + + gnutls_protocol_set_priority( *state, default_protocol_list); /* default */ + + (*state)->gnutls_key = gnutls_calloc(1, sizeof(struct GNUTLS_KEY_INT)); + if ( (*state)->gnutls_key == NULL) { + gnutls_free( *state); + return GNUTLS_E_MEMORY_ERROR; + } + + (*state)->gnutls_internals.resumed = RESUME_FALSE; + + (*state)->gnutls_internals.expire_time = DEFAULT_EXPIRE_TIME; /* one hour default */ + + gnutls_dh_set_bits( (*state), MIN_BITS); + + gnutls_transport_set_lowat((*state), DEFAULT_LOWAT); /* the default for tcp */ + + gnutls_handshake_set_max_packet_length( (*state), MAX_HANDSHAKE_PACKET_SIZE); + + /* Allocate a minimum size for recv_data + * This is allocated in order to avoid small messages, makeing + * the receive procedure slow. + */ + (*state)->gnutls_internals.record_recv_buffer.data = gnutls_malloc(INITIAL_RECV_BUFFER_SIZE); + + /* set the default maximum record size for TLS + */ + (*state)->security_parameters.max_record_size = DEFAULT_MAX_RECORD_SIZE; + (*state)->gnutls_internals.proposed_record_size = DEFAULT_MAX_RECORD_SIZE; + + /* by default no selected certificate */ + (*state)->gnutls_internals.selected_cert_index = -1; + + /* everything else not initialized here is initialized + * as NULL or 0. This is why calloc is used. + */ + + return 0; +} + +/** + * gnutls_deinit - This function clears all buffers associated with the &state + * @state: is a &GNUTLS_STATE structure. + * + * This function clears all buffers associated with the &state. + **/ +void gnutls_deinit(GNUTLS_STATE state) +{ + /* if the session has failed abnormally it has to be removed from the db */ + if ( state->gnutls_internals.resumable==RESUME_FALSE) { + _gnutls_db_remove_session( state, state->security_parameters.session_id, state->security_parameters.session_id_size); + } + + /* remove auth info firstly */ + _gnutls_free_auth_info(state ); + +#ifdef HAVE_LIBGDBM + /* close the database - resuming sessions */ + if ( state->gnutls_internals.db_reader != NULL) + gdbm_close(state->gnutls_internals.db_reader); +#endif + + _gnutls_handshake_io_buffer_clear( state); + + gnutls_sfree_datum(&state->connection_state.read_mac_secret); + gnutls_sfree_datum(&state->connection_state.write_mac_secret); + + _gnutls_free(state->gnutls_internals.application_data_buffer.data); + _gnutls_free(state->gnutls_internals.handshake_data_buffer.data); + _gnutls_free(state->gnutls_internals.handshake_hash_buffer.data); + _gnutls_free(state->gnutls_internals.record_recv_buffer.data); + _gnutls_free(state->gnutls_internals.record_send_buffer.data); + + gnutls_clear_creds( state); + + if (state->connection_state.read_cipher_state != NULL) + gnutls_cipher_deinit(state->connection_state.read_cipher_state); + if (state->connection_state.write_cipher_state != NULL) + gnutls_cipher_deinit(state->connection_state.write_cipher_state); + + gnutls_sfree_datum( &state->cipher_specs.server_write_mac_secret); + gnutls_sfree_datum( &state->cipher_specs.client_write_mac_secret); + gnutls_sfree_datum( &state->cipher_specs.server_write_IV); + gnutls_sfree_datum( &state->cipher_specs.client_write_IV); + gnutls_sfree_datum( &state->cipher_specs.server_write_key); + gnutls_sfree_datum( &state->cipher_specs.client_write_key); + + if (state->gnutls_key != NULL) { + _gnutls_mpi_release(&state->gnutls_key->KEY); + _gnutls_mpi_release(&state->gnutls_key->client_Y); + _gnutls_mpi_release(&state->gnutls_key->client_p); + _gnutls_mpi_release(&state->gnutls_key->client_g); + + _gnutls_mpi_release(&state->gnutls_key->u); + _gnutls_mpi_release(&state->gnutls_key->a); + _gnutls_mpi_release(&state->gnutls_key->x); + _gnutls_mpi_release(&state->gnutls_key->A); + _gnutls_mpi_release(&state->gnutls_key->B); + _gnutls_mpi_release(&state->gnutls_key->b); + + _gnutls_mpi_release(&state->gnutls_key->dh_secret); + _gnutls_free(state->gnutls_key); + + state->gnutls_key = NULL; + } + + _gnutls_free(state->gnutls_internals.db_name); + + memset( state, 0, sizeof(struct GNUTLS_STATE_INT)); + gnutls_free(state); + + return; +} diff --git a/lib/gnutls_state.h b/lib/gnutls_state.h index 2e03f2504d..e112c8bd35 100644 --- a/lib/gnutls_state.h +++ b/lib/gnutls_state.h @@ -13,3 +13,7 @@ CertificateType gnutls_cert_type_get( GNUTLS_STATE state); } #endif + +int _gnutls_state_cert_type_supported( GNUTLS_STATE, CertificateType); + +#define DEFAULT_CERT_TYPE GNUTLS_CRT_X509