| 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 20 matching lines...) Expand all  Loading... | 
|    31 #include "rtc_base/openssldigest.h" |    31 #include "rtc_base/openssldigest.h" | 
|    32 #include "rtc_base/opensslidentity.h" |    32 #include "rtc_base/opensslidentity.h" | 
|    33 #include "rtc_base/safe_conversions.h" |    33 #include "rtc_base/safe_conversions.h" | 
|    34 #include "rtc_base/stream.h" |    34 #include "rtc_base/stream.h" | 
|    35 #include "rtc_base/stringutils.h" |    35 #include "rtc_base/stringutils.h" | 
|    36 #include "rtc_base/thread.h" |    36 #include "rtc_base/thread.h" | 
|    37 #include "rtc_base/timeutils.h" |    37 #include "rtc_base/timeutils.h" | 
|    38  |    38  | 
|    39 namespace { |    39 namespace { | 
|    40   bool g_use_time_callback_for_testing = false; |    40   bool g_use_time_callback_for_testing = false; | 
 |    41   const int kMaxSupportedCertChainDepth = 3; | 
|    41 } |    42 } | 
|    42  |    43  | 
|    43 namespace rtc { |    44 namespace rtc { | 
|    44  |    45  | 
|    45 #if (OPENSSL_VERSION_NUMBER < 0x10001000L) |    46 #if (OPENSSL_VERSION_NUMBER < 0x10001000L) | 
|    46 #error "webrtc requires at least OpenSSL version 1.0.1, to support DTLS-SRTP" |    47 #error "webrtc requires at least OpenSSL version 1.0.1, to support DTLS-SRTP" | 
|    47 #endif |    48 #endif | 
|    48  |    49  | 
|    49 // SRTP cipher suite table. |internal_name| is used to construct a |    50 // SRTP cipher suite table. |internal_name| is used to construct a | 
|    50 // colon-separated profile strings which is needed by |    51 // colon-separated profile strings which is needed by | 
| (...skipping 1054 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1105 int OpenSSLStreamAdapter::SSLVerifyCallback(int ok, X509_STORE_CTX* store) { |  1106 int OpenSSLStreamAdapter::SSLVerifyCallback(int ok, X509_STORE_CTX* store) { | 
|  1106   // Get our SSL structure from the store |  1107   // Get our SSL structure from the store | 
|  1107   SSL* ssl = reinterpret_cast<SSL*>( |  1108   SSL* ssl = reinterpret_cast<SSL*>( | 
|  1108       X509_STORE_CTX_get_ex_data(store, SSL_get_ex_data_X509_STORE_CTX_idx())); |  1109       X509_STORE_CTX_get_ex_data(store, SSL_get_ex_data_X509_STORE_CTX_idx())); | 
|  1109   X509* cert = X509_STORE_CTX_get_current_cert(store); |  1110   X509* cert = X509_STORE_CTX_get_current_cert(store); | 
|  1110   int depth = X509_STORE_CTX_get_error_depth(store); |  1111   int depth = X509_STORE_CTX_get_error_depth(store); | 
|  1111  |  1112  | 
|  1112   // For now we ignore the parent certificates and verify the leaf against |  1113   // For now we ignore the parent certificates and verify the leaf against | 
|  1113   // the digest. |  1114   // the digest. | 
|  1114   // |  1115   // | 
|  1115   // TODO(jiayl): Verify the chain is a proper chain and report the chain to |  | 
|  1116   // |stream->peer_certificate_|. |  | 
|  1117   if (depth > 0) { |  | 
|  1118     LOG(LS_INFO) << "Ignored chained certificate at depth " << depth; |  | 
|  1119     return 1; |  | 
|  1120   } |  | 
|  1121  |  1116  | 
|  1122   OpenSSLStreamAdapter* stream = |  1117   OpenSSLStreamAdapter* stream = | 
|  1123       reinterpret_cast<OpenSSLStreamAdapter*>(SSL_get_app_data(ssl)); |  1118       reinterpret_cast<OpenSSLStreamAdapter*>(SSL_get_app_data(ssl)); | 
|  1124  |  1119  | 
|  1125   // Record the peer's certificate. |  1120   STACK_OF(X509)* chain = X509_STORE_CTX_get_chain(store); | 
|  1126   stream->peer_certificate_.reset(new OpenSSLCertificate(cert)); |  1121   if (sk_X509_num(chain) >= kMaxSupportedCertChainDepth) { | 
 |  1122     LOG(LS_INFO) << "Ignore chained certificate at depth " << depth; | 
 |  1123     return 1; | 
 |  1124   } | 
 |  1125   stream->peer_certificate_.reset(new OpenSSLCertificate(chain)); | 
|  1127  |  1126  | 
|  1128   // If the peer certificate digest isn't known yet, we'll wait to verify |  1127   // If the peer certificate digest isn't known yet, we'll wait to verify | 
|  1129   // until it's known, and for now just return a success status. |  1128   // until it's known, and for now just return a success status. | 
|  1130   if (stream->peer_certificate_digest_algorithm_.empty()) { |  1129   if (stream->peer_certificate_digest_algorithm_.empty()) { | 
|  1131     LOG(LS_INFO) << "Waiting to verify certificate until digest is known."; |  1130     LOG(LS_INFO) << "Waiting to verify certificate until digest is known."; | 
|  1132     return 1; |  1131     return 1; | 
|  1133   } |  1132   } | 
|  1134  |  1133  | 
|  1135   return stream->VerifyPeerCertificate(); |  1134   return stream->VerifyPeerCertificate(); | 
|  1136 } |  1135 } | 
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1212   } |  1211   } | 
|  1213  |  1212  | 
|  1214   return false; |  1213   return false; | 
|  1215 } |  1214 } | 
|  1216  |  1215  | 
|  1217 void OpenSSLStreamAdapter::enable_time_callback_for_testing() { |  1216 void OpenSSLStreamAdapter::enable_time_callback_for_testing() { | 
|  1218   g_use_time_callback_for_testing = true; |  1217   g_use_time_callback_for_testing = true; | 
|  1219 } |  1218 } | 
|  1220  |  1219  | 
|  1221 }  // namespace rtc |  1220 }  // namespace rtc | 
| OLD | NEW |