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 |