Changeset 3f661849


Ignore:
Timestamp:
2012-12-24T12:51:26Z (12 years ago)
Author:
Wilmer van der Gaast <wilmer@…>
Branches:
master
Children:
def3650
Parents:
bbc69f7
Message:

SNI client support in GnuTLS+OpenSSL modules.

Location:
lib
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • lib/ssl_gnutls.c

    rbbc69f7 r3f661849  
    273273        gnutls_set_default_priority( conn->session );
    274274        gnutls_credentials_set( conn->session, GNUTLS_CRD_CERTIFICATE, xcred );
     275        if( conn->hostname && !isdigit( conn->hostname[0] ) )
     276                gnutls_server_name_set( conn->session, GNUTLS_NAME_DNS,
     277                                        conn->hostname, strlen( conn->hostname ) );
    275278       
    276279        sock_make_nonblocking( conn->fd );
  • lib/ssl_openssl.c

    rbbc69f7 r3f661849  
    4747        gboolean established;
    4848        gboolean verify;
     49        char *hostname;
    4950       
    5051        int inpa;
     
    5455};
    5556
     57static void ssl_conn_free( struct scd *conn );
    5658static gboolean ssl_connected( gpointer data, gint source, b_input_condition cond );
    5759static gboolean ssl_starttls_real( gpointer data, gint source, b_input_condition cond );
     
    7375        if( conn->fd < 0 )
    7476        {
    75                 g_free( conn );
     77                ssl_conn_free( conn );
    7678                return NULL;
    7779        }
     
    8082        conn->data = data;
    8183        conn->inpa = -1;
     84        conn->hostname = g_strdup( host );
    8285       
    8386        return conn;
     
    9396        conn->inpa = -1;
    9497        conn->verify = verify && global.conf->cafile;
     98        conn->hostname = g_strdup( hostname );
    9599       
    96100        /* This function should be called via a (short) timeout instead of
     
    120124        const SSL_METHOD *meth;
    121125       
    122         /* Right now we don't have any verification functionality for OpenSSL. */
    123 
    124126        if( conn->verify )
    125127        {
     128                /* Right now we don't have any verification functionality for OpenSSL. */
    126129                conn->func( conn->data, 1, NULL, cond );
    127130                if( source >= 0 ) closesocket( source );
    128                 g_free( conn );
     131                ssl_conn_free( conn );
    129132
    130133                return FALSE;
     
    152155        SSL_set_fd( conn->ssl, conn->fd );
    153156       
     157        if( conn->hostname && !isdigit( conn->hostname[0] ) )
     158                SSL_set_tlsext_host_name( conn->ssl, conn->hostname );
     159       
    154160        return ssl_handshake( data, source, cond );
    155161
    156162ssl_connected_failure:
    157163        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        
     164        ssl_disconnect( conn );
    171165        return FALSE;
    172166
     
    184178                {
    185179                        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                        
     180                        ssl_disconnect( conn );
    194181                        return FALSE;
    195182                }
     
    261248}
    262249
     250static void ssl_conn_free( struct scd *conn )
     251{
     252        SSL_free( conn->ssl );
     253        SSL_CTX_free( conn->ssl_ctx );
     254        g_free( conn->hostname );
     255        g_free( conn );
     256       
     257}
     258
    263259void ssl_disconnect( void *conn_ )
    264260{
     
    273269        closesocket( conn->fd );
    274270       
    275         SSL_free( conn->ssl );
    276         SSL_CTX_free( conn->ssl_ctx );
    277         g_free( conn );
     271        ssl_conn_free( conn );
    278272}
    279273
Note: See TracChangeset for help on using the changeset viewer.