aboutsummaryrefslogtreecommitdiffstats
path: root/lib/ssl_gnutls.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ssl_gnutls.c')
-rw-r--r--lib/ssl_gnutls.c36
1 files changed, 20 insertions, 16 deletions
diff --git a/lib/ssl_gnutls.c b/lib/ssl_gnutls.c
index f5e0ad47..f6cce914 100644
--- a/lib/ssl_gnutls.c
+++ b/lib/ssl_gnutls.c
@@ -1,7 +1,7 @@
/********************************************************************\
* BitlBee -- An IRC to other IM-networks gateway *
* *
- * Copyright 2002-2004 Wilmer van der Gaast and others *
+ * Copyright 2002-2011 Wilmer van der Gaast and others *
\********************************************************************/
/* SSL module - GnuTLS version */
@@ -37,6 +37,7 @@
int ssl_errno = 0;
static gboolean initialized = FALSE;
+gnutls_certificate_credentials xcred;
#include <limits.h>
@@ -59,13 +60,13 @@ struct scd
gboolean verify;
gnutls_session session;
- gnutls_certificate_credentials xcred;
};
static gboolean ssl_connected( gpointer data, gint source, b_input_condition cond );
static gboolean ssl_starttls_real( gpointer data, gint source, b_input_condition cond );
static gboolean ssl_handshake( gpointer data, gint source, b_input_condition cond );
+static void ssl_deinit( void );
void ssl_init( void )
{
@@ -73,8 +74,22 @@ void ssl_init( void )
return;
gnutls_global_init();
+ gnutls_certificate_allocate_credentials( &xcred );
+ if( global.conf->cafile )
+ {
+ gnutls_certificate_set_x509_trust_file( xcred, global.conf->cafile, GNUTLS_X509_FMT_PEM );
+ /* TODO: Do we want/need this? */
+ gnutls_certificate_set_verify_flags( xcred, GNUTLS_VERIFY_ALLOW_X509_V1_CA_CRT );
+ }
initialized = TRUE;
- atexit( gnutls_global_deinit );
+
+ atexit( ssl_deinit );
+}
+
+static void ssl_deinit( void )
+{
+ gnutls_global_deinit();
+ gnutls_certificate_free_credentials( xcred );
}
void *ssl_connect( char *host, int port, gboolean verify, ssl_input_function func, gpointer data )
@@ -144,7 +159,7 @@ static int verify_certificate_callback( gnutls_session_t session )
gnutls_x509_crt_t cert;
const char *hostname;
- hostname = gnutls_session_get_ptr(session );
+ hostname = gnutls_session_get_ptr( session );
gnutlsret = gnutls_certificate_verify_peers2( session, &status );
if( gnutlsret < 0 )
@@ -244,13 +259,6 @@ static gboolean ssl_connected( gpointer data, gint source, b_input_condition con
ssl_init();
- gnutls_certificate_allocate_credentials( &conn->xcred );
- if( conn->verify && global.conf->cafile )
- {
- gnutls_certificate_set_x509_trust_file( conn->xcred, global.conf->cafile, GNUTLS_X509_FMT_PEM );
- gnutls_certificate_set_verify_flags( conn->xcred, GNUTLS_VERIFY_ALLOW_X509_V1_CA_CRT );
- }
-
gnutls_init( &conn->session, GNUTLS_CLIENT );
if( conn->verify )
gnutls_session_set_ptr( conn->session, (void *) conn->hostname );
@@ -258,7 +266,7 @@ static gboolean ssl_connected( gpointer data, gint source, b_input_condition con
gnutls_transport_set_lowat( conn->session, 0 );
#endif
gnutls_set_default_priority( conn->session );
- gnutls_credentials_set( conn->session, GNUTLS_CRD_CERTIFICATE, conn->xcred );
+ gnutls_credentials_set( conn->session, GNUTLS_CRD_CERTIFICATE, xcred );
sock_make_nonblocking( conn->fd );
gnutls_transport_set_ptr( conn->session, (gnutls_transport_ptr) GNUTLS_STUPID_CAST conn->fd );
@@ -283,7 +291,6 @@ static gboolean ssl_handshake( gpointer data, gint source, b_input_condition con
conn->func( conn->data, 0, NULL, cond );
gnutls_deinit( conn->session );
- gnutls_certificate_free_credentials( conn->xcred );
closesocket( conn->fd );
g_free( conn );
@@ -296,7 +303,6 @@ static gboolean ssl_handshake( gpointer data, gint source, b_input_condition con
conn->func( conn->data, stver, NULL, cond );
gnutls_deinit( conn->session );
- gnutls_certificate_free_credentials( conn->xcred );
closesocket( conn->fd );
g_free( conn );
@@ -384,8 +390,6 @@ void ssl_disconnect( void *conn_ )
if( conn->session )
gnutls_deinit( conn->session );
- if( conn->xcred )
- gnutls_certificate_free_credentials( conn->xcred );
g_free( conn );
}