blob: 91645f7285747691af08793800ecb176e0a6f6ff [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"
[email protected]578968d42017-12-13 15:39:3269#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
robpercival214763f2016-07-01 23:27:0170#include "testing/gmock/include/gmock/gmock.h"
[email protected]f61c3972010-12-23 09:54:1571#include "testing/gtest/include/gtest/gtest.h"
72#include "testing/platform_test.h"
tfarinae8cb8aa2016-10-21 02:44:0173#include "third_party/boringssl/src/include/openssl/evp.h"
74#include "third_party/boringssl/src/include/openssl/ssl.h"
[email protected]f61c3972010-12-23 09:54:1575
robpercival214763f2016-07-01 23:27:0176using net::test::IsError;
77using net::test::IsOk;
78
[email protected]f61c3972010-12-23 09:54:1579namespace net {
80
81namespace {
82
ryanchung987b2ff2016-02-19 00:17:1283const char kClientCertFileName[] = "client_1.pem";
84const char kClientPrivateKeyFileName[] = "client_1.pk8";
85const char kWrongClientCertFileName[] = "client_2.pem";
86const char kWrongClientPrivateKeyFileName[] = "client_2.pk8";
ryanchung987b2ff2016-02-19 00:17:1287
rsleevid6de8302016-06-21 01:33:2088class MockCTPolicyEnforcer : public CTPolicyEnforcer {
89 public:
90 MockCTPolicyEnforcer() = default;
91 ~MockCTPolicyEnforcer() override = default;
Emily Stark627238f2017-11-29 03:29:5492 ct::CTPolicyCompliance CheckCompliance(
rsleevid6de8302016-06-21 01:33:2093 X509Certificate* cert,
94 const SCTList& verified_scts,
tfarina428341112016-09-22 13:38:2095 const NetLogWithSource& net_log) override {
Emily Stark627238f2017-11-29 03:29:5496 return ct::CTPolicyCompliance::CT_POLICY_COMPLIES_VIA_SCTS;
rsleevid6de8302016-06-21 01:33:2097 }
rsleevid6de8302016-06-21 01:33:2098};
99
[email protected]f61c3972010-12-23 09:54:15100class FakeDataChannel {
101 public:
[email protected]55ee0e52011-07-21 18:29:44102 FakeDataChannel()
[email protected]83039bb2011-12-09 18:43:55103 : read_buf_len_(0),
[email protected]c0e4dd12012-05-16 19:36:31104 closed_(false),
[email protected]d5492c52013-11-10 20:44:39105 write_called_after_close_(false),
106 weak_factory_(this) {
[email protected]f61c3972010-12-23 09:54:15107 }
108
Brad Lassey3a814172018-04-26 03:30:21109 int Read(IOBuffer* buf, int buf_len, CompletionOnceCallback callback) {
[email protected]4da82282014-07-16 18:40:43110 DCHECK(read_callback_.is_null());
dcheng08ea2af02014-08-25 23:38:09111 DCHECK(!read_buf_.get());
[email protected]c0e4dd12012-05-16 19:36:31112 if (closed_)
113 return 0;
[email protected]3f55aa12011-12-07 02:03:33114 if (data_.empty()) {
Brad Lassey3a814172018-04-26 03:30:21115 read_callback_ = std::move(callback);
[email protected]f61c3972010-12-23 09:54:15116 read_buf_ = buf;
117 read_buf_len_ = buf_len;
[email protected]fa6ce922014-07-17 04:27:04118 return ERR_IO_PENDING;
[email protected]f61c3972010-12-23 09:54:15119 }
tfarina9b6381442015-10-05 22:38:11120 return PropagateData(buf, buf_len);
[email protected]f61c3972010-12-23 09:54:15121 }
122
[email protected]a2b2cfc2017-12-06 09:06:08123 int Write(IOBuffer* buf,
124 int buf_len,
Brad Lassey3a814172018-04-26 03:30:21125 CompletionOnceCallback callback,
[email protected]578968d42017-12-13 15:39:32126 const NetworkTrafficAnnotationTag& traffic_annotation) {
[email protected]4da82282014-07-16 18:40:43127 DCHECK(write_callback_.is_null());
[email protected]c0e4dd12012-05-16 19:36:31128 if (closed_) {
129 if (write_called_after_close_)
[email protected]fa6ce922014-07-17 04:27:04130 return ERR_CONNECTION_RESET;
[email protected]c0e4dd12012-05-16 19:36:31131 write_called_after_close_ = true;
Brad Lassey3a814172018-04-26 03:30:21132 write_callback_ = std::move(callback);
skyostil4891b25b2015-06-11 11:43:45133 base::ThreadTaskRunnerHandle::Get()->PostTask(
[email protected]c0e4dd12012-05-16 19:36:31134 FROM_HERE, base::Bind(&FakeDataChannel::DoWriteCallback,
135 weak_factory_.GetWeakPtr()));
[email protected]fa6ce922014-07-17 04:27:04136 return ERR_IO_PENDING;
[email protected]c0e4dd12012-05-16 19:36:31137 }
[email protected]4da82282014-07-16 18:40:43138 // This function returns synchronously, so make a copy of the buffer.
[email protected]fa6ce922014-07-17 04:27:04139 data_.push(new DrainableIOBuffer(
140 new StringIOBuffer(std::string(buf->data(), buf_len)),
[email protected]4da82282014-07-16 18:40:43141 buf_len));
skyostil4891b25b2015-06-11 11:43:45142 base::ThreadTaskRunnerHandle::Get()->PostTask(
[email protected]83039bb2011-12-09 18:43:55143 FROM_HERE, base::Bind(&FakeDataChannel::DoReadCallback,
144 weak_factory_.GetWeakPtr()));
[email protected]f61c3972010-12-23 09:54:15145 return buf_len;
146 }
147
[email protected]c0e4dd12012-05-16 19:36:31148 // Closes the FakeDataChannel. After Close() is called, Read() returns 0,
149 // indicating EOF, and Write() fails with ERR_CONNECTION_RESET. Note that
150 // after the FakeDataChannel is closed, the first Write() call completes
151 // asynchronously, which is necessary to reproduce bug 127822.
152 void Close() {
153 closed_ = true;
ryanchung987b2ff2016-02-19 00:17:12154 if (!read_callback_.is_null()) {
155 base::ThreadTaskRunnerHandle::Get()->PostTask(
156 FROM_HERE, base::Bind(&FakeDataChannel::DoReadCallback,
157 weak_factory_.GetWeakPtr()));
158 }
[email protected]c0e4dd12012-05-16 19:36:31159 }
160
[email protected]f61c3972010-12-23 09:54:15161 private:
162 void DoReadCallback() {
ryanchung987b2ff2016-02-19 00:17:12163 if (read_callback_.is_null())
164 return;
165
166 if (closed_) {
Brad Lassey3a814172018-04-26 03:30:21167 std::move(read_callback_).Run(ERR_CONNECTION_CLOSED);
ryanchung987b2ff2016-02-19 00:17:12168 return;
169 }
170
171 if (data_.empty())
[email protected]f61c3972010-12-23 09:54:15172 return;
173
tfarina9b6381442015-10-05 22:38:11174 int copied = PropagateData(read_buf_, read_buf_len_);
[email protected]83039bb2011-12-09 18:43:55175 read_buf_ = NULL;
176 read_buf_len_ = 0;
Brad Lassey3a814172018-04-26 03:30:21177 std::move(read_callback_).Run(copied);
[email protected]f61c3972010-12-23 09:54:15178 }
179
[email protected]c0e4dd12012-05-16 19:36:31180 void DoWriteCallback() {
181 if (write_callback_.is_null())
182 return;
183
Brad Lassey3a814172018-04-26 03:30:21184 std::move(write_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
Brad Lassey3a814172018-04-26 03:30:21198 CompletionOnceCallback 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
Brad Lassey3a814172018-04-26 03:30:21202 CompletionOnceCallback write_callback_;
[email protected]c0e4dd12012-05-16 19:36:31203
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,
Brad Lassey3a814172018-04-26 03:30:21229 CompletionOnceCallback callback) override {
[email protected]3f55aa12011-12-07 02:03:33230 // Read random number of bytes.
231 buf_len = rand() % buf_len + 1;
Brad Lassey3a814172018-04-26 03:30:21232 return incoming_->Read(buf, buf_len, std::move(callback));
[email protected]3f55aa12011-12-07 02:03:33233 }
[email protected]f61c3972010-12-23 09:54:15234
dchengb03027d2014-10-21 12:00:20235 int Write(IOBuffer* buf,
236 int buf_len,
Brad Lassey3a814172018-04-26 03:30:21237 CompletionOnceCallback callback,
[email protected]578968d42017-12-13 15:39:32238 const NetworkTrafficAnnotationTag& traffic_annotation) override {
[email protected]55ee0e52011-07-21 18:29:44239 // Write random number of bytes.
240 buf_len = rand() % buf_len + 1;
Brad Lassey3a814172018-04-26 03:30:21241 return outgoing_->Write(buf, buf_len, std::move(callback),
[email protected]578968d42017-12-13 15:39:32242 TRAFFIC_ANNOTATION_FOR_TESTS);
[email protected]f61c3972010-12-23 09:54:15243 }
244
Avi Drissman13fc8932015-12-20 04:40:46245 int SetReceiveBufferSize(int32_t size) override { return OK; }
[email protected]f61c3972010-12-23 09:54:15246
Avi Drissman13fc8932015-12-20 04:40:46247 int SetSendBufferSize(int32_t size) override { return OK; }
[email protected]f61c3972010-12-23 09:54:15248
Brad Lassey3a814172018-04-26 03:30:21249 int Connect(CompletionOnceCallback callback) override { return OK; }
[email protected]f61c3972010-12-23 09:54:15250
dchengb03027d2014-10-21 12:00:20251 void Disconnect() override {
[email protected]c0e4dd12012-05-16 19:36:31252 incoming_->Close();
253 outgoing_->Close();
254 }
[email protected]f61c3972010-12-23 09:54:15255
dchengb03027d2014-10-21 12:00:20256 bool IsConnected() const override { return true; }
[email protected]f61c3972010-12-23 09:54:15257
dchengb03027d2014-10-21 12:00:20258 bool IsConnectedAndIdle() const override { return true; }
[email protected]f61c3972010-12-23 09:54:15259
dchengb03027d2014-10-21 12:00:20260 int GetPeerAddress(IPEndPoint* address) const override {
martijna2e83bd2016-03-18 13:10:45261 *address = IPEndPoint(IPAddress::IPv4AllZeros(), 0 /*port*/);
[email protected]fa6ce922014-07-17 04:27:04262 return OK;
[email protected]f61c3972010-12-23 09:54:15263 }
264
dchengb03027d2014-10-21 12:00:20265 int GetLocalAddress(IPEndPoint* address) const override {
martijna2e83bd2016-03-18 13:10:45266 *address = IPEndPoint(IPAddress::IPv4AllZeros(), 0 /*port*/);
[email protected]fa6ce922014-07-17 04:27:04267 return OK;
[email protected]e7f74da2011-04-19 23:49:35268 }
269
tfarina428341112016-09-22 13:38:20270 const NetLogWithSource& NetLog() const override { return net_log_; }
[email protected]f61c3972010-12-23 09:54:15271
dchengb03027d2014-10-21 12:00:20272 void SetSubresourceSpeculation() override {}
273 void SetOmniboxSpeculation() override {}
[email protected]f61c3972010-12-23 09:54:15274
dchengb03027d2014-10-21 12:00:20275 bool WasEverUsed() const override { return true; }
[email protected]f61c3972010-12-23 09:54:15276
tfarina2846404c2016-12-25 14:31:37277 bool WasAlpnNegotiated() const override { return false; }
[email protected]5e6efa52011-06-27 17:26:41278
dchengb03027d2014-10-21 12:00:20279 NextProto GetNegotiatedProtocol() const override { return kProtoUnknown; }
[email protected]2d88e7d2012-07-19 17:55:17280
dchengb03027d2014-10-21 12:00:20281 bool GetSSLInfo(SSLInfo* ssl_info) override { return false; }
[email protected]2d88e7d2012-07-19 17:55:17282
ttuttle23fdb7b2015-05-15 01:28:03283 void GetConnectionAttempts(ConnectionAttempts* out) const override {
284 out->clear();
285 }
286
287 void ClearConnectionAttempts() override {}
288
289 void AddConnectionAttempts(const ConnectionAttempts& attempts) override {}
290
tbansalf82cc8e2015-10-14 20:05:49291 int64_t GetTotalReceivedBytes() const override {
292 NOTIMPLEMENTED();
293 return 0;
294 }
295
Paul Jensen0f49dec2017-12-12 23:39:58296 void ApplySocketTag(const SocketTag& tag) override {}
297
[email protected]f61c3972010-12-23 09:54:15298 private:
tfarina428341112016-09-22 13:38:20299 NetLogWithSource net_log_;
[email protected]f61c3972010-12-23 09:54:15300 FakeDataChannel* incoming_;
301 FakeDataChannel* outgoing_;
302
303 DISALLOW_COPY_AND_ASSIGN(FakeSocket);
304};
305
306} // namespace
307
308// Verify the correctness of the test helper classes first.
309TEST(FakeSocketTest, DataTransfer) {
310 // Establish channels between two sockets.
311 FakeDataChannel channel_1;
312 FakeDataChannel channel_2;
313 FakeSocket client(&channel_1, &channel_2);
314 FakeSocket server(&channel_2, &channel_1);
315
316 const char kTestData[] = "testing123";
317 const int kTestDataSize = strlen(kTestData);
318 const int kReadBufSize = 1024;
[email protected]fa6ce922014-07-17 04:27:04319 scoped_refptr<IOBuffer> write_buf = new StringIOBuffer(kTestData);
320 scoped_refptr<IOBuffer> read_buf = new IOBuffer(kReadBufSize);
[email protected]f61c3972010-12-23 09:54:15321
322 // Write then read.
[email protected]90499482013-06-01 00:39:50323 int written =
[email protected]578968d42017-12-13 15:39:32324 server.Write(write_buf.get(), kTestDataSize, CompletionCallback(),
325 TRAFFIC_ANNOTATION_FOR_TESTS);
[email protected]55ee0e52011-07-21 18:29:44326 EXPECT_GT(written, 0);
327 EXPECT_LE(written, kTestDataSize);
328
[email protected]90499482013-06-01 00:39:50329 int read = client.Read(read_buf.get(), kReadBufSize, CompletionCallback());
[email protected]55ee0e52011-07-21 18:29:44330 EXPECT_GT(read, 0);
331 EXPECT_LE(read, written);
332 EXPECT_EQ(0, memcmp(kTestData, read_buf->data(), read));
[email protected]f61c3972010-12-23 09:54:15333
334 // Read then write.
[email protected]83039bb2011-12-09 18:43:55335 TestCompletionCallback callback;
[email protected]fa6ce922014-07-17 04:27:04336 EXPECT_EQ(ERR_IO_PENDING,
[email protected]90499482013-06-01 00:39:50337 server.Read(read_buf.get(), kReadBufSize, callback.callback()));
[email protected]55ee0e52011-07-21 18:29:44338
[email protected]578968d42017-12-13 15:39:32339 written = client.Write(write_buf.get(), kTestDataSize, CompletionCallback(),
340 TRAFFIC_ANNOTATION_FOR_TESTS);
[email protected]55ee0e52011-07-21 18:29:44341 EXPECT_GT(written, 0);
342 EXPECT_LE(written, kTestDataSize);
343
344 read = callback.WaitForResult();
345 EXPECT_GT(read, 0);
346 EXPECT_LE(read, written);
347 EXPECT_EQ(0, memcmp(kTestData, read_buf->data(), read));
[email protected]f61c3972010-12-23 09:54:15348}
349
350class SSLServerSocketTest : public PlatformTest {
351 public:
352 SSLServerSocketTest()
[email protected]fa6ce922014-07-17 04:27:04353 : socket_factory_(ClientSocketFactory::GetDefaultFactory()),
[email protected]b1c988b2013-06-13 06:48:11354 cert_verifier_(new MockCertVerifier()),
ryanchung987b2ff2016-02-19 00:17:12355 client_cert_verifier_(new MockClientCertVerifier()),
rsleevid6de8302016-06-21 01:33:20356 transport_security_state_(new TransportSecurityState),
rsleevi22cae1672016-12-28 01:53:36357 ct_verifier_(new DoNothingCTVerifier),
rsleevid6de8302016-06-21 01:33:20358 ct_policy_enforcer_(new MockCTPolicyEnforcer) {}
rsleevia5c430222016-03-11 05:55:12359
360 void SetUp() override {
361 PlatformTest::SetUp();
362
ryanchung987b2ff2016-02-19 00:17:12363 cert_verifier_->set_default_result(ERR_CERT_AUTHORITY_INVALID);
364 client_cert_verifier_->set_default_result(ERR_CERT_AUTHORITY_INVALID);
[email protected]f61c3972010-12-23 09:54:15365
ryanchungeb9e3bc2016-03-08 05:08:10366 server_cert_ =
367 ImportCertFromFile(GetTestCertsDirectory(), "unittest.selfsigned.der");
rsleevia5c430222016-03-11 05:55:12368 ASSERT_TRUE(server_cert_);
ryanchungeb9e3bc2016-03-08 05:08:10369 server_private_key_ = ReadTestKey("unittest.key.bin");
rsleevia5c430222016-03-11 05:55:12370 ASSERT_TRUE(server_private_key_);
[email protected]f61c3972010-12-23 09:54:15371
Ryan Ki Sing Chung665861e2017-12-15 22:05:55372 std::unique_ptr<crypto::RSAPrivateKey> key =
373 ReadTestKey("unittest.key.bin");
374 ASSERT_TRUE(key);
375 EVP_PKEY_up_ref(key->key());
376 server_ssl_private_key_ =
377 WrapOpenSSLPrivateKey(bssl::UniquePtr<EVP_PKEY>(key->key()));
378
sergeyuff826d5e2015-05-13 20:35:22379 client_ssl_config_.false_start_enabled = false;
380 client_ssl_config_.channel_id_enabled = false;
[email protected]f61c3972010-12-23 09:54:15381
382 // Certificate provided by the host doesn't need authority.
rsleevi74e99742016-09-13 20:35:25383 client_ssl_config_.allowed_bad_certs.emplace_back(
384 server_cert_, CERT_STATUS_AUTHORITY_INVALID);
ryanchungeb9e3bc2016-03-08 05:08:10385 }
386
387 protected:
388 void CreateContext() {
389 client_socket_.reset();
390 server_socket_.reset();
391 channel_1_.reset();
392 channel_2_.reset();
393 server_context_.reset();
394 server_context_ = CreateSSLServerContext(
395 server_cert_.get(), *server_private_key_, server_ssl_config_);
396 }
397
Ryan Ki Sing Chung665861e2017-12-15 22:05:55398 void CreateContextSSLPrivateKey() {
399 client_socket_.reset();
400 server_socket_.reset();
401 channel_1_.reset();
402 channel_2_.reset();
403 server_context_.reset();
404 server_context_ = CreateSSLServerContext(
405 server_cert_.get(), server_ssl_private_key_, server_ssl_config_);
406 }
407
ryanchungeb9e3bc2016-03-08 05:08:10408 void CreateSockets() {
409 client_socket_.reset();
410 server_socket_.reset();
411 channel_1_.reset(new FakeDataChannel());
412 channel_2_.reset(new FakeDataChannel());
danakj655b66c2016-04-16 00:51:38413 std::unique_ptr<ClientSocketHandle> client_connection(
414 new ClientSocketHandle);
415 client_connection->SetSocket(std::unique_ptr<StreamSocket>(
ryanchungeb9e3bc2016-03-08 05:08:10416 new FakeSocket(channel_1_.get(), channel_2_.get())));
danakj655b66c2016-04-16 00:51:38417 std::unique_ptr<StreamSocket> server_socket(
ryanchungeb9e3bc2016-03-08 05:08:10418 new FakeSocket(channel_2_.get(), channel_1_.get()));
[email protected]f61c3972010-12-23 09:54:15419
[email protected]fa6ce922014-07-17 04:27:04420 HostPortPair host_and_pair("unittest", 0);
421 SSLClientSocketContext context;
[email protected]9f59fac2012-03-21 23:18:11422 context.cert_verifier = cert_verifier_.get();
[email protected]b1c988b2013-06-13 06:48:11423 context.transport_security_state = transport_security_state_.get();
rsleevid6de8302016-06-21 01:33:20424 context.cert_transparency_verifier = ct_verifier_.get();
425 context.ct_policy_enforcer = ct_policy_enforcer_.get();
David Benjaminb3840f42017-08-03 15:50:16426 // Set a dummy session cache shard to enable session caching.
427 context.ssl_session_cache_shard = "shard";
rsleevia5c430222016-03-11 05:55:12428
sergeyuff826d5e2015-05-13 20:35:22429 client_socket_ = socket_factory_->CreateSSLClientSocket(
dchengc7eeda422015-12-26 03:56:48430 std::move(client_connection), host_and_pair, client_ssl_config_,
431 context);
rsleevia5c430222016-03-11 05:55:12432 ASSERT_TRUE(client_socket_);
ryanchungeb9e3bc2016-03-08 05:08:10433
ryanchung987b2ff2016-02-19 00:17:12434 server_socket_ =
ryanchungeb9e3bc2016-03-08 05:08:10435 server_context_->CreateSSLServerSocket(std::move(server_socket));
rsleevia5c430222016-03-11 05:55:12436 ASSERT_TRUE(server_socket_);
[email protected]f61c3972010-12-23 09:54:15437 }
438
ryanchung987b2ff2016-02-19 00:17:12439 void ConfigureClientCertsForClient(const char* cert_file_name,
440 const char* private_key_file_name) {
441 client_ssl_config_.send_client_cert = true;
442 client_ssl_config_.client_cert =
443 ImportCertFromFile(GetTestCertsDirectory(), cert_file_name);
444 ASSERT_TRUE(client_ssl_config_.client_cert);
rsleevia5c430222016-03-11 05:55:12445
danakj655b66c2016-04-16 00:51:38446 std::unique_ptr<crypto::RSAPrivateKey> key =
447 ReadTestKey(private_key_file_name);
ryanchung987b2ff2016-02-19 00:17:12448 ASSERT_TRUE(key);
rsleevia5c430222016-03-11 05:55:12449
agl5a7cadf2016-07-13 16:52:53450 EVP_PKEY_up_ref(key->key());
451 client_ssl_config_.client_private_key =
davidbend80c12c2016-10-11 00:13:49452 WrapOpenSSLPrivateKey(bssl::UniquePtr<EVP_PKEY>(key->key()));
ryanchung987b2ff2016-02-19 00:17:12453 }
454
455 void ConfigureClientCertsForServer() {
456 server_ssl_config_.client_cert_type =
457 SSLServerConfig::ClientCertType::REQUIRE_CLIENT_CERT;
458
David Benjamin99dada22017-09-28 20:04:00459 // "CN=B CA" - DER encoded DN of the issuer of client_1.pem
460 static const uint8_t kClientCertCAName[] = {
461 0x30, 0x0f, 0x31, 0x0d, 0x30, 0x0b, 0x06, 0x03, 0x55,
462 0x04, 0x03, 0x0c, 0x04, 0x42, 0x20, 0x43, 0x41};
463 server_ssl_config_.cert_authorities_.push_back(std::string(
464 std::begin(kClientCertCAName), std::end(kClientCertCAName)));
ryanchung987b2ff2016-02-19 00:17:12465
466 scoped_refptr<X509Certificate> expected_client_cert(
467 ImportCertFromFile(GetTestCertsDirectory(), kClientCertFileName));
rsleevia5c430222016-03-11 05:55:12468 ASSERT_TRUE(expected_client_cert);
469
ryanchung987b2ff2016-02-19 00:17:12470 client_cert_verifier_->AddResultForCert(expected_client_cert.get(), OK);
471
472 server_ssl_config_.client_cert_verifier = client_cert_verifier_.get();
473 }
474
danakj655b66c2016-04-16 00:51:38475 std::unique_ptr<crypto::RSAPrivateKey> ReadTestKey(
476 const base::StringPiece& name) {
ryanchung987b2ff2016-02-19 00:17:12477 base::FilePath certs_dir(GetTestCertsDirectory());
478 base::FilePath key_path = certs_dir.AppendASCII(name);
479 std::string key_string;
480 if (!base::ReadFileToString(key_path, &key_string))
481 return nullptr;
482 std::vector<uint8_t> key_vector(
483 reinterpret_cast<const uint8_t*>(key_string.data()),
484 reinterpret_cast<const uint8_t*>(key_string.data() +
485 key_string.length()));
danakj655b66c2016-04-16 00:51:38486 std::unique_ptr<crypto::RSAPrivateKey> key(
ryanchung987b2ff2016-02-19 00:17:12487 crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(key_vector));
488 return key;
489 }
ryanchung987b2ff2016-02-19 00:17:12490
danakj655b66c2016-04-16 00:51:38491 std::unique_ptr<FakeDataChannel> channel_1_;
492 std::unique_ptr<FakeDataChannel> channel_2_;
sergeyuff826d5e2015-05-13 20:35:22493 SSLConfig client_ssl_config_;
svaldez6e7e82a22015-10-28 19:39:53494 SSLServerConfig server_ssl_config_;
danakj655b66c2016-04-16 00:51:38495 std::unique_ptr<SSLClientSocket> client_socket_;
496 std::unique_ptr<SSLServerSocket> server_socket_;
[email protected]fa6ce922014-07-17 04:27:04497 ClientSocketFactory* socket_factory_;
danakj655b66c2016-04-16 00:51:38498 std::unique_ptr<MockCertVerifier> cert_verifier_;
499 std::unique_ptr<MockClientCertVerifier> client_cert_verifier_;
500 std::unique_ptr<TransportSecurityState> transport_security_state_;
rsleevi22cae1672016-12-28 01:53:36501 std::unique_ptr<DoNothingCTVerifier> ct_verifier_;
rsleevid6de8302016-06-21 01:33:20502 std::unique_ptr<MockCTPolicyEnforcer> ct_policy_enforcer_;
danakj655b66c2016-04-16 00:51:38503 std::unique_ptr<SSLServerContext> server_context_;
504 std::unique_ptr<crypto::RSAPrivateKey> server_private_key_;
Ryan Ki Sing Chung665861e2017-12-15 22:05:55505 scoped_refptr<SSLPrivateKey> server_ssl_private_key_;
ryanchungeb9e3bc2016-03-08 05:08:10506 scoped_refptr<X509Certificate> server_cert_;
[email protected]f61c3972010-12-23 09:54:15507};
508
[email protected]f61c3972010-12-23 09:54:15509// This test only executes creation of client and server sockets. This is to
510// test that creation of sockets doesn't crash and have minimal code to run
511// under valgrind in order to help debugging memory problems.
512TEST_F(SSLServerSocketTest, Initialize) {
rsleevia5c430222016-03-11 05:55:12513 ASSERT_NO_FATAL_FAILURE(CreateContext());
514 ASSERT_NO_FATAL_FAILURE(CreateSockets());
[email protected]f61c3972010-12-23 09:54:15515}
516
[email protected]a7ac3c32011-06-17 19:10:15517// This test executes Connect() on SSLClientSocket and Handshake() on
518// SSLServerSocket to make sure handshaking between the two sockets is
[email protected]f61c3972010-12-23 09:54:15519// completed successfully.
520TEST_F(SSLServerSocketTest, Handshake) {
rsleevia5c430222016-03-11 05:55:12521 ASSERT_NO_FATAL_FAILURE(CreateContext());
522 ASSERT_NO_FATAL_FAILURE(CreateSockets());
[email protected]f61c3972010-12-23 09:54:15523
[email protected]6ea7b152011-12-21 21:21:13524 TestCompletionCallback handshake_callback;
[email protected]6ea7b152011-12-21 21:21:13525 int server_ret = server_socket_->Handshake(handshake_callback.callback());
[email protected]f61c3972010-12-23 09:54:15526
ryanchung987b2ff2016-02-19 00:17:12527 TestCompletionCallback connect_callback;
[email protected]83039bb2011-12-09 18:43:55528 int client_ret = client_socket_->Connect(connect_callback.callback());
[email protected]f61c3972010-12-23 09:54:15529
ryanchung987b2ff2016-02-19 00:17:12530 client_ret = connect_callback.GetResult(client_ret);
531 server_ret = handshake_callback.GetResult(server_ret);
532
robpercival214763f2016-07-01 23:27:01533 ASSERT_THAT(client_ret, IsOk());
534 ASSERT_THAT(server_ret, IsOk());
[email protected]4dc832e2011-04-28 22:04:24535
536 // Make sure the cert status is expected.
537 SSLInfo ssl_info;
davidben9dd84872015-05-02 00:22:58538 ASSERT_TRUE(client_socket_->GetSSLInfo(&ssl_info));
[email protected]4dc832e2011-04-28 22:04:24539 EXPECT_EQ(CERT_STATUS_AUTHORITY_INVALID, ssl_info.cert_status);
davidben9dd84872015-05-02 00:22:58540
davidben56a8aece2016-10-14 18:20:56541 // The default cipher suite should be ECDHE and an AEAD.
davidben9dd84872015-05-02 00:22:58542 uint16_t cipher_suite =
543 SSLConnectionStatusToCipherSuite(ssl_info.connection_status);
544 const char* key_exchange;
545 const char* cipher;
546 const char* mac;
547 bool is_aead;
davidben56a8aece2016-10-14 18:20:56548 bool is_tls13;
549 SSLCipherSuiteToStrings(&key_exchange, &cipher, &mac, &is_aead, &is_tls13,
550 cipher_suite);
hansc048c38b2016-10-14 11:30:09551 EXPECT_TRUE(is_aead);
davidben56a8aece2016-10-14 18:20:56552 ASSERT_FALSE(is_tls13);
553 EXPECT_STREQ("ECDHE_RSA", key_exchange);
[email protected]f61c3972010-12-23 09:54:15554}
555
ryanchungeb9e3bc2016-03-08 05:08:10556// This test makes sure the session cache is working.
557TEST_F(SSLServerSocketTest, HandshakeCached) {
rsleevia5c430222016-03-11 05:55:12558 ASSERT_NO_FATAL_FAILURE(CreateContext());
559 ASSERT_NO_FATAL_FAILURE(CreateSockets());
ryanchungeb9e3bc2016-03-08 05:08:10560
561 TestCompletionCallback handshake_callback;
562 int server_ret = server_socket_->Handshake(handshake_callback.callback());
563
564 TestCompletionCallback connect_callback;
565 int client_ret = client_socket_->Connect(connect_callback.callback());
566
567 client_ret = connect_callback.GetResult(client_ret);
568 server_ret = handshake_callback.GetResult(server_ret);
569
robpercival214763f2016-07-01 23:27:01570 ASSERT_THAT(client_ret, IsOk());
571 ASSERT_THAT(server_ret, IsOk());
ryanchungeb9e3bc2016-03-08 05:08:10572
573 // Make sure the cert status is expected.
574 SSLInfo ssl_info;
575 ASSERT_TRUE(client_socket_->GetSSLInfo(&ssl_info));
576 EXPECT_EQ(ssl_info.handshake_type, SSLInfo::HANDSHAKE_FULL);
577 SSLInfo ssl_server_info;
578 ASSERT_TRUE(server_socket_->GetSSLInfo(&ssl_server_info));
579 EXPECT_EQ(ssl_server_info.handshake_type, SSLInfo::HANDSHAKE_FULL);
580
581 // Make sure the second connection is cached.
rsleevia5c430222016-03-11 05:55:12582 ASSERT_NO_FATAL_FAILURE(CreateSockets());
ryanchungeb9e3bc2016-03-08 05:08:10583 TestCompletionCallback handshake_callback2;
584 int server_ret2 = server_socket_->Handshake(handshake_callback2.callback());
585
586 TestCompletionCallback connect_callback2;
587 int client_ret2 = client_socket_->Connect(connect_callback2.callback());
588
589 client_ret2 = connect_callback2.GetResult(client_ret2);
590 server_ret2 = handshake_callback2.GetResult(server_ret2);
591
robpercival214763f2016-07-01 23:27:01592 ASSERT_THAT(client_ret2, IsOk());
593 ASSERT_THAT(server_ret2, IsOk());
ryanchungeb9e3bc2016-03-08 05:08:10594
595 // Make sure the cert status is expected.
596 SSLInfo ssl_info2;
597 ASSERT_TRUE(client_socket_->GetSSLInfo(&ssl_info2));
598 EXPECT_EQ(ssl_info2.handshake_type, SSLInfo::HANDSHAKE_RESUME);
599 SSLInfo ssl_server_info2;
600 ASSERT_TRUE(server_socket_->GetSSLInfo(&ssl_server_info2));
601 EXPECT_EQ(ssl_server_info2.handshake_type, SSLInfo::HANDSHAKE_RESUME);
602}
603
604// This test makes sure the session cache separates out by server context.
605TEST_F(SSLServerSocketTest, HandshakeCachedContextSwitch) {
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_callback;
610 int server_ret = server_socket_->Handshake(handshake_callback.callback());
611
612 TestCompletionCallback connect_callback;
613 int client_ret = client_socket_->Connect(connect_callback.callback());
614
615 client_ret = connect_callback.GetResult(client_ret);
616 server_ret = handshake_callback.GetResult(server_ret);
617
robpercival214763f2016-07-01 23:27:01618 ASSERT_THAT(client_ret, IsOk());
619 ASSERT_THAT(server_ret, IsOk());
ryanchungeb9e3bc2016-03-08 05:08:10620
621 // Make sure the cert status is expected.
622 SSLInfo ssl_info;
623 ASSERT_TRUE(client_socket_->GetSSLInfo(&ssl_info));
624 EXPECT_EQ(ssl_info.handshake_type, SSLInfo::HANDSHAKE_FULL);
625 SSLInfo ssl_server_info;
626 ASSERT_TRUE(server_socket_->GetSSLInfo(&ssl_server_info));
627 EXPECT_EQ(ssl_server_info.handshake_type, SSLInfo::HANDSHAKE_FULL);
628
629 // Make sure the second connection is NOT cached when using a new context.
rsleevia5c430222016-03-11 05:55:12630 ASSERT_NO_FATAL_FAILURE(CreateContext());
631 ASSERT_NO_FATAL_FAILURE(CreateSockets());
ryanchungeb9e3bc2016-03-08 05:08:10632
633 TestCompletionCallback handshake_callback2;
634 int server_ret2 = server_socket_->Handshake(handshake_callback2.callback());
635
636 TestCompletionCallback connect_callback2;
637 int client_ret2 = client_socket_->Connect(connect_callback2.callback());
638
639 client_ret2 = connect_callback2.GetResult(client_ret2);
640 server_ret2 = handshake_callback2.GetResult(server_ret2);
641
robpercival214763f2016-07-01 23:27:01642 ASSERT_THAT(client_ret2, IsOk());
643 ASSERT_THAT(server_ret2, IsOk());
ryanchungeb9e3bc2016-03-08 05:08:10644
645 // Make sure the cert status is expected.
646 SSLInfo ssl_info2;
647 ASSERT_TRUE(client_socket_->GetSSLInfo(&ssl_info2));
648 EXPECT_EQ(ssl_info2.handshake_type, SSLInfo::HANDSHAKE_FULL);
649 SSLInfo ssl_server_info2;
650 ASSERT_TRUE(server_socket_->GetSSLInfo(&ssl_server_info2));
651 EXPECT_EQ(ssl_server_info2.handshake_type, SSLInfo::HANDSHAKE_FULL);
652}
653
ryanchung987b2ff2016-02-19 00:17:12654// This test executes Connect() on SSLClientSocket and Handshake() on
655// SSLServerSocket to make sure handshaking between the two sockets is
656// completed successfully, using client certificate.
657TEST_F(SSLServerSocketTest, HandshakeWithClientCert) {
658 scoped_refptr<X509Certificate> client_cert =
659 ImportCertFromFile(GetTestCertsDirectory(), kClientCertFileName);
rsleevia5c430222016-03-11 05:55:12660 ASSERT_NO_FATAL_FAILURE(ConfigureClientCertsForClient(
661 kClientCertFileName, kClientPrivateKeyFileName));
662 ASSERT_NO_FATAL_FAILURE(ConfigureClientCertsForServer());
663 ASSERT_NO_FATAL_FAILURE(CreateContext());
664 ASSERT_NO_FATAL_FAILURE(CreateSockets());
ryanchung987b2ff2016-02-19 00:17:12665
666 TestCompletionCallback handshake_callback;
667 int server_ret = server_socket_->Handshake(handshake_callback.callback());
668
669 TestCompletionCallback connect_callback;
670 int client_ret = client_socket_->Connect(connect_callback.callback());
671
672 client_ret = connect_callback.GetResult(client_ret);
673 server_ret = handshake_callback.GetResult(server_ret);
674
robpercival214763f2016-07-01 23:27:01675 ASSERT_THAT(client_ret, IsOk());
676 ASSERT_THAT(server_ret, IsOk());
ryanchung987b2ff2016-02-19 00:17:12677
678 // Make sure the cert status is expected.
679 SSLInfo ssl_info;
680 client_socket_->GetSSLInfo(&ssl_info);
681 EXPECT_EQ(CERT_STATUS_AUTHORITY_INVALID, ssl_info.cert_status);
682 server_socket_->GetSSLInfo(&ssl_info);
rsleevia5c430222016-03-11 05:55:12683 ASSERT_TRUE(ssl_info.cert.get());
Matt Mueller294998d2018-04-17 03:04:53684 EXPECT_TRUE(client_cert->EqualsExcludingChain(ssl_info.cert.get()));
ryanchung987b2ff2016-02-19 00:17:12685}
686
ryanchungeb9e3bc2016-03-08 05:08:10687// This test executes Connect() on SSLClientSocket and Handshake() twice on
688// SSLServerSocket to make sure handshaking between the two sockets is
689// completed successfully, using client certificate. The second connection is
690// expected to succeed through the session cache.
691TEST_F(SSLServerSocketTest, HandshakeWithClientCertCached) {
692 scoped_refptr<X509Certificate> client_cert =
693 ImportCertFromFile(GetTestCertsDirectory(), kClientCertFileName);
rsleevia5c430222016-03-11 05:55:12694 ASSERT_NO_FATAL_FAILURE(ConfigureClientCertsForClient(
695 kClientCertFileName, kClientPrivateKeyFileName));
696 ASSERT_NO_FATAL_FAILURE(ConfigureClientCertsForServer());
697 ASSERT_NO_FATAL_FAILURE(CreateContext());
698 ASSERT_NO_FATAL_FAILURE(CreateSockets());
ryanchungeb9e3bc2016-03-08 05:08:10699
700 TestCompletionCallback handshake_callback;
701 int server_ret = server_socket_->Handshake(handshake_callback.callback());
702
703 TestCompletionCallback connect_callback;
704 int client_ret = client_socket_->Connect(connect_callback.callback());
705
706 client_ret = connect_callback.GetResult(client_ret);
707 server_ret = handshake_callback.GetResult(server_ret);
708
robpercival214763f2016-07-01 23:27:01709 ASSERT_THAT(client_ret, IsOk());
710 ASSERT_THAT(server_ret, IsOk());
ryanchungeb9e3bc2016-03-08 05:08:10711
712 // Make sure the cert status is expected.
713 SSLInfo ssl_info;
714 ASSERT_TRUE(client_socket_->GetSSLInfo(&ssl_info));
715 EXPECT_EQ(ssl_info.handshake_type, SSLInfo::HANDSHAKE_FULL);
716 SSLInfo ssl_server_info;
717 ASSERT_TRUE(server_socket_->GetSSLInfo(&ssl_server_info));
718 ASSERT_TRUE(ssl_server_info.cert.get());
Matt Mueller294998d2018-04-17 03:04:53719 EXPECT_TRUE(client_cert->EqualsExcludingChain(ssl_server_info.cert.get()));
ryanchungeb9e3bc2016-03-08 05:08:10720 EXPECT_EQ(ssl_server_info.handshake_type, SSLInfo::HANDSHAKE_FULL);
721 server_socket_->Disconnect();
722 client_socket_->Disconnect();
723
724 // Create the connection again.
rsleevia5c430222016-03-11 05:55:12725 ASSERT_NO_FATAL_FAILURE(CreateSockets());
ryanchungeb9e3bc2016-03-08 05:08:10726 TestCompletionCallback handshake_callback2;
727 int server_ret2 = server_socket_->Handshake(handshake_callback2.callback());
728
729 TestCompletionCallback connect_callback2;
730 int client_ret2 = client_socket_->Connect(connect_callback2.callback());
731
732 client_ret2 = connect_callback2.GetResult(client_ret2);
733 server_ret2 = handshake_callback2.GetResult(server_ret2);
734
robpercival214763f2016-07-01 23:27:01735 ASSERT_THAT(client_ret2, IsOk());
736 ASSERT_THAT(server_ret2, IsOk());
ryanchungeb9e3bc2016-03-08 05:08:10737
738 // Make sure the cert status is expected.
739 SSLInfo ssl_info2;
740 ASSERT_TRUE(client_socket_->GetSSLInfo(&ssl_info2));
741 EXPECT_EQ(ssl_info2.handshake_type, SSLInfo::HANDSHAKE_RESUME);
742 SSLInfo ssl_server_info2;
743 ASSERT_TRUE(server_socket_->GetSSLInfo(&ssl_server_info2));
744 ASSERT_TRUE(ssl_server_info2.cert.get());
Matt Mueller294998d2018-04-17 03:04:53745 EXPECT_TRUE(client_cert->EqualsExcludingChain(ssl_server_info2.cert.get()));
ryanchungeb9e3bc2016-03-08 05:08:10746 EXPECT_EQ(ssl_server_info2.handshake_type, SSLInfo::HANDSHAKE_RESUME);
747}
748
ryanchung987b2ff2016-02-19 00:17:12749TEST_F(SSLServerSocketTest, HandshakeWithClientCertRequiredNotSupplied) {
rsleevia5c430222016-03-11 05:55:12750 ASSERT_NO_FATAL_FAILURE(ConfigureClientCertsForServer());
751 ASSERT_NO_FATAL_FAILURE(CreateContext());
752 ASSERT_NO_FATAL_FAILURE(CreateSockets());
ryanchung987b2ff2016-02-19 00:17:12753 // Use the default setting for the client socket, which is to not send
754 // a client certificate. This will cause the client to receive an
755 // ERR_SSL_CLIENT_AUTH_CERT_NEEDED error, and allow for inspecting the
756 // requested cert_authorities from the CertificateRequest sent by the
757 // server.
758
759 TestCompletionCallback handshake_callback;
760 int server_ret = server_socket_->Handshake(handshake_callback.callback());
761
762 TestCompletionCallback connect_callback;
763 EXPECT_EQ(ERR_SSL_CLIENT_AUTH_CERT_NEEDED,
764 connect_callback.GetResult(
765 client_socket_->Connect(connect_callback.callback())));
766
767 scoped_refptr<SSLCertRequestInfo> request_info = new SSLCertRequestInfo();
768 client_socket_->GetSSLCertRequestInfo(request_info.get());
769
770 // Check that the authority name that arrived in the CertificateRequest
771 // handshake message is as expected.
772 scoped_refptr<X509Certificate> client_cert =
773 ImportCertFromFile(GetTestCertsDirectory(), kClientCertFileName);
rsleevia5c430222016-03-11 05:55:12774 ASSERT_TRUE(client_cert);
ryanchung987b2ff2016-02-19 00:17:12775 EXPECT_TRUE(client_cert->IsIssuedByEncoded(request_info->cert_authorities));
776
777 client_socket_->Disconnect();
778
davidben3418e81f2016-10-19 00:09:45779 EXPECT_THAT(handshake_callback.GetResult(server_ret),
780 IsError(ERR_CONNECTION_CLOSED));
ryanchung987b2ff2016-02-19 00:17:12781}
782
ryanchungeb9e3bc2016-03-08 05:08:10783TEST_F(SSLServerSocketTest, HandshakeWithClientCertRequiredNotSuppliedCached) {
rsleevia5c430222016-03-11 05:55:12784 ASSERT_NO_FATAL_FAILURE(ConfigureClientCertsForServer());
785 ASSERT_NO_FATAL_FAILURE(CreateContext());
786 ASSERT_NO_FATAL_FAILURE(CreateSockets());
ryanchungeb9e3bc2016-03-08 05:08:10787 // Use the default setting for the client socket, which is to not send
788 // a client certificate. This will cause the client to receive an
789 // ERR_SSL_CLIENT_AUTH_CERT_NEEDED error, and allow for inspecting the
790 // requested cert_authorities from the CertificateRequest sent by the
791 // server.
792
793 TestCompletionCallback handshake_callback;
794 int server_ret = server_socket_->Handshake(handshake_callback.callback());
795
796 TestCompletionCallback connect_callback;
797 EXPECT_EQ(ERR_SSL_CLIENT_AUTH_CERT_NEEDED,
798 connect_callback.GetResult(
799 client_socket_->Connect(connect_callback.callback())));
800
801 scoped_refptr<SSLCertRequestInfo> request_info = new SSLCertRequestInfo();
802 client_socket_->GetSSLCertRequestInfo(request_info.get());
803
804 // Check that the authority name that arrived in the CertificateRequest
805 // handshake message is as expected.
806 scoped_refptr<X509Certificate> client_cert =
807 ImportCertFromFile(GetTestCertsDirectory(), kClientCertFileName);
rsleevia5c430222016-03-11 05:55:12808 ASSERT_TRUE(client_cert);
ryanchungeb9e3bc2016-03-08 05:08:10809 EXPECT_TRUE(client_cert->IsIssuedByEncoded(request_info->cert_authorities));
810
811 client_socket_->Disconnect();
812
davidben3418e81f2016-10-19 00:09:45813 EXPECT_THAT(handshake_callback.GetResult(server_ret),
814 IsError(ERR_CONNECTION_CLOSED));
ryanchungeb9e3bc2016-03-08 05:08:10815 server_socket_->Disconnect();
816
817 // Below, check that the cache didn't store the result of a failed handshake.
rsleevia5c430222016-03-11 05:55:12818 ASSERT_NO_FATAL_FAILURE(CreateSockets());
ryanchungeb9e3bc2016-03-08 05:08:10819 TestCompletionCallback handshake_callback2;
820 int server_ret2 = server_socket_->Handshake(handshake_callback2.callback());
821
822 TestCompletionCallback connect_callback2;
823 EXPECT_EQ(ERR_SSL_CLIENT_AUTH_CERT_NEEDED,
824 connect_callback2.GetResult(
825 client_socket_->Connect(connect_callback2.callback())));
826
827 scoped_refptr<SSLCertRequestInfo> request_info2 = new SSLCertRequestInfo();
828 client_socket_->GetSSLCertRequestInfo(request_info2.get());
829
830 // Check that the authority name that arrived in the CertificateRequest
831 // handshake message is as expected.
832 EXPECT_TRUE(client_cert->IsIssuedByEncoded(request_info2->cert_authorities));
833
834 client_socket_->Disconnect();
835
davidben3418e81f2016-10-19 00:09:45836 EXPECT_THAT(handshake_callback2.GetResult(server_ret2),
837 IsError(ERR_CONNECTION_CLOSED));
ryanchungeb9e3bc2016-03-08 05:08:10838}
839
ryanchung987b2ff2016-02-19 00:17:12840TEST_F(SSLServerSocketTest, HandshakeWithWrongClientCertSupplied) {
841 scoped_refptr<X509Certificate> client_cert =
842 ImportCertFromFile(GetTestCertsDirectory(), kClientCertFileName);
rsleevia5c430222016-03-11 05:55:12843 ASSERT_TRUE(client_cert);
844
845 ASSERT_NO_FATAL_FAILURE(ConfigureClientCertsForClient(
846 kWrongClientCertFileName, kWrongClientPrivateKeyFileName));
847 ASSERT_NO_FATAL_FAILURE(ConfigureClientCertsForServer());
848 ASSERT_NO_FATAL_FAILURE(CreateContext());
849 ASSERT_NO_FATAL_FAILURE(CreateSockets());
ryanchung987b2ff2016-02-19 00:17:12850
851 TestCompletionCallback handshake_callback;
852 int server_ret = server_socket_->Handshake(handshake_callback.callback());
853
854 TestCompletionCallback connect_callback;
855 int client_ret = client_socket_->Connect(connect_callback.callback());
856
857 EXPECT_EQ(ERR_BAD_SSL_CLIENT_AUTH_CERT,
858 connect_callback.GetResult(client_ret));
859 EXPECT_EQ(ERR_BAD_SSL_CLIENT_AUTH_CERT,
860 handshake_callback.GetResult(server_ret));
861}
ryanchungeb9e3bc2016-03-08 05:08:10862
863TEST_F(SSLServerSocketTest, HandshakeWithWrongClientCertSuppliedCached) {
864 scoped_refptr<X509Certificate> client_cert =
865 ImportCertFromFile(GetTestCertsDirectory(), kClientCertFileName);
rsleevia5c430222016-03-11 05:55:12866 ASSERT_TRUE(client_cert);
867
868 ASSERT_NO_FATAL_FAILURE(ConfigureClientCertsForClient(
869 kWrongClientCertFileName, kWrongClientPrivateKeyFileName));
870 ASSERT_NO_FATAL_FAILURE(ConfigureClientCertsForServer());
871 ASSERT_NO_FATAL_FAILURE(CreateContext());
872 ASSERT_NO_FATAL_FAILURE(CreateSockets());
ryanchungeb9e3bc2016-03-08 05:08:10873
874 TestCompletionCallback handshake_callback;
875 int server_ret = server_socket_->Handshake(handshake_callback.callback());
876
877 TestCompletionCallback connect_callback;
878 int client_ret = client_socket_->Connect(connect_callback.callback());
879
880 EXPECT_EQ(ERR_BAD_SSL_CLIENT_AUTH_CERT,
881 connect_callback.GetResult(client_ret));
882 EXPECT_EQ(ERR_BAD_SSL_CLIENT_AUTH_CERT,
883 handshake_callback.GetResult(server_ret));
884
885 client_socket_->Disconnect();
886 server_socket_->Disconnect();
887
888 // Below, check that the cache didn't store the result of a failed handshake.
rsleevia5c430222016-03-11 05:55:12889 ASSERT_NO_FATAL_FAILURE(CreateSockets());
ryanchungeb9e3bc2016-03-08 05:08:10890 TestCompletionCallback handshake_callback2;
891 int server_ret2 = server_socket_->Handshake(handshake_callback2.callback());
892
893 TestCompletionCallback connect_callback2;
894 int client_ret2 = client_socket_->Connect(connect_callback2.callback());
895
896 EXPECT_EQ(ERR_BAD_SSL_CLIENT_AUTH_CERT,
897 connect_callback2.GetResult(client_ret2));
898 EXPECT_EQ(ERR_BAD_SSL_CLIENT_AUTH_CERT,
899 handshake_callback2.GetResult(server_ret2));
900}
ryanchung987b2ff2016-02-19 00:17:12901
[email protected]f61c3972010-12-23 09:54:15902TEST_F(SSLServerSocketTest, DataTransfer) {
rsleevia5c430222016-03-11 05:55:12903 ASSERT_NO_FATAL_FAILURE(CreateContext());
904 ASSERT_NO_FATAL_FAILURE(CreateSockets());
[email protected]f61c3972010-12-23 09:54:15905
[email protected]f61c3972010-12-23 09:54:15906 // Establish connection.
ryanchung987b2ff2016-02-19 00:17:12907 TestCompletionCallback connect_callback;
[email protected]83039bb2011-12-09 18:43:55908 int client_ret = client_socket_->Connect(connect_callback.callback());
[email protected]fa6ce922014-07-17 04:27:04909 ASSERT_TRUE(client_ret == OK || client_ret == ERR_IO_PENDING);
[email protected]f61c3972010-12-23 09:54:15910
ryanchung987b2ff2016-02-19 00:17:12911 TestCompletionCallback handshake_callback;
[email protected]6ea7b152011-12-21 21:21:13912 int server_ret = server_socket_->Handshake(handshake_callback.callback());
[email protected]fa6ce922014-07-17 04:27:04913 ASSERT_TRUE(server_ret == OK || server_ret == ERR_IO_PENDING);
[email protected]f61c3972010-12-23 09:54:15914
[email protected]febbbb52011-08-17 04:59:23915 client_ret = connect_callback.GetResult(client_ret);
robpercival214763f2016-07-01 23:27:01916 ASSERT_THAT(client_ret, IsOk());
[email protected]febbbb52011-08-17 04:59:23917 server_ret = handshake_callback.GetResult(server_ret);
robpercival214763f2016-07-01 23:27:01918 ASSERT_THAT(server_ret, IsOk());
[email protected]f61c3972010-12-23 09:54:15919
920 const int kReadBufSize = 1024;
[email protected]fa6ce922014-07-17 04:27:04921 scoped_refptr<StringIOBuffer> write_buf =
922 new StringIOBuffer("testing123");
923 scoped_refptr<DrainableIOBuffer> read_buf =
924 new DrainableIOBuffer(new IOBuffer(kReadBufSize), kReadBufSize);
[email protected]f61c3972010-12-23 09:54:15925
926 // Write then read.
[email protected]83039bb2011-12-09 18:43:55927 TestCompletionCallback write_callback;
928 TestCompletionCallback read_callback;
ryanchungeb9e3bc2016-03-08 05:08:10929 server_ret = server_socket_->Write(write_buf.get(), write_buf->size(),
Ramin Halavati0a08cc82018-02-06 07:46:38930 write_callback.callback(),
931 TRAFFIC_ANNOTATION_FOR_TESTS);
[email protected]fa6ce922014-07-17 04:27:04932 EXPECT_TRUE(server_ret > 0 || server_ret == ERR_IO_PENDING);
[email protected]90499482013-06-01 00:39:50933 client_ret = client_socket_->Read(
934 read_buf.get(), read_buf->BytesRemaining(), read_callback.callback());
[email protected]fa6ce922014-07-17 04:27:04935 EXPECT_TRUE(client_ret > 0 || client_ret == ERR_IO_PENDING);
[email protected]f61c3972010-12-23 09:54:15936
[email protected]febbbb52011-08-17 04:59:23937 server_ret = write_callback.GetResult(server_ret);
938 EXPECT_GT(server_ret, 0);
939 client_ret = read_callback.GetResult(client_ret);
940 ASSERT_GT(client_ret, 0);
941
942 read_buf->DidConsume(client_ret);
943 while (read_buf->BytesConsumed() < write_buf->size()) {
[email protected]90499482013-06-01 00:39:50944 client_ret = client_socket_->Read(
945 read_buf.get(), read_buf->BytesRemaining(), read_callback.callback());
[email protected]fa6ce922014-07-17 04:27:04946 EXPECT_TRUE(client_ret > 0 || client_ret == ERR_IO_PENDING);
[email protected]febbbb52011-08-17 04:59:23947 client_ret = read_callback.GetResult(client_ret);
948 ASSERT_GT(client_ret, 0);
949 read_buf->DidConsume(client_ret);
[email protected]f61c3972010-12-23 09:54:15950 }
[email protected]febbbb52011-08-17 04:59:23951 EXPECT_EQ(write_buf->size(), read_buf->BytesConsumed());
952 read_buf->SetOffset(0);
[email protected]f61c3972010-12-23 09:54:15953 EXPECT_EQ(0, memcmp(write_buf->data(), read_buf->data(), write_buf->size()));
954
955 // Read then write.
[email protected]fa6ce922014-07-17 04:27:04956 write_buf = new StringIOBuffer("hello123");
[email protected]90499482013-06-01 00:39:50957 server_ret = server_socket_->Read(
958 read_buf.get(), read_buf->BytesRemaining(), read_callback.callback());
[email protected]fa6ce922014-07-17 04:27:04959 EXPECT_TRUE(server_ret > 0 || server_ret == ERR_IO_PENDING);
ryanchungeb9e3bc2016-03-08 05:08:10960 client_ret = client_socket_->Write(write_buf.get(), write_buf->size(),
Ramin Halavati0a08cc82018-02-06 07:46:38961 write_callback.callback(),
962 TRAFFIC_ANNOTATION_FOR_TESTS);
[email protected]fa6ce922014-07-17 04:27:04963 EXPECT_TRUE(client_ret > 0 || client_ret == ERR_IO_PENDING);
[email protected]f61c3972010-12-23 09:54:15964
[email protected]febbbb52011-08-17 04:59:23965 server_ret = read_callback.GetResult(server_ret);
966 ASSERT_GT(server_ret, 0);
967 client_ret = write_callback.GetResult(client_ret);
968 EXPECT_GT(client_ret, 0);
969
970 read_buf->DidConsume(server_ret);
971 while (read_buf->BytesConsumed() < write_buf->size()) {
[email protected]90499482013-06-01 00:39:50972 server_ret = server_socket_->Read(
973 read_buf.get(), read_buf->BytesRemaining(), read_callback.callback());
[email protected]fa6ce922014-07-17 04:27:04974 EXPECT_TRUE(server_ret > 0 || server_ret == ERR_IO_PENDING);
[email protected]febbbb52011-08-17 04:59:23975 server_ret = read_callback.GetResult(server_ret);
976 ASSERT_GT(server_ret, 0);
977 read_buf->DidConsume(server_ret);
[email protected]f61c3972010-12-23 09:54:15978 }
[email protected]febbbb52011-08-17 04:59:23979 EXPECT_EQ(write_buf->size(), read_buf->BytesConsumed());
980 read_buf->SetOffset(0);
[email protected]f61c3972010-12-23 09:54:15981 EXPECT_EQ(0, memcmp(write_buf->data(), read_buf->data(), write_buf->size()));
982}
[email protected]b0ff3f82011-07-23 05:12:39983
[email protected]c0e4dd12012-05-16 19:36:31984// A regression test for bug 127822 (http://crbug.com/127822).
985// If the server closes the connection after the handshake is finished,
986// the client's Write() call should not cause an infinite loop.
987// NOTE: this is a test for SSLClientSocket rather than SSLServerSocket.
[email protected]4da82282014-07-16 18:40:43988TEST_F(SSLServerSocketTest, ClientWriteAfterServerClose) {
rsleevia5c430222016-03-11 05:55:12989 ASSERT_NO_FATAL_FAILURE(CreateContext());
990 ASSERT_NO_FATAL_FAILURE(CreateSockets());
[email protected]c0e4dd12012-05-16 19:36:31991
992 // Establish connection.
ryanchung987b2ff2016-02-19 00:17:12993 TestCompletionCallback connect_callback;
[email protected]c0e4dd12012-05-16 19:36:31994 int client_ret = client_socket_->Connect(connect_callback.callback());
[email protected]fa6ce922014-07-17 04:27:04995 ASSERT_TRUE(client_ret == OK || client_ret == ERR_IO_PENDING);
[email protected]c0e4dd12012-05-16 19:36:31996
ryanchung987b2ff2016-02-19 00:17:12997 TestCompletionCallback handshake_callback;
[email protected]c0e4dd12012-05-16 19:36:31998 int server_ret = server_socket_->Handshake(handshake_callback.callback());
[email protected]fa6ce922014-07-17 04:27:04999 ASSERT_TRUE(server_ret == OK || server_ret == ERR_IO_PENDING);
[email protected]c0e4dd12012-05-16 19:36:311000
1001 client_ret = connect_callback.GetResult(client_ret);
robpercival214763f2016-07-01 23:27:011002 ASSERT_THAT(client_ret, IsOk());
[email protected]c0e4dd12012-05-16 19:36:311003 server_ret = handshake_callback.GetResult(server_ret);
robpercival214763f2016-07-01 23:27:011004 ASSERT_THAT(server_ret, IsOk());
[email protected]c0e4dd12012-05-16 19:36:311005
[email protected]fa6ce922014-07-17 04:27:041006 scoped_refptr<StringIOBuffer> write_buf = new StringIOBuffer("testing123");
[email protected]c0e4dd12012-05-16 19:36:311007
1008 // The server closes the connection. The server needs to write some
1009 // data first so that the client's Read() calls from the transport
1010 // socket won't return ERR_IO_PENDING. This ensures that the client
1011 // will call Read() on the transport socket again.
1012 TestCompletionCallback write_callback;
ryanchungeb9e3bc2016-03-08 05:08:101013 server_ret = server_socket_->Write(write_buf.get(), write_buf->size(),
Ramin Halavati0a08cc82018-02-06 07:46:381014 write_callback.callback(),
1015 TRAFFIC_ANNOTATION_FOR_TESTS);
[email protected]fa6ce922014-07-17 04:27:041016 EXPECT_TRUE(server_ret > 0 || server_ret == ERR_IO_PENDING);
[email protected]c0e4dd12012-05-16 19:36:311017
1018 server_ret = write_callback.GetResult(server_ret);
1019 EXPECT_GT(server_ret, 0);
1020
1021 server_socket_->Disconnect();
1022
1023 // The client writes some data. This should not cause an infinite loop.
ryanchungeb9e3bc2016-03-08 05:08:101024 client_ret = client_socket_->Write(write_buf.get(), write_buf->size(),
Ramin Halavati0a08cc82018-02-06 07:46:381025 write_callback.callback(),
1026 TRAFFIC_ANNOTATION_FOR_TESTS);
[email protected]fa6ce922014-07-17 04:27:041027 EXPECT_TRUE(client_ret > 0 || client_ret == ERR_IO_PENDING);
[email protected]c0e4dd12012-05-16 19:36:311028
1029 client_ret = write_callback.GetResult(client_ret);
1030 EXPECT_GT(client_ret, 0);
1031
skyostil4891b25b2015-06-11 11:43:451032 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
ki.stfu375812e2015-10-09 20:23:171033 FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(),
[email protected]c0e4dd12012-05-16 19:36:311034 base::TimeDelta::FromMilliseconds(10));
fdoray5eeb7642016-06-22 16:11:281035 base::RunLoop().Run();
[email protected]c0e4dd12012-05-16 19:36:311036}
1037
[email protected]b0ff3f82011-07-23 05:12:391038// This test executes ExportKeyingMaterial() on the client and server sockets,
1039// after connecting them, and verifies that the results match.
1040// This test will fail if False Start is enabled (see crbug.com/90208).
1041TEST_F(SSLServerSocketTest, ExportKeyingMaterial) {
rsleevia5c430222016-03-11 05:55:121042 ASSERT_NO_FATAL_FAILURE(CreateContext());
1043 ASSERT_NO_FATAL_FAILURE(CreateSockets());
[email protected]b0ff3f82011-07-23 05:12:391044
[email protected]83039bb2011-12-09 18:43:551045 TestCompletionCallback connect_callback;
[email protected]83039bb2011-12-09 18:43:551046 int client_ret = client_socket_->Connect(connect_callback.callback());
[email protected]fa6ce922014-07-17 04:27:041047 ASSERT_TRUE(client_ret == OK || client_ret == ERR_IO_PENDING);
[email protected]b0ff3f82011-07-23 05:12:391048
ryanchung987b2ff2016-02-19 00:17:121049 TestCompletionCallback handshake_callback;
[email protected]6ea7b152011-12-21 21:21:131050 int server_ret = server_socket_->Handshake(handshake_callback.callback());
[email protected]fa6ce922014-07-17 04:27:041051 ASSERT_TRUE(server_ret == OK || server_ret == ERR_IO_PENDING);
[email protected]b0ff3f82011-07-23 05:12:391052
[email protected]fa6ce922014-07-17 04:27:041053 if (client_ret == ERR_IO_PENDING) {
robpercival214763f2016-07-01 23:27:011054 ASSERT_THAT(connect_callback.WaitForResult(), IsOk());
[email protected]b0ff3f82011-07-23 05:12:391055 }
[email protected]fa6ce922014-07-17 04:27:041056 if (server_ret == ERR_IO_PENDING) {
robpercival214763f2016-07-01 23:27:011057 ASSERT_THAT(handshake_callback.WaitForResult(), IsOk());
[email protected]b0ff3f82011-07-23 05:12:391058 }
1059
1060 const int kKeyingMaterialSize = 32;
thestig9d3bb0c2015-01-24 00:49:511061 const char kKeyingLabel[] = "EXPERIMENTAL-server-socket-test";
1062 const char kKeyingContext[] = "";
[email protected]b0ff3f82011-07-23 05:12:391063 unsigned char server_out[kKeyingMaterialSize];
ryanchungeb9e3bc2016-03-08 05:08:101064 int rv = server_socket_->ExportKeyingMaterial(
1065 kKeyingLabel, false, kKeyingContext, server_out, sizeof(server_out));
robpercival214763f2016-07-01 23:27:011066 ASSERT_THAT(rv, IsOk());
[email protected]b0ff3f82011-07-23 05:12:391067
1068 unsigned char client_out[kKeyingMaterialSize];
ryanchungeb9e3bc2016-03-08 05:08:101069 rv = client_socket_->ExportKeyingMaterial(kKeyingLabel, false, kKeyingContext,
[email protected]b0ff3f82011-07-23 05:12:391070 client_out, sizeof(client_out));
robpercival214763f2016-07-01 23:27:011071 ASSERT_THAT(rv, IsOk());
[email protected]47a12862012-04-10 01:00:491072 EXPECT_EQ(0, memcmp(server_out, client_out, sizeof(server_out)));
[email protected]b0ff3f82011-07-23 05:12:391073
thestig9d3bb0c2015-01-24 00:49:511074 const char kKeyingLabelBad[] = "EXPERIMENTAL-server-socket-test-bad";
[email protected]b0ff3f82011-07-23 05:12:391075 unsigned char client_bad[kKeyingMaterialSize];
ryanchungeb9e3bc2016-03-08 05:08:101076 rv = client_socket_->ExportKeyingMaterial(
1077 kKeyingLabelBad, false, kKeyingContext, client_bad, sizeof(client_bad));
[email protected]fa6ce922014-07-17 04:27:041078 ASSERT_EQ(rv, OK);
[email protected]47a12862012-04-10 01:00:491079 EXPECT_NE(0, memcmp(server_out, client_bad, sizeof(server_out)));
[email protected]b0ff3f82011-07-23 05:12:391080}
[email protected]f61c3972010-12-23 09:54:151081
sergeyuff826d5e2015-05-13 20:35:221082// Verifies that SSLConfig::require_ecdhe flags works properly.
1083TEST_F(SSLServerSocketTest, RequireEcdheFlag) {
1084 // Disable all ECDHE suites on the client side.
1085 uint16_t kEcdheCiphers[] = {
1086 0xc007, // ECDHE_ECDSA_WITH_RC4_128_SHA
1087 0xc009, // ECDHE_ECDSA_WITH_AES_128_CBC_SHA
1088 0xc00a, // ECDHE_ECDSA_WITH_AES_256_CBC_SHA
1089 0xc011, // ECDHE_RSA_WITH_RC4_128_SHA
1090 0xc013, // ECDHE_RSA_WITH_AES_128_CBC_SHA
1091 0xc014, // ECDHE_RSA_WITH_AES_256_CBC_SHA
1092 0xc02b, // ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
1093 0xc02f, // ECDHE_RSA_WITH_AES_128_GCM_SHA256
davidben17f89c82017-01-24 20:56:491094 0xcca8, // ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
1095 0xcca9, // ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
sergeyuff826d5e2015-05-13 20:35:221096 };
1097 client_ssl_config_.disabled_cipher_suites.assign(
1098 kEcdheCiphers, kEcdheCiphers + arraysize(kEcdheCiphers));
1099
1100 // Require ECDHE on the server.
1101 server_ssl_config_.require_ecdhe = true;
1102
rsleevia5c430222016-03-11 05:55:121103 ASSERT_NO_FATAL_FAILURE(CreateContext());
1104 ASSERT_NO_FATAL_FAILURE(CreateSockets());
sergeyuff826d5e2015-05-13 20:35:221105
1106 TestCompletionCallback connect_callback;
sergeyuff826d5e2015-05-13 20:35:221107 int client_ret = client_socket_->Connect(connect_callback.callback());
ryanchung987b2ff2016-02-19 00:17:121108
1109 TestCompletionCallback handshake_callback;
sergeyuff826d5e2015-05-13 20:35:221110 int server_ret = server_socket_->Handshake(handshake_callback.callback());
1111
1112 client_ret = connect_callback.GetResult(client_ret);
1113 server_ret = handshake_callback.GetResult(server_ret);
1114
robpercival214763f2016-07-01 23:27:011115 ASSERT_THAT(client_ret, IsError(ERR_SSL_VERSION_OR_CIPHER_MISMATCH));
1116 ASSERT_THAT(server_ret, IsError(ERR_SSL_VERSION_OR_CIPHER_MISMATCH));
sergeyuff826d5e2015-05-13 20:35:221117}
1118
Ryan Ki Sing Chung665861e2017-12-15 22:05:551119// This test executes Connect() on SSLClientSocket and Handshake() on
1120// SSLServerSocket to make sure handshaking between the two sockets is
1121// completed successfully. The server key is represented by SSLPrivateKey.
1122TEST_F(SSLServerSocketTest, HandshakeServerSSLPrivateKey) {
1123 ASSERT_NO_FATAL_FAILURE(CreateContextSSLPrivateKey());
1124 ASSERT_NO_FATAL_FAILURE(CreateSockets());
1125
1126 TestCompletionCallback handshake_callback;
1127 int server_ret = server_socket_->Handshake(handshake_callback.callback());
1128
1129 TestCompletionCallback connect_callback;
1130 int client_ret = client_socket_->Connect(connect_callback.callback());
1131
1132 client_ret = connect_callback.GetResult(client_ret);
1133 server_ret = handshake_callback.GetResult(server_ret);
1134
1135 ASSERT_THAT(client_ret, IsOk());
1136 ASSERT_THAT(server_ret, IsOk());
1137
1138 // Make sure the cert status is expected.
1139 SSLInfo ssl_info;
1140 ASSERT_TRUE(client_socket_->GetSSLInfo(&ssl_info));
1141 EXPECT_EQ(CERT_STATUS_AUTHORITY_INVALID, ssl_info.cert_status);
1142
1143 // The default cipher suite should be ECDHE and an AEAD.
1144 uint16_t cipher_suite =
1145 SSLConnectionStatusToCipherSuite(ssl_info.connection_status);
1146 const char* key_exchange;
1147 const char* cipher;
1148 const char* mac;
1149 bool is_aead;
1150 bool is_tls13;
1151 SSLCipherSuiteToStrings(&key_exchange, &cipher, &mac, &is_aead, &is_tls13,
1152 cipher_suite);
1153 EXPECT_TRUE(is_aead);
1154 ASSERT_FALSE(is_tls13);
1155 EXPECT_STREQ("ECDHE_RSA", key_exchange);
1156}
1157
1158// Verifies that non-ECDHE ciphers are disabled when using SSLPrivateKey as the
1159// server key.
1160TEST_F(SSLServerSocketTest, HandshakeServerSSLPrivateKeyRequireEcdhe) {
1161 // Disable all ECDHE suites on the client side.
1162 uint16_t kEcdheCiphers[] = {
1163 0xc007, // ECDHE_ECDSA_WITH_RC4_128_SHA
1164 0xc009, // ECDHE_ECDSA_WITH_AES_128_CBC_SHA
1165 0xc00a, // ECDHE_ECDSA_WITH_AES_256_CBC_SHA
1166 0xc011, // ECDHE_RSA_WITH_RC4_128_SHA
1167 0xc013, // ECDHE_RSA_WITH_AES_128_CBC_SHA
1168 0xc014, // ECDHE_RSA_WITH_AES_256_CBC_SHA
1169 0xc02b, // ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
1170 0xc02f, // ECDHE_RSA_WITH_AES_128_GCM_SHA256
1171 0xcca8, // ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
1172 0xcca9, // ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
1173 };
1174 client_ssl_config_.disabled_cipher_suites.assign(
1175 kEcdheCiphers, kEcdheCiphers + arraysize(kEcdheCiphers));
1176 // TLS 1.3 always works with SSLPrivateKey.
1177 client_ssl_config_.version_max = SSL_PROTOCOL_VERSION_TLS1_2;
1178
1179 ASSERT_NO_FATAL_FAILURE(CreateContextSSLPrivateKey());
1180 ASSERT_NO_FATAL_FAILURE(CreateSockets());
1181
1182 TestCompletionCallback connect_callback;
1183 int client_ret = client_socket_->Connect(connect_callback.callback());
1184
1185 TestCompletionCallback handshake_callback;
1186 int server_ret = server_socket_->Handshake(handshake_callback.callback());
1187
1188 client_ret = connect_callback.GetResult(client_ret);
1189 server_ret = handshake_callback.GetResult(server_ret);
1190
1191 ASSERT_THAT(client_ret, IsError(ERR_SSL_VERSION_OR_CIPHER_MISMATCH));
1192 ASSERT_THAT(server_ret, IsError(ERR_SSL_VERSION_OR_CIPHER_MISMATCH));
1193}
1194
[email protected]f61c3972010-12-23 09:54:151195} // namespace net