1 /* 2 * libjingle 3 * Copyright 2004--2008, Google Inc. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright notice, 9 * this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright notice, 11 * this list of conditions and the following disclaimer in the documentation 12 * and/or other materials provided with the distribution. 13 * 3. The name of the author may not be used to endorse or promote products 14 * derived from this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 */ 27 28 #if HAVE_CONFIG_H 29 #include "config.h" 30 #endif // HAVE_CONFIG_H 31 32 #if HAVE_OPENSSL_SSL_H 33 34 #include "talk/base/opensslstreamadapter.h" 35 36 #include <openssl/bio.h> 37 #include <openssl/crypto.h> 38 #include <openssl/err.h> 39 #include <openssl/rand.h> 40 #include <openssl/ssl.h> 41 #include <openssl/x509v3.h> 42 43 #include <vector> 44 45 #include "talk/base/common.h" 46 #include "talk/base/logging.h" 47 #include "talk/base/stream.h" 48 #include "talk/base/openssladapter.h" 49 #include "talk/base/openssldigest.h" 50 #include "talk/base/opensslidentity.h" 51 #include "talk/base/stringutils.h" 52 #include "talk/base/thread.h" 53 54 namespace talk_base { 55 56 #if (OPENSSL_VERSION_NUMBER >= 0x10001000L) 57 #define HAVE_DTLS_SRTP 58 #endif 59 60 #if (OPENSSL_VERSION_NUMBER >= 0x10000000L) 61 #define HAVE_DTLS 62 #endif 63 64 #ifdef HAVE_DTLS_SRTP 65 // SRTP cipher suite table 66 struct SrtpCipherMapEntry { 67 const char* external_name; 68 const char* internal_name; 69 }; 70 71 // This isn't elegant, but it's better than an external reference 72 static SrtpCipherMapEntry SrtpCipherMap[] = { 73 {"AES_CM_128_HMAC_SHA1_80", "SRTP_AES128_CM_SHA1_80"}, 74 {"AES_CM_128_HMAC_SHA1_32", "SRTP_AES128_CM_SHA1_32"}, 75 {NULL, NULL} 76 }; 77 #endif 78 79 ////////////////////////////////////////////////////////////////////// 80 // StreamBIO 81 ////////////////////////////////////////////////////////////////////// 82 83 static int stream_write(BIO* h, const char* buf, int num); 84 static int stream_read(BIO* h, char* buf, int size); 85 static int stream_puts(BIO* h, const char* str); 86 static long stream_ctrl(BIO* h, int cmd, long arg1, void* arg2); 87 static int stream_new(BIO* h); 88 static int stream_free(BIO* data); 89 90 static BIO_METHOD methods_stream = { 91 BIO_TYPE_BIO, 92 "stream", 93 stream_write, 94 stream_read, 95 stream_puts, 96 0, 97 stream_ctrl, 98 stream_new, 99 stream_free, 100 NULL, 101 }; 102 103 static BIO_METHOD* BIO_s_stream() { return(&methods_stream); } 104 105 static BIO* BIO_new_stream(StreamInterface* stream) { 106 BIO* ret = BIO_new(BIO_s_stream()); 107 if (ret == NULL) 108 return NULL; 109 ret->ptr = stream; 110 return ret; 111 } 112 113 // bio methods return 1 (or at least non-zero) on success and 0 on failure. 114 115 static int stream_new(BIO* b) { 116 b->shutdown = 0; 117 b->init = 1; 118 b->num = 0; // 1 means end-of-stream 119 b->ptr = 0; 120 return 1; 121 } 122 123 static int stream_free(BIO* b) { 124 if (b == NULL) 125 return 0; 126 return 1; 127 } 128 129 static int stream_read(BIO* b, char* out, int outl) { 130 if (!out) 131 return -1; 132 StreamInterface* stream = static_cast<StreamInterface*>(b->ptr); 133 BIO_clear_retry_flags(b); 134 size_t read; 135 int error; 136 StreamResult result = stream->Read(out, outl, &read, &error); 137 if (result == SR_SUCCESS) { 138 return read; 139 } else if (result == SR_EOS) { 140 b->num = 1; 141 } else if (result == SR_BLOCK) { 142 BIO_set_retry_read(b); 143 } 144 return -1; 145 } 146 147 static int stream_write(BIO* b, const char* in, int inl) { 148 if (!in) 149 return -1; 150 StreamInterface* stream = static_cast<StreamInterface*>(b->ptr); 151 BIO_clear_retry_flags(b); 152 size_t written; 153 int error; 154 StreamResult result = stream->Write(in, inl, &written, &error); 155 if (result == SR_SUCCESS) { 156 return written; 157 } else if (result == SR_BLOCK) { 158 BIO_set_retry_write(b); 159 } 160 return -1; 161 } 162 163 static int stream_puts(BIO* b, const char* str) { 164 return stream_write(b, str, strlen(str)); 165 } 166 167 static long stream_ctrl(BIO* b, int cmd, long num, void* ptr) { 168 UNUSED(num); 169 UNUSED(ptr); 170 171 switch (cmd) { 172 case BIO_CTRL_RESET: 173 return 0; 174 case BIO_CTRL_EOF: 175 return b->num; 176 case BIO_CTRL_WPENDING: 177 case BIO_CTRL_PENDING: 178 return 0; 179 case BIO_CTRL_FLUSH: 180 return 1; 181 default: 182 return 0; 183 } 184 } 185 186 ///////////////////////////////////////////////////////////////////////////// 187 // OpenSSLStreamAdapter 188 ///////////////////////////////////////////////////////////////////////////// 189 190 OpenSSLStreamAdapter::OpenSSLStreamAdapter(StreamInterface* stream) 191 : SSLStreamAdapter(stream), 192 state_(SSL_NONE), 193 role_(SSL_CLIENT), 194 ssl_read_needs_write_(false), ssl_write_needs_read_(false), 195 ssl_(NULL), ssl_ctx_(NULL), 196 custom_verification_succeeded_(false), 197 ssl_mode_(SSL_MODE_TLS) { 198 } 199 200 OpenSSLStreamAdapter::~OpenSSLStreamAdapter() { 201 Cleanup(); 202 } 203 204 void OpenSSLStreamAdapter::SetIdentity(SSLIdentity* identity) { 205 ASSERT(!identity_); 206 identity_.reset(static_cast<OpenSSLIdentity*>(identity)); 207 } 208 209 void OpenSSLStreamAdapter::SetServerRole(SSLRole role) { 210 role_ = role; 211 } 212 213 void OpenSSLStreamAdapter::SetPeerCertificate(SSLCertificate* cert) { 214 ASSERT(!peer_certificate_); 215 ASSERT(peer_certificate_digest_algorithm_.empty()); 216 ASSERT(ssl_server_name_.empty()); 217 peer_certificate_.reset(static_cast<OpenSSLCertificate*>(cert)); 218 } 219 220 bool OpenSSLStreamAdapter::GetPeerCertificate(SSLCertificate** cert) const { 221 if (!peer_certificate_) 222 return false; 223 224 *cert = peer_certificate_->GetReference(); 225 return true; 226 } 227 228 bool OpenSSLStreamAdapter::SetPeerCertificateDigest(const std::string 229 &digest_alg, 230 const unsigned char* 231 digest_val, 232 size_t digest_len) { 233 ASSERT(!peer_certificate_); 234 ASSERT(peer_certificate_digest_algorithm_.size() == 0); 235 ASSERT(ssl_server_name_.empty()); 236 size_t expected_len; 237 238 if (!OpenSSLDigest::GetDigestSize(digest_alg, &expected_len)) { 239 LOG(LS_WARNING) << "Unknown digest algorithm: " << digest_alg; 240 return false; 241 } 242 if (expected_len != digest_len) 243 return false; 244 245 peer_certificate_digest_value_.SetData(digest_val, digest_len); 246 peer_certificate_digest_algorithm_ = digest_alg; 247 248 return true; 249 } 250 251 // Key Extractor interface 252 bool OpenSSLStreamAdapter::ExportKeyingMaterial(const std::string& label, 253 const uint8* context, 254 size_t context_len, 255 bool use_context, 256 uint8* result, 257 size_t result_len) { 258 #ifdef HAVE_DTLS_SRTP 259 int i; 260 261 i = SSL_export_keying_material(ssl_, result, result_len, 262 label.c_str(), label.length(), 263 const_cast<uint8 *>(context), 264 context_len, use_context); 265 266 if (i != 1) 267 return false; 268 269 return true; 270 #else 271 return false; 272 #endif 273 } 274 275 bool OpenSSLStreamAdapter::SetDtlsSrtpCiphers( 276 const std::vector<std::string>& ciphers) { 277 std::string internal_ciphers; 278 279 if (state_ != SSL_NONE) 280 return false; 281 282 #ifdef HAVE_DTLS_SRTP 283 for (std::vector<std::string>::const_iterator cipher = ciphers.begin(); 284 cipher != ciphers.end(); ++cipher) { 285 bool found = false; 286 for (SrtpCipherMapEntry *entry = SrtpCipherMap; entry->internal_name; 287 ++entry) { 288 if (*cipher == entry->external_name) { 289 found = true; 290 if (!internal_ciphers.empty()) 291 internal_ciphers += ":"; 292 internal_ciphers += entry->internal_name; 293 break; 294 } 295 } 296 297 if (!found) { 298 LOG(LS_ERROR) << "Could not find cipher: " << *cipher; 299 return false; 300 } 301 } 302 303 if (internal_ciphers.empty()) 304 return false; 305 306 srtp_ciphers_ = internal_ciphers; 307 return true; 308 #else 309 return false; 310 #endif 311 } 312 313 bool OpenSSLStreamAdapter::GetDtlsSrtpCipher(std::string* cipher) { 314 #ifdef HAVE_DTLS_SRTP 315 ASSERT(state_ == SSL_CONNECTED); 316 if (state_ != SSL_CONNECTED) 317 return false; 318 319 SRTP_PROTECTION_PROFILE *srtp_profile = 320 SSL_get_selected_srtp_profile(ssl_); 321 322 if (!srtp_profile) 323 return false; 324 325 for (SrtpCipherMapEntry *entry = SrtpCipherMap; 326 entry->internal_name; ++entry) { 327 if (!strcmp(entry->internal_name, srtp_profile->name)) { 328 *cipher = entry->external_name; 329 return true; 330 } 331 } 332 333 ASSERT(false); // This should never happen 334 335 return false; 336 #else 337 return false; 338 #endif 339 } 340 341 int OpenSSLStreamAdapter::StartSSLWithServer(const char* server_name) { 342 ASSERT(server_name != NULL && server_name[0] != '\0'); 343 ssl_server_name_ = server_name; 344 return StartSSL(); 345 } 346 347 int OpenSSLStreamAdapter::StartSSLWithPeer() { 348 ASSERT(ssl_server_name_.empty()); 349 // It is permitted to specify peer_certificate_ only later. 350 return StartSSL(); 351 } 352 353 void OpenSSLStreamAdapter::SetMode(SSLMode mode) { 354 ASSERT(state_ == SSL_NONE); 355 ssl_mode_ = mode; 356 } 357 358 // 359 // StreamInterface Implementation 360 // 361 362 StreamResult OpenSSLStreamAdapter::Write(const void* data, size_t data_len, 363 size_t* written, int* error) { 364 LOG(LS_VERBOSE) << "OpenSSLStreamAdapter::Write(" << data_len << ")"; 365 366 switch (state_) { 367 case SSL_NONE: 368 // pass-through in clear text 369 return StreamAdapterInterface::Write(data, data_len, written, error); 370 371 case SSL_WAIT: 372 case SSL_CONNECTING: 373 return SR_BLOCK; 374 375 case SSL_CONNECTED: 376 break; 377 378 case SSL_ERROR: 379 case SSL_CLOSED: 380 default: 381 if (error) 382 *error = ssl_error_code_; 383 return SR_ERROR; 384 } 385 386 // OpenSSL will return an error if we try to write zero bytes 387 if (data_len == 0) { 388 if (written) 389 *written = 0; 390 return SR_SUCCESS; 391 } 392 393 ssl_write_needs_read_ = false; 394 395 int code = SSL_write(ssl_, data, data_len); 396 int ssl_error = SSL_get_error(ssl_, code); 397 switch (ssl_error) { 398 case SSL_ERROR_NONE: 399 LOG(LS_VERBOSE) << " -- success"; 400 ASSERT(0 < code && static_cast<unsigned>(code) <= data_len); 401 if (written) 402 *written = code; 403 return SR_SUCCESS; 404 case SSL_ERROR_WANT_READ: 405 LOG(LS_VERBOSE) << " -- error want read"; 406 ssl_write_needs_read_ = true; 407 return SR_BLOCK; 408 case SSL_ERROR_WANT_WRITE: 409 LOG(LS_VERBOSE) << " -- error want write"; 410 return SR_BLOCK; 411 412 case SSL_ERROR_ZERO_RETURN: 413 default: 414 Error("SSL_write", (ssl_error ? ssl_error : -1), false); 415 if (error) 416 *error = ssl_error_code_; 417 return SR_ERROR; 418 } 419 // not reached 420 } 421 422 StreamResult OpenSSLStreamAdapter::Read(void* data, size_t data_len, 423 size_t* read, int* error) { 424 LOG(LS_VERBOSE) << "OpenSSLStreamAdapter::Read(" << data_len << ")"; 425 switch (state_) { 426 case SSL_NONE: 427 // pass-through in clear text 428 return StreamAdapterInterface::Read(data, data_len, read, error); 429 430 case SSL_WAIT: 431 case SSL_CONNECTING: 432 return SR_BLOCK; 433 434 case SSL_CONNECTED: 435 break; 436 437 case SSL_CLOSED: 438 return SR_EOS; 439 440 case SSL_ERROR: 441 default: 442 if (error) 443 *error = ssl_error_code_; 444 return SR_ERROR; 445 } 446 447 // Don't trust OpenSSL with zero byte reads 448 if (data_len == 0) { 449 if (read) 450 *read = 0; 451 return SR_SUCCESS; 452 } 453 454 ssl_read_needs_write_ = false; 455 456 int code = SSL_read(ssl_, data, data_len); 457 int ssl_error = SSL_get_error(ssl_, code); 458 switch (ssl_error) { 459 case SSL_ERROR_NONE: 460 LOG(LS_VERBOSE) << " -- success"; 461 ASSERT(0 < code && static_cast<unsigned>(code) <= data_len); 462 if (read) 463 *read = code; 464 465 if (ssl_mode_ == SSL_MODE_DTLS) { 466 // Enforce atomic reads -- this is a short read 467 unsigned int pending = SSL_pending(ssl_); 468 469 if (pending) { 470 LOG(LS_INFO) << " -- short DTLS read. flushing"; 471 FlushInput(pending); 472 if (error) 473 *error = SSE_MSG_TRUNC; 474 return SR_ERROR; 475 } 476 } 477 return SR_SUCCESS; 478 case SSL_ERROR_WANT_READ: 479 LOG(LS_VERBOSE) << " -- error want read"; 480 return SR_BLOCK; 481 case SSL_ERROR_WANT_WRITE: 482 LOG(LS_VERBOSE) << " -- error want write"; 483 ssl_read_needs_write_ = true; 484 return SR_BLOCK; 485 case SSL_ERROR_ZERO_RETURN: 486 LOG(LS_VERBOSE) << " -- remote side closed"; 487 return SR_EOS; 488 break; 489 default: 490 LOG(LS_VERBOSE) << " -- error " << code; 491 Error("SSL_read", (ssl_error ? ssl_error : -1), false); 492 if (error) 493 *error = ssl_error_code_; 494 return SR_ERROR; 495 } 496 // not reached 497 } 498 499 void OpenSSLStreamAdapter::FlushInput(unsigned int left) { 500 unsigned char buf[2048]; 501 502 while (left) { 503 // This should always succeed 504 int toread = (sizeof(buf) < left) ? sizeof(buf) : left; 505 int code = SSL_read(ssl_, buf, toread); 506 507 int ssl_error = SSL_get_error(ssl_, code); 508 ASSERT(ssl_error == SSL_ERROR_NONE); 509 510 if (ssl_error != SSL_ERROR_NONE) { 511 LOG(LS_VERBOSE) << " -- error " << code; 512 Error("SSL_read", (ssl_error ? ssl_error : -1), false); 513 return; 514 } 515 516 LOG(LS_VERBOSE) << " -- flushed " << code << " bytes"; 517 left -= code; 518 } 519 } 520 521 void OpenSSLStreamAdapter::Close() { 522 Cleanup(); 523 ASSERT(state_ == SSL_CLOSED || state_ == SSL_ERROR); 524 StreamAdapterInterface::Close(); 525 } 526 527 StreamState OpenSSLStreamAdapter::GetState() const { 528 switch (state_) { 529 case SSL_WAIT: 530 case SSL_CONNECTING: 531 return SS_OPENING; 532 case SSL_CONNECTED: 533 return SS_OPEN; 534 default: 535 return SS_CLOSED; 536 }; 537 // not reached 538 } 539 540 void OpenSSLStreamAdapter::OnEvent(StreamInterface* stream, int events, 541 int err) { 542 int events_to_signal = 0; 543 int signal_error = 0; 544 ASSERT(stream == this->stream()); 545 if ((events & SE_OPEN)) { 546 LOG(LS_VERBOSE) << "OpenSSLStreamAdapter::OnEvent SE_OPEN"; 547 if (state_ != SSL_WAIT) { 548 ASSERT(state_ == SSL_NONE); 549 events_to_signal |= SE_OPEN; 550 } else { 551 state_ = SSL_CONNECTING; 552 if (int err = BeginSSL()) { 553 Error("BeginSSL", err, true); 554 return; 555 } 556 } 557 } 558 if ((events & (SE_READ|SE_WRITE))) { 559 LOG(LS_VERBOSE) << "OpenSSLStreamAdapter::OnEvent" 560 << ((events & SE_READ) ? " SE_READ" : "") 561 << ((events & SE_WRITE) ? " SE_WRITE" : ""); 562 if (state_ == SSL_NONE) { 563 events_to_signal |= events & (SE_READ|SE_WRITE); 564 } else if (state_ == SSL_CONNECTING) { 565 if (int err = ContinueSSL()) { 566 Error("ContinueSSL", err, true); 567 return; 568 } 569 } else if (state_ == SSL_CONNECTED) { 570 if (((events & SE_READ) && ssl_write_needs_read_) || 571 (events & SE_WRITE)) { 572 LOG(LS_VERBOSE) << " -- onStreamWriteable"; 573 events_to_signal |= SE_WRITE; 574 } 575 if (((events & SE_WRITE) && ssl_read_needs_write_) || 576 (events & SE_READ)) { 577 LOG(LS_VERBOSE) << " -- onStreamReadable"; 578 events_to_signal |= SE_READ; 579 } 580 } 581 } 582 if ((events & SE_CLOSE)) { 583 LOG(LS_VERBOSE) << "OpenSSLStreamAdapter::OnEvent(SE_CLOSE, " << err << ")"; 584 Cleanup(); 585 events_to_signal |= SE_CLOSE; 586 // SE_CLOSE is the only event that uses the final parameter to OnEvent(). 587 ASSERT(signal_error == 0); 588 signal_error = err; 589 } 590 if (events_to_signal) 591 StreamAdapterInterface::OnEvent(stream, events_to_signal, signal_error); 592 } 593 594 int OpenSSLStreamAdapter::StartSSL() { 595 ASSERT(state_ == SSL_NONE); 596 597 if (StreamAdapterInterface::GetState() != SS_OPEN) { 598 state_ = SSL_WAIT; 599 return 0; 600 } 601 602 state_ = SSL_CONNECTING; 603 if (int err = BeginSSL()) { 604 Error("BeginSSL", err, false); 605 return err; 606 } 607 608 return 0; 609 } 610 611 int OpenSSLStreamAdapter::BeginSSL() { 612 ASSERT(state_ == SSL_CONNECTING); 613 // The underlying stream has open. If we are in peer-to-peer mode 614 // then a peer certificate must have been specified by now. 615 ASSERT(!ssl_server_name_.empty() || 616 peer_certificate_ || 617 !peer_certificate_digest_algorithm_.empty()); 618 LOG(LS_INFO) << "BeginSSL: " 619 << (!ssl_server_name_.empty() ? ssl_server_name_ : 620 "with peer"); 621 622 BIO* bio = NULL; 623 624 // First set up the context 625 ASSERT(ssl_ctx_ == NULL); 626 ssl_ctx_ = SetupSSLContext(); 627 if (!ssl_ctx_) 628 return -1; 629 630 bio = BIO_new_stream(static_cast<StreamInterface*>(stream())); 631 if (!bio) 632 return -1; 633 634 ssl_ = SSL_new(ssl_ctx_); 635 if (!ssl_) { 636 BIO_free(bio); 637 return -1; 638 } 639 640 SSL_set_app_data(ssl_, this); 641 642 SSL_set_bio(ssl_, bio, bio); // the SSL object owns the bio now. 643 644 SSL_set_mode(ssl_, SSL_MODE_ENABLE_PARTIAL_WRITE | 645 SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER); 646 647 // Do the connect 648 return ContinueSSL(); 649 } 650 651 int OpenSSLStreamAdapter::ContinueSSL() { 652 LOG(LS_VERBOSE) << "ContinueSSL"; 653 ASSERT(state_ == SSL_CONNECTING); 654 655 // Clear the DTLS timer 656 Thread::Current()->Clear(this, MSG_TIMEOUT); 657 658 int code = (role_ == SSL_CLIENT) ? SSL_connect(ssl_) : SSL_accept(ssl_); 659 int ssl_error; 660 switch (ssl_error = SSL_get_error(ssl_, code)) { 661 case SSL_ERROR_NONE: 662 LOG(LS_VERBOSE) << " -- success"; 663 664 if (!SSLPostConnectionCheck(ssl_, ssl_server_name_.c_str(), 665 peer_certificate_ ? 666 peer_certificate_->x509() : NULL, 667 peer_certificate_digest_algorithm_)) { 668 LOG(LS_ERROR) << "TLS post connection check failed"; 669 return -1; 670 } 671 672 state_ = SSL_CONNECTED; 673 StreamAdapterInterface::OnEvent(stream(), SE_OPEN|SE_READ|SE_WRITE, 0); 674 break; 675 676 case SSL_ERROR_WANT_READ: { 677 LOG(LS_VERBOSE) << " -- error want read"; 678 #ifdef HAVE_DTLS 679 struct timeval timeout; 680 if (DTLSv1_get_timeout(ssl_, &timeout)) { 681 int delay = timeout.tv_sec * 1000 + timeout.tv_usec/1000; 682 683 Thread::Current()->PostDelayed(delay, this, MSG_TIMEOUT, 0); 684 } 685 #endif 686 } 687 break; 688 689 case SSL_ERROR_WANT_WRITE: 690 LOG(LS_VERBOSE) << " -- error want write"; 691 break; 692 693 case SSL_ERROR_ZERO_RETURN: 694 default: 695 LOG(LS_VERBOSE) << " -- error " << code; 696 return (ssl_error != 0) ? ssl_error : -1; 697 } 698 699 return 0; 700 } 701 702 void OpenSSLStreamAdapter::Error(const char* context, int err, bool signal) { 703 LOG(LS_WARNING) << "OpenSSLStreamAdapter::Error(" 704 << context << ", " << err << ")"; 705 state_ = SSL_ERROR; 706 ssl_error_code_ = err; 707 Cleanup(); 708 if (signal) 709 StreamAdapterInterface::OnEvent(stream(), SE_CLOSE, err); 710 } 711 712 void OpenSSLStreamAdapter::Cleanup() { 713 LOG(LS_INFO) << "Cleanup"; 714 715 if (state_ != SSL_ERROR) { 716 state_ = SSL_CLOSED; 717 ssl_error_code_ = 0; 718 } 719 720 if (ssl_) { 721 SSL_free(ssl_); 722 ssl_ = NULL; 723 } 724 if (ssl_ctx_) { 725 SSL_CTX_free(ssl_ctx_); 726 ssl_ctx_ = NULL; 727 } 728 identity_.reset(); 729 peer_certificate_.reset(); 730 731 // Clear the DTLS timer 732 Thread::Current()->Clear(this, MSG_TIMEOUT); 733 } 734 735 736 void OpenSSLStreamAdapter::OnMessage(Message* msg) { 737 // Process our own messages and then pass others to the superclass 738 if (MSG_TIMEOUT == msg->message_id) { 739 LOG(LS_INFO) << "DTLS timeout expired"; 740 #ifdef HAVE_DTLS 741 DTLSv1_handle_timeout(ssl_); 742 #endif 743 ContinueSSL(); 744 } else { 745 StreamInterface::OnMessage(msg); 746 } 747 } 748 749 SSL_CTX* OpenSSLStreamAdapter::SetupSSLContext() { 750 SSL_CTX *ctx = NULL; 751 752 if (role_ == SSL_CLIENT) { 753 #ifdef HAVE_DTLS 754 ctx = SSL_CTX_new(ssl_mode_ == SSL_MODE_DTLS ? 755 DTLSv1_client_method() : TLSv1_client_method()); 756 #else 757 ctx = SSL_CTX_new(TLSv1_client_method()); 758 #endif 759 } else { 760 #ifdef HAVE_DTLS 761 ctx = SSL_CTX_new(ssl_mode_ == SSL_MODE_DTLS ? 762 DTLSv1_server_method() : TLSv1_server_method()); 763 #else 764 ctx = SSL_CTX_new(TLSv1_server_method()); 765 #endif 766 } 767 if (ctx == NULL) 768 return NULL; 769 770 if (identity_ && !identity_->ConfigureIdentity(ctx)) { 771 SSL_CTX_free(ctx); 772 return NULL; 773 } 774 775 if (!peer_certificate_) { // traditional mode 776 // Add the root cert to the SSL context 777 if (!OpenSSLAdapter::ConfigureTrustedRootCertificates(ctx)) { 778 SSL_CTX_free(ctx); 779 return NULL; 780 } 781 } 782 783 if (peer_certificate_ && role_ == SSL_SERVER) 784 // we must specify which client cert to ask for 785 SSL_CTX_add_client_CA(ctx, peer_certificate_->x509()); 786 787 #ifdef _DEBUG 788 SSL_CTX_set_info_callback(ctx, OpenSSLAdapter::SSLInfoCallback); 789 #endif 790 791 SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER |SSL_VERIFY_FAIL_IF_NO_PEER_CERT, 792 SSLVerifyCallback); 793 SSL_CTX_set_verify_depth(ctx, 4); 794 SSL_CTX_set_cipher_list(ctx, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"); 795 796 #ifdef HAVE_DTLS_SRTP 797 if (!srtp_ciphers_.empty()) { 798 if (SSL_CTX_set_tlsext_use_srtp(ctx, srtp_ciphers_.c_str())) { 799 SSL_CTX_free(ctx); 800 return NULL; 801 } 802 } 803 #endif 804 805 return ctx; 806 } 807 808 int OpenSSLStreamAdapter::SSLVerifyCallback(int ok, X509_STORE_CTX* store) { 809 #if _DEBUG 810 if (!ok) { 811 char data[256]; 812 X509* cert = X509_STORE_CTX_get_current_cert(store); 813 int depth = X509_STORE_CTX_get_error_depth(store); 814 int err = X509_STORE_CTX_get_error(store); 815 816 LOG(LS_INFO) << "Error with certificate at depth: " << depth; 817 X509_NAME_oneline(X509_get_issuer_name(cert), data, sizeof(data)); 818 LOG(LS_INFO) << " issuer = " << data; 819 X509_NAME_oneline(X509_get_subject_name(cert), data, sizeof(data)); 820 LOG(LS_INFO) << " subject = " << data; 821 LOG(LS_INFO) << " err = " << err 822 << ":" << X509_verify_cert_error_string(err); 823 } 824 #endif 825 826 // Get our SSL structure from the store 827 SSL* ssl = reinterpret_cast<SSL*>(X509_STORE_CTX_get_ex_data( 828 store, 829 SSL_get_ex_data_X509_STORE_CTX_idx())); 830 831 OpenSSLStreamAdapter* stream = 832 reinterpret_cast<OpenSSLStreamAdapter*>(SSL_get_app_data(ssl)); 833 834 // In peer-to-peer mode, no root cert / certificate authority was 835 // specified, so the libraries knows of no certificate to accept, 836 // and therefore it will necessarily call here on the first cert it 837 // tries to verify. 838 if (!ok && stream->peer_certificate_) { 839 X509* cert = X509_STORE_CTX_get_current_cert(store); 840 int err = X509_STORE_CTX_get_error(store); 841 // peer-to-peer mode: allow the certificate to be self-signed, 842 // assuming it matches the cert that was specified. 843 if (err == X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT && 844 X509_cmp(cert, stream->peer_certificate_->x509()) == 0) { 845 LOG(LS_INFO) << "Accepted self-signed peer certificate authority"; 846 ok = 1; 847 } 848 } else if (!ok && !stream->peer_certificate_digest_algorithm_.empty()) { 849 X509* cert = X509_STORE_CTX_get_current_cert(store); 850 int err = X509_STORE_CTX_get_error(store); 851 852 // peer-to-peer mode: allow the certificate to be self-signed, 853 // assuming it matches the digest that was specified. 854 if (err == X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT) { 855 unsigned char digest[EVP_MAX_MD_SIZE]; 856 std::size_t digest_length; 857 858 if (OpenSSLCertificate:: 859 ComputeDigest(cert, 860 stream->peer_certificate_digest_algorithm_, 861 digest, sizeof(digest), 862 &digest_length)) { 863 Buffer computed_digest(digest, digest_length); 864 if (computed_digest == stream->peer_certificate_digest_value_) { 865 LOG(LS_INFO) << 866 "Accepted self-signed peer certificate authority"; 867 ok = 1; 868 869 // Record the peer's certificate. 870 stream->peer_certificate_.reset(new OpenSSLCertificate(cert)); 871 } 872 } 873 } 874 } else if (!ok && OpenSSLAdapter::custom_verify_callback_) { 875 // this applies only in traditional mode 876 void* cert = 877 reinterpret_cast<void*>(X509_STORE_CTX_get_current_cert(store)); 878 if (OpenSSLAdapter::custom_verify_callback_(cert)) { 879 stream->custom_verification_succeeded_ = true; 880 LOG(LS_INFO) << "validated certificate using custom callback"; 881 ok = 1; 882 } 883 } 884 885 if (!ok && stream->ignore_bad_cert()) { 886 LOG(LS_WARNING) << "Ignoring cert error while verifying cert chain"; 887 ok = 1; 888 } 889 890 return ok; 891 } 892 893 // This code is taken from the "Network Security with OpenSSL" 894 // sample in chapter 5 895 bool OpenSSLStreamAdapter::SSLPostConnectionCheck(SSL* ssl, 896 const char* server_name, 897 const X509* peer_cert, 898 const std::string 899 &peer_digest) { 900 ASSERT(server_name != NULL); 901 bool ok; 902 if (server_name[0] != '\0') { // traditional mode 903 ok = OpenSSLAdapter::VerifyServerName(ssl, server_name, ignore_bad_cert()); 904 905 if (ok) { 906 ok = (SSL_get_verify_result(ssl) == X509_V_OK || 907 custom_verification_succeeded_); 908 } 909 } else { // peer-to-peer mode 910 ASSERT((peer_cert != NULL) || (!peer_digest.empty())); 911 // no server name validation 912 ok = true; 913 } 914 915 if (!ok && ignore_bad_cert()) { 916 LOG(LS_ERROR) << "SSL_get_verify_result(ssl) = " 917 << SSL_get_verify_result(ssl); 918 LOG(LS_INFO) << "Other TLS post connection checks failed."; 919 ok = true; 920 } 921 922 return ok; 923 } 924 925 bool OpenSSLStreamAdapter::HaveDtls() { 926 #ifdef HAVE_DTLS 927 return true; 928 #else 929 return false; 930 #endif 931 } 932 933 bool OpenSSLStreamAdapter::HaveDtlsSrtp() { 934 #ifdef HAVE_DTLS_SRTP 935 return true; 936 #else 937 return false; 938 #endif 939 } 940 941 bool OpenSSLStreamAdapter::HaveExporter() { 942 #ifdef HAVE_DTLS_SRTP 943 return true; 944 #else 945 return false; 946 #endif 947 } 948 949 } // namespace talk_base 950 951 #endif // HAVE_OPENSSL_SSL_H 952