Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • lib/ssl_openssl.c

    r59c03bd rdef3650  
    22  * BitlBee -- An IRC to other IM-networks gateway                     *
    33  *                                                                    *
    4   * Copyright 2002-2004 Wilmer van der Gaast and others                *
     4  * Copyright 2002-2012 Wilmer van der Gaast and others                *
    55  \********************************************************************/
    66
     
    4747        gboolean established;
    4848        gboolean verify;
     49        char *hostname;
    4950       
    5051        int inpa;
    5152        int lasterr;            /* Necessary for SSL_get_error */
    5253        SSL *ssl;
    53         SSL_CTX *ssl_ctx;
    5454};
    5555
     56static SSL_CTX *ssl_ctx;
     57
     58static void ssl_conn_free( struct scd *conn );
    5659static gboolean ssl_connected( gpointer data, gint source, b_input_condition cond );
    5760static gboolean ssl_starttls_real( gpointer data, gint source, b_input_condition cond );
     
    6164void ssl_init( void )
    6265{
     66        const SSL_METHOD *meth;
     67       
     68        SSL_library_init();
     69       
     70        meth = TLSv1_client_method();
     71        ssl_ctx = SSL_CTX_new( meth );
     72       
    6373        initialized = TRUE;
    64         SSL_library_init();
    65         // SSLeay_add_ssl_algorithms();
    6674}
    6775
     
    7381        if( conn->fd < 0 )
    7482        {
    75                 g_free( conn );
     83                ssl_conn_free( conn );
    7684                return NULL;
    7785        }
     
    8088        conn->data = data;
    8189        conn->inpa = -1;
     90        conn->hostname = g_strdup( host );
    8291       
    8392        return conn;
     
    93102        conn->inpa = -1;
    94103        conn->verify = verify && global.conf->cafile;
     104        conn->hostname = g_strdup( hostname );
    95105       
    96106        /* This function should be called via a (short) timeout instead of
     
    118128{
    119129        struct scd *conn = data;
    120         const SSL_METHOD *meth;
    121        
    122         /* Right now we don't have any verification functionality for OpenSSL. */
    123 
     130       
    124131        if( conn->verify )
    125132        {
     133                /* Right now we don't have any verification functionality for OpenSSL. */
    126134                conn->func( conn->data, 1, NULL, cond );
    127135                if( source >= 0 ) closesocket( source );
    128                 g_free( conn );
     136                ssl_conn_free( conn );
    129137
    130138                return FALSE;
     
    139147        }
    140148       
    141         meth = TLSv1_client_method();
    142         conn->ssl_ctx = SSL_CTX_new( meth );
    143         if( conn->ssl_ctx == NULL )
     149       
     150        if( ssl_ctx == NULL )
    144151                goto ssl_connected_failure;
    145152       
    146         conn->ssl = SSL_new( conn->ssl_ctx );
     153        conn->ssl = SSL_new( ssl_ctx );
    147154        if( conn->ssl == NULL )
    148155                goto ssl_connected_failure;
     
    152159        SSL_set_fd( conn->ssl, conn->fd );
    153160       
     161        if( conn->hostname && !isdigit( conn->hostname[0] ) )
     162                SSL_set_tlsext_host_name( conn->ssl, conn->hostname );
     163       
    154164        return ssl_handshake( data, source, cond );
    155165
    156166ssl_connected_failure:
    157167        conn->func( conn->data, 0, NULL, cond );
    158        
    159         if( conn->ssl )
    160         {
    161                 SSL_shutdown( conn->ssl );
    162                 SSL_free( conn->ssl );
    163         }
    164         if( conn->ssl_ctx )
    165         {
    166                 SSL_CTX_free( conn->ssl_ctx );
    167         }
    168         if( source >= 0 ) closesocket( source );
    169         g_free( conn );
    170        
     168        ssl_disconnect( conn );
    171169        return FALSE;
    172170
     
    184182                {
    185183                        conn->func( conn->data, 0, NULL, cond );
    186                        
    187                         SSL_shutdown( conn->ssl );
    188                         SSL_free( conn->ssl );
    189                         SSL_CTX_free( conn->ssl_ctx );
    190                        
    191                         if( source >= 0 ) closesocket( source );
    192                         g_free( conn );
    193                        
     184                        ssl_disconnect( conn );
    194185                        return FALSE;
    195186                }
     
    261252}
    262253
     254static void ssl_conn_free( struct scd *conn )
     255{
     256        SSL_free( conn->ssl );
     257        g_free( conn->hostname );
     258        g_free( conn );
     259       
     260}
     261
    263262void ssl_disconnect( void *conn_ )
    264263{
     
    273272        closesocket( conn->fd );
    274273       
    275         SSL_free( conn->ssl );
    276         SSL_CTX_free( conn->ssl_ctx );
    277         g_free( conn );
     274        ssl_conn_free( conn );
    278275}
    279276
Note: See TracChangeset for help on using the changeset viewer.