| 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 d0e5d2556e882b14849cfb8d145e03496a1be4f0..78e4eb30f79a551bd290dece245ee35ce7afeafb 100644
 | 
| --- a/net/url_request/url_request_unittest.cc
 | 
| +++ b/net/url_request/url_request_unittest.cc
 | 
| @@ -16,6 +16,7 @@
 | 
|  #include <algorithm>
 | 
|  #include <limits>
 | 
|  
 | 
| +#include "base/base64url.h"
 | 
|  #include "base/bind.h"
 | 
|  #include "base/compiler_specific.h"
 | 
|  #include "base/files/file_path.h"
 | 
| @@ -79,9 +80,12 @@
 | 
|  #include "net/log/test_net_log_util.h"
 | 
|  #include "net/proxy/proxy_service.h"
 | 
|  #include "net/socket/ssl_client_socket.h"
 | 
| +#include "net/ssl/channel_id_service.h"
 | 
| +#include "net/ssl/default_channel_id_store.h"
 | 
|  #include "net/ssl/ssl_cipher_suite_names.h"
 | 
|  #include "net/ssl/ssl_connection_status_flags.h"
 | 
|  #include "net/ssl/ssl_server_config.h"
 | 
| +#include "net/ssl/token_binding.h"
 | 
|  #include "net/test/cert_test_util.h"
 | 
|  #include "net/test/embedded_test_server/embedded_test_server.h"
 | 
|  #include "net/test/embedded_test_server/http_request.h"
 | 
| @@ -3370,7 +3374,113 @@ scoped_ptr<test_server::HttpResponse> HandleRedirectConnect(
 | 
|  
 | 
|  }  // namespace
 | 
|  
 | 
| -// In this unit test, we're using the EmbeddedTestServer as a proxy server and
 | 
| +class TestSSLConfigService : public SSLConfigService {
 | 
| + public:
 | 
| +  TestSSLConfigService(bool ev_enabled,
 | 
| +                       bool online_rev_checking,
 | 
| +                       bool rev_checking_required_local_anchors,
 | 
| +                       bool token_binding_enabled)
 | 
| +      : ev_enabled_(ev_enabled),
 | 
| +        online_rev_checking_(online_rev_checking),
 | 
| +        rev_checking_required_local_anchors_(
 | 
| +            rev_checking_required_local_anchors),
 | 
| +        token_binding_enabled_(token_binding_enabled),
 | 
| +        min_version_(kDefaultSSLVersionMin),
 | 
| +        fallback_min_version_(kDefaultSSLVersionFallbackMin) {}
 | 
| +
 | 
| +  void set_min_version(uint16_t version) { min_version_ = version; }
 | 
| +
 | 
| +  void set_fallback_min_version(uint16_t version) {
 | 
| +    fallback_min_version_ = version;
 | 
| +  }
 | 
| +
 | 
| +  // SSLConfigService:
 | 
| +  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_;
 | 
| +    }
 | 
| +    if (min_version_) {
 | 
| +      config->version_min = min_version_;
 | 
| +    }
 | 
| +    if (token_binding_enabled_) {
 | 
| +      config->token_binding_params.push_back(TB_PARAM_ECDSAP256);
 | 
| +    }
 | 
| +  }
 | 
| +
 | 
| + protected:
 | 
| +  ~TestSSLConfigService() override {}
 | 
| +
 | 
| + private:
 | 
| +  const bool ev_enabled_;
 | 
| +  const bool online_rev_checking_;
 | 
| +  const bool rev_checking_required_local_anchors_;
 | 
| +  const bool token_binding_enabled_;
 | 
| +  uint16_t min_version_;
 | 
| +  uint16_t fallback_min_version_;
 | 
| +};
 | 
| +
 | 
| +// TODO(svaldez): Update tests to use EmbeddedTestServer.
 | 
| +#if !defined(OS_IOS)
 | 
| +class TokenBindingURLRequestTest : public URLRequestTestHTTP {
 | 
| + public:
 | 
| +  void SetUp() override {
 | 
| +    default_context_.set_ssl_config_service(
 | 
| +        new TestSSLConfigService(false, false, false, true));
 | 
| +    channel_id_service_.reset(new ChannelIDService(
 | 
| +        new DefaultChannelIDStore(NULL), base::ThreadTaskRunnerHandle::Get()));
 | 
| +    default_context_.set_channel_id_service(channel_id_service_.get());
 | 
| +    URLRequestTestHTTP::SetUp();
 | 
| +  }
 | 
| +
 | 
| + protected:
 | 
| +  scoped_ptr<ChannelIDService> channel_id_service_;
 | 
| +};
 | 
| +
 | 
| +TEST_F(TokenBindingURLRequestTest, TokenBindingTest) {
 | 
| +  SpawnedTestServer::SSLOptions ssl_options;
 | 
| +  ssl_options.supported_token_binding_params.push_back(TB_PARAM_ECDSAP256);
 | 
| +  SpawnedTestServer https_test_server(SpawnedTestServer::TYPE_HTTPS,
 | 
| +                                      ssl_options,
 | 
| +                                      base::FilePath(kTestFilePath));
 | 
| +  ASSERT_TRUE(https_test_server.Start());
 | 
| +
 | 
| +  TestDelegate d;
 | 
| +  {
 | 
| +    scoped_ptr<URLRequest> r(default_context_.CreateRequest(
 | 
| +        https_test_server.GetURL("tokbind-ekm"), DEFAULT_PRIORITY, &d));
 | 
| +    r->Start();
 | 
| +    EXPECT_TRUE(r->is_pending());
 | 
| +
 | 
| +    base::RunLoop().Run();
 | 
| +
 | 
| +    EXPECT_EQ(URLRequestStatus::SUCCESS, r->status().status());
 | 
| +
 | 
| +    HttpRequestHeaders headers;
 | 
| +    std::string token_binding_header, token_binding_message;
 | 
| +    EXPECT_TRUE(r->GetFullRequestHeaders(&headers));
 | 
| +    EXPECT_TRUE(headers.GetHeader(HttpRequestHeaders::kTokenBinding,
 | 
| +                                  &token_binding_header));
 | 
| +    EXPECT_TRUE(base::Base64UrlDecode(
 | 
| +        token_binding_header, base::Base64UrlDecodePolicy::REQUIRE_PADDING,
 | 
| +        &token_binding_message));
 | 
| +    base::StringPiece ec_point, signature;
 | 
| +    EXPECT_TRUE(
 | 
| +        ParseTokenBindingMessage(token_binding_message, &ec_point, &signature));
 | 
| +
 | 
| +    EXPECT_GT(d.bytes_received(), 0);
 | 
| +    std::string ekm = d.data_received();
 | 
| +
 | 
| +    EXPECT_TRUE(VerifyEKMSignature(ec_point, signature, ekm));
 | 
| +  }
 | 
| +}
 | 
| +#endif  // !defined(OS_IOS)
 | 
| +
 | 
| +// In this unit test, we're using the HTTPTestServer as a proxy server and
 | 
|  // issuing a CONNECT request with the magic host name "www.redirect.com".
 | 
|  // The EmbeddedTestServer will return a 302 response, which we should not
 | 
|  // follow.
 | 
| @@ -8528,61 +8638,17 @@ TEST_F(HTTPSRequestTest, DisableECDSAOnXP) {
 | 
|  
 | 
|  #endif  // OS_WIN
 | 
|  
 | 
| -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),
 | 
| -        min_version_(kDefaultSSLVersionMin),
 | 
| -        fallback_min_version_(kDefaultSSLVersionFallbackMin) {}
 | 
| -
 | 
| -  void set_min_version(uint16_t version) { min_version_ = version; }
 | 
| -
 | 
| -  void set_fallback_min_version(uint16_t version) {
 | 
| -    fallback_min_version_ = version;
 | 
| -  }
 | 
| -
 | 
| -  // SSLConfigService:
 | 
| -  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_;
 | 
| -    }
 | 
| -    if (min_version_) {
 | 
| -      config->version_min = min_version_;
 | 
| -    }
 | 
| -  }
 | 
| -
 | 
| - protected:
 | 
| -  ~TestSSLConfigService() override {}
 | 
| -
 | 
| - private:
 | 
| -  const bool ev_enabled_;
 | 
| -  const bool online_rev_checking_;
 | 
| -  const bool rev_checking_required_local_anchors_;
 | 
| -  uint16_t min_version_;
 | 
| -  uint16_t fallback_min_version_;
 | 
| -};
 | 
| -
 | 
|  class FallbackTestURLRequestContext : public TestURLRequestContext {
 | 
|   public:
 | 
|    explicit FallbackTestURLRequestContext(bool delay_initialization)
 | 
|        : TestURLRequestContext(delay_initialization) {}
 | 
|  
 | 
|    void set_fallback_min_version(uint16_t version) {
 | 
| -    TestSSLConfigService *ssl_config_service =
 | 
| -        new TestSSLConfigService(true /* check for EV */,
 | 
| -                                 false /* online revocation checking */,
 | 
| -                                 false /* require rev. checking for local
 | 
| -                                          anchors */);
 | 
| +    TestSSLConfigService* ssl_config_service = new TestSSLConfigService(
 | 
| +        true /* check for EV */, false /* online revocation checking */,
 | 
| +        false /* require rev. checking for local
 | 
| +                                          anchors */,
 | 
| +        false /* token binding enabled */);
 | 
|      ssl_config_service->set_fallback_min_version(version);
 | 
|      set_ssl_config_service(ssl_config_service);
 | 
|    }
 | 
| @@ -8957,11 +9023,11 @@ class HTTPSOCSPTest : public HTTPSRequestTest {
 | 
|    // connetions to testserver. This can be overridden in test subclasses for
 | 
|    // different behaviour.
 | 
|    virtual void SetupContext(URLRequestContext* context) {
 | 
| -    context->set_ssl_config_service(
 | 
| -        new TestSSLConfigService(true /* check for EV */,
 | 
| -                                 true /* online revocation checking */,
 | 
| -                                 false /* require rev. checking for local
 | 
| -                                          anchors */));
 | 
| +    context->set_ssl_config_service(new TestSSLConfigService(
 | 
| +        true /* check for EV */, true /* online revocation checking */,
 | 
| +        false /* require rev. checking for local
 | 
| +                                          anchors */,
 | 
| +        false /* token binding enabled */));
 | 
|    }
 | 
|  
 | 
|    scoped_ptr<ScopedTestRoot> test_root_;
 | 
| @@ -9152,11 +9218,11 @@ TEST_F(HTTPSOCSPTest, MAYBE_RevokedStapled) {
 | 
|  class HTTPSHardFailTest : public HTTPSOCSPTest {
 | 
|   protected:
 | 
|    void SetupContext(URLRequestContext* context) override {
 | 
| -    context->set_ssl_config_service(
 | 
| -        new TestSSLConfigService(false /* check for EV */,
 | 
| -                                 false /* online revocation checking */,
 | 
| -                                 true /* require rev. checking for local
 | 
| -                                         anchors */));
 | 
| +    context->set_ssl_config_service(new TestSSLConfigService(
 | 
| +        false /* check for EV */, false /* online revocation checking */,
 | 
| +        true /* require rev. checking for local
 | 
| +                                         anchors */,
 | 
| +        false /* token binding enabled */));
 | 
|    }
 | 
|  };
 | 
|  
 | 
| @@ -9189,11 +9255,11 @@ TEST_F(HTTPSHardFailTest, FailsOnOCSPInvalid) {
 | 
|  class HTTPSEVCRLSetTest : public HTTPSOCSPTest {
 | 
|   protected:
 | 
|    void SetupContext(URLRequestContext* context) override {
 | 
| -    context->set_ssl_config_service(
 | 
| -        new TestSSLConfigService(true /* check for EV */,
 | 
| -                                 false /* online revocation checking */,
 | 
| -                                 false /* require rev. checking for local
 | 
| -                                          anchors */));
 | 
| +    context->set_ssl_config_service(new TestSSLConfigService(
 | 
| +        true /* check for EV */, false /* online revocation checking */,
 | 
| +        false /* require rev. checking for local
 | 
| +                                          anchors */,
 | 
| +        false /* token binding enabled */));
 | 
|    }
 | 
|  };
 | 
|  
 | 
| @@ -9374,11 +9440,11 @@ TEST_F(HTTPSEVCRLSetTest, ExpiredCRLSetAndRevokedNonEVCert) {
 | 
|  class HTTPSCRLSetTest : public HTTPSOCSPTest {
 | 
|   protected:
 | 
|    void SetupContext(URLRequestContext* context) override {
 | 
| -    context->set_ssl_config_service(
 | 
| -        new TestSSLConfigService(false /* check for EV */,
 | 
| -                                 false /* online revocation checking */,
 | 
| -                                 false /* require rev. checking for local
 | 
| -                                          anchors */));
 | 
| +    context->set_ssl_config_service(new TestSSLConfigService(
 | 
| +        false /* check for EV */, false /* online revocation checking */,
 | 
| +        false /* require rev. checking for local
 | 
| +                                          anchors */,
 | 
| +        false /* token binding enabled */));
 | 
|    }
 | 
|  };
 | 
|  
 | 
| 
 |