tls_server.c

Go to the documentation of this file.
00001 /*
00002  * $Id: tls_server.c 4828 2008-09-04 09:58:55Z klaus_darilion $
00003  *
00004  * Copyright (C) 2001-2003 FhG Fokus
00005  * Copyright (C) 2004,2005 Free Software Foundation, Inc.
00006  * Copyright (C) 2006 enum.at
00007  *
00008  * This file is part of Kamailio, a free SIP server.
00009  *
00010  * Kamailio is free software; you can redistribute it and/or modify
00011  * it under the terms of the GNU General Public License as published by
00012  * the Free Software Foundation; either version 2 of the License, or
00013  * (at your option) any later version
00014  *
00015  * Kamailio is distributed in the hope that it will be useful,
00016  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00017  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00018  * GNU General Public License for more details.
00019  *
00020  * You should have received a copy of the GNU General Public License 
00021  * along with this program; if not, write to the Free Software 
00022  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00023  */
00024 #include <sys/poll.h>
00025 #include <openssl/err.h>
00026 #include <openssl/ssl.h>
00027 #include <string.h>
00028 #include <errno.h>
00029 
00030 /*! 
00031  * \file
00032  * \brief Kamailio TLS support :: Server
00033  * \ingroup tls
00034  * Module: \ref tls
00035  * 
00036  * \todo Check \ref TLS_questions
00037  */
00038 
00039 
00040 #include "../dprint.h"
00041 #include "tls_server.h"
00042 #include "tls_config.h"
00043 #include "tls_init.h"
00044 #include "tls_domain.h"
00045 #include "../ip_addr.h"
00046 #include "../mem/shm_mem.h"
00047 #include "../mem/mem.h"
00048 #include "../timer.h"
00049 #include "../usr_avp.h"
00050 #include "../ut.h"
00051 
00052 /*! \page TLS_questions Kamailio TLS Support :: Open questions
00053  *
00054  * Open questions:
00055  *
00056  * - what would happen when select exits, connection is passed
00057  *   to reader to perform read, but another process would acquire
00058  *   the same connection meanwhile, performs a write and finishes
00059  *   accept/connect on behalf of the reader process, thus the
00060  *   reader process would have nothing to read ? (resolved)
00061  *
00062  * - What happens if SSL_accept or SSL_connect gets called on
00063  *   already established connection (c->S_CONN_OK) ? We could
00064  *   save some locking provided that the functions do not screw
00065  *   up the connection (in tcp_fix_read_conn we would not have
00066  *   to lock before the switch).
00067  *
00068  * - tls_blocking_write needs fixing..
00069  *
00070  * - we need to protect ctx by a lock -- it is in shared memory
00071  *   and may be accessed simultaneously
00072  */
00073 
00074 
00075 /*! \brief
00076  * Update ssl structure with new fd 
00077  */
00078 static int
00079 tls_update_fd(struct tcp_connection *c, int fd)
00080 {
00081    /*
00082    * must be run from within a lock 
00083    */
00084    SSL            *ssl;
00085 
00086    ssl = (SSL *) c->extra_data;
00087 
00088    if (!SSL_set_fd(ssl, fd)) {
00089       LM_ERR("failed to assign socket to ssl\n");
00090       return -1;
00091    }
00092 
00093    LM_DBG("New fd is %d\n", fd);
00094    return 0;
00095 }
00096 
00097 
00098 /*! \brief
00099  * dump ssl error stack 
00100  */
00101 void
00102 tls_print_errstack(void)
00103 {
00104    int             code;
00105 
00106    while ((code = ERR_get_error())) {
00107       LM_ERR("%s\n", ERR_error_string(code, 0));
00108    }
00109 }
00110 
00111 static void tls_dump_cert_info(char* s,   X509* cert)
00112 {
00113    char* subj;
00114    char* issuer;
00115 
00116    subj   = X509_NAME_oneline(X509_get_subject_name(cert), 0, 0);
00117    issuer = X509_NAME_oneline(X509_get_issuer_name(cert), 0, 0);
00118 
00119    LM_DBG("%s subject:%s\n", s ? s : "", subj);
00120    LM_DBG("%s issuer: %s\n", s ? s : "", issuer);
00121    OPENSSL_free(subj);
00122    OPENSSL_free(issuer);
00123 }
00124 
00125 
00126 static void tls_dump_verification_failure(long verification_result)
00127 {
00128    switch(verification_result) {
00129    case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT:
00130       LM_DBG("unable to get issuer certificate\n");
00131       break;
00132    case X509_V_ERR_UNABLE_TO_GET_CRL:
00133       LM_DBG("unable to get certificate CRL\n");
00134       break;
00135    case X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE:
00136       LM_DBG("unable to decrypt certificate's signature\n");
00137       break;
00138    case X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE:
00139       LM_DBG("unable to decrypt CRL's signature\n");
00140       break;
00141    case X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY:
00142       LM_DBG("unable to decode issuer public key\n");
00143       break;
00144    case X509_V_ERR_CERT_SIGNATURE_FAILURE:
00145       LM_DBG("certificate signature failure\n");
00146       break;
00147    case X509_V_ERR_CRL_SIGNATURE_FAILURE:
00148       LM_DBG("CRL signature failure\n");
00149       break;
00150    case X509_V_ERR_CERT_NOT_YET_VALID:
00151       LM_DBG("certificate is not yet valid\n");
00152       break;
00153    case X509_V_ERR_CERT_HAS_EXPIRED:
00154       LM_DBG("certificate has expired\n");
00155       break;
00156    case X509_V_ERR_CRL_NOT_YET_VALID:
00157       LM_DBG("CRL is not yet valid\n");
00158       break;
00159    case X509_V_ERR_CRL_HAS_EXPIRED:
00160       LM_DBG("CRL has expired\n");
00161       break;
00162    case X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD:
00163       LM_DBG("format error in certificate's notBefore field\n");
00164       break;
00165    case X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD:
00166       LM_DBG("format error in certificate's notAfter field\n");
00167       break;
00168    case X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD:
00169       LM_DBG("format error in CRL's lastUpdate field\n");
00170       break;
00171    case X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD:
00172       LM_DBG("format error in CRL's nextUpdate field\n");
00173       break;
00174    case X509_V_ERR_OUT_OF_MEM:
00175       LM_DBG("out of memory\n");
00176       break;
00177    case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:
00178       LM_DBG("self signed certificate\n");
00179       break;
00180    case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN:
00181       LM_DBG("self signed certificate in certificate chain\n");
00182       break;
00183    case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY:
00184       LM_DBG("unable to get local issuer certificate\n");
00185       break;
00186    case X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE:
00187       LM_DBG("unable to verify the first certificate\n");
00188       break;
00189    case X509_V_ERR_CERT_CHAIN_TOO_LONG:
00190       LM_DBG("certificate chain too long\n");
00191       break;
00192    case X509_V_ERR_CERT_REVOKED:
00193       LM_DBG("certificate revoked\n");
00194       break;
00195    case X509_V_ERR_INVALID_CA:
00196       LM_DBG("invalid CA certificate\n");
00197       break;
00198    case X509_V_ERR_PATH_LENGTH_EXCEEDED:
00199       LM_DBG("path length constraint exceeded\n");
00200       break;
00201    case X509_V_ERR_INVALID_PURPOSE:
00202       LM_DBG("unsupported certificate purpose\n");
00203       break;
00204    case X509_V_ERR_CERT_UNTRUSTED:
00205       LM_DBG("certificate not trusted\n");
00206       break;
00207    case X509_V_ERR_CERT_REJECTED:
00208       LM_DBG("certificate rejected\n");
00209       break;
00210    case X509_V_ERR_SUBJECT_ISSUER_MISMATCH:
00211       LM_DBG("subject issuer mismatch\n");
00212       break;
00213    case X509_V_ERR_AKID_SKID_MISMATCH:
00214       LM_DBG("authority and subject key identifier mismatch\n");
00215       break;
00216    case X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH:
00217       LM_DBG("authority and issuer serial number mismatch\n");
00218       break;
00219    case X509_V_ERR_KEYUSAGE_NO_CERTSIGN:
00220       LM_DBG("key usage does not include certificate signing\n");
00221       break;
00222    case X509_V_ERR_APPLICATION_VERIFICATION:
00223       LM_DBG("application verification failure\n");
00224       break;
00225    }
00226 }
00227 
00228 /*! \brief
00229  * Wrapper around SSL_accept
00230  * \return returns -1 on error, 0 on success 
00231  */
00232 static int
00233 tls_accept(struct tcp_connection *c)
00234 {
00235    int ret, err;
00236    SSL *ssl;
00237    X509* cert;
00238 
00239    if (c->state != S_CONN_ACCEPT) {
00240       LM_ERR("invalid connection state (bug in TLS code)\n");
00241       return -1;
00242    }
00243 
00244    ssl = (SSL *) c->extra_data;
00245 #ifndef OPENSSL_NO_KRB5
00246    if ( ssl->kssl_ctx==NULL )
00247       ssl->kssl_ctx = kssl_ctx_new( );
00248 #endif
00249    ret = SSL_accept(ssl);
00250 #ifndef OPENSSL_NO_KRB5
00251    if ( ssl->kssl_ctx ) {
00252       kssl_ctx_free( ssl->kssl_ctx );
00253       ssl->kssl_ctx = 0;
00254    }
00255 #endif
00256    if (ret > 0) {
00257       LM_DBG("TLS handshake successful\n");
00258       c->state = S_CONN_OK;
00259 
00260       LM_DBG("new connection from %s:%d using %s %s %d\n",
00261          ip_addr2a(&c->rcv.src_ip), c->rcv.src_port,
00262          SSL_get_cipher_version(ssl), SSL_get_cipher_name(ssl),
00263          SSL_get_cipher_bits(ssl, 0)
00264          );
00265       LM_DBG("local socket: %s:%d\n",
00266          ip_addr2a(&c->rcv.dst_ip), c->rcv.dst_port
00267          );
00268       cert = SSL_get_peer_certificate(ssl);
00269       if (cert != 0) {
00270          tls_dump_cert_info("tls_accept: client certificate", cert);
00271          if (SSL_get_verify_result(ssl) != X509_V_OK) {
00272             LM_WARN("client certificate verification failed!!!\n");
00273             tls_dump_verification_failure(SSL_get_verify_result(ssl));
00274          }
00275          X509_free(cert);
00276       } else {
00277          LM_INFO("client did not present a certificate\n");
00278       }
00279       cert = SSL_get_certificate(ssl);
00280       if (cert != 0) {
00281          tls_dump_cert_info("tls_accept: local (server) certificate", cert);
00282       } else {
00283          /* this should not happen, servers always present a cert */
00284          LM_ERR("local TLS server domain has no certificate\n");
00285       }
00286       return 0;
00287    } else {
00288       err = SSL_get_error(ssl, ret);
00289       switch (err) {
00290          case SSL_ERROR_ZERO_RETURN:
00291             LM_DBG("SSL_accept failed: SSH handshake failed cleanly\n");
00292             c->state = S_CONN_BAD;
00293             return -1;
00294       
00295          case SSL_ERROR_WANT_READ:
00296             LM_DBG("SSL_accept: SSL_ERROR_WANT_READ\n");
00297             /*
00298             * nothing to do here 
00299             */
00300             return 0;
00301       
00302          case SSL_ERROR_WANT_WRITE:
00303             LM_DBG("SSL_accept: SSL_ERROR_WANT_WRITE\n");
00304             /*
00305             * nothing to do here 
00306             */
00307             return 0;
00308       
00309          case SSL_ERROR_WANT_CONNECT:
00310             LM_ERR("SSL_accept failed: SSL_ERROR_WANT_CONNECT\n");
00311             c->state = S_CONN_BAD;
00312             return -1;
00313 
00314          case SSL_ERROR_WANT_ACCEPT:
00315             LM_ERR("SSL_accept failed: SSL_ERROR_WANT_ACCEPT\n");
00316             c->state = S_CONN_BAD;
00317             return -1;
00318 
00319          case SSL_ERROR_WANT_X509_LOOKUP:
00320             LM_ERR("SSL_accept failed: SSL_ERROR_WANT_X509_LOOKUP\n");
00321             c->state = S_CONN_BAD;
00322             return -1;
00323 
00324          case SSL_ERROR_SYSCALL:
00325             LM_ERR("SSL_accept failed: SSL_ERROR_SYSCALL\n");
00326             c->state = S_CONN_BAD;
00327             tls_print_errstack();
00328             return -1;
00329 
00330          case SSL_ERROR_SSL:
00331             LM_ERR("SSL_accept failed: SSL_ERROR_SSL\n");
00332             c->state = S_CONN_BAD;
00333             return -1;
00334 
00335          default:
00336             LM_ERR("SSL_accept failed: some error in SSL: SSL_get_error=%d\n",err);
00337             c->state = S_CONN_BAD;
00338             return -1;
00339       }
00340    }
00341 
00342    LM_ERR("bug\n");
00343    return -1;
00344 }
00345 
00346 
00347 /*! \brief
00348  * wrapper around SSL_connect
00349  * \return returns 0 on success, -1 on error 
00350  */
00351 static int
00352 tls_connect(struct tcp_connection *c)
00353 {
00354    int ret, err;
00355    SSL *ssl;
00356    X509* cert;
00357 
00358    if (c->state != S_CONN_CONNECT) {
00359       LM_ERR("invalid connection state (bug in TLS code)\n");
00360       return -1;
00361    }
00362 
00363    ssl = (SSL *) c->extra_data;
00364 
00365    ret = SSL_connect(ssl);
00366    if (ret > 0) {
00367       LM_DBG("SSL/TLS connect successuful\n");
00368       c->state = S_CONN_OK;
00369       LM_DBG("new connection to %s:%d using %s %s %d\n",
00370          ip_addr2a(&c->rcv.src_ip), c->rcv.src_port,
00371          SSL_get_cipher_version(ssl), SSL_get_cipher_name(ssl),
00372          SSL_get_cipher_bits(ssl, 0)
00373          );
00374       LM_DBG("sending socket: %s:%d \n",
00375          ip_addr2a(&c->rcv.dst_ip), c->rcv.dst_port
00376          );
00377       cert = SSL_get_peer_certificate(ssl);
00378       if (cert != 0) {
00379          tls_dump_cert_info("tls_connect: server certificate", cert);
00380          if (SSL_get_verify_result(ssl) != X509_V_OK) {
00381             LM_WARN("server certificate verification failed!!!\n");
00382             tls_dump_verification_failure(SSL_get_verify_result(ssl));
00383          }
00384          X509_free(cert);
00385       } else {
00386          /* this should not happen, servers always present a cert */
00387          LM_ERR("server did not present a certificate\n");
00388       }
00389       cert = SSL_get_certificate(ssl);
00390       if (cert != 0) {
00391          tls_dump_cert_info("tls_connect: local (client) certificate",
00392             cert);
00393       } else {
00394          LM_INFO("local TLS client domain does not have a certificate\n");
00395       }
00396       return 0;
00397    } else {
00398       err = SSL_get_error(ssl, ret);
00399       switch (err) {
00400          case SSL_ERROR_ZERO_RETURN:
00401             LM_DBG("SSL_connect failed cleanly\n");
00402             c->state = S_CONN_BAD;
00403             return -1;
00404       
00405          case SSL_ERROR_WANT_READ:
00406          case SSL_ERROR_WANT_WRITE:
00407             /*
00408             * nothing to do here 
00409             */
00410             return 0;
00411       
00412          case SSL_ERROR_SYSCALL:
00413             LM_ERR("SSL_ERROR_SYSCALL err=%s(%d)\n",
00414                strerror(errno), errno);
00415          default:
00416             LM_ERR("something wrong in SSL: %d (ret=%d) err=%s(%d)\n",
00417                err,ret,strerror(errno), errno);
00418             c->state = S_CONN_BAD;
00419             tls_print_errstack();
00420             return -1;
00421       }
00422    }
00423 
00424    LM_ERR("bug\n");
00425    return -1;
00426 }
00427 
00428 /*! \brief
00429  * wrapper around SSL_shutdown
00430  * \return returns -1 on error, 0 on success 
00431  */
00432 static int
00433 tls_shutdown(struct tcp_connection *c)
00434 {
00435    int             ret,
00436                err;
00437    SSL            *ssl;
00438 
00439    /*
00440    * we do not implement full ssl shutdown 
00441    */
00442    ssl = (SSL *) c->extra_data;
00443    if (ssl == 0) {
00444       LM_ERR("no ssl data\n");
00445       return -1;
00446    }
00447 
00448    ret = SSL_shutdown(ssl);
00449    if (ret == 1) {
00450       LM_DBG("shutdown successful\n");
00451       return 0;
00452    } else if (ret == 0) {
00453       LM_DBG("first phase of 2-way handshake completed succesfuly\n");
00454       return 0;
00455    } else {
00456       err = SSL_get_error(ssl, ret);
00457       switch (err) {
00458          case SSL_ERROR_ZERO_RETURN:
00459             c->state = S_CONN_EOF;
00460             return 0;
00461       
00462          case SSL_ERROR_WANT_READ:
00463          case SSL_ERROR_WANT_WRITE:
00464             c->state = S_CONN_EOF;
00465             return 0;
00466       
00467          default:
00468             LM_ERR("something wrong in SSL:\n");
00469             c->state = S_CONN_BAD;
00470             tls_print_errstack();
00471             return -1;
00472       }
00473    }
00474    
00475    LM_ERR("bug\n");
00476    return -1;
00477 }
00478 
00479 
00480 /*! \brief
00481  * Wrapper around SSL_write, returns number of bytes written on success, * 
00482  * -1 on error, 0 when it would block 
00483  */
00484 static int
00485 tls_write(struct tcp_connection *c, int fd, const void *buf, size_t len)
00486 {
00487    int             ret,
00488                err;
00489    /*
00490    * runs within write lock, no need to lock here 
00491    */
00492    SSL            *ssl;
00493 
00494    ssl = (SSL *) c->extra_data;
00495 
00496    ret = SSL_write(ssl, buf, len);
00497    if (ret > 0) {
00498       LM_DBG("write was successful (%d bytes)\n", ret);
00499       return ret;
00500    } else {
00501       err = SSL_get_error(ssl, ret);
00502       switch (err) {
00503       case SSL_ERROR_ZERO_RETURN:
00504          LM_DBG("connection closed cleanly\n");
00505          c->state = S_CONN_EOF;
00506          return -1;
00507    
00508       case SSL_ERROR_WANT_READ:
00509       case SSL_ERROR_WANT_WRITE:
00510          return 0;
00511    
00512       default:
00513          LM_ERR("something wrong in SSL:\n");
00514          c->state = S_CONN_BAD;
00515          tls_print_errstack();
00516          return -1;
00517       }
00518    }
00519 
00520    LM_ERR("bug\n");
00521    return -1;
00522 }
00523 
00524 
00525 /*! \brief
00526  * Wrapper around SSL_read 
00527  * \return returns number of bytes read, 0 on eof and transits into S_CONN_EOF, -1 
00528  * on error 
00529  */
00530 static int
00531 _tls_read(struct tcp_connection *c, void *buf, size_t len)
00532 {
00533    int             ret,
00534                err;
00535    SSL            *ssl;
00536 
00537    ssl = c->extra_data;
00538 
00539    ret = SSL_read(ssl, buf, len);
00540    if (ret > 0) {
00541       LM_DBG("%d bytes read\n", ret);
00542       return ret;
00543    } else {
00544       err = SSL_get_error(ssl, ret);
00545       switch (err) {
00546       case SSL_ERROR_ZERO_RETURN:
00547          LM_DBG("connection closed cleanly\n");
00548          /*
00549          * mark end of file 
00550          */
00551          c->state = S_CONN_EOF;
00552          return 0;
00553    
00554       case SSL_ERROR_WANT_READ:
00555       case SSL_ERROR_WANT_WRITE:
00556          return 0;
00557    
00558       default:
00559          LM_ERR("something wrong in SSL: %d\n",err);
00560          c->state = S_CONN_BAD;
00561          tls_print_errstack();
00562          return -1;
00563       }
00564    }
00565 
00566    LM_ERR("bug\n");
00567    return -1;
00568 }
00569 
00570 
00571 
00572 /*! \brief
00573  * Called when new tcp connection is accepted or connected, create ssl
00574  * data structures here, there is no need to acquire any lock, because the 
00575  * connection is being created by a new process and no other process has
00576  * access to it yet, this is called before adding the tcp_connection
00577  * structure into the hash 
00578  */
00579 int
00580 tls_tcpconn_init(struct tcp_connection *c, int sock)
00581 {
00582    struct tls_domain *dom;
00583 
00584    struct usr_avp *avp;
00585    int_str val;
00586    int_str avp_tlscdom_name;
00587 
00588    int_str avp_tlsservername_name;
00589    unsigned short avp_tlscdom_name_type;
00590    unsigned short avp_tlsservername_name_type;
00591 
00592    // we use integer name AVPs, configured via config file
00593    avp_tlscdom_name.n = tls_client_domain_avp;
00594    avp_tlscdom_name_type = 0;
00595    avp_tlsservername_name.n = tls_server_name_avp;
00596    avp_tlsservername_name_type = 0;
00597 
00598    /*
00599    * new connection within a single process, no lock necessary 
00600    */
00601    LM_DBG("entered: Creating a whole new ssl connection\n");
00602    
00603    /*
00604    * do everything tcpconn_new wouldn't do when TLS 
00605    */
00606    c->type = PROTO_TLS;
00607    c->rcv.proto = PROTO_TLS;
00608    c->flags = 0;
00609    c->timeout = get_ticks() + DEFAULT_TCP_CONNECTION_LIFETIME;
00610 
00611    if (c->state == S_CONN_ACCEPT) {
00612       LM_DBG("looking up socket based TLS server "
00613          "domain [%s:%d]\n", ip_addr2a(&c->rcv.dst_ip), c->rcv.dst_port);
00614       dom = tls_find_server_domain(&c->rcv.dst_ip, c->rcv.dst_port);
00615       if (dom) {
00616          LM_DBG("found socket based TLS server domain "
00617             "[%s:%d]\n", ip_addr2a(&dom->addr), dom->port);
00618             c->extra_data = SSL_new(dom->ctx);
00619       } else {
00620          LM_ERR("no TLS server domain found\n");
00621          return -1;
00622       }
00623    } else if (c->state == S_CONN_CONNECT) {
00624       avp = NULL;
00625       if (avp_tlscdom_name.n) {
00626          avp = search_first_avp(avp_tlscdom_name_type, avp_tlscdom_name,
00627             &val, 0);
00628       } else {
00629          LM_DBG("name based TLS client domains are disabled\n");
00630       }
00631       if (!avp) {
00632          LM_DBG("no TLS client domain AVP set, looking "
00633             "for socket based TLS client domain\n");
00634          dom = tls_find_client_domain(&c->rcv.src_ip, c->rcv.src_port);
00635          if (dom) {
00636             LM_DBG("found socket based TLS client domain "
00637                "[%s:%d]\n", ip_addr2a(&dom->addr), dom->port);
00638                c->extra_data = SSL_new(dom->ctx);
00639          } else {
00640             LM_ERR("no TLS client domain found\n");
00641             return -1;
00642          }
00643       } else {
00644          LM_DBG("TLS client domain AVP found = '%.*s'\n",
00645             val.s.len, ZSW(val.s.s));
00646          dom = tls_find_client_domain_name(val.s);
00647          if (dom) {
00648             LM_DBG("found name based TLS client domain "
00649                "'%.*s'\n", val.s.len, ZSW(val.s.s));
00650             c->extra_data = SSL_new(dom->ctx);
00651          } else {
00652             LM_DBG("no name based TLS client domain found, "
00653                "trying socket based TLS client domains\n");
00654             dom = tls_find_client_domain(&c->rcv.src_ip, c->rcv.src_port);
00655             if (dom) {
00656                LM_DBG("found socket based TLS client domain [%s:%d]\n",
00657                ip_addr2a(&dom->addr), dom->port);
00658                c->extra_data = SSL_new(dom->ctx);
00659             } else {
00660                LM_ERR("no TLS client domain found\n");
00661                return -1;
00662             }
00663          }
00664       }
00665    } else {
00666       LM_ERR("invalid connection state (bug in TCP code)\n");
00667       return -1;
00668    }
00669    if (!c->extra_data) {
00670       LM_ERR("failed to create SSL structure\n");
00671       return -1;
00672    }
00673 
00674 #ifndef OPENSSL_NO_KRB5
00675    if ( ((SSL *)c->extra_data)->kssl_ctx ) {
00676       kssl_ctx_free( ((SSL *)c->extra_data)->kssl_ctx );
00677       ((SSL *)c->extra_data)->kssl_ctx = 0;
00678    }
00679 #endif
00680 
00681    if (c->state == S_CONN_ACCEPT) {
00682       LM_DBG("Setting in ACCEPT mode (server)\n");
00683       SSL_set_accept_state((SSL *) c->extra_data);
00684    } else if (c->state == S_CONN_CONNECT) {
00685       LM_DBG("Setting in CONNECT mode (client)\n");
00686       SSL_set_connect_state((SSL *) c->extra_data);
00687 #ifndef OPENSSL_NO_TLSEXT
00688       avp = NULL;
00689       if (avp_tlsservername_name.n) {
00690          avp = search_first_avp(avp_tlsservername_name_type, avp_tlsservername_name,
00691             &val, 0);
00692       } else {
00693          LM_DBG("TLS server extension is not activated\n");
00694       }
00695       if (!avp) {
00696          LM_DBG("TLS server name is not set, sending "
00697             "ClientHello without server_name\n");
00698       } else {
00699          char *str;
00700          LM_DBG("set TLS server_name = '%.*s'\n",
00701             val.s.len, ZSW(val.s.s));
00702          str = (char*)pkg_malloc((val.s.len+1)*sizeof(char));
00703          if (str == NULL) {
00704             LM_ERR("cannot allocate pkg memory for TLS server name\n");
00705             return -1;
00706          }
00707          memcpy(str, val.s.s, val.s.len);
00708          *(str+val.s.len) = 0;
00709          if (!SSL_set_tlsext_host_name(c->extra_data, str)) {
00710             LM_ERR("Unable to set TLS servername extension.\n");
00711             pkg_free(str);
00712             return -1;
00713          }
00714          pkg_free(str);
00715       }
00716 #endif
00717    }
00718    return 0;
00719 }
00720 
00721 
00722 /*! \brief
00723  * clean the extra data upon connection shut down 
00724  */
00725 void
00726 tls_tcpconn_clean(struct tcp_connection *c)
00727 {
00728    /*
00729    * runs within global tcp lock 
00730    */
00731    LM_DBG("Cleanup function entered\n");
00732 
00733    if (c->extra_data) {
00734       SSL_free((SSL *) c->extra_data);
00735       c->extra_data = 0;
00736    }
00737 }
00738 
00739 
00740 /*! \brief
00741  * perform one-way shutdown, do not wait fro notify from the remote peer 
00742  */
00743 void
00744 tls_close(struct tcp_connection *c, int fd)
00745 {
00746    /*
00747    * runs within global tcp lock 
00748    */
00749    LM_DBG("closing SSL connection\n"); 
00750    tls_update_fd(c, fd);
00751    tls_shutdown(c);
00752 }
00753 
00754 
00755 
00756 /*! \brief
00757  * This is shamelessly stolen tsend_stream from tsend.c 
00758  * \todo fixme: probably does not work correctly 
00759  */
00760 size_t
00761 tls_blocking_write(struct tcp_connection *c, int fd, const char *buf,
00762          size_t len)
00763 {
00764    int             written,
00765                n;
00766    int             timeout;
00767    struct pollfd   pf;
00768    pf.fd = fd;
00769    pf.events = POLLOUT | POLLIN; /* we need both because of ssl
00770                 * library */
00771 
00772    /* LM_DBG("entered\n"); //noisy */
00773 
00774    written = 0;
00775 
00776    if (tls_update_fd(c, fd) < 0)
00777       goto error;
00778 
00779    timeout = tls_send_timeout;
00780 again:
00781    n = 0;
00782    switch (c->state) {
00783       case S_CONN_ACCEPT:
00784          if (tls_accept(c) < 0)
00785             goto error;
00786          timeout = tls_handshake_timeout * 1000;
00787          break;
00788    
00789       case S_CONN_CONNECT:
00790          if (tls_connect(c) < 0)
00791             goto error;
00792          timeout = tls_handshake_timeout * 1000;
00793          break;
00794    
00795       case S_CONN_OK:
00796          n = tls_write(c, fd, buf, len);
00797          timeout = tls_send_timeout * 1000;
00798          break;
00799    
00800       default:
00801          LM_ERR("broken connection\n");
00802          goto error;
00803    }
00804 
00805    if (n < 0) {
00806       LM_ERR("failed to send data\n");
00807       goto error;
00808    }
00809 
00810    written += n;
00811    if (n < len) {
00812       /*
00813       * partial write 
00814       */
00815       buf += n;
00816       len -= n;
00817    } else {
00818       /*
00819       * successful full write 
00820       */
00821       return written;
00822    }
00823 
00824 poll_loop:
00825    while (1) {
00826       /*
00827       * keep tls_send_timeout in seconds to be compatible with
00828       * tcp_send_timeout 
00829       */
00830       n = poll(&pf, 1, timeout);
00831       if (n < 0) {
00832          if (errno == EINTR)
00833             continue;   /* signal, ignore */
00834          else if (errno != EAGAIN && errno != EWOULDBLOCK) {
00835             LM_ERR("poll failed: %s [%d]\n",strerror(errno), errno);
00836             goto error;
00837          } else
00838             goto poll_loop;
00839       } else if (n == 0) {
00840          /*
00841          * timeout 
00842          */
00843          LM_ERR("send timeout (%d)\n", timeout);
00844          goto error;
00845       }
00846       if (pf.revents & POLLOUT || pf.revents & POLLIN) {
00847          /*
00848          * we can read or write again 
00849          */
00850          goto again;
00851       } else if (pf.revents & (POLLERR | POLLHUP | POLLNVAL)) {
00852          LM_ERR("bad poll flags %x\n",pf.revents);
00853          goto error;
00854       }
00855       /*
00856       * if POLLPRI or other non-harmful events happened, continue (
00857       * although poll should never signal them since we're not
00858       * interested in them => we should never reach this point) 
00859       */
00860 }
00861 
00862 error:
00863    return -1;
00864 }
00865 
00866 
00867 /*! \brief
00868  * called only when a connection is in S_CONN_OK, we do not have to care
00869  * about accepting or connecting here, each modification of ssl data
00870  * structures has to be protected, another process might ask for the same
00871  * connection and attempt write to it which would result in updating the
00872  * ssl structures 
00873  */
00874 size_t
00875 tls_read(struct tcp_connection * c)
00876 {
00877    /*
00878    * no lock acquired 
00879    */
00880    /*
00881    * shamelessly stolen from tcp_read 
00882    */
00883    int             bytes_free;
00884    struct tcp_req *r;
00885    int             fd,
00886                read;
00887 
00888    r = &c->req;
00889    fd = c->fd;
00890    bytes_free = TCP_BUF_SIZE - (int) (r->pos - r->buf);
00891 
00892    if (bytes_free == 0) {
00893       LM_ERR("buffer overrun, dropping\n");
00894       r->error = TCP_REQ_OVERRUN;
00895       return -1;
00896    }
00897 
00898    /*
00899    * ssl structures may be accessed from several processes, we need to
00900    * protect each access and modification by a lock 
00901    */
00902    lock_get(&c->write_lock);
00903    tls_update_fd(c, fd);
00904    read = _tls_read(c, r->pos, bytes_free);
00905    lock_release(&c->write_lock);
00906    if (read > 0)
00907       r->pos += read;
00908    return read;
00909 }
00910 
00911 
00912 /*! \brief
00913  * called before tls_read, the this function should attempt tls_accept or
00914  * tls_connect depending on the state of the connection, if this function
00915  * does not transit a connection into S_CONN_OK then tcp layer would not
00916  * call tcp_read 
00917  */
00918 int
00919 tls_fix_read_conn(struct tcp_connection *c)
00920 {
00921    /*
00922    * no lock acquired 
00923    */
00924    int             ret;
00925 
00926    ret = 0;
00927 
00928    /*
00929    * We have to acquire the lock before testing c->state, otherwise a
00930    * writer could modify the structure if it gets preempted and has
00931    * something to write 
00932    */
00933    lock_get(&c->write_lock);
00934     switch (c->state) {
00935       case S_CONN_ACCEPT:
00936          ret = tls_update_fd(c, c->fd);
00937          if (!ret) 
00938             ret = tls_accept(c);
00939          break;
00940    
00941       case S_CONN_CONNECT:
00942          ret = tls_update_fd(c, c->fd);
00943          if (!ret)
00944             ret = tls_connect(c);
00945          break;
00946    
00947       default: /* fall through */
00948          break;
00949    }
00950    lock_release(&c->write_lock);
00951 
00952    return ret;
00953 }

Generated on Thu May 24 20:00:33 2012 for Kamailio - The Open Source SIP Server by  doxygen 1.5.6