Index: webrtc/base/opensslstreamadapter.cc |
diff --git a/webrtc/base/opensslstreamadapter.cc b/webrtc/base/opensslstreamadapter.cc |
index b2afebb75be6c32e0b770349fde2b4d8180e8f66..3e911987e556764292183ce02f98f875b853ff8a 100644 |
--- a/webrtc/base/opensslstreamadapter.cc |
+++ b/webrtc/base/opensslstreamadapter.cc |
@@ -147,51 +147,6 @@ static const SslCipherMapEntry kSslCipherMap[] = { |
#pragma warning(disable : 4310) |
#endif // defined(_MSC_VER) |
-// Default cipher used between OpenSSL/BoringSSL stream adapters. |
-// This needs to be updated when the default of the SSL library changes. |
-// static_cast<uint16_t> causes build warnings on windows platform. |
-static int kDefaultSslCipher10 = |
- static_cast<uint16_t>(TLS1_CK_ECDHE_RSA_WITH_AES_256_CBC_SHA); |
-static int kDefaultSslEcCipher10 = |
- static_cast<uint16_t>(TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CBC_SHA); |
-#ifdef OPENSSL_IS_BORINGSSL |
-static int kDefaultSslCipher12 = |
- static_cast<uint16_t>(TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256); |
-static int kDefaultSslEcCipher12 = |
- static_cast<uint16_t>(TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256); |
-// Fallback cipher for DTLS 1.2 if hardware-accelerated AES-GCM is unavailable. |
- |
-#ifdef TLS1_CK_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 |
-// This ciphersuite was added in boringssl 13414b3a..., changing the fallback |
-// ciphersuite. For compatibility during a transitional period, support old |
-// boringssl versions. TODO(torbjorng): Remove this. |
-static int kDefaultSslCipher12NoAesGcm = |
- static_cast<uint16_t>(TLS1_CK_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256); |
-#else |
-static int kDefaultSslCipher12NoAesGcm = |
- static_cast<uint16_t>(TLS1_CK_ECDHE_RSA_CHACHA20_POLY1305_OLD); |
-#endif |
- |
-#ifdef TLS1_CK_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 |
-// This ciphersuite was added in boringssl 13414b3a..., changing the fallback |
-// ciphersuite. For compatibility during a transitional period, support old |
-// boringssl versions. TODO(torbjorng): Remove this. |
-static int kDefaultSslEcCipher12NoAesGcm = |
- static_cast<uint16_t>(TLS1_CK_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256); |
-#else |
-static int kDefaultSslEcCipher12NoAesGcm = |
- static_cast<uint16_t>(TLS1_CK_ECDHE_ECDSA_CHACHA20_POLY1305_OLD); |
-#endif |
- |
-#else // !OPENSSL_IS_BORINGSSL |
-// OpenSSL sorts differently than BoringSSL, so the default cipher doesn't |
-// change between TLS 1.0 and TLS 1.2 with the current setup. |
-static int kDefaultSslCipher12 = |
- static_cast<uint16_t>(TLS1_CK_ECDHE_RSA_WITH_AES_256_CBC_SHA); |
-static int kDefaultSslEcCipher12 = |
- static_cast<uint16_t>(TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CBC_SHA); |
-#endif // OPENSSL_IS_BORINGSSL |
- |
#if defined(_MSC_VER) |
#pragma warning(pop) |
#endif // defined(_MSC_VER) |
@@ -404,6 +359,28 @@ bool OpenSSLStreamAdapter::GetSslCipherSuite(int* cipher_suite) { |
return true; |
} |
+int OpenSSLStreamAdapter::GetSslVersion() const { |
+ if (state_ != SSL_CONNECTED) |
+ return -1; |
+ |
+ int ssl_version = SSL_version(ssl_); |
+ if (ssl_mode_ == SSL_MODE_DTLS) { |
+ if (ssl_version == DTLS1_VERSION) |
+ return SSL_PROTOCOL_DTLS_10; |
+ else if (ssl_version == DTLS1_2_VERSION) |
+ return SSL_PROTOCOL_DTLS_12; |
+ } else { |
+ if (ssl_version == TLS1_VERSION) |
+ return SSL_PROTOCOL_TLS_10; |
+ else if (ssl_version == TLS1_1_VERSION) |
+ return SSL_PROTOCOL_TLS_11; |
+ else if (ssl_version == TLS1_2_VERSION) |
+ return SSL_PROTOCOL_TLS_12; |
+ } |
+ |
+ return -1; |
+} |
+ |
// Key Extractor interface |
bool OpenSSLStreamAdapter::ExportKeyingMaterial(const std::string& label, |
const uint8_t* context, |
@@ -1147,46 +1124,71 @@ bool OpenSSLStreamAdapter::HaveExporter() { |
#endif |
} |
-int OpenSSLStreamAdapter::GetDefaultSslCipherForTest(SSLProtocolVersion version, |
- KeyType key_type) { |
- if (key_type == KT_RSA) { |
- switch (version) { |
- case SSL_PROTOCOL_TLS_10: |
- case SSL_PROTOCOL_TLS_11: |
- return kDefaultSslCipher10; |
- case SSL_PROTOCOL_TLS_12: |
- default: |
-#ifdef OPENSSL_IS_BORINGSSL |
- if (EVP_has_aes_hardware()) { |
- return kDefaultSslCipher12; |
- } else { |
- return kDefaultSslCipher12NoAesGcm; |
- } |
-#else // !OPENSSL_IS_BORINGSSL |
- return kDefaultSslCipher12; |
+#define CDEF(X) \ |
+ { static_cast<uint16_t>(TLS1_CK_##X & 0xffff), "TLS_" #X } |
+ |
+struct cipher_list { |
+ uint16_t cipher; |
+ const char* cipher_str; |
+}; |
+ |
+// TODO(torbjorng): Perhaps add more cipher suites to these lists. |
+static const cipher_list OK_RSA_ciphers[] = { |
+ CDEF(ECDHE_RSA_WITH_AES_128_CBC_SHA), |
+ CDEF(ECDHE_RSA_WITH_AES_256_CBC_SHA), |
+ CDEF(ECDHE_RSA_WITH_AES_128_GCM_SHA256), |
+#ifdef TLS1_CK_ECDHE_RSA_WITH_AES_256_GCM_SHA256 |
+ CDEF(ECDHE_RSA_WITH_AES_256_GCM_SHA256), |
#endif |
- } |
- } else if (key_type == KT_ECDSA) { |
- switch (version) { |
- case SSL_PROTOCOL_TLS_10: |
- case SSL_PROTOCOL_TLS_11: |
- return kDefaultSslEcCipher10; |
- case SSL_PROTOCOL_TLS_12: |
- default: |
-#ifdef OPENSSL_IS_BORINGSSL |
- if (EVP_has_aes_hardware()) { |
- return kDefaultSslEcCipher12; |
- } else { |
- return kDefaultSslEcCipher12NoAesGcm; |
- } |
-#else // !OPENSSL_IS_BORINGSSL |
- return kDefaultSslEcCipher12; |
+ CDEF(ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256), |
+}; |
+ |
+static const cipher_list OK_ECDSA_ciphers[] = { |
+ CDEF(ECDHE_ECDSA_WITH_AES_128_CBC_SHA), |
+ CDEF(ECDHE_ECDSA_WITH_AES_256_CBC_SHA), |
+ CDEF(ECDHE_ECDSA_WITH_AES_128_GCM_SHA256), |
+#ifdef TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA256 |
+ CDEF(ECDHE_ECDSA_WITH_AES_256_GCM_SHA256), |
#endif |
+ CDEF(ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256), |
+}; |
+#undef CDEF |
+ |
+bool OpenSSLStreamAdapter::IsAcceptableCipher(int cipher, KeyType key_type) { |
+ if (key_type == KT_RSA) { |
+ for (const cipher_list& c : OK_RSA_ciphers) { |
+ if (cipher == c.cipher) |
+ return true; |
+ } |
+ } |
+ |
+ if (key_type == KT_ECDSA) { |
+ for (const cipher_list& c : OK_ECDSA_ciphers) { |
+ if (cipher == c.cipher) |
+ return true; |
} |
- } else { |
- RTC_NOTREACHED(); |
- return kDefaultSslEcCipher12; |
} |
+ |
+ return false; |
+} |
+ |
+bool OpenSSLStreamAdapter::IsAcceptableCipher(const std::string& cipher, |
+ KeyType key_type) { |
+ if (key_type == KT_RSA) { |
+ for (const cipher_list& c : OK_RSA_ciphers) { |
+ if (cipher == c.cipher_str) |
+ return true; |
+ } |
+ } |
+ |
+ if (key_type == KT_ECDSA) { |
+ for (const cipher_list& c : OK_ECDSA_ciphers) { |
+ if (cipher == c.cipher_str) |
+ return true; |
+ } |
+ } |
+ |
+ return false; |
} |
} // namespace rtc |