Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(593)

Unified Diff: net/url_request/url_request_unittest.cc

Issue 619463002: net: disable SSLv3 fallback. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix debug crash in tests. Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/ssl/ssl_config.cc ('k') | tools/metrics/histograms/histograms.xml » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/url_request/url_request_unittest.cc
diff --git a/net/url_request/url_request_unittest.cc b/net/url_request/url_request_unittest.cc
index e269f01453c3e88005c0c90a865294834cf1fdbd..0f64a7c2d8f4b3f2ebf8855d1d3ee8025ce8e180 100644
--- a/net/url_request/url_request_unittest.cc
+++ b/net/url_request/url_request_unittest.cc
@@ -6936,6 +6936,28 @@ TEST_F(HTTPSRequestTest, ResumeTest) {
}
}
+// AssertTwoDistinctSessionsInserted checks that |session_info|, which must be
+// the result of fetching "ssl-session-cache" from the test server, indicates
+// that exactly two different sessions were inserted, with no lookups etc.
+static void AssertTwoDistinctSessionsInserted(const string& session_info) {
+ std::vector<std::string> lines;
+ base::SplitString(session_info, '\n', &lines);
+ ASSERT_EQ(3u, lines.size()) << session_info;
+
+ std::string session_id;
+ for (size_t i = 0; i < 2; i++) {
+ std::vector<std::string> parts;
+ base::SplitString(lines[i], '\t', &parts);
+ ASSERT_EQ(2u, parts.size());
+ EXPECT_EQ("insert", parts[0]);
+ if (i == 0) {
+ session_id = parts[1];
+ } else {
+ EXPECT_NE(session_id, parts[1]);
+ }
+ }
+}
+
TEST_F(HTTPSRequestTest, SSLSessionCacheShardTest) {
// Test that sessions aren't resumed when the value of ssl_session_cache_shard
// differs.
@@ -6999,22 +7021,7 @@ TEST_F(HTTPSRequestTest, SSLSessionCacheShardTest) {
// three lines.
EXPECT_EQ(1, d.response_started_count());
- std::vector<std::string> lines;
- base::SplitString(d.data_received(), '\n', &lines);
- ASSERT_EQ(3u, lines.size());
-
- std::string session_id;
- for (size_t i = 0; i < 2; i++) {
- std::vector<std::string> parts;
- base::SplitString(lines[i], '\t', &parts);
- ASSERT_EQ(2u, parts.size());
- EXPECT_EQ("insert", parts[0]);
- if (i == 0) {
- session_id = parts[1];
- } else {
- EXPECT_NE(session_id, parts[1]);
- }
- }
+ AssertTwoDistinctSessionsInserted(d.data_received());
}
}
@@ -7069,17 +7076,70 @@ TEST_F(HTTPSRequestTest, DisableECDSAOnXP) {
#endif // OS_WIN
-class HTTPSFallbackTest : public testing::Test {
+class TestSSLConfigService : public SSLConfigService {
public:
- HTTPSFallbackTest() : context_(true) {
- context_.Init();
- delegate_.set_allow_certificate_errors(true);
+ TestSSLConfigService(bool ev_enabled,
+ bool online_rev_checking,
+ bool rev_checking_required_local_anchors)
+ : ev_enabled_(ev_enabled),
+ online_rev_checking_(online_rev_checking),
+ rev_checking_required_local_anchors_(
+ rev_checking_required_local_anchors),
+ fallback_min_version_(0) {}
+
+ void set_fallback_min_version(uint16 version) {
+ fallback_min_version_ = version;
+ }
+
+ // SSLConfigService:
+ virtual void GetSSLConfig(SSLConfig* config) override {
+ *config = SSLConfig();
+ config->rev_checking_enabled = online_rev_checking_;
+ config->verify_ev_cert = ev_enabled_;
+ config->rev_checking_required_local_anchors =
+ rev_checking_required_local_anchors_;
+ if (fallback_min_version_) {
+ config->version_fallback_min = fallback_min_version_;
+ }
+ }
+
+ protected:
+ virtual ~TestSSLConfigService() {}
+
+ private:
+ const bool ev_enabled_;
+ const bool online_rev_checking_;
+ const bool rev_checking_required_local_anchors_;
+ uint16 fallback_min_version_;
+};
+
+class FallbackTestURLRequestContext : public TestURLRequestContext {
+ public:
+ explicit FallbackTestURLRequestContext(bool delay_initialization)
+ : TestURLRequestContext(delay_initialization) {}
+
+ void set_fallback_min_version(uint16 version) {
+ TestSSLConfigService *ssl_config_service =
+ new TestSSLConfigService(true /* check for EV */,
+ false /* online revocation checking */,
+ false /* require rev. checking for local
+ anchors */);
+ ssl_config_service->set_fallback_min_version(version);
+ set_ssl_config_service(ssl_config_service);
}
+};
+
+class HTTPSFallbackTest : public testing::Test {
+ public:
+ HTTPSFallbackTest() : context_(true) {}
virtual ~HTTPSFallbackTest() {}
protected:
void DoFallbackTest(const SpawnedTestServer::SSLOptions& ssl_options) {
DCHECK(!request_);
+ context_.Init();
+ delegate_.set_allow_certificate_errors(true);
+
SpawnedTestServer test_server(
SpawnedTestServer::TYPE_HTTPS,
ssl_options,
@@ -7093,6 +7153,10 @@ class HTTPSFallbackTest : public testing::Test {
base::RunLoop().Run();
}
+ void set_fallback_min_version(uint16 version) {
+ context_.set_fallback_min_version(version);
+ }
+
void ExpectConnection(int version) {
EXPECT_EQ(1, delegate_.response_started_count());
EXPECT_NE(0, delegate_.bytes_received());
@@ -7111,7 +7175,7 @@ class HTTPSFallbackTest : public testing::Test {
private:
TestDelegate delegate_;
- TestURLRequestContext context_;
+ FallbackTestURLRequestContext context_;
scoped_ptr<URLRequest> request_;
};
@@ -7187,7 +7251,7 @@ TEST_F(HTTPSFallbackTest, FallbackSCSVClosed) {
ExpectFailure(ERR_CONNECTION_CLOSED);
}
-// Tests that the SSLv3 fallback triggers on alert.
+// Tests that the SSLv3 fallback doesn't happen by default.
TEST_F(HTTPSFallbackTest, SSLv3Fallback) {
SpawnedTestServer::SSLOptions ssl_options(
SpawnedTestServer::SSLOptions::CERT_OK);
@@ -7195,10 +7259,23 @@ TEST_F(HTTPSFallbackTest, SSLv3Fallback) {
SpawnedTestServer::SSLOptions::TLS_INTOLERANT_ALL;
ASSERT_NO_FATAL_FAILURE(DoFallbackTest(ssl_options));
+ ExpectFailure(ERR_SSL_FALLBACK_BEYOND_MINIMUM_VERSION);
+}
+
+// Tests that the SSLv3 fallback works when explicitly enabled.
+TEST_F(HTTPSFallbackTest, SSLv3FallbackEnabled) {
+ SpawnedTestServer::SSLOptions ssl_options(
+ SpawnedTestServer::SSLOptions::CERT_OK);
+ ssl_options.tls_intolerant =
+ SpawnedTestServer::SSLOptions::TLS_INTOLERANT_ALL;
+ set_fallback_min_version(SSL_PROTOCOL_VERSION_SSL3);
+
+ ASSERT_NO_FATAL_FAILURE(DoFallbackTest(ssl_options));
ExpectConnection(SSL_CONNECTION_VERSION_SSL3);
}
-// Tests that the SSLv3 fallback triggers on closed connections.
+// Tests that the SSLv3 fallback triggers on closed connections when explicitly
+// enabled.
TEST_F(HTTPSFallbackTest, SSLv3FallbackClosed) {
SpawnedTestServer::SSLOptions ssl_options(
SpawnedTestServer::SSLOptions::CERT_OK);
@@ -7206,11 +7283,81 @@ TEST_F(HTTPSFallbackTest, SSLv3FallbackClosed) {
SpawnedTestServer::SSLOptions::TLS_INTOLERANT_ALL;
ssl_options.tls_intolerance_type =
SpawnedTestServer::SSLOptions::TLS_INTOLERANCE_CLOSE;
+ set_fallback_min_version(SSL_PROTOCOL_VERSION_SSL3);
ASSERT_NO_FATAL_FAILURE(DoFallbackTest(ssl_options));
ExpectConnection(SSL_CONNECTION_VERSION_SSL3);
}
+// Test that SSLv3 fallback probe connections don't cause sessions to be cached.
+TEST_F(HTTPSRequestTest, SSLv3FallbackNoCache) {
+ SpawnedTestServer::SSLOptions ssl_options(
+ SpawnedTestServer::SSLOptions::CERT_OK);
+ ssl_options.tls_intolerant =
+ SpawnedTestServer::SSLOptions::TLS_INTOLERANT_ALL;
+ ssl_options.tls_intolerance_type =
+ SpawnedTestServer::SSLOptions::TLS_INTOLERANCE_CLOSE;
+ ssl_options.record_resume = true;
+
+ SpawnedTestServer test_server(
+ SpawnedTestServer::TYPE_HTTPS,
+ ssl_options,
+ base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
+ ASSERT_TRUE(test_server.Start());
+
+ SSLClientSocket::ClearSessionCache();
+
+ // Make a connection that does a probe fallback to SSLv3 but fails because
+ // SSLv3 fallback is disabled. We don't wish a session for this connection to
+ // be inserted locally.
+ {
+ TestDelegate delegate;
+ FallbackTestURLRequestContext context(true);
+
+ context.Init();
+ scoped_ptr<URLRequest> request(context.CreateRequest(
+ test_server.GetURL(std::string()), DEFAULT_PRIORITY, &delegate, NULL));
+ request->Start();
+
+ base::RunLoop().Run();
+
+ EXPECT_EQ(1, delegate.response_started_count());
+ EXPECT_FALSE(request->status().is_success());
+ EXPECT_EQ(URLRequestStatus::FAILED, request->status().status());
+ EXPECT_EQ(ERR_SSL_FALLBACK_BEYOND_MINIMUM_VERSION,
+ request->status().error());
+ }
+
+ // Now allow SSLv3 connections and request the session cache log.
+ {
+ TestDelegate delegate;
+ FallbackTestURLRequestContext context(true);
+ context.set_fallback_min_version(SSL_PROTOCOL_VERSION_SSL3);
+
+ context.Init();
+ scoped_ptr<URLRequest> request(
+ context.CreateRequest(test_server.GetURL("ssl-session-cache"),
+ DEFAULT_PRIORITY,
+ &delegate,
+ NULL));
+ request->Start();
+
+ base::RunLoop().Run();
+
+ EXPECT_EQ(1, delegate.response_started_count());
+ EXPECT_NE(0, delegate.bytes_received());
+ EXPECT_EQ(SSL_CONNECTION_VERSION_SSL3, SSLConnectionStatusToVersion(
+ request->ssl_info().connection_status));
+ EXPECT_TRUE(request->ssl_info().connection_status &
+ SSL_CONNECTION_VERSION_FALLBACK);
+
+ std::vector<std::string> lines;
+ // If no sessions were cached then the server should have seen two sessions
+ // inserted with no lookups.
+ AssertTwoDistinctSessionsInserted(delegate.data_received());
+ }
+}
+
// This test is disabled on Android because the remote test server doesn't cause
// a TCP reset.
#if !defined(OS_ANDROID)
@@ -7303,53 +7450,10 @@ TEST_F(HTTPSSessionTest, DontResumeSessionsForInvalidCertificates) {
// insert xyz
EXPECT_EQ(1, d.response_started_count());
- std::vector<std::string> lines;
- base::SplitString(d.data_received(), '\n', &lines);
- ASSERT_EQ(3u, lines.size()) << d.data_received();
-
- std::string session_id;
- for (size_t i = 0; i < 2; i++) {
- std::vector<std::string> parts;
- base::SplitString(lines[i], '\t', &parts);
- ASSERT_EQ(2u, parts.size());
- EXPECT_EQ("insert", parts[0]);
- if (i == 0) {
- session_id = parts[1];
- } else {
- EXPECT_NE(session_id, parts[1]);
- }
- }
+ AssertTwoDistinctSessionsInserted(d.data_received());
}
}
-class TestSSLConfigService : public SSLConfigService {
- public:
- TestSSLConfigService(bool ev_enabled,
- bool online_rev_checking,
- bool rev_checking_required_local_anchors)
- : ev_enabled_(ev_enabled),
- online_rev_checking_(online_rev_checking),
- rev_checking_required_local_anchors_(
- rev_checking_required_local_anchors) {}
-
- // SSLConfigService:
- virtual void GetSSLConfig(SSLConfig* config) override {
- *config = SSLConfig();
- config->rev_checking_enabled = online_rev_checking_;
- config->verify_ev_cert = ev_enabled_;
- config->rev_checking_required_local_anchors =
- rev_checking_required_local_anchors_;
- }
-
- protected:
- virtual ~TestSSLConfigService() {}
-
- private:
- const bool ev_enabled_;
- const bool online_rev_checking_;
- const bool rev_checking_required_local_anchors_;
-};
-
// This the fingerprint of the "Testing CA" certificate used by the testserver.
// See net/data/ssl/certificates/ocsp-test-root.pem.
static const SHA1HashValue kOCSPTestCertFingerprint =
« no previous file with comments | « net/ssl/ssl_config.cc ('k') | tools/metrics/histograms/histograms.xml » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698