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 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 140 {0, NULL} | 140 {0, NULL} |
| 141 }; | 141 }; |
| 142 #endif // #ifndef OPENSSL_IS_BORINGSSL | 142 #endif // #ifndef OPENSSL_IS_BORINGSSL |
| 143 | 143 |
| 144 #if defined(_MSC_VER) | 144 #if defined(_MSC_VER) |
| 145 #pragma warning(push) | 145 #pragma warning(push) |
| 146 #pragma warning(disable : 4309) | 146 #pragma warning(disable : 4309) |
| 147 #pragma warning(disable : 4310) | 147 #pragma warning(disable : 4310) |
| 148 #endif // defined(_MSC_VER) | 148 #endif // defined(_MSC_VER) |
| 149 | 149 |
| 150 // Default cipher used between OpenSSL/BoringSSL stream adapters. | |
| 151 // This needs to be updated when the default of the SSL library changes. | |
| 152 // static_cast<uint16_t> causes build warnings on windows platform. | |
| 153 static int kDefaultSslCipher10 = | |
| 154 static_cast<uint16_t>(TLS1_CK_ECDHE_RSA_WITH_AES_256_CBC_SHA); | |
| 155 static int kDefaultSslEcCipher10 = | |
| 156 static_cast<uint16_t>(TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CBC_SHA); | |
| 157 #ifdef OPENSSL_IS_BORINGSSL | |
| 158 static int kDefaultSslCipher12 = | |
| 159 static_cast<uint16_t>(TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256); | |
| 160 static int kDefaultSslEcCipher12 = | |
| 161 static_cast<uint16_t>(TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256); | |
| 162 // Fallback cipher for DTLS 1.2 if hardware-accelerated AES-GCM is unavailable. | |
| 163 | |
| 164 #ifdef TLS1_CK_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 | |
| 165 // This ciphersuite was added in boringssl 13414b3a..., changing the fallback | |
| 166 // ciphersuite. For compatibility during a transitional period, support old | |
| 167 // boringssl versions. TODO(torbjorng): Remove this. | |
| 168 static int kDefaultSslCipher12NoAesGcm = | |
| 169 static_cast<uint16_t>(TLS1_CK_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256); | |
| 170 #else | |
| 171 static int kDefaultSslCipher12NoAesGcm = | |
| 172 static_cast<uint16_t>(TLS1_CK_ECDHE_RSA_CHACHA20_POLY1305_OLD); | |
| 173 #endif | |
| 174 | |
| 175 #ifdef TLS1_CK_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 | |
| 176 // This ciphersuite was added in boringssl 13414b3a..., changing the fallback | |
| 177 // ciphersuite. For compatibility during a transitional period, support old | |
| 178 // boringssl versions. TODO(torbjorng): Remove this. | |
| 179 static int kDefaultSslEcCipher12NoAesGcm = | |
| 180 static_cast<uint16_t>(TLS1_CK_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256); | |
| 181 #else | |
| 182 static int kDefaultSslEcCipher12NoAesGcm = | |
| 183 static_cast<uint16_t>(TLS1_CK_ECDHE_ECDSA_CHACHA20_POLY1305_OLD); | |
| 184 #endif | |
| 185 | |
| 186 #else // !OPENSSL_IS_BORINGSSL | |
| 187 // OpenSSL sorts differently than BoringSSL, so the default cipher doesn't | |
| 188 // change between TLS 1.0 and TLS 1.2 with the current setup. | |
| 189 static int kDefaultSslCipher12 = | |
| 190 static_cast<uint16_t>(TLS1_CK_ECDHE_RSA_WITH_AES_256_CBC_SHA); | |
| 191 static int kDefaultSslEcCipher12 = | |
| 192 static_cast<uint16_t>(TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CBC_SHA); | |
| 193 #endif // OPENSSL_IS_BORINGSSL | |
| 194 | |
| 195 #if defined(_MSC_VER) | 150 #if defined(_MSC_VER) |
| 196 #pragma warning(pop) | 151 #pragma warning(pop) |
| 197 #endif // defined(_MSC_VER) | 152 #endif // defined(_MSC_VER) |
| 198 | 153 |
| 199 ////////////////////////////////////////////////////////////////////// | 154 ////////////////////////////////////////////////////////////////////// |
| 200 // StreamBIO | 155 // StreamBIO |
| 201 ////////////////////////////////////////////////////////////////////// | 156 ////////////////////////////////////////////////////////////////////// |
| 202 | 157 |
| 203 static int stream_write(BIO* h, const char* buf, int num); | 158 static int stream_write(BIO* h, const char* buf, int num); |
| 204 static int stream_read(BIO* h, char* buf, int size); | 159 static int stream_read(BIO* h, char* buf, int size); |
| (...skipping 935 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1140 } | 1095 } |
| 1141 | 1096 |
| 1142 bool OpenSSLStreamAdapter::HaveExporter() { | 1097 bool OpenSSLStreamAdapter::HaveExporter() { |
| 1143 #ifdef HAVE_DTLS_SRTP | 1098 #ifdef HAVE_DTLS_SRTP |
| 1144 return true; | 1099 return true; |
| 1145 #else | 1100 #else |
| 1146 return false; | 1101 return false; |
| 1147 #endif | 1102 #endif |
| 1148 } | 1103 } |
| 1149 | 1104 |
| 1150 int OpenSSLStreamAdapter::GetDefaultSslCipherForTest(SSLProtocolVersion version, | 1105 #define CDEF(X) \ |
| 1151 KeyType key_type) { | 1106 { static_cast<uint16_t>(TLS1_CK_##X & 0xffff), "TLS_" #X } |
| 1107 | |
| 1108 struct cipher_list { | |
| 1109 uint16_t cipher; | |
| 1110 const char* cipher_str; | |
| 1111 }; | |
| 1112 | |
| 1113 // TODO(torbjorng): Perhaps add more cipher suites to these lists. | |
| 1114 static const cipher_list OK_RSA_ciphers[] = { | |
| 1115 CDEF(ECDHE_RSA_WITH_AES_128_CBC_SHA), | |
| 1116 CDEF(ECDHE_RSA_WITH_AES_256_CBC_SHA), | |
| 1117 CDEF(ECDHE_RSA_WITH_AES_128_GCM_SHA256), | |
| 1118 #ifdef TLS1_CK_ECDHE_RSA_WITH_AES_256_GCM_SHA256 | |
| 1119 CDEF(ECDHE_RSA_WITH_AES_256_GCM_SHA256), | |
| 1120 #endif | |
| 1121 CDEF(ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256), | |
| 1122 }; | |
| 1123 | |
| 1124 static const cipher_list OK_ECDSA_ciphers[] = { | |
| 1125 CDEF(ECDHE_ECDSA_WITH_AES_128_CBC_SHA), | |
| 1126 CDEF(ECDHE_ECDSA_WITH_AES_256_CBC_SHA), | |
| 1127 CDEF(ECDHE_ECDSA_WITH_AES_128_GCM_SHA256), | |
| 1128 #ifdef TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA256 | |
| 1129 CDEF(ECDHE_ECDSA_WITH_AES_256_GCM_SHA256), | |
| 1130 #endif | |
| 1131 CDEF(ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256), | |
| 1132 }; | |
| 1133 | |
| 1134 bool OpenSSLStreamAdapter::IsAcceptableCipher(int cipher, | |
| 1135 KeyType key_type) { | |
|
davidben_webrtc
2016/03/08 20:29:05
What is the test actually trying to check? Are you
torbjorng (webrtc)
2016/03/09 13:10:31
Mainly I am trying to assert we got a reasonable c
davidben_webrtc
2016/03/09 20:30:26
I think it depends on what you're interested in ch
torbjorng (webrtc)
2016/03/10 21:29:03
Thanks, let's consider that for the future, but st
davidben_webrtc
2016/03/10 21:40:05
Really? I've been under the impression you all nee
| |
| 1152 if (key_type == KT_RSA) { | 1136 if (key_type == KT_RSA) { |
| 1153 switch (version) { | 1137 for (const cipher_list &c : OK_RSA_ciphers) { |
| 1154 case SSL_PROTOCOL_TLS_10: | 1138 if (cipher == c.cipher) |
| 1155 case SSL_PROTOCOL_TLS_11: | 1139 return true; |
| 1156 return kDefaultSslCipher10; | |
| 1157 case SSL_PROTOCOL_TLS_12: | |
| 1158 default: | |
| 1159 #ifdef OPENSSL_IS_BORINGSSL | |
| 1160 if (EVP_has_aes_hardware()) { | |
| 1161 return kDefaultSslCipher12; | |
| 1162 } else { | |
| 1163 return kDefaultSslCipher12NoAesGcm; | |
| 1164 } | |
| 1165 #else // !OPENSSL_IS_BORINGSSL | |
| 1166 return kDefaultSslCipher12; | |
| 1167 #endif | |
| 1168 } | 1140 } |
| 1169 } else if (key_type == KT_ECDSA) { | 1141 } |
| 1170 switch (version) { | 1142 |
| 1171 case SSL_PROTOCOL_TLS_10: | 1143 if (key_type == KT_ECDSA) { |
| 1172 case SSL_PROTOCOL_TLS_11: | 1144 for (const cipher_list &c : OK_ECDSA_ciphers) { |
| 1173 return kDefaultSslEcCipher10; | 1145 if (cipher == c.cipher) |
| 1174 case SSL_PROTOCOL_TLS_12: | 1146 return true; |
| 1175 default: | |
| 1176 #ifdef OPENSSL_IS_BORINGSSL | |
| 1177 if (EVP_has_aes_hardware()) { | |
| 1178 return kDefaultSslEcCipher12; | |
| 1179 } else { | |
| 1180 return kDefaultSslEcCipher12NoAesGcm; | |
| 1181 } | |
| 1182 #else // !OPENSSL_IS_BORINGSSL | |
| 1183 return kDefaultSslEcCipher12; | |
| 1184 #endif | |
| 1185 } | 1147 } |
| 1186 } else { | |
| 1187 RTC_NOTREACHED(); | |
| 1188 return kDefaultSslEcCipher12; | |
| 1189 } | 1148 } |
| 1149 | |
| 1150 // TODO(torbjorng): Remove before landing. | |
| 1151 LOG(LS_ERROR) << "Attempted use of truly terrible cipher suite: " | |
| 1152 << OpenSSLStreamAdapter::SslCipherSuiteToName(cipher) << "(" | |
| 1153 << cipher << ")"; | |
| 1154 return false; | |
| 1155 } | |
| 1156 | |
| 1157 bool OpenSSLStreamAdapter::IsAcceptableCipher(std::string cipher, | |
| 1158 KeyType key_type) { | |
| 1159 if (key_type == KT_RSA) { | |
| 1160 for (const cipher_list &c : OK_RSA_ciphers) { | |
| 1161 if (cipher == c.cipher_str) | |
| 1162 return true; | |
| 1163 } | |
| 1164 } | |
| 1165 | |
| 1166 if (key_type == KT_ECDSA) { | |
| 1167 for (const cipher_list &c : OK_ECDSA_ciphers) { | |
| 1168 if (cipher == c.cipher_str) | |
| 1169 return true; | |
| 1170 } | |
| 1171 } | |
| 1172 | |
| 1173 // TODO(torbjorng): Remove before landing. | |
| 1174 LOG(LS_ERROR) << "Attempted use of truly terrible cipher suite: " << cipher; | |
| 1175 return false; | |
| 1190 } | 1176 } |
| 1191 | 1177 |
| 1192 } // namespace rtc | 1178 } // namespace rtc |
| 1193 | 1179 |
| 1194 #endif // HAVE_OPENSSL_SSL_H | 1180 #endif // HAVE_OPENSSL_SSL_H |
| OLD | NEW |