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

Side by Side Diff: net/url_request/url_request_unittest.cc

Issue 2099673003: Delete TLS version fallback code in net/http. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@fallback-die-die-die-2
Patch Set: Oops, got my branches confused. Created 4 years, 5 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 unified diff | Download patch
« no previous file with comments | « net/socket/client_socket_pool_manager.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <memory> 5 #include <memory>
6 #include <utility> 6 #include <utility>
7 7
8 #include "base/memory/ptr_util.h" 8 #include "base/memory/ptr_util.h"
9 #include "base/run_loop.h" 9 #include "base/run_loop.h"
10 #include "build/build_config.h" 10 #include "build/build_config.h"
(...skipping 3305 matching lines...) Expand 10 before | Expand all | Expand 10 after
3316 public: 3316 public:
3317 TestSSLConfigService(bool ev_enabled, 3317 TestSSLConfigService(bool ev_enabled,
3318 bool online_rev_checking, 3318 bool online_rev_checking,
3319 bool rev_checking_required_local_anchors, 3319 bool rev_checking_required_local_anchors,
3320 bool token_binding_enabled) 3320 bool token_binding_enabled)
3321 : ev_enabled_(ev_enabled), 3321 : ev_enabled_(ev_enabled),
3322 online_rev_checking_(online_rev_checking), 3322 online_rev_checking_(online_rev_checking),
3323 rev_checking_required_local_anchors_( 3323 rev_checking_required_local_anchors_(
3324 rev_checking_required_local_anchors), 3324 rev_checking_required_local_anchors),
3325 token_binding_enabled_(token_binding_enabled), 3325 token_binding_enabled_(token_binding_enabled),
3326 min_version_(kDefaultSSLVersionMin), 3326 min_version_(kDefaultSSLVersionMin) {}
3327 fallback_min_version_(kDefaultSSLVersionFallbackMin) {}
3328 3327
3329 void set_min_version(uint16_t version) { min_version_ = version; } 3328 void set_min_version(uint16_t version) { min_version_ = version; }
3330 3329
3331 void set_fallback_min_version(uint16_t version) {
3332 fallback_min_version_ = version;
3333 }
3334
3335 // SSLConfigService: 3330 // SSLConfigService:
3336 void GetSSLConfig(SSLConfig* config) override { 3331 void GetSSLConfig(SSLConfig* config) override {
3337 *config = SSLConfig(); 3332 *config = SSLConfig();
3338 config->rev_checking_enabled = online_rev_checking_; 3333 config->rev_checking_enabled = online_rev_checking_;
3339 config->verify_ev_cert = ev_enabled_; 3334 config->verify_ev_cert = ev_enabled_;
3340 config->rev_checking_required_local_anchors = 3335 config->rev_checking_required_local_anchors =
3341 rev_checking_required_local_anchors_; 3336 rev_checking_required_local_anchors_;
3342 if (fallback_min_version_) {
3343 config->version_fallback_min = fallback_min_version_;
3344 }
3345 if (min_version_) { 3337 if (min_version_) {
3346 config->version_min = min_version_; 3338 config->version_min = min_version_;
3347 } 3339 }
3348 if (token_binding_enabled_) { 3340 if (token_binding_enabled_) {
3349 config->token_binding_params.push_back(TB_PARAM_ECDSAP256); 3341 config->token_binding_params.push_back(TB_PARAM_ECDSAP256);
3350 } 3342 }
3351 } 3343 }
3352 3344
3353 protected: 3345 protected:
3354 ~TestSSLConfigService() override {} 3346 ~TestSSLConfigService() override {}
3355 3347
3356 private: 3348 private:
3357 const bool ev_enabled_; 3349 const bool ev_enabled_;
3358 const bool online_rev_checking_; 3350 const bool online_rev_checking_;
3359 const bool rev_checking_required_local_anchors_; 3351 const bool rev_checking_required_local_anchors_;
3360 const bool token_binding_enabled_; 3352 const bool token_binding_enabled_;
3361 uint16_t min_version_; 3353 uint16_t min_version_;
3362 uint16_t fallback_min_version_;
3363 }; 3354 };
3364 3355
3365 // TODO(svaldez): Update tests to use EmbeddedTestServer. 3356 // TODO(svaldez): Update tests to use EmbeddedTestServer.
3366 #if !defined(OS_IOS) 3357 #if !defined(OS_IOS)
3367 class TokenBindingURLRequestTest : public URLRequestTestHTTP { 3358 class TokenBindingURLRequestTest : public URLRequestTestHTTP {
3368 public: 3359 public:
3369 void SetUp() override { 3360 void SetUp() override {
3370 default_context_.set_ssl_config_service( 3361 default_context_.set_ssl_config_service(
3371 new TestSSLConfigService(false, false, false, true)); 3362 new TestSSLConfigService(false, false, false, true));
3372 channel_id_service_.reset(new ChannelIDService( 3363 channel_id_service_.reset(new ChannelIDService(
(...skipping 5496 matching lines...) Expand 10 before | Expand all | Expand 10 after
8869 // insert xyz 8860 // insert xyz
8870 // 8861 //
8871 // With a newline at the end which makes the split think that there are 8862 // With a newline at the end which makes the split think that there are
8872 // three lines. 8863 // three lines.
8873 8864
8874 EXPECT_EQ(1, d.response_started_count()); 8865 EXPECT_EQ(1, d.response_started_count());
8875 AssertTwoDistinctSessionsInserted(d.data_received()); 8866 AssertTwoDistinctSessionsInserted(d.data_received());
8876 } 8867 }
8877 } 8868 }
8878 8869
8879 class FallbackTestURLRequestContext : public TestURLRequestContext {
8880 public:
8881 explicit FallbackTestURLRequestContext(bool delay_initialization)
8882 : TestURLRequestContext(delay_initialization) {}
8883
8884 void set_fallback_min_version(uint16_t version) {
8885 TestSSLConfigService* ssl_config_service = new TestSSLConfigService(
8886 true /* check for EV */, false /* online revocation checking */,
8887 false /* require rev. checking for local
8888 anchors */,
8889 false /* token binding enabled */);
8890 ssl_config_service->set_fallback_min_version(version);
8891 set_ssl_config_service(ssl_config_service);
8892 }
8893 };
8894
8895 class HTTPSFallbackTest : public testing::Test { 8870 class HTTPSFallbackTest : public testing::Test {
8896 public: 8871 public:
8897 HTTPSFallbackTest() : context_(true) {} 8872 HTTPSFallbackTest() : context_(true) {}
8898 ~HTTPSFallbackTest() override {} 8873 ~HTTPSFallbackTest() override {}
8899 8874
8900 protected: 8875 protected:
8901 void DoFallbackTest(const SpawnedTestServer::SSLOptions& ssl_options) { 8876 void DoFallbackTest(const SpawnedTestServer::SSLOptions& ssl_options) {
8902 DCHECK(!request_); 8877 DCHECK(!request_);
8903 context_.Init(); 8878 context_.Init();
8904 delegate_.set_allow_certificate_errors(true); 8879 delegate_.set_allow_certificate_errors(true);
8905 8880
8906 SpawnedTestServer test_server( 8881 SpawnedTestServer test_server(
8907 SpawnedTestServer::TYPE_HTTPS, 8882 SpawnedTestServer::TYPE_HTTPS,
8908 ssl_options, 8883 ssl_options,
8909 base::FilePath(FILE_PATH_LITERAL("net/data/ssl"))); 8884 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
8910 ASSERT_TRUE(test_server.Start()); 8885 ASSERT_TRUE(test_server.Start());
8911 8886
8912 request_ = context_.CreateRequest(test_server.GetURL("/"), DEFAULT_PRIORITY, 8887 request_ = context_.CreateRequest(test_server.GetURL("/"), DEFAULT_PRIORITY,
8913 &delegate_); 8888 &delegate_);
8914 request_->Start(); 8889 request_->Start();
8915 8890
8916 base::RunLoop().Run(); 8891 base::RunLoop().Run();
8917 } 8892 }
8918 8893
8919 void set_fallback_min_version(uint16_t version) {
8920 context_.set_fallback_min_version(version);
8921 }
8922
8923 void ExpectConnection(int version) { 8894 void ExpectConnection(int version) {
8924 EXPECT_EQ(1, delegate_.response_started_count()); 8895 EXPECT_EQ(1, delegate_.response_started_count());
8925 EXPECT_NE(0, delegate_.bytes_received()); 8896 EXPECT_NE(0, delegate_.bytes_received());
8926 EXPECT_EQ(version, SSLConnectionStatusToVersion( 8897 EXPECT_EQ(version, SSLConnectionStatusToVersion(
8927 request_->ssl_info().connection_status)); 8898 request_->ssl_info().connection_status));
8928 EXPECT_TRUE(request_->ssl_info().connection_status & 8899 EXPECT_TRUE(request_->ssl_info().connection_status &
8929 SSL_CONNECTION_VERSION_FALLBACK); 8900 SSL_CONNECTION_VERSION_FALLBACK);
8930 } 8901 }
8931 8902
8932 void ExpectFailure(int error) { 8903 void ExpectFailure(int error) {
8933 EXPECT_EQ(1, delegate_.response_started_count()); 8904 EXPECT_EQ(1, delegate_.response_started_count());
8934 EXPECT_FALSE(request_->status().is_success()); 8905 EXPECT_FALSE(request_->status().is_success());
8935 EXPECT_EQ(URLRequestStatus::FAILED, request_->status().status()); 8906 EXPECT_EQ(URLRequestStatus::FAILED, request_->status().status());
8936 EXPECT_EQ(error, request_->status().error()); 8907 EXPECT_EQ(error, request_->status().error());
8937 } 8908 }
8938 8909
8939 private: 8910 private:
8940 TestDelegate delegate_; 8911 TestDelegate delegate_;
8941 FallbackTestURLRequestContext context_; 8912 TestURLRequestContext context_;
8942 std::unique_ptr<URLRequest> request_; 8913 std::unique_ptr<URLRequest> request_;
8943 }; 8914 };
8944 8915
8945 // Tests the TLS 1.0 fallback doesn't happen. 8916 // Tests the TLS 1.0 fallback doesn't happen.
8946 TEST_F(HTTPSFallbackTest, TLSv1NoFallback) { 8917 TEST_F(HTTPSFallbackTest, TLSv1NoFallback) {
8947 SpawnedTestServer::SSLOptions ssl_options( 8918 SpawnedTestServer::SSLOptions ssl_options(
8948 SpawnedTestServer::SSLOptions::CERT_OK); 8919 SpawnedTestServer::SSLOptions::CERT_OK);
8949 ssl_options.tls_intolerant = 8920 ssl_options.tls_intolerant =
8950 SpawnedTestServer::SSLOptions::TLS_INTOLERANT_TLS1_1; 8921 SpawnedTestServer::SSLOptions::TLS_INTOLERANT_TLS1_1;
8951 8922
8952 ASSERT_NO_FATAL_FAILURE(DoFallbackTest(ssl_options)); 8923 ASSERT_NO_FATAL_FAILURE(DoFallbackTest(ssl_options));
8953 ExpectFailure(ERR_SSL_VERSION_OR_CIPHER_MISMATCH); 8924 ExpectFailure(ERR_SSL_VERSION_OR_CIPHER_MISMATCH);
8954 } 8925 }
8955 8926
8956 // Tests the TLS 1.1 fallback doesn't happen but 1.2-intolerance is detected. 8927 // Tests the TLS 1.1 fallback doesn't happen.
8957 TEST_F(HTTPSFallbackTest, TLSv1_1NoFallback) { 8928 TEST_F(HTTPSFallbackTest, TLSv1_1NoFallback) {
8958 SpawnedTestServer::SSLOptions ssl_options( 8929 SpawnedTestServer::SSLOptions ssl_options(
8959 SpawnedTestServer::SSLOptions::CERT_OK); 8930 SpawnedTestServer::SSLOptions::CERT_OK);
8960 ssl_options.tls_intolerant = 8931 ssl_options.tls_intolerant =
8961 SpawnedTestServer::SSLOptions::TLS_INTOLERANT_TLS1_2; 8932 SpawnedTestServer::SSLOptions::TLS_INTOLERANT_TLS1_2;
8962 8933
8963 ASSERT_NO_FATAL_FAILURE(DoFallbackTest(ssl_options)); 8934 ASSERT_NO_FATAL_FAILURE(DoFallbackTest(ssl_options));
8964 ExpectFailure(ERR_SSL_FALLBACK_BEYOND_MINIMUM_VERSION);
8965 }
8966
8967 // Tests the TLS 1.1 fallback when explicitly enabled.
8968 TEST_F(HTTPSFallbackTest, TLSv1_1Fallback) {
8969 SpawnedTestServer::SSLOptions ssl_options(
8970 SpawnedTestServer::SSLOptions::CERT_OK);
8971 ssl_options.tls_intolerant =
8972 SpawnedTestServer::SSLOptions::TLS_INTOLERANT_TLS1_2;
8973
8974 set_fallback_min_version(SSL_PROTOCOL_VERSION_TLS1_1);
8975 ASSERT_NO_FATAL_FAILURE(DoFallbackTest(ssl_options));
8976 ExpectConnection(SSL_CONNECTION_VERSION_TLS1_1);
8977 }
8978
8979 // Tests that the TLS 1.1 fallback, if enabled, triggers on closed connections.
8980 TEST_F(HTTPSFallbackTest, TLSv1_1FallbackClosed) {
8981 SpawnedTestServer::SSLOptions ssl_options(
8982 SpawnedTestServer::SSLOptions::CERT_OK);
8983 ssl_options.tls_intolerant =
8984 SpawnedTestServer::SSLOptions::TLS_INTOLERANT_TLS1_2;
8985 ssl_options.tls_intolerance_type =
8986 SpawnedTestServer::SSLOptions::TLS_INTOLERANCE_CLOSE;
8987
8988 set_fallback_min_version(SSL_PROTOCOL_VERSION_TLS1_1);
8989 ASSERT_NO_FATAL_FAILURE(DoFallbackTest(ssl_options));
8990 ExpectConnection(SSL_CONNECTION_VERSION_TLS1_1);
8991 }
8992
8993 // This test is disabled on Android because the remote test server doesn't cause
8994 // a TCP reset.
8995 #if !defined(OS_ANDROID)
8996 // Tests fallback to TLS 1.1, if enabled, on connection reset.
8997 TEST_F(HTTPSFallbackTest, TLSv1_1FallbackReset) {
8998 SpawnedTestServer::SSLOptions ssl_options(
8999 SpawnedTestServer::SSLOptions::CERT_OK);
9000 ssl_options.tls_intolerant =
9001 SpawnedTestServer::SSLOptions::TLS_INTOLERANT_TLS1_2;
9002 ssl_options.tls_intolerance_type =
9003 SpawnedTestServer::SSLOptions::TLS_INTOLERANCE_RESET;
9004
9005 set_fallback_min_version(SSL_PROTOCOL_VERSION_TLS1_1);
9006 ASSERT_NO_FATAL_FAILURE(DoFallbackTest(ssl_options));
9007 ExpectConnection(SSL_CONNECTION_VERSION_TLS1_1);
9008 }
9009 #endif // !OS_ANDROID
9010
9011 // Tests that we don't fallback, even if enabled, on handshake failure with
9012 // servers that implement TLS_FALLBACK_SCSV. Also ensure that the original error
9013 // code is reported.
9014 TEST_F(HTTPSFallbackTest, FallbackSCSV) {
9015 SpawnedTestServer::SSLOptions ssl_options(
9016 SpawnedTestServer::SSLOptions::CERT_OK);
9017 // Configure HTTPS server to be intolerant of TLS >= 1.1 in order to trigger
9018 // a version fallback.
9019 ssl_options.tls_intolerant =
9020 SpawnedTestServer::SSLOptions::TLS_INTOLERANT_TLS1_1;
9021 // Have the server process TLS_FALLBACK_SCSV so that version fallback
9022 // connections are rejected.
9023 ssl_options.fallback_scsv_enabled = true;
9024
9025 set_fallback_min_version(SSL_PROTOCOL_VERSION_TLS1_1);
9026 ASSERT_NO_FATAL_FAILURE(DoFallbackTest(ssl_options));
9027
9028 // ERR_SSL_VERSION_OR_CIPHER_MISMATCH is how the server simulates version
9029 // intolerance. If the fallback SCSV is processed when the original error
9030 // that caused the fallback should be returned, which should be
9031 // ERR_SSL_VERSION_OR_CIPHER_MISMATCH.
9032 ExpectFailure(ERR_SSL_VERSION_OR_CIPHER_MISMATCH); 8935 ExpectFailure(ERR_SSL_VERSION_OR_CIPHER_MISMATCH);
9033 } 8936 }
9034 8937
9035 // Tests that we don't fallback, even if enabled, on connection closed with
9036 // servers that implement TLS_FALLBACK_SCSV. Also ensure that the original error
9037 // code is reported.
9038 TEST_F(HTTPSFallbackTest, FallbackSCSVClosed) {
9039 SpawnedTestServer::SSLOptions ssl_options(
9040 SpawnedTestServer::SSLOptions::CERT_OK);
9041 // Configure HTTPS server to be intolerant of TLS >= 1.1 in order to trigger
9042 // a version fallback.
9043 ssl_options.tls_intolerant =
9044 SpawnedTestServer::SSLOptions::TLS_INTOLERANT_TLS1_1;
9045 ssl_options.tls_intolerance_type =
9046 SpawnedTestServer::SSLOptions::TLS_INTOLERANCE_CLOSE;
9047 // Have the server process TLS_FALLBACK_SCSV so that version fallback
9048 // connections are rejected.
9049 ssl_options.fallback_scsv_enabled = true;
9050
9051 set_fallback_min_version(SSL_PROTOCOL_VERSION_TLS1_1);
9052 ASSERT_NO_FATAL_FAILURE(DoFallbackTest(ssl_options));
9053
9054 // The original error should be replayed on rejected fallback.
9055 ExpectFailure(ERR_CONNECTION_CLOSED);
9056 }
9057
9058 // Test that fallback probe connections don't cause sessions to be cached.
9059 TEST_F(HTTPSRequestTest, FallbackProbeNoCache) {
9060 SpawnedTestServer::SSLOptions ssl_options(
9061 SpawnedTestServer::SSLOptions::CERT_OK);
9062 ssl_options.tls_intolerant =
9063 SpawnedTestServer::SSLOptions::TLS_INTOLERANT_TLS1_2;
9064 ssl_options.tls_intolerance_type =
9065 SpawnedTestServer::SSLOptions::TLS_INTOLERANCE_CLOSE;
9066 ssl_options.record_resume = true;
9067
9068 SpawnedTestServer test_server(
9069 SpawnedTestServer::TYPE_HTTPS,
9070 ssl_options,
9071 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
9072 ASSERT_TRUE(test_server.Start());
9073
9074 SSLClientSocket::ClearSessionCache();
9075
9076 // Make a connection that does a probe fallback to TLSv1.1 but fails because
9077 // fallback is disabled. We don't wish a session for this connection to be
9078 // inserted locally.
9079 {
9080 TestDelegate delegate;
9081 FallbackTestURLRequestContext context(true);
9082
9083 context.Init();
9084 std::unique_ptr<URLRequest> request(context.CreateRequest(
9085 test_server.GetURL("/"), DEFAULT_PRIORITY, &delegate));
9086 request->Start();
9087
9088 base::RunLoop().Run();
9089
9090 EXPECT_EQ(1, delegate.response_started_count());
9091 EXPECT_FALSE(request->status().is_success());
9092 EXPECT_EQ(URLRequestStatus::FAILED, request->status().status());
9093 EXPECT_EQ(ERR_SSL_FALLBACK_BEYOND_MINIMUM_VERSION,
9094 request->status().error());
9095 }
9096
9097 // Now allow TLSv1.1 fallback connections and request the session cache log.
9098 {
9099 TestDelegate delegate;
9100 FallbackTestURLRequestContext context(true);
9101 context.set_fallback_min_version(SSL_PROTOCOL_VERSION_TLS1_1);
9102
9103 context.Init();
9104 std::unique_ptr<URLRequest> request(context.CreateRequest(
9105 test_server.GetURL("ssl-session-cache"), DEFAULT_PRIORITY, &delegate));
9106 request->Start();
9107
9108 base::RunLoop().Run();
9109
9110 EXPECT_EQ(1, delegate.response_started_count());
9111 EXPECT_NE(0, delegate.bytes_received());
9112 EXPECT_EQ(
9113 SSL_CONNECTION_VERSION_TLS1_1,
9114 SSLConnectionStatusToVersion(request->ssl_info().connection_status));
9115 EXPECT_TRUE(request->ssl_info().connection_status &
9116 SSL_CONNECTION_VERSION_FALLBACK);
9117
9118 std::vector<std::string> lines;
9119 // If no sessions were cached then the server should have seen two sessions
9120 // inserted with no lookups.
9121 AssertTwoDistinctSessionsInserted(delegate.data_received());
9122 }
9123 }
9124
9125 class HTTPSSessionTest : public testing::Test { 8938 class HTTPSSessionTest : public testing::Test {
9126 public: 8939 public:
9127 HTTPSSessionTest() : default_context_(true) { 8940 HTTPSSessionTest() : default_context_(true) {
9128 cert_verifier_.set_default_result(OK); 8941 cert_verifier_.set_default_result(OK);
9129 8942
9130 default_context_.set_network_delegate(&default_network_delegate_); 8943 default_context_.set_network_delegate(&default_network_delegate_);
9131 default_context_.set_cert_verifier(&cert_verifier_); 8944 default_context_.set_cert_verifier(&cert_verifier_);
9132 default_context_.Init(); 8945 default_context_.Init();
9133 } 8946 }
9134 ~HTTPSSessionTest() override {} 8947 ~HTTPSSessionTest() override {}
(...skipping 1013 matching lines...) Expand 10 before | Expand all | Expand 10 after
10148 AddTestInterceptor()->set_main_intercept_job(std::move(job)); 9961 AddTestInterceptor()->set_main_intercept_job(std::move(job));
10149 9962
10150 req->Start(); 9963 req->Start();
10151 req->Cancel(); 9964 req->Cancel();
10152 base::RunLoop().RunUntilIdle(); 9965 base::RunLoop().RunUntilIdle();
10153 EXPECT_EQ(URLRequestStatus::CANCELED, req->status().status()); 9966 EXPECT_EQ(URLRequestStatus::CANCELED, req->status().status());
10154 EXPECT_EQ(0, d.received_redirect_count()); 9967 EXPECT_EQ(0, d.received_redirect_count());
10155 } 9968 }
10156 9969
10157 } // namespace net 9970 } // namespace net
OLDNEW
« no previous file with comments | « net/socket/client_socket_pool_manager.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698