Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 306 return peer_certificate_ ? std::unique_ptr<SSLCertificate>( | 306 return peer_certificate_ ? std::unique_ptr<SSLCertificate>( |
| 307 peer_certificate_->GetReference()) | 307 peer_certificate_->GetReference()) |
| 308 : nullptr; | 308 : nullptr; |
| 309 } | 309 } |
| 310 | 310 |
| 311 bool OpenSSLStreamAdapter::SetPeerCertificateDigest(const std::string | 311 bool OpenSSLStreamAdapter::SetPeerCertificateDigest(const std::string |
| 312 &digest_alg, | 312 &digest_alg, |
| 313 const unsigned char* | 313 const unsigned char* |
| 314 digest_val, | 314 digest_val, |
| 315 size_t digest_len) { | 315 size_t digest_len) { |
| 316 ASSERT(!peer_certificate_); | 316 ASSERT(!certificate_verified_); |
| 317 ASSERT(peer_certificate_digest_algorithm_.size() == 0); | 317 ASSERT(peer_certificate_digest_algorithm_.size() == 0); |
| 318 ASSERT(ssl_server_name_.empty()); | 318 ASSERT(ssl_server_name_.empty()); |
| 319 size_t expected_len; | 319 size_t expected_len; |
| 320 | 320 |
| 321 if (!OpenSSLDigest::GetDigestSize(digest_alg, &expected_len)) { | 321 if (!OpenSSLDigest::GetDigestSize(digest_alg, &expected_len)) { |
| 322 LOG(LS_WARNING) << "Unknown digest algorithm: " << digest_alg; | 322 LOG(LS_WARNING) << "Unknown digest algorithm: " << digest_alg; |
| 323 return false; | 323 return false; |
| 324 } | 324 } |
| 325 if (expected_len != digest_len) | 325 if (expected_len != digest_len) { |
| 326 return false; | 326 return false; |
| 327 } | |
| 327 | 328 |
| 328 peer_certificate_digest_value_.SetData(digest_val, digest_len); | 329 peer_certificate_digest_value_.SetData(digest_val, digest_len); |
| 329 peer_certificate_digest_algorithm_ = digest_alg; | 330 peer_certificate_digest_algorithm_ = digest_alg; |
| 330 | 331 |
| 332 if (peer_certificate_) { | |
| 333 if (VerifyPeerCertificate()) { | |
| 334 if (state_ == SSL_CONNECTED) { | |
| 335 // Post event to unwind stack. Caller may not be expecting this event | |
| 336 // to occur synchronously. | |
| 337 PostEvent(SE_OPEN | SE_READ | SE_WRITE, 0); | |
| 338 } | |
| 339 } else { | |
| 340 Error("SetPeerCertificateDigest", -1, false); | |
|
mattdr-at-webrtc.org
2016/07/20 00:50:27
instead of -1, X509_V_ERR_CERT_UNTRUSTED might be
Taylor Brandstetter
2016/07/20 17:36:52
No, in this case the caller can check the return v
| |
| 341 return false; | |
| 342 } | |
| 343 } | |
| 331 return true; | 344 return true; |
| 332 } | 345 } |
| 333 | 346 |
| 334 std::string OpenSSLStreamAdapter::SslCipherSuiteToName(int cipher_suite) { | 347 std::string OpenSSLStreamAdapter::SslCipherSuiteToName(int cipher_suite) { |
| 335 #ifdef OPENSSL_IS_BORINGSSL | 348 #ifdef OPENSSL_IS_BORINGSSL |
| 336 const SSL_CIPHER* ssl_cipher = SSL_get_cipher_by_value(cipher_suite); | 349 const SSL_CIPHER* ssl_cipher = SSL_get_cipher_by_value(cipher_suite); |
| 337 if (!ssl_cipher) { | 350 if (!ssl_cipher) { |
| 338 return std::string(); | 351 return std::string(); |
| 339 } | 352 } |
| 340 char* cipher_name = SSL_CIPHER_get_rfc_name(ssl_cipher); | 353 char* cipher_name = SSL_CIPHER_get_rfc_name(ssl_cipher); |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 501 switch (state_) { | 514 switch (state_) { |
| 502 case SSL_NONE: | 515 case SSL_NONE: |
| 503 // pass-through in clear text | 516 // pass-through in clear text |
| 504 return StreamAdapterInterface::Write(data, data_len, written, error); | 517 return StreamAdapterInterface::Write(data, data_len, written, error); |
| 505 | 518 |
| 506 case SSL_WAIT: | 519 case SSL_WAIT: |
| 507 case SSL_CONNECTING: | 520 case SSL_CONNECTING: |
| 508 return SR_BLOCK; | 521 return SR_BLOCK; |
| 509 | 522 |
| 510 case SSL_CONNECTED: | 523 case SSL_CONNECTED: |
| 524 if (client_auth_enabled() && !certificate_verified_) { | |
|
mattdr-at-webrtc.org
2016/07/20 00:50:27
We repeat this expression more than a few times. M
Taylor Brandstetter
2016/07/20 17:36:52
Good idea, done.
| |
| 525 return SR_BLOCK; | |
| 526 } | |
| 511 break; | 527 break; |
| 512 | 528 |
| 513 case SSL_ERROR: | 529 case SSL_ERROR: |
| 514 case SSL_CLOSED: | 530 case SSL_CLOSED: |
| 515 default: | 531 default: |
| 516 if (error) | 532 if (error) |
| 517 *error = ssl_error_code_; | 533 *error = ssl_error_code_; |
| 518 return SR_ERROR; | 534 return SR_ERROR; |
| 519 } | 535 } |
| 520 | 536 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 560 switch (state_) { | 576 switch (state_) { |
| 561 case SSL_NONE: | 577 case SSL_NONE: |
| 562 // pass-through in clear text | 578 // pass-through in clear text |
| 563 return StreamAdapterInterface::Read(data, data_len, read, error); | 579 return StreamAdapterInterface::Read(data, data_len, read, error); |
| 564 | 580 |
| 565 case SSL_WAIT: | 581 case SSL_WAIT: |
| 566 case SSL_CONNECTING: | 582 case SSL_CONNECTING: |
| 567 return SR_BLOCK; | 583 return SR_BLOCK; |
| 568 | 584 |
| 569 case SSL_CONNECTED: | 585 case SSL_CONNECTED: |
| 586 if (client_auth_enabled() && !certificate_verified_) { | |
| 587 return SR_BLOCK; | |
| 588 } | |
| 570 break; | 589 break; |
| 571 | 590 |
| 572 case SSL_CLOSED: | 591 case SSL_CLOSED: |
| 573 return SR_EOS; | 592 return SR_EOS; |
| 574 | 593 |
| 575 case SSL_ERROR: | 594 case SSL_ERROR: |
| 576 default: | 595 default: |
| 577 if (error) | 596 if (error) |
| 578 *error = ssl_error_code_; | 597 *error = ssl_error_code_; |
| 579 return SR_ERROR; | 598 return SR_ERROR; |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 662 ASSERT(state_ == SSL_CLOSED || state_ == SSL_ERROR); | 681 ASSERT(state_ == SSL_CLOSED || state_ == SSL_ERROR); |
| 663 StreamAdapterInterface::Close(); | 682 StreamAdapterInterface::Close(); |
| 664 } | 683 } |
| 665 | 684 |
| 666 StreamState OpenSSLStreamAdapter::GetState() const { | 685 StreamState OpenSSLStreamAdapter::GetState() const { |
| 667 switch (state_) { | 686 switch (state_) { |
| 668 case SSL_WAIT: | 687 case SSL_WAIT: |
| 669 case SSL_CONNECTING: | 688 case SSL_CONNECTING: |
| 670 return SS_OPENING; | 689 return SS_OPENING; |
| 671 case SSL_CONNECTED: | 690 case SSL_CONNECTED: |
| 691 if (client_auth_enabled() && !certificate_verified_) { | |
| 692 return SS_OPENING; | |
| 693 } | |
| 672 return SS_OPEN; | 694 return SS_OPEN; |
| 673 default: | 695 default: |
| 674 return SS_CLOSED; | 696 return SS_CLOSED; |
| 675 }; | 697 }; |
| 676 // not reached | 698 // not reached |
| 677 } | 699 } |
| 678 | 700 |
| 679 void OpenSSLStreamAdapter::OnEvent(StreamInterface* stream, int events, | 701 void OpenSSLStreamAdapter::OnEvent(StreamInterface* stream, int events, |
| 680 int err) { | 702 int err) { |
| 681 int events_to_signal = 0; | 703 int events_to_signal = 0; |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 742 if (int err = BeginSSL()) { | 764 if (int err = BeginSSL()) { |
| 743 Error("BeginSSL", err, false); | 765 Error("BeginSSL", err, false); |
| 744 return err; | 766 return err; |
| 745 } | 767 } |
| 746 | 768 |
| 747 return 0; | 769 return 0; |
| 748 } | 770 } |
| 749 | 771 |
| 750 int OpenSSLStreamAdapter::BeginSSL() { | 772 int OpenSSLStreamAdapter::BeginSSL() { |
| 751 ASSERT(state_ == SSL_CONNECTING); | 773 ASSERT(state_ == SSL_CONNECTING); |
| 752 // The underlying stream has open. If we are in peer-to-peer mode | |
| 753 // then a peer certificate must have been specified by now. | |
| 754 ASSERT(!ssl_server_name_.empty() || | |
| 755 !peer_certificate_digest_algorithm_.empty()); | |
| 756 LOG(LS_INFO) << "BeginSSL: " | 774 LOG(LS_INFO) << "BeginSSL: " |
| 757 << (!ssl_server_name_.empty() ? ssl_server_name_ : | 775 << (!ssl_server_name_.empty() ? ssl_server_name_ : |
| 758 "with peer"); | 776 "with peer"); |
| 759 | 777 |
| 760 BIO* bio = NULL; | 778 BIO* bio = NULL; |
| 761 | 779 |
| 762 // First set up the context | 780 // First set up the context |
| 763 ASSERT(ssl_ctx_ == NULL); | 781 ASSERT(ssl_ctx_ == NULL); |
| 764 ssl_ctx_ = SetupSSLContext(); | 782 ssl_ctx_ = SetupSSLContext(); |
| 765 if (!ssl_ctx_) | 783 if (!ssl_ctx_) |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 818 | 836 |
| 819 // Clear the DTLS timer | 837 // Clear the DTLS timer |
| 820 Thread::Current()->Clear(this, MSG_TIMEOUT); | 838 Thread::Current()->Clear(this, MSG_TIMEOUT); |
| 821 | 839 |
| 822 int code = (role_ == SSL_CLIENT) ? SSL_connect(ssl_) : SSL_accept(ssl_); | 840 int code = (role_ == SSL_CLIENT) ? SSL_connect(ssl_) : SSL_accept(ssl_); |
| 823 int ssl_error; | 841 int ssl_error; |
| 824 switch (ssl_error = SSL_get_error(ssl_, code)) { | 842 switch (ssl_error = SSL_get_error(ssl_, code)) { |
| 825 case SSL_ERROR_NONE: | 843 case SSL_ERROR_NONE: |
| 826 LOG(LS_VERBOSE) << " -- success"; | 844 LOG(LS_VERBOSE) << " -- success"; |
| 827 | 845 |
| 828 if (!SSLPostConnectionCheck(ssl_, ssl_server_name_.c_str(), NULL, | 846 if (!SSLPostConnectionCheck( |
| 829 peer_certificate_digest_algorithm_)) { | 847 ssl_, ssl_server_name_.c_str(), |
| 848 peer_certificate_ ? peer_certificate_->x509() : nullptr)) { | |
| 830 LOG(LS_ERROR) << "TLS post connection check failed"; | 849 LOG(LS_ERROR) << "TLS post connection check failed"; |
| 831 return -1; | 850 return -1; |
| 832 } | 851 } |
| 833 | 852 |
| 834 state_ = SSL_CONNECTED; | 853 state_ = SSL_CONNECTED; |
| 835 StreamAdapterInterface::OnEvent(stream(), SE_OPEN|SE_READ|SE_WRITE, 0); | 854 if (!client_auth_enabled() || certificate_verified_) { |
| 855 // If the certificate is not verified (because we're in peer-to-peer | |
|
mattdr-at-webrtc.org
2016/07/20 00:50:27
Make it a bit more obvious here that you're talkin
Taylor Brandstetter
2016/07/20 17:36:52
Done.
| |
| 856 // mode and the digest is not yet known), SE_OPEN will be signaled in | |
| 857 // SetPeerCertificateDigest. | |
| 858 StreamAdapterInterface::OnEvent(stream(), SE_OPEN | SE_READ | SE_WRITE, | |
| 859 0); | |
| 860 } | |
| 836 break; | 861 break; |
| 837 | 862 |
| 838 case SSL_ERROR_WANT_READ: { | 863 case SSL_ERROR_WANT_READ: { |
| 839 LOG(LS_VERBOSE) << " -- error want read"; | 864 LOG(LS_VERBOSE) << " -- error want read"; |
| 840 struct timeval timeout; | 865 struct timeval timeout; |
| 841 if (DTLSv1_get_timeout(ssl_, &timeout)) { | 866 if (DTLSv1_get_timeout(ssl_, &timeout)) { |
| 842 int delay = timeout.tv_sec * 1000 + timeout.tv_usec/1000; | 867 int delay = timeout.tv_sec * 1000 + timeout.tv_usec/1000; |
| 843 | 868 |
| 844 Thread::Current()->PostDelayed(RTC_FROM_HERE, delay, this, | 869 Thread::Current()->PostDelayed(RTC_FROM_HERE, delay, this, |
| 845 MSG_TIMEOUT, 0); | 870 MSG_TIMEOUT, 0); |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1035 if (SSL_CTX_set_tlsext_use_srtp(ctx, srtp_ciphers_.c_str())) { | 1060 if (SSL_CTX_set_tlsext_use_srtp(ctx, srtp_ciphers_.c_str())) { |
| 1036 SSL_CTX_free(ctx); | 1061 SSL_CTX_free(ctx); |
| 1037 return NULL; | 1062 return NULL; |
| 1038 } | 1063 } |
| 1039 } | 1064 } |
| 1040 #endif | 1065 #endif |
| 1041 | 1066 |
| 1042 return ctx; | 1067 return ctx; |
| 1043 } | 1068 } |
| 1044 | 1069 |
| 1045 int OpenSSLStreamAdapter::SSLVerifyCallback(int ok, X509_STORE_CTX* store) { | 1070 bool OpenSSLStreamAdapter::VerifyPeerCertificate() { |
| 1046 // Get our SSL structure from the store | 1071 if (peer_certificate_digest_algorithm_.empty() || !peer_certificate_) { |
| 1047 SSL* ssl = reinterpret_cast<SSL*>(X509_STORE_CTX_get_ex_data( | 1072 LOG(LS_WARNING) << "Missing digest or peer certificate."; |
| 1048 store, | 1073 return false; |
| 1049 SSL_get_ex_data_X509_STORE_CTX_idx())); | |
| 1050 OpenSSLStreamAdapter* stream = | |
| 1051 reinterpret_cast<OpenSSLStreamAdapter*>(SSL_get_app_data(ssl)); | |
| 1052 | |
| 1053 if (stream->peer_certificate_digest_algorithm_.empty()) { | |
| 1054 return 0; | |
| 1055 } | |
| 1056 X509* cert = X509_STORE_CTX_get_current_cert(store); | |
| 1057 int depth = X509_STORE_CTX_get_error_depth(store); | |
| 1058 | |
| 1059 // For now We ignore the parent certificates and verify the leaf against | |
| 1060 // the digest. | |
| 1061 // | |
| 1062 // TODO(jiayl): Verify the chain is a proper chain and report the chain to | |
| 1063 // |stream->peer_certificate_|. | |
| 1064 if (depth > 0) { | |
| 1065 LOG(LS_INFO) << "Ignored chained certificate at depth " << depth; | |
| 1066 return 1; | |
| 1067 } | 1074 } |
| 1068 | 1075 |
| 1069 unsigned char digest[EVP_MAX_MD_SIZE]; | 1076 unsigned char digest[EVP_MAX_MD_SIZE]; |
| 1070 size_t digest_length; | 1077 size_t digest_length; |
| 1071 if (!OpenSSLCertificate::ComputeDigest( | 1078 if (!OpenSSLCertificate::ComputeDigest( |
| 1072 cert, | 1079 peer_certificate_->x509(), peer_certificate_digest_algorithm_, digest, |
| 1073 stream->peer_certificate_digest_algorithm_, | 1080 sizeof(digest), &digest_length)) { |
| 1074 digest, sizeof(digest), | |
| 1075 &digest_length)) { | |
| 1076 LOG(LS_WARNING) << "Failed to compute peer cert digest."; | 1081 LOG(LS_WARNING) << "Failed to compute peer cert digest."; |
| 1077 return 0; | 1082 return false; |
| 1078 } | 1083 } |
| 1079 | 1084 |
| 1080 Buffer computed_digest(digest, digest_length); | 1085 Buffer computed_digest(digest, digest_length); |
| 1081 if (computed_digest != stream->peer_certificate_digest_value_) { | 1086 if (computed_digest != peer_certificate_digest_value_) { |
| 1082 LOG(LS_WARNING) << "Rejected peer certificate due to mismatched digest."; | 1087 LOG(LS_WARNING) << "Rejected peer certificate due to mismatched digest."; |
| 1083 return 0; | 1088 return 0; |
| 1084 } | 1089 } |
| 1085 // Ignore any verification error if the digest matches, since there is no | 1090 // Ignore any verification error if the digest matches, since there is no |
| 1086 // value in checking the validity of a self-signed cert issued by untrusted | 1091 // value in checking the validity of a self-signed cert issued by untrusted |
| 1087 // sources. | 1092 // sources. |
| 1088 LOG(LS_INFO) << "Accepted peer certificate."; | 1093 LOG(LS_INFO) << "Accepted peer certificate."; |
| 1094 certificate_verified_ = true; | |
| 1095 return true; | |
| 1096 } | |
| 1097 | |
| 1098 int OpenSSLStreamAdapter::SSLVerifyCallback(int ok, X509_STORE_CTX* store) { | |
| 1099 // Get our SSL structure from the store | |
| 1100 SSL* ssl = reinterpret_cast<SSL*>( | |
| 1101 X509_STORE_CTX_get_ex_data(store, SSL_get_ex_data_X509_STORE_CTX_idx())); | |
| 1102 X509* cert = X509_STORE_CTX_get_current_cert(store); | |
| 1103 int depth = X509_STORE_CTX_get_error_depth(store); | |
| 1104 | |
| 1105 // For now we ignore the parent certificates and verify the leaf against | |
| 1106 // the digest. | |
| 1107 // | |
| 1108 // TODO(jiayl): Verify the chain is a proper chain and report the chain to | |
| 1109 // |stream->peer_certificate_|. | |
| 1110 if (depth > 0) { | |
| 1111 LOG(LS_INFO) << "Ignored chained certificate at depth " << depth; | |
| 1112 return 1; | |
| 1113 } | |
| 1114 | |
| 1115 OpenSSLStreamAdapter* stream = | |
| 1116 reinterpret_cast<OpenSSLStreamAdapter*>(SSL_get_app_data(ssl)); | |
| 1089 | 1117 |
| 1090 // Record the peer's certificate. | 1118 // Record the peer's certificate. |
| 1091 stream->peer_certificate_.reset(new OpenSSLCertificate(cert)); | 1119 stream->peer_certificate_.reset(new OpenSSLCertificate(cert)); |
| 1092 return 1; | 1120 |
| 1121 // If the peer certificate digest isn't known yet, we'll wait to verify | |
| 1122 // until it's known, and for now just return a success status. | |
| 1123 if (stream->peer_certificate_digest_algorithm_.empty()) { | |
|
mattdr-at-webrtc.org
2016/07/20 00:50:27
do we really want to use the digest *algorithm* va
Taylor Brandstetter
2016/07/20 17:36:52
Both should always be set at the same time. But th
| |
| 1124 LOG(LS_INFO) << "Waiting to verify certificate until digest is known."; | |
| 1125 return 1; | |
| 1126 } | |
| 1127 | |
| 1128 return stream->VerifyPeerCertificate() ? 1 : 0; | |
|
mattdr-at-webrtc.org
2016/07/20 00:50:27
bool coerces to 1 or 0, so this should be redundan
Taylor Brandstetter
2016/07/20 17:36:52
I always forget this. Done.
| |
| 1093 } | 1129 } |
| 1094 | 1130 |
| 1095 // This code is taken from the "Network Security with OpenSSL" | 1131 // This code is taken from the "Network Security with OpenSSL" |
| 1096 // sample in chapter 5 | 1132 // sample in chapter 5 |
| 1097 bool OpenSSLStreamAdapter::SSLPostConnectionCheck(SSL* ssl, | 1133 bool OpenSSLStreamAdapter::SSLPostConnectionCheck(SSL* ssl, |
| 1098 const char* server_name, | 1134 const char* server_name, |
| 1099 const X509* peer_cert, | 1135 const X509* peer_cert) { |
|
mattdr-at-webrtc.org
2016/07/20 00:50:27
This function doesn't really need the peer certifi
Taylor Brandstetter
2016/07/20 17:36:52
In fact I'm not sure why this method takes any par
| |
| 1100 const std::string | |
| 1101 &peer_digest) { | |
| 1102 ASSERT(server_name != NULL); | 1136 ASSERT(server_name != NULL); |
| 1103 bool ok; | 1137 bool ok; |
| 1104 if (server_name[0] != '\0') { // traditional mode | 1138 if (server_name[0] != '\0') { // traditional mode |
| 1105 ok = OpenSSLAdapter::VerifyServerName(ssl, server_name, ignore_bad_cert()); | 1139 ok = OpenSSLAdapter::VerifyServerName(ssl, server_name, ignore_bad_cert()); |
| 1106 | 1140 |
| 1107 if (ok) { | 1141 if (ok) { |
| 1108 ok = (SSL_get_verify_result(ssl) == X509_V_OK || | 1142 ok = certificate_verified_ = (SSL_get_verify_result(ssl) == X509_V_OK || |
| 1109 custom_verification_succeeded_); | 1143 custom_verification_succeeded_); |
|
mattdr-at-webrtc.org
2016/07/20 00:50:27
Let's avoid chained assignment.
In fact, I'd pref
Taylor Brandstetter
2016/07/20 17:36:52
This is no longer necessary, since I have "waiting
| |
| 1110 } | 1144 } |
| 1111 } else { // peer-to-peer mode | 1145 } else { // peer-to-peer mode |
| 1112 ASSERT((peer_cert != NULL) || (!peer_digest.empty())); | |
| 1113 // no server name validation | 1146 // no server name validation |
| 1114 ok = true; | 1147 ok = peer_cert != nullptr || !client_auth_enabled(); |
| 1115 } | 1148 } |
| 1116 | 1149 |
| 1117 if (!ok && ignore_bad_cert()) { | 1150 if (!ok && ignore_bad_cert()) { |
| 1118 LOG(LS_ERROR) << "SSL_get_verify_result(ssl) = " | 1151 LOG(LS_ERROR) << "SSL_get_verify_result(ssl) = " |
| 1119 << SSL_get_verify_result(ssl); | 1152 << SSL_get_verify_result(ssl); |
| 1120 LOG(LS_INFO) << "Other TLS post connection checks failed."; | 1153 LOG(LS_INFO) << "Other TLS post connection checks failed."; |
| 1121 ok = true; | 1154 ok = true; |
| 1122 } | 1155 } |
| 1123 | 1156 |
| 1124 return ok; | 1157 return ok; |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1219 return true; | 1252 return true; |
| 1220 } | 1253 } |
| 1221 } | 1254 } |
| 1222 | 1255 |
| 1223 return false; | 1256 return false; |
| 1224 } | 1257 } |
| 1225 | 1258 |
| 1226 } // namespace rtc | 1259 } // namespace rtc |
| 1227 | 1260 |
| 1228 #endif // HAVE_OPENSSL_SSL_H | 1261 #endif // HAVE_OPENSSL_SSL_H |
| OLD | NEW |