| 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 16 matching lines...) Expand all Loading... |
| 27 | 27 |
| 28 #include "webrtc/base/common.h" | 28 #include "webrtc/base/common.h" |
| 29 #include "webrtc/base/logging.h" | 29 #include "webrtc/base/logging.h" |
| 30 #include "webrtc/base/safe_conversions.h" | 30 #include "webrtc/base/safe_conversions.h" |
| 31 #include "webrtc/base/stream.h" | 31 #include "webrtc/base/stream.h" |
| 32 #include "webrtc/base/openssl.h" | 32 #include "webrtc/base/openssl.h" |
| 33 #include "webrtc/base/openssladapter.h" | 33 #include "webrtc/base/openssladapter.h" |
| 34 #include "webrtc/base/openssldigest.h" | 34 #include "webrtc/base/openssldigest.h" |
| 35 #include "webrtc/base/opensslidentity.h" | 35 #include "webrtc/base/opensslidentity.h" |
| 36 #include "webrtc/base/stringutils.h" | 36 #include "webrtc/base/stringutils.h" |
| 37 #include "webrtc/base/timeutils.h" |
| 37 #include "webrtc/base/thread.h" | 38 #include "webrtc/base/thread.h" |
| 38 | 39 |
| 39 namespace rtc { | 40 namespace rtc { |
| 40 | 41 |
| 41 #if (OPENSSL_VERSION_NUMBER >= 0x10001000L) | 42 #if (OPENSSL_VERSION_NUMBER >= 0x10001000L) |
| 42 #define HAVE_DTLS_SRTP | 43 #define HAVE_DTLS_SRTP |
| 43 #endif | 44 #endif |
| 44 | 45 |
| 45 #ifdef HAVE_DTLS_SRTP | 46 #ifdef HAVE_DTLS_SRTP |
| 46 // SRTP cipher suite table. |internal_name| is used to construct a | 47 // SRTP cipher suite table. |internal_name| is used to construct a |
| 47 // colon-separated profile strings which is needed by | 48 // colon-separated profile strings which is needed by |
| 48 // SSL_CTX_set_tlsext_use_srtp(). | 49 // SSL_CTX_set_tlsext_use_srtp(). |
| 49 struct SrtpCipherMapEntry { | 50 struct SrtpCipherMapEntry { |
| 50 const char* internal_name; | 51 const char* internal_name; |
| 51 const int id; | 52 const int id; |
| 52 }; | 53 }; |
| 53 | 54 |
| 54 // This isn't elegant, but it's better than an external reference | 55 // This isn't elegant, but it's better than an external reference |
| 55 static SrtpCipherMapEntry SrtpCipherMap[] = { | 56 static SrtpCipherMapEntry SrtpCipherMap[] = { |
| 56 {"SRTP_AES128_CM_SHA1_80", SRTP_AES128_CM_SHA1_80}, | 57 {"SRTP_AES128_CM_SHA1_80", SRTP_AES128_CM_SHA1_80}, |
| 57 {"SRTP_AES128_CM_SHA1_32", SRTP_AES128_CM_SHA1_32}, | 58 {"SRTP_AES128_CM_SHA1_32", SRTP_AES128_CM_SHA1_32}, |
| 58 {nullptr, 0}}; | 59 {nullptr, 0}}; |
| 59 #endif | 60 #endif |
| 60 | 61 |
| 61 #ifndef OPENSSL_IS_BORINGSSL | 62 #ifdef OPENSSL_IS_BORINGSSL |
| 63 static void TimeCallback(const SSL* ssl, struct timeval* out_clock) { |
| 64 uint64_t time = TimeNanos(); |
| 65 out_clock->tv_sec = time / kNumNanosecsPerSec; |
| 66 out_clock->tv_usec = time / kNumNanosecsPerMicrosec; |
| 67 } |
| 68 #else // #ifdef OPENSSL_IS_BORINGSSL |
| 62 | 69 |
| 63 // Cipher name table. Maps internal OpenSSL cipher ids to the RFC name. | 70 // Cipher name table. Maps internal OpenSSL cipher ids to the RFC name. |
| 64 struct SslCipherMapEntry { | 71 struct SslCipherMapEntry { |
| 65 uint32_t openssl_id; | 72 uint32_t openssl_id; |
| 66 const char* rfc_name; | 73 const char* rfc_name; |
| 67 }; | 74 }; |
| 68 | 75 |
| 69 #define DEFINE_CIPHER_ENTRY_SSL3(name) {SSL3_CK_##name, "TLS_"#name} | 76 #define DEFINE_CIPHER_ENTRY_SSL3(name) {SSL3_CK_##name, "TLS_"#name} |
| 70 #define DEFINE_CIPHER_ENTRY_TLS1(name) {TLS1_CK_##name, "TLS_"#name} | 77 #define DEFINE_CIPHER_ENTRY_TLS1(name) {TLS1_CK_##name, "TLS_"#name} |
| 71 | 78 |
| (...skipping 692 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 764 | 771 |
| 765 ssl_ = SSL_new(ssl_ctx_); | 772 ssl_ = SSL_new(ssl_ctx_); |
| 766 if (!ssl_) { | 773 if (!ssl_) { |
| 767 BIO_free(bio); | 774 BIO_free(bio); |
| 768 return -1; | 775 return -1; |
| 769 } | 776 } |
| 770 | 777 |
| 771 SSL_set_app_data(ssl_, this); | 778 SSL_set_app_data(ssl_, this); |
| 772 | 779 |
| 773 SSL_set_bio(ssl_, bio, bio); // the SSL object owns the bio now. | 780 SSL_set_bio(ssl_, bio, bio); // the SSL object owns the bio now. |
| 774 #ifndef OPENSSL_IS_BORINGSSL | |
| 775 if (ssl_mode_ == SSL_MODE_DTLS) { | 781 if (ssl_mode_ == SSL_MODE_DTLS) { |
| 782 #ifdef OPENSSL_IS_BORINGSSL |
| 783 // Change the initial retransmission timer from 1 second to 50ms. |
| 784 // This will likely result in some spurious retransmissions, but |
| 785 // it's useful for ensuring a timely handshake when there's packet |
| 786 // loss. |
| 787 DTLSv1_set_initial_timeout_duration(ssl_, 50); |
| 788 #else |
| 776 // Enable read-ahead for DTLS so whole packets are read from internal BIO | 789 // Enable read-ahead for DTLS so whole packets are read from internal BIO |
| 777 // before parsing. This is done internally by BoringSSL for DTLS. | 790 // before parsing. This is done internally by BoringSSL for DTLS. |
| 778 SSL_set_read_ahead(ssl_, 1); | 791 SSL_set_read_ahead(ssl_, 1); |
| 792 #endif |
| 779 } | 793 } |
| 780 #endif | |
| 781 | 794 |
| 782 SSL_set_mode(ssl_, SSL_MODE_ENABLE_PARTIAL_WRITE | | 795 SSL_set_mode(ssl_, SSL_MODE_ENABLE_PARTIAL_WRITE | |
| 783 SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER); | 796 SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER); |
| 784 | 797 |
| 785 #if !defined(OPENSSL_IS_BORINGSSL) | 798 #if !defined(OPENSSL_IS_BORINGSSL) |
| 786 // Specify an ECDH group for ECDHE ciphers, otherwise OpenSSL cannot | 799 // Specify an ECDH group for ECDHE ciphers, otherwise OpenSSL cannot |
| 787 // negotiate them when acting as the server. Use NIST's P-256 which is | 800 // negotiate them when acting as the server. Use NIST's P-256 which is |
| 788 // commonly supported. BoringSSL doesn't need explicit configuration and has | 801 // commonly supported. BoringSSL doesn't need explicit configuration and has |
| 789 // a reasonable default set. | 802 // a reasonable default set. |
| 790 EC_KEY* ecdh = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1); | 803 EC_KEY* ecdh = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1); |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 978 case SSL_PROTOCOL_TLS_11: | 991 case SSL_PROTOCOL_TLS_11: |
| 979 SSL_CTX_set_max_version(ctx, ssl_mode_ == SSL_MODE_DTLS ? | 992 SSL_CTX_set_max_version(ctx, ssl_mode_ == SSL_MODE_DTLS ? |
| 980 DTLS1_VERSION : TLS1_1_VERSION); | 993 DTLS1_VERSION : TLS1_1_VERSION); |
| 981 break; | 994 break; |
| 982 case SSL_PROTOCOL_TLS_12: | 995 case SSL_PROTOCOL_TLS_12: |
| 983 default: | 996 default: |
| 984 SSL_CTX_set_max_version(ctx, ssl_mode_ == SSL_MODE_DTLS ? | 997 SSL_CTX_set_max_version(ctx, ssl_mode_ == SSL_MODE_DTLS ? |
| 985 DTLS1_2_VERSION : TLS1_2_VERSION); | 998 DTLS1_2_VERSION : TLS1_2_VERSION); |
| 986 break; | 999 break; |
| 987 } | 1000 } |
| 1001 // Set a time callback for BoringSSL because: |
| 1002 // 1. Our time function is more accurate (doesn't just use gettimeofday). |
| 1003 // 2. This allows us to inject a fake clock for testing. |
| 1004 // SSL_CTX_set_current_time_cb(ctx, &TimeCallback); |
| 1005 ctx->current_time_cb = &TimeCallback; |
| 988 #endif | 1006 #endif |
| 989 | 1007 |
| 990 if (identity_ && !identity_->ConfigureIdentity(ctx)) { | 1008 if (identity_ && !identity_->ConfigureIdentity(ctx)) { |
| 991 SSL_CTX_free(ctx); | 1009 SSL_CTX_free(ctx); |
| 992 return NULL; | 1010 return NULL; |
| 993 } | 1011 } |
| 994 | 1012 |
| 995 #if !defined(NDEBUG) | 1013 #if !defined(NDEBUG) |
| 996 SSL_CTX_set_info_callback(ctx, OpenSSLAdapter::SSLInfoCallback); | 1014 SSL_CTX_set_info_callback(ctx, OpenSSLAdapter::SSLInfoCallback); |
| 997 #endif | 1015 #endif |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1120 } | 1138 } |
| 1121 | 1139 |
| 1122 bool OpenSSLStreamAdapter::HaveExporter() { | 1140 bool OpenSSLStreamAdapter::HaveExporter() { |
| 1123 #ifdef HAVE_DTLS_SRTP | 1141 #ifdef HAVE_DTLS_SRTP |
| 1124 return true; | 1142 return true; |
| 1125 #else | 1143 #else |
| 1126 return false; | 1144 return false; |
| 1127 #endif | 1145 #endif |
| 1128 } | 1146 } |
| 1129 | 1147 |
| 1148 bool OpenSSLStreamAdapter::IsBoringSsl() { |
| 1149 #ifdef OPENSSL_IS_BORINGSSL |
| 1150 return true; |
| 1151 #else |
| 1152 return false; |
| 1153 #endif |
| 1154 } |
| 1155 |
| 1130 #define CDEF(X) \ | 1156 #define CDEF(X) \ |
| 1131 { static_cast<uint16_t>(TLS1_CK_##X & 0xffff), "TLS_" #X } | 1157 { static_cast<uint16_t>(TLS1_CK_##X & 0xffff), "TLS_" #X } |
| 1132 | 1158 |
| 1133 struct cipher_list { | 1159 struct cipher_list { |
| 1134 uint16_t cipher; | 1160 uint16_t cipher; |
| 1135 const char* cipher_str; | 1161 const char* cipher_str; |
| 1136 }; | 1162 }; |
| 1137 | 1163 |
| 1138 // TODO(torbjorng): Perhaps add more cipher suites to these lists. | 1164 // TODO(torbjorng): Perhaps add more cipher suites to these lists. |
| 1139 static const cipher_list OK_RSA_ciphers[] = { | 1165 static const cipher_list OK_RSA_ciphers[] = { |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1194 return true; | 1220 return true; |
| 1195 } | 1221 } |
| 1196 } | 1222 } |
| 1197 | 1223 |
| 1198 return false; | 1224 return false; |
| 1199 } | 1225 } |
| 1200 | 1226 |
| 1201 } // namespace rtc | 1227 } // namespace rtc |
| 1202 | 1228 |
| 1203 #endif // HAVE_OPENSSL_SSL_H | 1229 #endif // HAVE_OPENSSL_SSL_H |
| OLD | NEW |