00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
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
00032
00033
00034
00035
00036
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
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078 static int
00079 tls_update_fd(struct tcp_connection *c, int fd)
00080 {
00081
00082
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
00099
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
00229
00230
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
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
00299
00300 return 0;
00301
00302 case SSL_ERROR_WANT_WRITE:
00303 LM_DBG("SSL_accept: SSL_ERROR_WANT_WRITE\n");
00304
00305
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
00348
00349
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
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
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
00429
00430
00431
00432 static int
00433 tls_shutdown(struct tcp_connection *c)
00434 {
00435 int ret,
00436 err;
00437 SSL *ssl;
00438
00439
00440
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
00481
00482
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
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
00526
00527
00528
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
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
00573
00574
00575
00576
00577
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
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
00600
00601 LM_DBG("entered: Creating a whole new ssl connection\n");
00602
00603
00604
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
00723
00724
00725 void
00726 tls_tcpconn_clean(struct tcp_connection *c)
00727 {
00728
00729
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
00741
00742
00743 void
00744 tls_close(struct tcp_connection *c, int fd)
00745 {
00746
00747
00748
00749 LM_DBG("closing SSL connection\n");
00750 tls_update_fd(c, fd);
00751 tls_shutdown(c);
00752 }
00753
00754
00755
00756
00757
00758
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;
00770
00771
00772
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
00814
00815 buf += n;
00816 len -= n;
00817 } else {
00818
00819
00820
00821 return written;
00822 }
00823
00824 poll_loop:
00825 while (1) {
00826
00827
00828
00829
00830 n = poll(&pf, 1, timeout);
00831 if (n < 0) {
00832 if (errno == EINTR)
00833 continue;
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
00842
00843 LM_ERR("send timeout (%d)\n", timeout);
00844 goto error;
00845 }
00846 if (pf.revents & POLLOUT || pf.revents & POLLIN) {
00847
00848
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
00857
00858
00859
00860 }
00861
00862 error:
00863 return -1;
00864 }
00865
00866
00867
00868
00869
00870
00871
00872
00873
00874 size_t
00875 tls_read(struct tcp_connection * c)
00876 {
00877
00878
00879
00880
00881
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
00900
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
00913
00914
00915
00916
00917
00918 int
00919 tls_fix_read_conn(struct tcp_connection *c)
00920 {
00921
00922
00923
00924 int ret;
00925
00926 ret = 0;
00927
00928
00929
00930
00931
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:
00948 break;
00949 }
00950 lock_release(&c->write_lock);
00951
00952 return ret;
00953 }