blob: 73a038d61cc31b275fe038024d8e3b77aee6c21b [file] [log] [blame]
[email protected]1bc6f5e2012-03-15 00:20:581// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]f61c3972010-12-23 09:54:152// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// This test suite uses SSLClientSocket to test the implementation of
6// SSLServerSocket. In order to establish connections between the sockets
7// we need two additional classes:
8// 1. FakeSocket
9// Connects SSL socket to FakeDataChannel. This class is just a stub.
10//
11// 2. FakeDataChannel
12// Implements the actual exchange of data between two FakeSockets.
13//
14// Implementations of these two classes are included in this file.
15
16#include "net/socket/ssl_server_socket.h"
17
tbansalf82cc8e2015-10-14 20:05:4918#include <stdint.h>
[email protected]55ee0e52011-07-21 18:29:4419#include <stdlib.h>
dchengc7eeda422015-12-26 03:56:4820#include <utility>
[email protected]f61c3972010-12-23 09:54:1521
ryanchung987b2ff2016-02-19 00:17:1222#include "base/callback_helpers.h"
[email protected]55ee0e52011-07-21 18:29:4423#include "base/compiler_specific.h"
Brett Wilsonc6a0c822017-09-12 00:04:2924#include "base/containers/queue.h"
[email protected]57999812013-02-24 05:40:5225#include "base/files/file_path.h"
thestigd8df0332014-09-04 06:33:2926#include "base/files/file_util.h"
skyostil4891b25b2015-06-11 11:43:4527#include "base/location.h"
tbansalf82cc8e2015-10-14 20:05:4928#include "base/logging.h"
Avi Drissman13fc8932015-12-20 04:40:4629#include "base/macros.h"
[email protected]18b577412013-07-18 04:19:1530#include "base/message_loop/message_loop.h"
fdoray5eeb7642016-06-22 16:11:2831#include "base/run_loop.h"
skyostil4891b25b2015-06-11 11:43:4532#include "base/single_thread_task_runner.h"
gabf767595f2016-05-11 18:50:3533#include "base/threading/thread_task_runner_handle.h"
ryanchung987b2ff2016-02-19 00:17:1234#include "build/build_config.h"
[email protected]4b559b4d2011-04-14 17:37:1435#include "crypto/nss_util.h"
36#include "crypto/rsa_private_key.h"
ryanchung987b2ff2016-02-19 00:17:1237#include "crypto/signature_creator.h"
[email protected]f61c3972010-12-23 09:54:1538#include "net/base/address_list.h"
[email protected]6ea7b152011-12-21 21:21:1339#include "net/base/completion_callback.h"
[email protected]f61c3972010-12-23 09:54:1540#include "net/base/host_port_pair.h"
41#include "net/base/io_buffer.h"
martijna2e83bd2016-03-18 13:10:4542#include "net/base/ip_address.h"
[email protected]e7f74da2011-04-19 23:49:3543#include "net/base/ip_endpoint.h"
[email protected]f61c3972010-12-23 09:54:1544#include "net/base/net_errors.h"
[email protected]6e7845ae2013-03-29 21:48:1145#include "net/cert/cert_status_flags.h"
rsleevid6de8302016-06-21 01:33:2046#include "net/cert/ct_policy_enforcer.h"
47#include "net/cert/ct_policy_status.h"
rsleevi22cae1672016-12-28 01:53:3648#include "net/cert/do_nothing_ct_verifier.h"
[email protected]6e7845ae2013-03-29 21:48:1149#include "net/cert/mock_cert_verifier.h"
ryanchung987b2ff2016-02-19 00:17:1250#include "net/cert/mock_client_cert_verifier.h"
eranmdcec9632016-10-10 14:16:1051#include "net/cert/signed_certificate_timestamp_and_status.h"
[email protected]6e7845ae2013-03-29 21:48:1152#include "net/cert/x509_certificate.h"
[email protected]b1c988b2013-06-13 06:48:1153#include "net/http/transport_security_state.h"
mikecironef22f9812016-10-04 03:40:1954#include "net/log/net_log_with_source.h"
[email protected]f61c3972010-12-23 09:54:1555#include "net/socket/client_socket_factory.h"
56#include "net/socket/socket_test_util.h"
57#include "net/socket/ssl_client_socket.h"
[email protected]3268023f2011-05-05 00:08:1058#include "net/socket/stream_socket.h"
ryanchung987b2ff2016-02-19 00:17:1259#include "net/ssl/ssl_cert_request_info.h"
davidben9dd84872015-05-02 00:22:5860#include "net/ssl/ssl_cipher_suite_names.h"
davidben9dd84872015-05-02 00:22:5861#include "net/ssl/ssl_connection_status_flags.h"
[email protected]536fd0b2013-03-14 17:41:5762#include "net/ssl/ssl_info.h"
ryanchung987b2ff2016-02-19 00:17:1263#include "net/ssl/ssl_private_key.h"
svaldez6e7e82a22015-10-28 19:39:5364#include "net/ssl/ssl_server_config.h"
ryanchung987b2ff2016-02-19 00:17:1265#include "net/ssl/test_ssl_private_key.h"
[email protected]6e7845ae2013-03-29 21:48:1166#include "net/test/cert_test_util.h"
robpercival214763f2016-07-01 23:27:0167#include "net/test/gtest_util.h"
rsleevia69c79a2016-06-22 03:28:4368#include "net/test/test_data_directory.h"
robpercival214763f2016-07-01 23:27:0169#include "testing/gmock/include/gmock/gmock.h"
[email protected]f61c3972010-12-23 09:54:1570#include "testing/gtest/include/gtest/gtest.h"
71#include "testing/platform_test.h"
tfarinae8cb8aa2016-10-21 02:44:0172#include "third_party/boringssl/src/include/openssl/evp.h"
73#include "third_party/boringssl/src/include/openssl/ssl.h"
[email protected]f61c3972010-12-23 09:54:1574
robpercival214763f2016-07-01 23:27:0175using net::test::IsError;
76using net::test::IsOk;
77
[email protected]f61c3972010-12-23 09:54:1578namespace net {
79
80namespace {
81
ryanchung987b2ff2016-02-19 00:17:1282const char kClientCertFileName[] = "client_1.pem";
83const char kClientPrivateKeyFileName[] = "client_1.pk8";
84const char kWrongClientCertFileName[] = "client_2.pem";
85const char kWrongClientPrivateKeyFileName[] = "client_2.pk8";
ryanchung987b2ff2016-02-19 00:17:1286
rsleevid6de8302016-06-21 01:33:2087class MockCTPolicyEnforcer : public CTPolicyEnforcer {
88 public:
89 MockCTPolicyEnforcer() = default;
90 ~MockCTPolicyEnforcer() override = default;
Emily Stark627238f2017-11-29 03:29:5491 ct::CTPolicyCompliance CheckCompliance(
rsleevid6de8302016-06-21 01:33:2092 X509Certificate* cert,
93 const SCTList& verified_scts,
tfarina428341112016-09-22 13:38:2094 const NetLogWithSource& net_log) override {
Emily Stark627238f2017-11-29 03:29:5495 return ct::CTPolicyCompliance::CT_POLICY_COMPLIES_VIA_SCTS;
rsleevid6de8302016-06-21 01:33:2096 }
rsleevid6de8302016-06-21 01:33:2097};
98
[email protected]f61c3972010-12-23 09:54:1599class FakeDataChannel {
100 public:
[email protected]55ee0e52011-07-21 18:29:44101 FakeDataChannel()
[email protected]83039bb2011-12-09 18:43:55102 : read_buf_len_(0),
[email protected]c0e4dd12012-05-16 19:36:31103 closed_(false),
[email protected]d5492c52013-11-10 20:44:39104 write_called_after_close_(false),
105 weak_factory_(this) {
[email protected]f61c3972010-12-23 09:54:15106 }
107
[email protected]47a12862012-04-10 01:00:49108 int Read(IOBuffer* buf, int buf_len, const CompletionCallback& callback) {
[email protected]4da82282014-07-16 18:40:43109 DCHECK(read_callback_.is_null());
dcheng08ea2af02014-08-25 23:38:09110 DCHECK(!read_buf_.get());
[email protected]c0e4dd12012-05-16 19:36:31111 if (closed_)
112 return 0;
[email protected]3f55aa12011-12-07 02:03:33113 if (data_.empty()) {
[email protected]f61c3972010-12-23 09:54:15114 read_callback_ = callback;
115 read_buf_ = buf;
116 read_buf_len_ = buf_len;
[email protected]fa6ce922014-07-17 04:27:04117 return ERR_IO_PENDING;
[email protected]f61c3972010-12-23 09:54:15118 }
tfarina9b6381442015-10-05 22:38:11119 return PropagateData(buf, buf_len);
[email protected]f61c3972010-12-23 09:54:15120 }
121
[email protected]47a12862012-04-10 01:00:49122 int Write(IOBuffer* buf, int buf_len, const CompletionCallback& callback) {
[email protected]4da82282014-07-16 18:40:43123 DCHECK(write_callback_.is_null());
[email protected]c0e4dd12012-05-16 19:36:31124 if (closed_) {
125 if (write_called_after_close_)
[email protected]fa6ce922014-07-17 04:27:04126 return ERR_CONNECTION_RESET;
[email protected]c0e4dd12012-05-16 19:36:31127 write_called_after_close_ = true;
128 write_callback_ = callback;
skyostil4891b25b2015-06-11 11:43:45129 base::ThreadTaskRunnerHandle::Get()->PostTask(
[email protected]c0e4dd12012-05-16 19:36:31130 FROM_HERE, base::Bind(&FakeDataChannel::DoWriteCallback,
131 weak_factory_.GetWeakPtr()));
[email protected]fa6ce922014-07-17 04:27:04132 return ERR_IO_PENDING;
[email protected]c0e4dd12012-05-16 19:36:31133 }
[email protected]4da82282014-07-16 18:40:43134 // This function returns synchronously, so make a copy of the buffer.
[email protected]fa6ce922014-07-17 04:27:04135 data_.push(new DrainableIOBuffer(
136 new StringIOBuffer(std::string(buf->data(), buf_len)),
[email protected]4da82282014-07-16 18:40:43137 buf_len));
skyostil4891b25b2015-06-11 11:43:45138 base::ThreadTaskRunnerHandle::Get()->PostTask(
[email protected]83039bb2011-12-09 18:43:55139 FROM_HERE, base::Bind(&FakeDataChannel::DoReadCallback,
140 weak_factory_.GetWeakPtr()));
[email protected]f61c3972010-12-23 09:54:15141 return buf_len;
142 }
143
[email protected]c0e4dd12012-05-16 19:36:31144 // Closes the FakeDataChannel. After Close() is called, Read() returns 0,
145 // indicating EOF, and Write() fails with ERR_CONNECTION_RESET. Note that
146 // after the FakeDataChannel is closed, the first Write() call completes
147 // asynchronously, which is necessary to reproduce bug 127822.
148 void Close() {
149 closed_ = true;
ryanchung987b2ff2016-02-19 00:17:12150 if (!read_callback_.is_null()) {
151 base::ThreadTaskRunnerHandle::Get()->PostTask(
152 FROM_HERE, base::Bind(&FakeDataChannel::DoReadCallback,
153 weak_factory_.GetWeakPtr()));
154 }
[email protected]c0e4dd12012-05-16 19:36:31155 }
156
[email protected]f61c3972010-12-23 09:54:15157 private:
158 void DoReadCallback() {
ryanchung987b2ff2016-02-19 00:17:12159 if (read_callback_.is_null())
160 return;
161
162 if (closed_) {
163 base::ResetAndReturn(&read_callback_).Run(ERR_CONNECTION_CLOSED);
164 return;
165 }
166
167 if (data_.empty())
[email protected]f61c3972010-12-23 09:54:15168 return;
169
tfarina9b6381442015-10-05 22:38:11170 int copied = PropagateData(read_buf_, read_buf_len_);
[email protected]83039bb2011-12-09 18:43:55171 CompletionCallback callback = read_callback_;
172 read_callback_.Reset();
173 read_buf_ = NULL;
174 read_buf_len_ = 0;
175 callback.Run(copied);
[email protected]f61c3972010-12-23 09:54:15176 }
177
[email protected]c0e4dd12012-05-16 19:36:31178 void DoWriteCallback() {
179 if (write_callback_.is_null())
180 return;
181
182 CompletionCallback callback = write_callback_;
183 write_callback_.Reset();
[email protected]fa6ce922014-07-17 04:27:04184 callback.Run(ERR_CONNECTION_RESET);
[email protected]c0e4dd12012-05-16 19:36:31185 }
186
tfarina9b6381442015-10-05 22:38:11187 int PropagateData(scoped_refptr<IOBuffer> read_buf, int read_buf_len) {
[email protected]fa6ce922014-07-17 04:27:04188 scoped_refptr<DrainableIOBuffer> buf = data_.front();
[email protected]f61c3972010-12-23 09:54:15189 int copied = std::min(buf->BytesRemaining(), read_buf_len);
190 memcpy(read_buf->data(), buf->data(), copied);
191 buf->DidConsume(copied);
192
193 if (!buf->BytesRemaining())
194 data_.pop();
195 return copied;
196 }
197
[email protected]83039bb2011-12-09 18:43:55198 CompletionCallback read_callback_;
[email protected]fa6ce922014-07-17 04:27:04199 scoped_refptr<IOBuffer> read_buf_;
[email protected]f61c3972010-12-23 09:54:15200 int read_buf_len_;
201
[email protected]c0e4dd12012-05-16 19:36:31202 CompletionCallback write_callback_;
203
Brett Wilsonc6a0c822017-09-12 00:04:29204 base::queue<scoped_refptr<DrainableIOBuffer>> data_;
[email protected]f61c3972010-12-23 09:54:15205
[email protected]c0e4dd12012-05-16 19:36:31206 // True if Close() has been called.
207 bool closed_;
208
209 // Controls the completion of Write() after the FakeDataChannel is closed.
210 // After the FakeDataChannel is closed, the first Write() call completes
211 // asynchronously.
212 bool write_called_after_close_;
213
[email protected]d5492c52013-11-10 20:44:39214 base::WeakPtrFactory<FakeDataChannel> weak_factory_;
215
[email protected]f61c3972010-12-23 09:54:15216 DISALLOW_COPY_AND_ASSIGN(FakeDataChannel);
217};
218
[email protected]3268023f2011-05-05 00:08:10219class FakeSocket : public StreamSocket {
[email protected]f61c3972010-12-23 09:54:15220 public:
221 FakeSocket(FakeDataChannel* incoming_channel,
222 FakeDataChannel* outgoing_channel)
ryanchungeb9e3bc2016-03-08 05:08:10223 : incoming_(incoming_channel), outgoing_(outgoing_channel) {}
[email protected]f61c3972010-12-23 09:54:15224
Chris Watkins7a41d3552017-12-01 02:13:27225 ~FakeSocket() override = default;
[email protected]f61c3972010-12-23 09:54:15226
dchengb03027d2014-10-21 12:00:20227 int Read(IOBuffer* buf,
228 int buf_len,
229 const CompletionCallback& callback) override {
[email protected]3f55aa12011-12-07 02:03:33230 // Read random number of bytes.
231 buf_len = rand() % buf_len + 1;
232 return incoming_->Read(buf, buf_len, callback);
233 }
[email protected]f61c3972010-12-23 09:54:15234
dchengb03027d2014-10-21 12:00:20235 int Write(IOBuffer* buf,
236 int buf_len,
237 const CompletionCallback& callback) override {
[email protected]55ee0e52011-07-21 18:29:44238 // Write random number of bytes.
239 buf_len = rand() % buf_len + 1;
[email protected]f61c3972010-12-23 09:54:15240 return outgoing_->Write(buf, buf_len, callback);
241 }
242
Avi Drissman13fc8932015-12-20 04:40:46243 int SetReceiveBufferSize(int32_t size) override { return OK; }
[email protected]f61c3972010-12-23 09:54:15244
Avi Drissman13fc8932015-12-20 04:40:46245 int SetSendBufferSize(int32_t size) override { return OK; }
[email protected]f61c3972010-12-23 09:54:15246
dchengb03027d2014-10-21 12:00:20247 int Connect(const CompletionCallback& callback) override { return OK; }
[email protected]f61c3972010-12-23 09:54:15248
dchengb03027d2014-10-21 12:00:20249 void Disconnect() override {
[email protected]c0e4dd12012-05-16 19:36:31250 incoming_->Close();
251 outgoing_->Close();
252 }
[email protected]f61c3972010-12-23 09:54:15253
dchengb03027d2014-10-21 12:00:20254 bool IsConnected() const override { return true; }
[email protected]f61c3972010-12-23 09:54:15255
dchengb03027d2014-10-21 12:00:20256 bool IsConnectedAndIdle() const override { return true; }
[email protected]f61c3972010-12-23 09:54:15257
dchengb03027d2014-10-21 12:00:20258 int GetPeerAddress(IPEndPoint* address) const override {
martijna2e83bd2016-03-18 13:10:45259 *address = IPEndPoint(IPAddress::IPv4AllZeros(), 0 /*port*/);
[email protected]fa6ce922014-07-17 04:27:04260 return OK;
[email protected]f61c3972010-12-23 09:54:15261 }
262
dchengb03027d2014-10-21 12:00:20263 int GetLocalAddress(IPEndPoint* address) const override {
martijna2e83bd2016-03-18 13:10:45264 *address = IPEndPoint(IPAddress::IPv4AllZeros(), 0 /*port*/);
[email protected]fa6ce922014-07-17 04:27:04265 return OK;
[email protected]e7f74da2011-04-19 23:49:35266 }
267
tfarina428341112016-09-22 13:38:20268 const NetLogWithSource& NetLog() const override { return net_log_; }
[email protected]f61c3972010-12-23 09:54:15269
dchengb03027d2014-10-21 12:00:20270 void SetSubresourceSpeculation() override {}
271 void SetOmniboxSpeculation() override {}
[email protected]f61c3972010-12-23 09:54:15272
dchengb03027d2014-10-21 12:00:20273 bool WasEverUsed() const override { return true; }
[email protected]f61c3972010-12-23 09:54:15274
tfarina2846404c2016-12-25 14:31:37275 bool WasAlpnNegotiated() const override { return false; }
[email protected]5e6efa52011-06-27 17:26:41276
dchengb03027d2014-10-21 12:00:20277 NextProto GetNegotiatedProtocol() const override { return kProtoUnknown; }
[email protected]2d88e7d2012-07-19 17:55:17278
dchengb03027d2014-10-21 12:00:20279 bool GetSSLInfo(SSLInfo* ssl_info) override { return false; }
[email protected]2d88e7d2012-07-19 17:55:17280
ttuttle23fdb7b2015-05-15 01:28:03281 void GetConnectionAttempts(ConnectionAttempts* out) const override {
282 out->clear();
283 }
284
285 void ClearConnectionAttempts() override {}
286
287 void AddConnectionAttempts(const ConnectionAttempts& attempts) override {}
288
tbansalf82cc8e2015-10-14 20:05:49289 int64_t GetTotalReceivedBytes() const override {
290 NOTIMPLEMENTED();
291 return 0;
292 }
293
[email protected]f61c3972010-12-23 09:54:15294 private:
tfarina428341112016-09-22 13:38:20295 NetLogWithSource net_log_;
[email protected]f61c3972010-12-23 09:54:15296 FakeDataChannel* incoming_;
297 FakeDataChannel* outgoing_;
298
299 DISALLOW_COPY_AND_ASSIGN(FakeSocket);
300};
301
302} // namespace
303
304// Verify the correctness of the test helper classes first.
305TEST(FakeSocketTest, DataTransfer) {
306 // Establish channels between two sockets.
307 FakeDataChannel channel_1;
308 FakeDataChannel channel_2;
309 FakeSocket client(&channel_1, &channel_2);
310 FakeSocket server(&channel_2, &channel_1);
311
312 const char kTestData[] = "testing123";
313 const int kTestDataSize = strlen(kTestData);
314 const int kReadBufSize = 1024;
[email protected]fa6ce922014-07-17 04:27:04315 scoped_refptr<IOBuffer> write_buf = new StringIOBuffer(kTestData);
316 scoped_refptr<IOBuffer> read_buf = new IOBuffer(kReadBufSize);
[email protected]f61c3972010-12-23 09:54:15317
318 // Write then read.
[email protected]90499482013-06-01 00:39:50319 int written =
320 server.Write(write_buf.get(), kTestDataSize, CompletionCallback());
[email protected]55ee0e52011-07-21 18:29:44321 EXPECT_GT(written, 0);
322 EXPECT_LE(written, kTestDataSize);
323
[email protected]90499482013-06-01 00:39:50324 int read = client.Read(read_buf.get(), kReadBufSize, CompletionCallback());
[email protected]55ee0e52011-07-21 18:29:44325 EXPECT_GT(read, 0);
326 EXPECT_LE(read, written);
327 EXPECT_EQ(0, memcmp(kTestData, read_buf->data(), read));
[email protected]f61c3972010-12-23 09:54:15328
329 // Read then write.
[email protected]83039bb2011-12-09 18:43:55330 TestCompletionCallback callback;
[email protected]fa6ce922014-07-17 04:27:04331 EXPECT_EQ(ERR_IO_PENDING,
[email protected]90499482013-06-01 00:39:50332 server.Read(read_buf.get(), kReadBufSize, callback.callback()));
[email protected]55ee0e52011-07-21 18:29:44333
[email protected]90499482013-06-01 00:39:50334 written = client.Write(write_buf.get(), kTestDataSize, CompletionCallback());
[email protected]55ee0e52011-07-21 18:29:44335 EXPECT_GT(written, 0);
336 EXPECT_LE(written, kTestDataSize);
337
338 read = callback.WaitForResult();
339 EXPECT_GT(read, 0);
340 EXPECT_LE(read, written);
341 EXPECT_EQ(0, memcmp(kTestData, read_buf->data(), read));
[email protected]f61c3972010-12-23 09:54:15342}
343
344class SSLServerSocketTest : public PlatformTest {
345 public:
346 SSLServerSocketTest()
[email protected]fa6ce922014-07-17 04:27:04347 : socket_factory_(ClientSocketFactory::GetDefaultFactory()),
[email protected]b1c988b2013-06-13 06:48:11348 cert_verifier_(new MockCertVerifier()),
ryanchung987b2ff2016-02-19 00:17:12349 client_cert_verifier_(new MockClientCertVerifier()),
rsleevid6de8302016-06-21 01:33:20350 transport_security_state_(new TransportSecurityState),
rsleevi22cae1672016-12-28 01:53:36351 ct_verifier_(new DoNothingCTVerifier),
rsleevid6de8302016-06-21 01:33:20352 ct_policy_enforcer_(new MockCTPolicyEnforcer) {}
rsleevia5c430222016-03-11 05:55:12353
354 void SetUp() override {
355 PlatformTest::SetUp();
356
ryanchung987b2ff2016-02-19 00:17:12357 cert_verifier_->set_default_result(ERR_CERT_AUTHORITY_INVALID);
358 client_cert_verifier_->set_default_result(ERR_CERT_AUTHORITY_INVALID);
[email protected]f61c3972010-12-23 09:54:15359
ryanchungeb9e3bc2016-03-08 05:08:10360 server_cert_ =
361 ImportCertFromFile(GetTestCertsDirectory(), "unittest.selfsigned.der");
rsleevia5c430222016-03-11 05:55:12362 ASSERT_TRUE(server_cert_);
ryanchungeb9e3bc2016-03-08 05:08:10363 server_private_key_ = ReadTestKey("unittest.key.bin");
rsleevia5c430222016-03-11 05:55:12364 ASSERT_TRUE(server_private_key_);
[email protected]f61c3972010-12-23 09:54:15365
sergeyuff826d5e2015-05-13 20:35:22366 client_ssl_config_.false_start_enabled = false;
367 client_ssl_config_.channel_id_enabled = false;
[email protected]f61c3972010-12-23 09:54:15368
369 // Certificate provided by the host doesn't need authority.
rsleevi74e99742016-09-13 20:35:25370 client_ssl_config_.allowed_bad_certs.emplace_back(
371 server_cert_, CERT_STATUS_AUTHORITY_INVALID);
ryanchungeb9e3bc2016-03-08 05:08:10372 }
373
374 protected:
375 void CreateContext() {
376 client_socket_.reset();
377 server_socket_.reset();
378 channel_1_.reset();
379 channel_2_.reset();
380 server_context_.reset();
381 server_context_ = CreateSSLServerContext(
382 server_cert_.get(), *server_private_key_, server_ssl_config_);
383 }
384
385 void CreateSockets() {
386 client_socket_.reset();
387 server_socket_.reset();
388 channel_1_.reset(new FakeDataChannel());
389 channel_2_.reset(new FakeDataChannel());
danakj655b66c2016-04-16 00:51:38390 std::unique_ptr<ClientSocketHandle> client_connection(
391 new ClientSocketHandle);
392 client_connection->SetSocket(std::unique_ptr<StreamSocket>(
ryanchungeb9e3bc2016-03-08 05:08:10393 new FakeSocket(channel_1_.get(), channel_2_.get())));
danakj655b66c2016-04-16 00:51:38394 std::unique_ptr<StreamSocket> server_socket(
ryanchungeb9e3bc2016-03-08 05:08:10395 new FakeSocket(channel_2_.get(), channel_1_.get()));
[email protected]f61c3972010-12-23 09:54:15396
[email protected]fa6ce922014-07-17 04:27:04397 HostPortPair host_and_pair("unittest", 0);
398 SSLClientSocketContext context;
[email protected]9f59fac2012-03-21 23:18:11399 context.cert_verifier = cert_verifier_.get();
[email protected]b1c988b2013-06-13 06:48:11400 context.transport_security_state = transport_security_state_.get();
rsleevid6de8302016-06-21 01:33:20401 context.cert_transparency_verifier = ct_verifier_.get();
402 context.ct_policy_enforcer = ct_policy_enforcer_.get();
David Benjaminb3840f42017-08-03 15:50:16403 // Set a dummy session cache shard to enable session caching.
404 context.ssl_session_cache_shard = "shard";
rsleevia5c430222016-03-11 05:55:12405
sergeyuff826d5e2015-05-13 20:35:22406 client_socket_ = socket_factory_->CreateSSLClientSocket(
dchengc7eeda422015-12-26 03:56:48407 std::move(client_connection), host_and_pair, client_ssl_config_,
408 context);
rsleevia5c430222016-03-11 05:55:12409 ASSERT_TRUE(client_socket_);
ryanchungeb9e3bc2016-03-08 05:08:10410
ryanchung987b2ff2016-02-19 00:17:12411 server_socket_ =
ryanchungeb9e3bc2016-03-08 05:08:10412 server_context_->CreateSSLServerSocket(std::move(server_socket));
rsleevia5c430222016-03-11 05:55:12413 ASSERT_TRUE(server_socket_);
[email protected]f61c3972010-12-23 09:54:15414 }
415
ryanchung987b2ff2016-02-19 00:17:12416 void ConfigureClientCertsForClient(const char* cert_file_name,
417 const char* private_key_file_name) {
418 client_ssl_config_.send_client_cert = true;
419 client_ssl_config_.client_cert =
420 ImportCertFromFile(GetTestCertsDirectory(), cert_file_name);
421 ASSERT_TRUE(client_ssl_config_.client_cert);
rsleevia5c430222016-03-11 05:55:12422
danakj655b66c2016-04-16 00:51:38423 std::unique_ptr<crypto::RSAPrivateKey> key =
424 ReadTestKey(private_key_file_name);
ryanchung987b2ff2016-02-19 00:17:12425 ASSERT_TRUE(key);
rsleevia5c430222016-03-11 05:55:12426
agl5a7cadf2016-07-13 16:52:53427 EVP_PKEY_up_ref(key->key());
428 client_ssl_config_.client_private_key =
davidbend80c12c2016-10-11 00:13:49429 WrapOpenSSLPrivateKey(bssl::UniquePtr<EVP_PKEY>(key->key()));
ryanchung987b2ff2016-02-19 00:17:12430 }
431
432 void ConfigureClientCertsForServer() {
433 server_ssl_config_.client_cert_type =
434 SSLServerConfig::ClientCertType::REQUIRE_CLIENT_CERT;
435
David Benjamin99dada22017-09-28 20:04:00436 // "CN=B CA" - DER encoded DN of the issuer of client_1.pem
437 static const uint8_t kClientCertCAName[] = {
438 0x30, 0x0f, 0x31, 0x0d, 0x30, 0x0b, 0x06, 0x03, 0x55,
439 0x04, 0x03, 0x0c, 0x04, 0x42, 0x20, 0x43, 0x41};
440 server_ssl_config_.cert_authorities_.push_back(std::string(
441 std::begin(kClientCertCAName), std::end(kClientCertCAName)));
ryanchung987b2ff2016-02-19 00:17:12442
443 scoped_refptr<X509Certificate> expected_client_cert(
444 ImportCertFromFile(GetTestCertsDirectory(), kClientCertFileName));
rsleevia5c430222016-03-11 05:55:12445 ASSERT_TRUE(expected_client_cert);
446
ryanchung987b2ff2016-02-19 00:17:12447 client_cert_verifier_->AddResultForCert(expected_client_cert.get(), OK);
448
449 server_ssl_config_.client_cert_verifier = client_cert_verifier_.get();
450 }
451
danakj655b66c2016-04-16 00:51:38452 std::unique_ptr<crypto::RSAPrivateKey> ReadTestKey(
453 const base::StringPiece& name) {
ryanchung987b2ff2016-02-19 00:17:12454 base::FilePath certs_dir(GetTestCertsDirectory());
455 base::FilePath key_path = certs_dir.AppendASCII(name);
456 std::string key_string;
457 if (!base::ReadFileToString(key_path, &key_string))
458 return nullptr;
459 std::vector<uint8_t> key_vector(
460 reinterpret_cast<const uint8_t*>(key_string.data()),
461 reinterpret_cast<const uint8_t*>(key_string.data() +
462 key_string.length()));
danakj655b66c2016-04-16 00:51:38463 std::unique_ptr<crypto::RSAPrivateKey> key(
ryanchung987b2ff2016-02-19 00:17:12464 crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(key_vector));
465 return key;
466 }
ryanchung987b2ff2016-02-19 00:17:12467
danakj655b66c2016-04-16 00:51:38468 std::unique_ptr<FakeDataChannel> channel_1_;
469 std::unique_ptr<FakeDataChannel> channel_2_;
sergeyuff826d5e2015-05-13 20:35:22470 SSLConfig client_ssl_config_;
svaldez6e7e82a22015-10-28 19:39:53471 SSLServerConfig server_ssl_config_;
danakj655b66c2016-04-16 00:51:38472 std::unique_ptr<SSLClientSocket> client_socket_;
473 std::unique_ptr<SSLServerSocket> server_socket_;
[email protected]fa6ce922014-07-17 04:27:04474 ClientSocketFactory* socket_factory_;
danakj655b66c2016-04-16 00:51:38475 std::unique_ptr<MockCertVerifier> cert_verifier_;
476 std::unique_ptr<MockClientCertVerifier> client_cert_verifier_;
477 std::unique_ptr<TransportSecurityState> transport_security_state_;
rsleevi22cae1672016-12-28 01:53:36478 std::unique_ptr<DoNothingCTVerifier> ct_verifier_;
rsleevid6de8302016-06-21 01:33:20479 std::unique_ptr<MockCTPolicyEnforcer> ct_policy_enforcer_;
danakj655b66c2016-04-16 00:51:38480 std::unique_ptr<SSLServerContext> server_context_;
481 std::unique_ptr<crypto::RSAPrivateKey> server_private_key_;
ryanchungeb9e3bc2016-03-08 05:08:10482 scoped_refptr<X509Certificate> server_cert_;
[email protected]f61c3972010-12-23 09:54:15483};
484
[email protected]f61c3972010-12-23 09:54:15485// This test only executes creation of client and server sockets. This is to
486// test that creation of sockets doesn't crash and have minimal code to run
487// under valgrind in order to help debugging memory problems.
488TEST_F(SSLServerSocketTest, Initialize) {
rsleevia5c430222016-03-11 05:55:12489 ASSERT_NO_FATAL_FAILURE(CreateContext());
490 ASSERT_NO_FATAL_FAILURE(CreateSockets());
[email protected]f61c3972010-12-23 09:54:15491}
492
[email protected]a7ac3c32011-06-17 19:10:15493// This test executes Connect() on SSLClientSocket and Handshake() on
494// SSLServerSocket to make sure handshaking between the two sockets is
[email protected]f61c3972010-12-23 09:54:15495// completed successfully.
496TEST_F(SSLServerSocketTest, Handshake) {
rsleevia5c430222016-03-11 05:55:12497 ASSERT_NO_FATAL_FAILURE(CreateContext());
498 ASSERT_NO_FATAL_FAILURE(CreateSockets());
[email protected]f61c3972010-12-23 09:54:15499
[email protected]6ea7b152011-12-21 21:21:13500 TestCompletionCallback handshake_callback;
[email protected]6ea7b152011-12-21 21:21:13501 int server_ret = server_socket_->Handshake(handshake_callback.callback());
[email protected]f61c3972010-12-23 09:54:15502
ryanchung987b2ff2016-02-19 00:17:12503 TestCompletionCallback connect_callback;
[email protected]83039bb2011-12-09 18:43:55504 int client_ret = client_socket_->Connect(connect_callback.callback());
[email protected]f61c3972010-12-23 09:54:15505
ryanchung987b2ff2016-02-19 00:17:12506 client_ret = connect_callback.GetResult(client_ret);
507 server_ret = handshake_callback.GetResult(server_ret);
508
robpercival214763f2016-07-01 23:27:01509 ASSERT_THAT(client_ret, IsOk());
510 ASSERT_THAT(server_ret, IsOk());
[email protected]4dc832e2011-04-28 22:04:24511
512 // Make sure the cert status is expected.
513 SSLInfo ssl_info;
davidben9dd84872015-05-02 00:22:58514 ASSERT_TRUE(client_socket_->GetSSLInfo(&ssl_info));
[email protected]4dc832e2011-04-28 22:04:24515 EXPECT_EQ(CERT_STATUS_AUTHORITY_INVALID, ssl_info.cert_status);
davidben9dd84872015-05-02 00:22:58516
davidben56a8aece2016-10-14 18:20:56517 // The default cipher suite should be ECDHE and an AEAD.
davidben9dd84872015-05-02 00:22:58518 uint16_t cipher_suite =
519 SSLConnectionStatusToCipherSuite(ssl_info.connection_status);
520 const char* key_exchange;
521 const char* cipher;
522 const char* mac;
523 bool is_aead;
davidben56a8aece2016-10-14 18:20:56524 bool is_tls13;
525 SSLCipherSuiteToStrings(&key_exchange, &cipher, &mac, &is_aead, &is_tls13,
526 cipher_suite);
hansc048c38b2016-10-14 11:30:09527 EXPECT_TRUE(is_aead);
davidben56a8aece2016-10-14 18:20:56528 ASSERT_FALSE(is_tls13);
529 EXPECT_STREQ("ECDHE_RSA", key_exchange);
[email protected]f61c3972010-12-23 09:54:15530}
531
ryanchungeb9e3bc2016-03-08 05:08:10532// This test makes sure the session cache is working.
533TEST_F(SSLServerSocketTest, HandshakeCached) {
rsleevia5c430222016-03-11 05:55:12534 ASSERT_NO_FATAL_FAILURE(CreateContext());
535 ASSERT_NO_FATAL_FAILURE(CreateSockets());
ryanchungeb9e3bc2016-03-08 05:08:10536
537 TestCompletionCallback handshake_callback;
538 int server_ret = server_socket_->Handshake(handshake_callback.callback());
539
540 TestCompletionCallback connect_callback;
541 int client_ret = client_socket_->Connect(connect_callback.callback());
542
543 client_ret = connect_callback.GetResult(client_ret);
544 server_ret = handshake_callback.GetResult(server_ret);
545
robpercival214763f2016-07-01 23:27:01546 ASSERT_THAT(client_ret, IsOk());
547 ASSERT_THAT(server_ret, IsOk());
ryanchungeb9e3bc2016-03-08 05:08:10548
549 // Make sure the cert status is expected.
550 SSLInfo ssl_info;
551 ASSERT_TRUE(client_socket_->GetSSLInfo(&ssl_info));
552 EXPECT_EQ(ssl_info.handshake_type, SSLInfo::HANDSHAKE_FULL);
553 SSLInfo ssl_server_info;
554 ASSERT_TRUE(server_socket_->GetSSLInfo(&ssl_server_info));
555 EXPECT_EQ(ssl_server_info.handshake_type, SSLInfo::HANDSHAKE_FULL);
556
557 // Make sure the second connection is cached.
rsleevia5c430222016-03-11 05:55:12558 ASSERT_NO_FATAL_FAILURE(CreateSockets());
ryanchungeb9e3bc2016-03-08 05:08:10559 TestCompletionCallback handshake_callback2;
560 int server_ret2 = server_socket_->Handshake(handshake_callback2.callback());
561
562 TestCompletionCallback connect_callback2;
563 int client_ret2 = client_socket_->Connect(connect_callback2.callback());
564
565 client_ret2 = connect_callback2.GetResult(client_ret2);
566 server_ret2 = handshake_callback2.GetResult(server_ret2);
567
robpercival214763f2016-07-01 23:27:01568 ASSERT_THAT(client_ret2, IsOk());
569 ASSERT_THAT(server_ret2, IsOk());
ryanchungeb9e3bc2016-03-08 05:08:10570
571 // Make sure the cert status is expected.
572 SSLInfo ssl_info2;
573 ASSERT_TRUE(client_socket_->GetSSLInfo(&ssl_info2));
574 EXPECT_EQ(ssl_info2.handshake_type, SSLInfo::HANDSHAKE_RESUME);
575 SSLInfo ssl_server_info2;
576 ASSERT_TRUE(server_socket_->GetSSLInfo(&ssl_server_info2));
577 EXPECT_EQ(ssl_server_info2.handshake_type, SSLInfo::HANDSHAKE_RESUME);
578}
579
580// This test makes sure the session cache separates out by server context.
581TEST_F(SSLServerSocketTest, HandshakeCachedContextSwitch) {
rsleevia5c430222016-03-11 05:55:12582 ASSERT_NO_FATAL_FAILURE(CreateContext());
583 ASSERT_NO_FATAL_FAILURE(CreateSockets());
ryanchungeb9e3bc2016-03-08 05:08:10584
585 TestCompletionCallback handshake_callback;
586 int server_ret = server_socket_->Handshake(handshake_callback.callback());
587
588 TestCompletionCallback connect_callback;
589 int client_ret = client_socket_->Connect(connect_callback.callback());
590
591 client_ret = connect_callback.GetResult(client_ret);
592 server_ret = handshake_callback.GetResult(server_ret);
593
robpercival214763f2016-07-01 23:27:01594 ASSERT_THAT(client_ret, IsOk());
595 ASSERT_THAT(server_ret, IsOk());
ryanchungeb9e3bc2016-03-08 05:08:10596
597 // Make sure the cert status is expected.
598 SSLInfo ssl_info;
599 ASSERT_TRUE(client_socket_->GetSSLInfo(&ssl_info));
600 EXPECT_EQ(ssl_info.handshake_type, SSLInfo::HANDSHAKE_FULL);
601 SSLInfo ssl_server_info;
602 ASSERT_TRUE(server_socket_->GetSSLInfo(&ssl_server_info));
603 EXPECT_EQ(ssl_server_info.handshake_type, SSLInfo::HANDSHAKE_FULL);
604
605 // Make sure the second connection is NOT cached when using a new context.
rsleevia5c430222016-03-11 05:55:12606 ASSERT_NO_FATAL_FAILURE(CreateContext());
607 ASSERT_NO_FATAL_FAILURE(CreateSockets());
ryanchungeb9e3bc2016-03-08 05:08:10608
609 TestCompletionCallback handshake_callback2;
610 int server_ret2 = server_socket_->Handshake(handshake_callback2.callback());
611
612 TestCompletionCallback connect_callback2;
613 int client_ret2 = client_socket_->Connect(connect_callback2.callback());
614
615 client_ret2 = connect_callback2.GetResult(client_ret2);
616 server_ret2 = handshake_callback2.GetResult(server_ret2);
617
robpercival214763f2016-07-01 23:27:01618 ASSERT_THAT(client_ret2, IsOk());
619 ASSERT_THAT(server_ret2, IsOk());
ryanchungeb9e3bc2016-03-08 05:08:10620
621 // Make sure the cert status is expected.
622 SSLInfo ssl_info2;
623 ASSERT_TRUE(client_socket_->GetSSLInfo(&ssl_info2));
624 EXPECT_EQ(ssl_info2.handshake_type, SSLInfo::HANDSHAKE_FULL);
625 SSLInfo ssl_server_info2;
626 ASSERT_TRUE(server_socket_->GetSSLInfo(&ssl_server_info2));
627 EXPECT_EQ(ssl_server_info2.handshake_type, SSLInfo::HANDSHAKE_FULL);
628}
629
ryanchung987b2ff2016-02-19 00:17:12630// This test executes Connect() on SSLClientSocket and Handshake() on
631// SSLServerSocket to make sure handshaking between the two sockets is
632// completed successfully, using client certificate.
633TEST_F(SSLServerSocketTest, HandshakeWithClientCert) {
634 scoped_refptr<X509Certificate> client_cert =
635 ImportCertFromFile(GetTestCertsDirectory(), kClientCertFileName);
rsleevia5c430222016-03-11 05:55:12636 ASSERT_NO_FATAL_FAILURE(ConfigureClientCertsForClient(
637 kClientCertFileName, kClientPrivateKeyFileName));
638 ASSERT_NO_FATAL_FAILURE(ConfigureClientCertsForServer());
639 ASSERT_NO_FATAL_FAILURE(CreateContext());
640 ASSERT_NO_FATAL_FAILURE(CreateSockets());
ryanchung987b2ff2016-02-19 00:17:12641
642 TestCompletionCallback handshake_callback;
643 int server_ret = server_socket_->Handshake(handshake_callback.callback());
644
645 TestCompletionCallback connect_callback;
646 int client_ret = client_socket_->Connect(connect_callback.callback());
647
648 client_ret = connect_callback.GetResult(client_ret);
649 server_ret = handshake_callback.GetResult(server_ret);
650
robpercival214763f2016-07-01 23:27:01651 ASSERT_THAT(client_ret, IsOk());
652 ASSERT_THAT(server_ret, IsOk());
ryanchung987b2ff2016-02-19 00:17:12653
654 // Make sure the cert status is expected.
655 SSLInfo ssl_info;
656 client_socket_->GetSSLInfo(&ssl_info);
657 EXPECT_EQ(CERT_STATUS_AUTHORITY_INVALID, ssl_info.cert_status);
658 server_socket_->GetSSLInfo(&ssl_info);
rsleevia5c430222016-03-11 05:55:12659 ASSERT_TRUE(ssl_info.cert.get());
ryanchung987b2ff2016-02-19 00:17:12660 EXPECT_TRUE(client_cert->Equals(ssl_info.cert.get()));
661}
662
ryanchungeb9e3bc2016-03-08 05:08:10663// This test executes Connect() on SSLClientSocket and Handshake() twice on
664// SSLServerSocket to make sure handshaking between the two sockets is
665// completed successfully, using client certificate. The second connection is
666// expected to succeed through the session cache.
667TEST_F(SSLServerSocketTest, HandshakeWithClientCertCached) {
668 scoped_refptr<X509Certificate> client_cert =
669 ImportCertFromFile(GetTestCertsDirectory(), kClientCertFileName);
rsleevia5c430222016-03-11 05:55:12670 ASSERT_NO_FATAL_FAILURE(ConfigureClientCertsForClient(
671 kClientCertFileName, kClientPrivateKeyFileName));
672 ASSERT_NO_FATAL_FAILURE(ConfigureClientCertsForServer());
673 ASSERT_NO_FATAL_FAILURE(CreateContext());
674 ASSERT_NO_FATAL_FAILURE(CreateSockets());
ryanchungeb9e3bc2016-03-08 05:08:10675
676 TestCompletionCallback handshake_callback;
677 int server_ret = server_socket_->Handshake(handshake_callback.callback());
678
679 TestCompletionCallback connect_callback;
680 int client_ret = client_socket_->Connect(connect_callback.callback());
681
682 client_ret = connect_callback.GetResult(client_ret);
683 server_ret = handshake_callback.GetResult(server_ret);
684
robpercival214763f2016-07-01 23:27:01685 ASSERT_THAT(client_ret, IsOk());
686 ASSERT_THAT(server_ret, IsOk());
ryanchungeb9e3bc2016-03-08 05:08:10687
688 // Make sure the cert status is expected.
689 SSLInfo ssl_info;
690 ASSERT_TRUE(client_socket_->GetSSLInfo(&ssl_info));
691 EXPECT_EQ(ssl_info.handshake_type, SSLInfo::HANDSHAKE_FULL);
692 SSLInfo ssl_server_info;
693 ASSERT_TRUE(server_socket_->GetSSLInfo(&ssl_server_info));
694 ASSERT_TRUE(ssl_server_info.cert.get());
695 EXPECT_TRUE(client_cert->Equals(ssl_server_info.cert.get()));
696 EXPECT_EQ(ssl_server_info.handshake_type, SSLInfo::HANDSHAKE_FULL);
697 server_socket_->Disconnect();
698 client_socket_->Disconnect();
699
700 // Create the connection again.
rsleevia5c430222016-03-11 05:55:12701 ASSERT_NO_FATAL_FAILURE(CreateSockets());
ryanchungeb9e3bc2016-03-08 05:08:10702 TestCompletionCallback handshake_callback2;
703 int server_ret2 = server_socket_->Handshake(handshake_callback2.callback());
704
705 TestCompletionCallback connect_callback2;
706 int client_ret2 = client_socket_->Connect(connect_callback2.callback());
707
708 client_ret2 = connect_callback2.GetResult(client_ret2);
709 server_ret2 = handshake_callback2.GetResult(server_ret2);
710
robpercival214763f2016-07-01 23:27:01711 ASSERT_THAT(client_ret2, IsOk());
712 ASSERT_THAT(server_ret2, IsOk());
ryanchungeb9e3bc2016-03-08 05:08:10713
714 // Make sure the cert status is expected.
715 SSLInfo ssl_info2;
716 ASSERT_TRUE(client_socket_->GetSSLInfo(&ssl_info2));
717 EXPECT_EQ(ssl_info2.handshake_type, SSLInfo::HANDSHAKE_RESUME);
718 SSLInfo ssl_server_info2;
719 ASSERT_TRUE(server_socket_->GetSSLInfo(&ssl_server_info2));
720 ASSERT_TRUE(ssl_server_info2.cert.get());
721 EXPECT_TRUE(client_cert->Equals(ssl_server_info2.cert.get()));
722 EXPECT_EQ(ssl_server_info2.handshake_type, SSLInfo::HANDSHAKE_RESUME);
723}
724
ryanchung987b2ff2016-02-19 00:17:12725TEST_F(SSLServerSocketTest, HandshakeWithClientCertRequiredNotSupplied) {
rsleevia5c430222016-03-11 05:55:12726 ASSERT_NO_FATAL_FAILURE(ConfigureClientCertsForServer());
727 ASSERT_NO_FATAL_FAILURE(CreateContext());
728 ASSERT_NO_FATAL_FAILURE(CreateSockets());
ryanchung987b2ff2016-02-19 00:17:12729 // Use the default setting for the client socket, which is to not send
730 // a client certificate. This will cause the client to receive an
731 // ERR_SSL_CLIENT_AUTH_CERT_NEEDED error, and allow for inspecting the
732 // requested cert_authorities from the CertificateRequest sent by the
733 // server.
734
735 TestCompletionCallback handshake_callback;
736 int server_ret = server_socket_->Handshake(handshake_callback.callback());
737
738 TestCompletionCallback connect_callback;
739 EXPECT_EQ(ERR_SSL_CLIENT_AUTH_CERT_NEEDED,
740 connect_callback.GetResult(
741 client_socket_->Connect(connect_callback.callback())));
742
743 scoped_refptr<SSLCertRequestInfo> request_info = new SSLCertRequestInfo();
744 client_socket_->GetSSLCertRequestInfo(request_info.get());
745
746 // Check that the authority name that arrived in the CertificateRequest
747 // handshake message is as expected.
748 scoped_refptr<X509Certificate> client_cert =
749 ImportCertFromFile(GetTestCertsDirectory(), kClientCertFileName);
rsleevia5c430222016-03-11 05:55:12750 ASSERT_TRUE(client_cert);
ryanchung987b2ff2016-02-19 00:17:12751 EXPECT_TRUE(client_cert->IsIssuedByEncoded(request_info->cert_authorities));
752
753 client_socket_->Disconnect();
754
davidben3418e81f2016-10-19 00:09:45755 EXPECT_THAT(handshake_callback.GetResult(server_ret),
756 IsError(ERR_CONNECTION_CLOSED));
ryanchung987b2ff2016-02-19 00:17:12757}
758
ryanchungeb9e3bc2016-03-08 05:08:10759TEST_F(SSLServerSocketTest, HandshakeWithClientCertRequiredNotSuppliedCached) {
rsleevia5c430222016-03-11 05:55:12760 ASSERT_NO_FATAL_FAILURE(ConfigureClientCertsForServer());
761 ASSERT_NO_FATAL_FAILURE(CreateContext());
762 ASSERT_NO_FATAL_FAILURE(CreateSockets());
ryanchungeb9e3bc2016-03-08 05:08:10763 // Use the default setting for the client socket, which is to not send
764 // a client certificate. This will cause the client to receive an
765 // ERR_SSL_CLIENT_AUTH_CERT_NEEDED error, and allow for inspecting the
766 // requested cert_authorities from the CertificateRequest sent by the
767 // server.
768
769 TestCompletionCallback handshake_callback;
770 int server_ret = server_socket_->Handshake(handshake_callback.callback());
771
772 TestCompletionCallback connect_callback;
773 EXPECT_EQ(ERR_SSL_CLIENT_AUTH_CERT_NEEDED,
774 connect_callback.GetResult(
775 client_socket_->Connect(connect_callback.callback())));
776
777 scoped_refptr<SSLCertRequestInfo> request_info = new SSLCertRequestInfo();
778 client_socket_->GetSSLCertRequestInfo(request_info.get());
779
780 // Check that the authority name that arrived in the CertificateRequest
781 // handshake message is as expected.
782 scoped_refptr<X509Certificate> client_cert =
783 ImportCertFromFile(GetTestCertsDirectory(), kClientCertFileName);
rsleevia5c430222016-03-11 05:55:12784 ASSERT_TRUE(client_cert);
ryanchungeb9e3bc2016-03-08 05:08:10785 EXPECT_TRUE(client_cert->IsIssuedByEncoded(request_info->cert_authorities));
786
787 client_socket_->Disconnect();
788
davidben3418e81f2016-10-19 00:09:45789 EXPECT_THAT(handshake_callback.GetResult(server_ret),
790 IsError(ERR_CONNECTION_CLOSED));
ryanchungeb9e3bc2016-03-08 05:08:10791 server_socket_->Disconnect();
792
793 // Below, check that the cache didn't store the result of a failed handshake.
rsleevia5c430222016-03-11 05:55:12794 ASSERT_NO_FATAL_FAILURE(CreateSockets());
ryanchungeb9e3bc2016-03-08 05:08:10795 TestCompletionCallback handshake_callback2;
796 int server_ret2 = server_socket_->Handshake(handshake_callback2.callback());
797
798 TestCompletionCallback connect_callback2;
799 EXPECT_EQ(ERR_SSL_CLIENT_AUTH_CERT_NEEDED,
800 connect_callback2.GetResult(
801 client_socket_->Connect(connect_callback2.callback())));
802
803 scoped_refptr<SSLCertRequestInfo> request_info2 = new SSLCertRequestInfo();
804 client_socket_->GetSSLCertRequestInfo(request_info2.get());
805
806 // Check that the authority name that arrived in the CertificateRequest
807 // handshake message is as expected.
808 EXPECT_TRUE(client_cert->IsIssuedByEncoded(request_info2->cert_authorities));
809
810 client_socket_->Disconnect();
811
davidben3418e81f2016-10-19 00:09:45812 EXPECT_THAT(handshake_callback2.GetResult(server_ret2),
813 IsError(ERR_CONNECTION_CLOSED));
ryanchungeb9e3bc2016-03-08 05:08:10814}
815
ryanchung987b2ff2016-02-19 00:17:12816TEST_F(SSLServerSocketTest, HandshakeWithWrongClientCertSupplied) {
817 scoped_refptr<X509Certificate> client_cert =
818 ImportCertFromFile(GetTestCertsDirectory(), kClientCertFileName);
rsleevia5c430222016-03-11 05:55:12819 ASSERT_TRUE(client_cert);
820
821 ASSERT_NO_FATAL_FAILURE(ConfigureClientCertsForClient(
822 kWrongClientCertFileName, kWrongClientPrivateKeyFileName));
823 ASSERT_NO_FATAL_FAILURE(ConfigureClientCertsForServer());
824 ASSERT_NO_FATAL_FAILURE(CreateContext());
825 ASSERT_NO_FATAL_FAILURE(CreateSockets());
ryanchung987b2ff2016-02-19 00:17:12826
827 TestCompletionCallback handshake_callback;
828 int server_ret = server_socket_->Handshake(handshake_callback.callback());
829
830 TestCompletionCallback connect_callback;
831 int client_ret = client_socket_->Connect(connect_callback.callback());
832
833 EXPECT_EQ(ERR_BAD_SSL_CLIENT_AUTH_CERT,
834 connect_callback.GetResult(client_ret));
835 EXPECT_EQ(ERR_BAD_SSL_CLIENT_AUTH_CERT,
836 handshake_callback.GetResult(server_ret));
837}
ryanchungeb9e3bc2016-03-08 05:08:10838
839TEST_F(SSLServerSocketTest, HandshakeWithWrongClientCertSuppliedCached) {
840 scoped_refptr<X509Certificate> client_cert =
841 ImportCertFromFile(GetTestCertsDirectory(), kClientCertFileName);
rsleevia5c430222016-03-11 05:55:12842 ASSERT_TRUE(client_cert);
843
844 ASSERT_NO_FATAL_FAILURE(ConfigureClientCertsForClient(
845 kWrongClientCertFileName, kWrongClientPrivateKeyFileName));
846 ASSERT_NO_FATAL_FAILURE(ConfigureClientCertsForServer());
847 ASSERT_NO_FATAL_FAILURE(CreateContext());
848 ASSERT_NO_FATAL_FAILURE(CreateSockets());
ryanchungeb9e3bc2016-03-08 05:08:10849
850 TestCompletionCallback handshake_callback;
851 int server_ret = server_socket_->Handshake(handshake_callback.callback());
852
853 TestCompletionCallback connect_callback;
854 int client_ret = client_socket_->Connect(connect_callback.callback());
855
856 EXPECT_EQ(ERR_BAD_SSL_CLIENT_AUTH_CERT,
857 connect_callback.GetResult(client_ret));
858 EXPECT_EQ(ERR_BAD_SSL_CLIENT_AUTH_CERT,
859 handshake_callback.GetResult(server_ret));
860
861 client_socket_->Disconnect();
862 server_socket_->Disconnect();
863
864 // Below, check that the cache didn't store the result of a failed handshake.
rsleevia5c430222016-03-11 05:55:12865 ASSERT_NO_FATAL_FAILURE(CreateSockets());
ryanchungeb9e3bc2016-03-08 05:08:10866 TestCompletionCallback handshake_callback2;
867 int server_ret2 = server_socket_->Handshake(handshake_callback2.callback());
868
869 TestCompletionCallback connect_callback2;
870 int client_ret2 = client_socket_->Connect(connect_callback2.callback());
871
872 EXPECT_EQ(ERR_BAD_SSL_CLIENT_AUTH_CERT,
873 connect_callback2.GetResult(client_ret2));
874 EXPECT_EQ(ERR_BAD_SSL_CLIENT_AUTH_CERT,
875 handshake_callback2.GetResult(server_ret2));
876}
ryanchung987b2ff2016-02-19 00:17:12877
[email protected]f61c3972010-12-23 09:54:15878TEST_F(SSLServerSocketTest, DataTransfer) {
rsleevia5c430222016-03-11 05:55:12879 ASSERT_NO_FATAL_FAILURE(CreateContext());
880 ASSERT_NO_FATAL_FAILURE(CreateSockets());
[email protected]f61c3972010-12-23 09:54:15881
[email protected]f61c3972010-12-23 09:54:15882 // Establish connection.
ryanchung987b2ff2016-02-19 00:17:12883 TestCompletionCallback connect_callback;
[email protected]83039bb2011-12-09 18:43:55884 int client_ret = client_socket_->Connect(connect_callback.callback());
[email protected]fa6ce922014-07-17 04:27:04885 ASSERT_TRUE(client_ret == OK || client_ret == ERR_IO_PENDING);
[email protected]f61c3972010-12-23 09:54:15886
ryanchung987b2ff2016-02-19 00:17:12887 TestCompletionCallback handshake_callback;
[email protected]6ea7b152011-12-21 21:21:13888 int server_ret = server_socket_->Handshake(handshake_callback.callback());
[email protected]fa6ce922014-07-17 04:27:04889 ASSERT_TRUE(server_ret == OK || server_ret == ERR_IO_PENDING);
[email protected]f61c3972010-12-23 09:54:15890
[email protected]febbbb52011-08-17 04:59:23891 client_ret = connect_callback.GetResult(client_ret);
robpercival214763f2016-07-01 23:27:01892 ASSERT_THAT(client_ret, IsOk());
[email protected]febbbb52011-08-17 04:59:23893 server_ret = handshake_callback.GetResult(server_ret);
robpercival214763f2016-07-01 23:27:01894 ASSERT_THAT(server_ret, IsOk());
[email protected]f61c3972010-12-23 09:54:15895
896 const int kReadBufSize = 1024;
[email protected]fa6ce922014-07-17 04:27:04897 scoped_refptr<StringIOBuffer> write_buf =
898 new StringIOBuffer("testing123");
899 scoped_refptr<DrainableIOBuffer> read_buf =
900 new DrainableIOBuffer(new IOBuffer(kReadBufSize), kReadBufSize);
[email protected]f61c3972010-12-23 09:54:15901
902 // Write then read.
[email protected]83039bb2011-12-09 18:43:55903 TestCompletionCallback write_callback;
904 TestCompletionCallback read_callback;
ryanchungeb9e3bc2016-03-08 05:08:10905 server_ret = server_socket_->Write(write_buf.get(), write_buf->size(),
906 write_callback.callback());
[email protected]fa6ce922014-07-17 04:27:04907 EXPECT_TRUE(server_ret > 0 || server_ret == ERR_IO_PENDING);
[email protected]90499482013-06-01 00:39:50908 client_ret = client_socket_->Read(
909 read_buf.get(), read_buf->BytesRemaining(), read_callback.callback());
[email protected]fa6ce922014-07-17 04:27:04910 EXPECT_TRUE(client_ret > 0 || client_ret == ERR_IO_PENDING);
[email protected]f61c3972010-12-23 09:54:15911
[email protected]febbbb52011-08-17 04:59:23912 server_ret = write_callback.GetResult(server_ret);
913 EXPECT_GT(server_ret, 0);
914 client_ret = read_callback.GetResult(client_ret);
915 ASSERT_GT(client_ret, 0);
916
917 read_buf->DidConsume(client_ret);
918 while (read_buf->BytesConsumed() < write_buf->size()) {
[email protected]90499482013-06-01 00:39:50919 client_ret = client_socket_->Read(
920 read_buf.get(), read_buf->BytesRemaining(), read_callback.callback());
[email protected]fa6ce922014-07-17 04:27:04921 EXPECT_TRUE(client_ret > 0 || client_ret == ERR_IO_PENDING);
[email protected]febbbb52011-08-17 04:59:23922 client_ret = read_callback.GetResult(client_ret);
923 ASSERT_GT(client_ret, 0);
924 read_buf->DidConsume(client_ret);
[email protected]f61c3972010-12-23 09:54:15925 }
[email protected]febbbb52011-08-17 04:59:23926 EXPECT_EQ(write_buf->size(), read_buf->BytesConsumed());
927 read_buf->SetOffset(0);
[email protected]f61c3972010-12-23 09:54:15928 EXPECT_EQ(0, memcmp(write_buf->data(), read_buf->data(), write_buf->size()));
929
930 // Read then write.
[email protected]fa6ce922014-07-17 04:27:04931 write_buf = new StringIOBuffer("hello123");
[email protected]90499482013-06-01 00:39:50932 server_ret = server_socket_->Read(
933 read_buf.get(), read_buf->BytesRemaining(), read_callback.callback());
[email protected]fa6ce922014-07-17 04:27:04934 EXPECT_TRUE(server_ret > 0 || server_ret == ERR_IO_PENDING);
ryanchungeb9e3bc2016-03-08 05:08:10935 client_ret = client_socket_->Write(write_buf.get(), write_buf->size(),
936 write_callback.callback());
[email protected]fa6ce922014-07-17 04:27:04937 EXPECT_TRUE(client_ret > 0 || client_ret == ERR_IO_PENDING);
[email protected]f61c3972010-12-23 09:54:15938
[email protected]febbbb52011-08-17 04:59:23939 server_ret = read_callback.GetResult(server_ret);
940 ASSERT_GT(server_ret, 0);
941 client_ret = write_callback.GetResult(client_ret);
942 EXPECT_GT(client_ret, 0);
943
944 read_buf->DidConsume(server_ret);
945 while (read_buf->BytesConsumed() < write_buf->size()) {
[email protected]90499482013-06-01 00:39:50946 server_ret = server_socket_->Read(
947 read_buf.get(), read_buf->BytesRemaining(), read_callback.callback());
[email protected]fa6ce922014-07-17 04:27:04948 EXPECT_TRUE(server_ret > 0 || server_ret == ERR_IO_PENDING);
[email protected]febbbb52011-08-17 04:59:23949 server_ret = read_callback.GetResult(server_ret);
950 ASSERT_GT(server_ret, 0);
951 read_buf->DidConsume(server_ret);
[email protected]f61c3972010-12-23 09:54:15952 }
[email protected]febbbb52011-08-17 04:59:23953 EXPECT_EQ(write_buf->size(), read_buf->BytesConsumed());
954 read_buf->SetOffset(0);
[email protected]f61c3972010-12-23 09:54:15955 EXPECT_EQ(0, memcmp(write_buf->data(), read_buf->data(), write_buf->size()));
956}
[email protected]b0ff3f82011-07-23 05:12:39957
[email protected]c0e4dd12012-05-16 19:36:31958// A regression test for bug 127822 (http://crbug.com/127822).
959// If the server closes the connection after the handshake is finished,
960// the client's Write() call should not cause an infinite loop.
961// NOTE: this is a test for SSLClientSocket rather than SSLServerSocket.
[email protected]4da82282014-07-16 18:40:43962TEST_F(SSLServerSocketTest, ClientWriteAfterServerClose) {
rsleevia5c430222016-03-11 05:55:12963 ASSERT_NO_FATAL_FAILURE(CreateContext());
964 ASSERT_NO_FATAL_FAILURE(CreateSockets());
[email protected]c0e4dd12012-05-16 19:36:31965
966 // Establish connection.
ryanchung987b2ff2016-02-19 00:17:12967 TestCompletionCallback connect_callback;
[email protected]c0e4dd12012-05-16 19:36:31968 int client_ret = client_socket_->Connect(connect_callback.callback());
[email protected]fa6ce922014-07-17 04:27:04969 ASSERT_TRUE(client_ret == OK || client_ret == ERR_IO_PENDING);
[email protected]c0e4dd12012-05-16 19:36:31970
ryanchung987b2ff2016-02-19 00:17:12971 TestCompletionCallback handshake_callback;
[email protected]c0e4dd12012-05-16 19:36:31972 int server_ret = server_socket_->Handshake(handshake_callback.callback());
[email protected]fa6ce922014-07-17 04:27:04973 ASSERT_TRUE(server_ret == OK || server_ret == ERR_IO_PENDING);
[email protected]c0e4dd12012-05-16 19:36:31974
975 client_ret = connect_callback.GetResult(client_ret);
robpercival214763f2016-07-01 23:27:01976 ASSERT_THAT(client_ret, IsOk());
[email protected]c0e4dd12012-05-16 19:36:31977 server_ret = handshake_callback.GetResult(server_ret);
robpercival214763f2016-07-01 23:27:01978 ASSERT_THAT(server_ret, IsOk());
[email protected]c0e4dd12012-05-16 19:36:31979
[email protected]fa6ce922014-07-17 04:27:04980 scoped_refptr<StringIOBuffer> write_buf = new StringIOBuffer("testing123");
[email protected]c0e4dd12012-05-16 19:36:31981
982 // The server closes the connection. The server needs to write some
983 // data first so that the client's Read() calls from the transport
984 // socket won't return ERR_IO_PENDING. This ensures that the client
985 // will call Read() on the transport socket again.
986 TestCompletionCallback write_callback;
ryanchungeb9e3bc2016-03-08 05:08:10987 server_ret = server_socket_->Write(write_buf.get(), write_buf->size(),
988 write_callback.callback());
[email protected]fa6ce922014-07-17 04:27:04989 EXPECT_TRUE(server_ret > 0 || server_ret == ERR_IO_PENDING);
[email protected]c0e4dd12012-05-16 19:36:31990
991 server_ret = write_callback.GetResult(server_ret);
992 EXPECT_GT(server_ret, 0);
993
994 server_socket_->Disconnect();
995
996 // The client writes some data. This should not cause an infinite loop.
ryanchungeb9e3bc2016-03-08 05:08:10997 client_ret = client_socket_->Write(write_buf.get(), write_buf->size(),
998 write_callback.callback());
[email protected]fa6ce922014-07-17 04:27:04999 EXPECT_TRUE(client_ret > 0 || client_ret == ERR_IO_PENDING);
[email protected]c0e4dd12012-05-16 19:36:311000
1001 client_ret = write_callback.GetResult(client_ret);
1002 EXPECT_GT(client_ret, 0);
1003
skyostil4891b25b2015-06-11 11:43:451004 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
ki.stfu375812e2015-10-09 20:23:171005 FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(),
[email protected]c0e4dd12012-05-16 19:36:311006 base::TimeDelta::FromMilliseconds(10));
fdoray5eeb7642016-06-22 16:11:281007 base::RunLoop().Run();
[email protected]c0e4dd12012-05-16 19:36:311008}
1009
[email protected]b0ff3f82011-07-23 05:12:391010// This test executes ExportKeyingMaterial() on the client and server sockets,
1011// after connecting them, and verifies that the results match.
1012// This test will fail if False Start is enabled (see crbug.com/90208).
1013TEST_F(SSLServerSocketTest, ExportKeyingMaterial) {
rsleevia5c430222016-03-11 05:55:121014 ASSERT_NO_FATAL_FAILURE(CreateContext());
1015 ASSERT_NO_FATAL_FAILURE(CreateSockets());
[email protected]b0ff3f82011-07-23 05:12:391016
[email protected]83039bb2011-12-09 18:43:551017 TestCompletionCallback connect_callback;
[email protected]83039bb2011-12-09 18:43:551018 int client_ret = client_socket_->Connect(connect_callback.callback());
[email protected]fa6ce922014-07-17 04:27:041019 ASSERT_TRUE(client_ret == OK || client_ret == ERR_IO_PENDING);
[email protected]b0ff3f82011-07-23 05:12:391020
ryanchung987b2ff2016-02-19 00:17:121021 TestCompletionCallback handshake_callback;
[email protected]6ea7b152011-12-21 21:21:131022 int server_ret = server_socket_->Handshake(handshake_callback.callback());
[email protected]fa6ce922014-07-17 04:27:041023 ASSERT_TRUE(server_ret == OK || server_ret == ERR_IO_PENDING);
[email protected]b0ff3f82011-07-23 05:12:391024
[email protected]fa6ce922014-07-17 04:27:041025 if (client_ret == ERR_IO_PENDING) {
robpercival214763f2016-07-01 23:27:011026 ASSERT_THAT(connect_callback.WaitForResult(), IsOk());
[email protected]b0ff3f82011-07-23 05:12:391027 }
[email protected]fa6ce922014-07-17 04:27:041028 if (server_ret == ERR_IO_PENDING) {
robpercival214763f2016-07-01 23:27:011029 ASSERT_THAT(handshake_callback.WaitForResult(), IsOk());
[email protected]b0ff3f82011-07-23 05:12:391030 }
1031
1032 const int kKeyingMaterialSize = 32;
thestig9d3bb0c2015-01-24 00:49:511033 const char kKeyingLabel[] = "EXPERIMENTAL-server-socket-test";
1034 const char kKeyingContext[] = "";
[email protected]b0ff3f82011-07-23 05:12:391035 unsigned char server_out[kKeyingMaterialSize];
ryanchungeb9e3bc2016-03-08 05:08:101036 int rv = server_socket_->ExportKeyingMaterial(
1037 kKeyingLabel, false, kKeyingContext, server_out, sizeof(server_out));
robpercival214763f2016-07-01 23:27:011038 ASSERT_THAT(rv, IsOk());
[email protected]b0ff3f82011-07-23 05:12:391039
1040 unsigned char client_out[kKeyingMaterialSize];
ryanchungeb9e3bc2016-03-08 05:08:101041 rv = client_socket_->ExportKeyingMaterial(kKeyingLabel, false, kKeyingContext,
[email protected]b0ff3f82011-07-23 05:12:391042 client_out, sizeof(client_out));
robpercival214763f2016-07-01 23:27:011043 ASSERT_THAT(rv, IsOk());
[email protected]47a12862012-04-10 01:00:491044 EXPECT_EQ(0, memcmp(server_out, client_out, sizeof(server_out)));
[email protected]b0ff3f82011-07-23 05:12:391045
thestig9d3bb0c2015-01-24 00:49:511046 const char kKeyingLabelBad[] = "EXPERIMENTAL-server-socket-test-bad";
[email protected]b0ff3f82011-07-23 05:12:391047 unsigned char client_bad[kKeyingMaterialSize];
ryanchungeb9e3bc2016-03-08 05:08:101048 rv = client_socket_->ExportKeyingMaterial(
1049 kKeyingLabelBad, false, kKeyingContext, client_bad, sizeof(client_bad));
[email protected]fa6ce922014-07-17 04:27:041050 ASSERT_EQ(rv, OK);
[email protected]47a12862012-04-10 01:00:491051 EXPECT_NE(0, memcmp(server_out, client_bad, sizeof(server_out)));
[email protected]b0ff3f82011-07-23 05:12:391052}
[email protected]f61c3972010-12-23 09:54:151053
sergeyuff826d5e2015-05-13 20:35:221054// Verifies that SSLConfig::require_ecdhe flags works properly.
1055TEST_F(SSLServerSocketTest, RequireEcdheFlag) {
1056 // Disable all ECDHE suites on the client side.
1057 uint16_t kEcdheCiphers[] = {
1058 0xc007, // ECDHE_ECDSA_WITH_RC4_128_SHA
1059 0xc009, // ECDHE_ECDSA_WITH_AES_128_CBC_SHA
1060 0xc00a, // ECDHE_ECDSA_WITH_AES_256_CBC_SHA
1061 0xc011, // ECDHE_RSA_WITH_RC4_128_SHA
1062 0xc013, // ECDHE_RSA_WITH_AES_128_CBC_SHA
1063 0xc014, // ECDHE_RSA_WITH_AES_256_CBC_SHA
1064 0xc02b, // ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
1065 0xc02f, // ECDHE_RSA_WITH_AES_128_GCM_SHA256
davidben17f89c82017-01-24 20:56:491066 0xcca8, // ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
1067 0xcca9, // ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
sergeyuff826d5e2015-05-13 20:35:221068 };
1069 client_ssl_config_.disabled_cipher_suites.assign(
1070 kEcdheCiphers, kEcdheCiphers + arraysize(kEcdheCiphers));
1071
1072 // Require ECDHE on the server.
1073 server_ssl_config_.require_ecdhe = true;
1074
rsleevia5c430222016-03-11 05:55:121075 ASSERT_NO_FATAL_FAILURE(CreateContext());
1076 ASSERT_NO_FATAL_FAILURE(CreateSockets());
sergeyuff826d5e2015-05-13 20:35:221077
1078 TestCompletionCallback connect_callback;
sergeyuff826d5e2015-05-13 20:35:221079 int client_ret = client_socket_->Connect(connect_callback.callback());
ryanchung987b2ff2016-02-19 00:17:121080
1081 TestCompletionCallback handshake_callback;
sergeyuff826d5e2015-05-13 20:35:221082 int server_ret = server_socket_->Handshake(handshake_callback.callback());
1083
1084 client_ret = connect_callback.GetResult(client_ret);
1085 server_ret = handshake_callback.GetResult(server_ret);
1086
robpercival214763f2016-07-01 23:27:011087 ASSERT_THAT(client_ret, IsError(ERR_SSL_VERSION_OR_CIPHER_MISMATCH));
1088 ASSERT_THAT(server_ret, IsError(ERR_SSL_VERSION_OR_CIPHER_MISMATCH));
sergeyuff826d5e2015-05-13 20:35:221089}
1090
[email protected]f61c3972010-12-23 09:54:151091} // namespace net