| OLD | NEW | 
|     1 /* |     1 /* | 
|     2  *  Copyright 2008 The WebRTC Project Authors. All rights reserved. |     2  *  Copyright 2008 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 268 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   279     : SSLAdapter(socket), |   279     : SSLAdapter(socket), | 
|   280       factory_(factory), |   280       factory_(factory), | 
|   281       state_(SSL_NONE), |   281       state_(SSL_NONE), | 
|   282       role_(SSL_CLIENT), |   282       role_(SSL_CLIENT), | 
|   283       ssl_read_needs_write_(false), |   283       ssl_read_needs_write_(false), | 
|   284       ssl_write_needs_read_(false), |   284       ssl_write_needs_read_(false), | 
|   285       restartable_(false), |   285       restartable_(false), | 
|   286       ssl_(nullptr), |   286       ssl_(nullptr), | 
|   287       ssl_ctx_(nullptr), |   287       ssl_ctx_(nullptr), | 
|   288       ssl_mode_(SSL_MODE_TLS), |   288       ssl_mode_(SSL_MODE_TLS), | 
 |   289       ignore_bad_cert_(false), | 
|   289       custom_verification_succeeded_(false) { |   290       custom_verification_succeeded_(false) { | 
|   290   // If a factory is used, take a reference on the factory's SSL_CTX. |   291   // If a factory is used, take a reference on the factory's SSL_CTX. | 
|   291   // Otherwise, we'll create our own later. |   292   // Otherwise, we'll create our own later. | 
|   292   // Either way, we'll release our reference via SSL_CTX_free() in Cleanup(). |   293   // Either way, we'll release our reference via SSL_CTX_free() in Cleanup(). | 
|   293   if (factory_) { |   294   if (factory_) { | 
|   294     ssl_ctx_ = factory_->ssl_ctx(); |   295     ssl_ctx_ = factory_->ssl_ctx(); | 
|   295     RTC_DCHECK(ssl_ctx_); |   296     RTC_DCHECK(ssl_ctx_); | 
|   296     // Note: if using OpenSSL, requires version 1.1.0 or later. |   297     // Note: if using OpenSSL, requires version 1.1.0 or later. | 
|   297     SSL_CTX_up_ref(ssl_ctx_); |   298     SSL_CTX_up_ref(ssl_ctx_); | 
|   298   } |   299   } | 
|   299 } |   300 } | 
|   300  |   301  | 
|   301 OpenSSLAdapter::~OpenSSLAdapter() { |   302 OpenSSLAdapter::~OpenSSLAdapter() { | 
|   302   Cleanup(); |   303   Cleanup(); | 
|   303 } |   304 } | 
|   304  |   305  | 
|   305 void OpenSSLAdapter::SetMode(SSLMode mode) { |   306 void OpenSSLAdapter::SetIgnoreBadCert(bool ignore) { | 
 |   307   ignore_bad_cert_ = ignore; | 
 |   308 } | 
 |   309  | 
 |   310 void OpenSSLAdapter::SetAlpnProtocols(const std::vector<std::string>& protos) { | 
 |   311   alpn_protocols_ = protos; | 
 |   312 } | 
 |   313  | 
 |   314 void | 
 |   315 OpenSSLAdapter::SetMode(SSLMode mode) { | 
|   306   RTC_DCHECK(!ssl_ctx_); |   316   RTC_DCHECK(!ssl_ctx_); | 
|   307   RTC_DCHECK(state_ == SSL_NONE); |   317   RTC_DCHECK(state_ == SSL_NONE); | 
|   308   ssl_mode_ = mode; |   318   ssl_mode_ = mode; | 
|   309 } |   319 } | 
|   310  |   320  | 
|   311 void OpenSSLAdapter::SetIdentity(SSLIdentity* identity) { |   321 void OpenSSLAdapter::SetIdentity(SSLIdentity* identity) { | 
|   312   RTC_DCHECK(!identity_); |   322   RTC_DCHECK(!identity_); | 
|   313   identity_.reset(static_cast<OpenSSLIdentity*>(identity)); |   323   identity_.reset(static_cast<OpenSSLIdentity*>(identity)); | 
|   314 } |   324 } | 
|   315  |   325  | 
|   316 void OpenSSLAdapter::SetRole(SSLRole role) { |   326 void OpenSSLAdapter::SetRole(SSLRole role) { | 
|   317   role_ = role; |   327   role_ = role; | 
|   318 } |   328 } | 
|   319  |   329  | 
|   320 AsyncSocket* OpenSSLAdapter::Accept(SocketAddress* paddr) { |   330 AsyncSocket* OpenSSLAdapter::Accept(SocketAddress* paddr) { | 
|   321   RTC_DCHECK(role_ == SSL_SERVER); |   331   RTC_DCHECK(role_ == SSL_SERVER); | 
|   322   AsyncSocket* socket = SSLAdapter::Accept(paddr); |   332   AsyncSocket* socket = SSLAdapter::Accept(paddr); | 
|   323   if (!socket) { |   333   if (!socket) { | 
|   324     return nullptr; |   334     return nullptr; | 
|   325   } |   335   } | 
|   326  |   336  | 
|   327   SSLAdapter* adapter = SSLAdapter::Create(socket); |   337   SSLAdapter* adapter = SSLAdapter::Create(socket); | 
|   328   adapter->SetIdentity(identity_->GetReference()); |   338   adapter->SetIdentity(identity_->GetReference()); | 
|   329   adapter->SetRole(rtc::SSL_SERVER); |   339   adapter->SetRole(rtc::SSL_SERVER); | 
|   330   adapter->set_ignore_bad_cert(ignore_bad_cert()); |   340   adapter->SetIgnoreBadCert(ignore_bad_cert_); | 
|   331   adapter->StartSSL("", false); |   341   adapter->StartSSL("", false); | 
|   332   return adapter; |   342   return adapter; | 
|   333 } |   343 } | 
|   334  |   344  | 
|   335 int OpenSSLAdapter::StartSSL(const char* hostname, bool restartable) { |   345 int OpenSSLAdapter::StartSSL(const char* hostname, bool restartable) { | 
|   336   if (state_ != SSL_NONE) |   346   if (state_ != SSL_NONE) | 
|   337     return -1; |   347     return -1; | 
|   338  |   348  | 
|   339   ssl_host_name_ = hostname; |   349   ssl_host_name_ = hostname; | 
|   340   restartable_ = restartable; |   350   restartable_ = restartable; | 
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   417           goto ssl_error; |   427           goto ssl_error; | 
|   418         } |   428         } | 
|   419  |   429  | 
|   420         LOG(LS_INFO) << "Attempting to resume SSL session to " |   430         LOG(LS_INFO) << "Attempting to resume SSL session to " | 
|   421                      << ssl_host_name_; |   431                      << ssl_host_name_; | 
|   422       } |   432       } | 
|   423     } |   433     } | 
|   424   } |   434   } | 
|   425  |   435  | 
|   426   // Set a couple common TLS extensions; even though we don't use them yet. |   436   // Set a couple common TLS extensions; even though we don't use them yet. | 
|   427   // TODO(emadomara) Add ALPN extension. |  | 
|   428   SSL_enable_ocsp_stapling(ssl_); |   437   SSL_enable_ocsp_stapling(ssl_); | 
|   429   SSL_enable_signed_cert_timestamps(ssl_); |   438   SSL_enable_signed_cert_timestamps(ssl_); | 
|   430  |   439  | 
 |   440   if (!alpn_protocols_.empty()) { | 
 |   441     std::string tls_alpn_string = TransformAlpnProtocols(alpn_protocols_); | 
 |   442     if (!tls_alpn_string.empty()) { | 
 |   443       SSL_set_alpn_protos(ssl_, | 
 |   444         reinterpret_cast<const unsigned char *>(tls_alpn_string.data()), | 
 |   445         tls_alpn_string.size()); | 
 |   446     } | 
 |   447   } | 
 |   448  | 
|   431   // Now that the initial config is done, transfer ownership of |bio| to the |   449   // Now that the initial config is done, transfer ownership of |bio| to the | 
|   432   // SSL object. If ContinueSSL() fails, the bio will be freed in Cleanup(). |   450   // SSL object. If ContinueSSL() fails, the bio will be freed in Cleanup(). | 
|   433   SSL_set_bio(ssl_, bio, bio); |   451   SSL_set_bio(ssl_, bio, bio); | 
|   434   bio = nullptr; |   452   bio = nullptr; | 
|   435  |   453  | 
|   436   // Do the connect. |   454   // Do the connect. | 
|   437   err = ContinueSSL(); |   455   err = ContinueSSL(); | 
|   438   if (err != 0) |   456   if (err != 0) | 
|   439     goto ssl_error; |   457     goto ssl_error; | 
|   440  |   458  | 
| (...skipping 479 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   920   if (!ok && ignore_bad_cert) { |   938   if (!ok && ignore_bad_cert) { | 
|   921     LOG(LS_WARNING) << "TLS certificate check FAILED.  " |   939     LOG(LS_WARNING) << "TLS certificate check FAILED.  " | 
|   922       << "Allowing connection anyway."; |   940       << "Allowing connection anyway."; | 
|   923     ok = true; |   941     ok = true; | 
|   924   } |   942   } | 
|   925  |   943  | 
|   926   return ok; |   944   return ok; | 
|   927 } |   945 } | 
|   928  |   946  | 
|   929 bool OpenSSLAdapter::SSLPostConnectionCheck(SSL* ssl, const char* host) { |   947 bool OpenSSLAdapter::SSLPostConnectionCheck(SSL* ssl, const char* host) { | 
|   930   bool ok = VerifyServerName(ssl, host, ignore_bad_cert()); |   948   bool ok = VerifyServerName(ssl, host, ignore_bad_cert_); | 
|   931  |   949  | 
|   932   if (ok) { |   950   if (ok) { | 
|   933     ok = (SSL_get_verify_result(ssl) == X509_V_OK || |   951     ok = (SSL_get_verify_result(ssl) == X509_V_OK || | 
|   934           custom_verification_succeeded_); |   952           custom_verification_succeeded_); | 
|   935   } |   953   } | 
|   936  |   954  | 
|   937   if (!ok && ignore_bad_cert()) { |   955   if (!ok && ignore_bad_cert_) { | 
|   938     LOG(LS_INFO) << "Other TLS post connection checks failed."; |   956     LOG(LS_INFO) << "Other TLS post connection checks failed."; | 
|   939     ok = true; |   957     ok = true; | 
|   940   } |   958   } | 
|   941  |   959  | 
|   942   return ok; |   960   return ok; | 
|   943 } |   961 } | 
|   944  |   962  | 
|   945 #if !defined(NDEBUG) |   963 #if !defined(NDEBUG) | 
|   946  |   964  | 
|   947 // We only use this for tracing and so it is only needed in debug mode |   965 // We only use this for tracing and so it is only needed in debug mode | 
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1002     void* cert = |  1020     void* cert = | 
|  1003         reinterpret_cast<void*>(X509_STORE_CTX_get_current_cert(store)); |  1021         reinterpret_cast<void*>(X509_STORE_CTX_get_current_cert(store)); | 
|  1004     if (custom_verify_callback_(cert)) { |  1022     if (custom_verify_callback_(cert)) { | 
|  1005       stream->custom_verification_succeeded_ = true; |  1023       stream->custom_verification_succeeded_ = true; | 
|  1006       LOG(LS_INFO) << "validated certificate using custom callback"; |  1024       LOG(LS_INFO) << "validated certificate using custom callback"; | 
|  1007       ok = true; |  1025       ok = true; | 
|  1008     } |  1026     } | 
|  1009   } |  1027   } | 
|  1010  |  1028  | 
|  1011   // Should only be used for debugging and development. |  1029   // Should only be used for debugging and development. | 
|  1012   if (!ok && stream->ignore_bad_cert()) { |  1030   if (!ok && stream->ignore_bad_cert_) { | 
|  1013     LOG(LS_WARNING) << "Ignoring cert error while verifying cert chain"; |  1031     LOG(LS_WARNING) << "Ignoring cert error while verifying cert chain"; | 
|  1014     ok = 1; |  1032     ok = 1; | 
|  1015   } |  1033   } | 
|  1016  |  1034  | 
|  1017   return ok; |  1035   return ok; | 
|  1018 } |  1036 } | 
|  1019  |  1037  | 
|  1020 int OpenSSLAdapter::NewSSLSessionCallback(SSL* ssl, SSL_SESSION* session) { |  1038 int OpenSSLAdapter::NewSSLSessionCallback(SSL* ssl, SSL_SESSION* session) { | 
|  1021   OpenSSLAdapter* stream = |  1039   OpenSSLAdapter* stream = | 
|  1022       reinterpret_cast<OpenSSLAdapter*>(SSL_get_app_data(ssl)); |  1040       reinterpret_cast<OpenSSLAdapter*>(SSL_get_app_data(ssl)); | 
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1089   } |  1107   } | 
|  1090  |  1108  | 
|  1091   if (enable_cache) { |  1109   if (enable_cache) { | 
|  1092     SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_CLIENT); |  1110     SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_CLIENT); | 
|  1093     SSL_CTX_sess_set_new_cb(ctx, &OpenSSLAdapter::NewSSLSessionCallback); |  1111     SSL_CTX_sess_set_new_cb(ctx, &OpenSSLAdapter::NewSSLSessionCallback); | 
|  1094   } |  1112   } | 
|  1095  |  1113  | 
|  1096   return ctx; |  1114   return ctx; | 
|  1097 } |  1115 } | 
|  1098  |  1116  | 
 |  1117 std::string TransformAlpnProtocols( | 
 |  1118     const std::vector<std::string>& alpn_protocols) { | 
 |  1119   // Transforms the alpn_protocols list to the format expected by | 
 |  1120   // Open/BoringSSL. This requires joining the protocols into a single string | 
 |  1121   // and prepending a character with the size of the protocol string before | 
 |  1122   // each protocol. | 
 |  1123   std::string transformed_alpn; | 
 |  1124   for (const std::string& proto : alpn_protocols) { | 
 |  1125     if (proto.size() == 0 || proto.size() > 0xFF) { | 
 |  1126       LOG(LS_ERROR) << "OpenSSLAdapter::Error(" | 
 |  1127                     << "TransformAlpnProtocols received proto with size " | 
 |  1128                     << proto.size() << ")"; | 
 |  1129       return ""; | 
 |  1130     } | 
 |  1131     transformed_alpn += static_cast<char>(proto.size()); | 
 |  1132     transformed_alpn += proto; | 
 |  1133     LOG(LS_VERBOSE) << "TransformAlpnProtocols: Adding proto: " << proto; | 
 |  1134   } | 
 |  1135   return transformed_alpn; | 
 |  1136 } | 
 |  1137  | 
|  1099 ////////////////////////////////////////////////////////////////////// |  1138 ////////////////////////////////////////////////////////////////////// | 
|  1100 // OpenSSLAdapterFactory |  1139 // OpenSSLAdapterFactory | 
|  1101 ////////////////////////////////////////////////////////////////////// |  1140 ////////////////////////////////////////////////////////////////////// | 
|  1102  |  1141  | 
|  1103 OpenSSLAdapterFactory::OpenSSLAdapterFactory() |  1142 OpenSSLAdapterFactory::OpenSSLAdapterFactory() | 
|  1104     : ssl_mode_(SSL_MODE_TLS), ssl_ctx_(nullptr) {} |  1143     : ssl_mode_(SSL_MODE_TLS), ssl_ctx_(nullptr) {} | 
|  1105  |  1144  | 
|  1106 OpenSSLAdapterFactory::~OpenSSLAdapterFactory() { |  1145 OpenSSLAdapterFactory::~OpenSSLAdapterFactory() { | 
|  1107   for (auto it : sessions_) { |  1146   for (auto it : sessions_) { | 
|  1108     SSL_SESSION_free(it.second); |  1147     SSL_SESSION_free(it.second); | 
| (...skipping 24 matching lines...) Expand all  Loading... | 
|  1133 } |  1172 } | 
|  1134  |  1173  | 
|  1135 void OpenSSLAdapterFactory::AddSession(const std::string& hostname, |  1174 void OpenSSLAdapterFactory::AddSession(const std::string& hostname, | 
|  1136                                        SSL_SESSION* new_session) { |  1175                                        SSL_SESSION* new_session) { | 
|  1137   SSL_SESSION* old_session = LookupSession(hostname); |  1176   SSL_SESSION* old_session = LookupSession(hostname); | 
|  1138   SSL_SESSION_free(old_session); |  1177   SSL_SESSION_free(old_session); | 
|  1139   sessions_[hostname] = new_session; |  1178   sessions_[hostname] = new_session; | 
|  1140 } |  1179 } | 
|  1141  |  1180  | 
|  1142 } // namespace rtc |  1181 } // namespace rtc | 
| OLD | NEW |