1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
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:
9 // Connects SSL socket to FakeDataChannel. This class is just a stub.
12 // Implements the actual exchange of data between two FakeSockets.
14 // Implementations of these two classes are included in this file.
16 #include "net/socket/ssl_server_socket.h"
22 #include "base/compiler_specific.h"
23 #include "base/files/file_path.h"
24 #include "base/files/file_util.h"
25 #include "base/message_loop/message_loop.h"
26 #include "crypto/nss_util.h"
27 #include "crypto/rsa_private_key.h"
28 #include "net/base/address_list.h"
29 #include "net/base/completion_callback.h"
30 #include "net/base/host_port_pair.h"
31 #include "net/base/io_buffer.h"
32 #include "net/base/ip_endpoint.h"
33 #include "net/base/net_errors.h"
34 #include "net/base/net_log.h"
35 #include "net/base/test_data_directory.h"
36 #include "net/cert/cert_status_flags.h"
37 #include "net/cert/mock_cert_verifier.h"
38 #include "net/cert/x509_certificate.h"
39 #include "net/http/transport_security_state.h"
40 #include "net/socket/client_socket_factory.h"
41 #include "net/socket/socket_test_util.h"
42 #include "net/socket/ssl_client_socket.h"
43 #include "net/socket/stream_socket.h"
44 #include "net/ssl/ssl_config_service.h"
45 #include "net/ssl/ssl_info.h"
46 #include "net/test/cert_test_util.h"
47 #include "testing/gtest/include/gtest/gtest.h"
48 #include "testing/platform_test.h"
54 class FakeDataChannel
{
59 write_called_after_close_(false),
63 int Read(IOBuffer
* buf
, int buf_len
, const CompletionCallback
& callback
) {
64 DCHECK(read_callback_
.is_null());
65 DCHECK(!read_buf_
.get());
69 read_callback_
= callback
;
71 read_buf_len_
= buf_len
;
72 return ERR_IO_PENDING
;
74 return PropogateData(buf
, buf_len
);
77 int Write(IOBuffer
* buf
, int buf_len
, const CompletionCallback
& callback
) {
78 DCHECK(write_callback_
.is_null());
80 if (write_called_after_close_
)
81 return ERR_CONNECTION_RESET
;
82 write_called_after_close_
= true;
83 write_callback_
= callback
;
84 base::MessageLoop::current()->PostTask(
85 FROM_HERE
, base::Bind(&FakeDataChannel::DoWriteCallback
,
86 weak_factory_
.GetWeakPtr()));
87 return ERR_IO_PENDING
;
89 // This function returns synchronously, so make a copy of the buffer.
90 data_
.push(new DrainableIOBuffer(
91 new StringIOBuffer(std::string(buf
->data(), buf_len
)),
93 base::MessageLoop::current()->PostTask(
94 FROM_HERE
, base::Bind(&FakeDataChannel::DoReadCallback
,
95 weak_factory_
.GetWeakPtr()));
99 // Closes the FakeDataChannel. After Close() is called, Read() returns 0,
100 // indicating EOF, and Write() fails with ERR_CONNECTION_RESET. Note that
101 // after the FakeDataChannel is closed, the first Write() call completes
102 // asynchronously, which is necessary to reproduce bug 127822.
108 void DoReadCallback() {
109 if (read_callback_
.is_null() || data_
.empty())
112 int copied
= PropogateData(read_buf_
, read_buf_len_
);
113 CompletionCallback callback
= read_callback_
;
114 read_callback_
.Reset();
117 callback
.Run(copied
);
120 void DoWriteCallback() {
121 if (write_callback_
.is_null())
124 CompletionCallback callback
= write_callback_
;
125 write_callback_
.Reset();
126 callback
.Run(ERR_CONNECTION_RESET
);
129 int PropogateData(scoped_refptr
<IOBuffer
> read_buf
, int read_buf_len
) {
130 scoped_refptr
<DrainableIOBuffer
> buf
= data_
.front();
131 int copied
= std::min(buf
->BytesRemaining(), read_buf_len
);
132 memcpy(read_buf
->data(), buf
->data(), copied
);
133 buf
->DidConsume(copied
);
135 if (!buf
->BytesRemaining())
140 CompletionCallback read_callback_
;
141 scoped_refptr
<IOBuffer
> read_buf_
;
144 CompletionCallback write_callback_
;
146 std::queue
<scoped_refptr
<DrainableIOBuffer
> > data_
;
148 // True if Close() has been called.
151 // Controls the completion of Write() after the FakeDataChannel is closed.
152 // After the FakeDataChannel is closed, the first Write() call completes
154 bool write_called_after_close_
;
156 base::WeakPtrFactory
<FakeDataChannel
> weak_factory_
;
158 DISALLOW_COPY_AND_ASSIGN(FakeDataChannel
);
161 class FakeSocket
: public StreamSocket
{
163 FakeSocket(FakeDataChannel
* incoming_channel
,
164 FakeDataChannel
* outgoing_channel
)
165 : incoming_(incoming_channel
),
166 outgoing_(outgoing_channel
) {
169 ~FakeSocket() override
{}
171 int Read(IOBuffer
* buf
,
173 const CompletionCallback
& callback
) override
{
174 // Read random number of bytes.
175 buf_len
= rand() % buf_len
+ 1;
176 return incoming_
->Read(buf
, buf_len
, callback
);
179 int Write(IOBuffer
* buf
,
181 const CompletionCallback
& callback
) override
{
182 // Write random number of bytes.
183 buf_len
= rand() % buf_len
+ 1;
184 return outgoing_
->Write(buf
, buf_len
, callback
);
187 int SetReceiveBufferSize(int32 size
) override
{ return OK
; }
189 int SetSendBufferSize(int32 size
) override
{ return OK
; }
191 int Connect(const CompletionCallback
& callback
) override
{ return OK
; }
193 void Disconnect() override
{
198 bool IsConnected() const override
{ return true; }
200 bool IsConnectedAndIdle() const override
{ return true; }
202 int GetPeerAddress(IPEndPoint
* address
) const override
{
203 IPAddressNumber
ip_address(kIPv4AddressSize
);
204 *address
= IPEndPoint(ip_address
, 0 /*port*/);
208 int GetLocalAddress(IPEndPoint
* address
) const override
{
209 IPAddressNumber
ip_address(4);
210 *address
= IPEndPoint(ip_address
, 0);
214 const BoundNetLog
& NetLog() const override
{ return net_log_
; }
216 void SetSubresourceSpeculation() override
{}
217 void SetOmniboxSpeculation() override
{}
219 bool WasEverUsed() const override
{ return true; }
221 bool UsingTCPFastOpen() const override
{ return false; }
223 bool WasNpnNegotiated() const override
{ return false; }
225 NextProto
GetNegotiatedProtocol() const override
{ return kProtoUnknown
; }
227 bool GetSSLInfo(SSLInfo
* ssl_info
) override
{ return false; }
230 BoundNetLog net_log_
;
231 FakeDataChannel
* incoming_
;
232 FakeDataChannel
* outgoing_
;
234 DISALLOW_COPY_AND_ASSIGN(FakeSocket
);
239 // Verify the correctness of the test helper classes first.
240 TEST(FakeSocketTest
, DataTransfer
) {
241 // Establish channels between two sockets.
242 FakeDataChannel channel_1
;
243 FakeDataChannel channel_2
;
244 FakeSocket
client(&channel_1
, &channel_2
);
245 FakeSocket
server(&channel_2
, &channel_1
);
247 const char kTestData
[] = "testing123";
248 const int kTestDataSize
= strlen(kTestData
);
249 const int kReadBufSize
= 1024;
250 scoped_refptr
<IOBuffer
> write_buf
= new StringIOBuffer(kTestData
);
251 scoped_refptr
<IOBuffer
> read_buf
= new IOBuffer(kReadBufSize
);
255 server
.Write(write_buf
.get(), kTestDataSize
, CompletionCallback());
256 EXPECT_GT(written
, 0);
257 EXPECT_LE(written
, kTestDataSize
);
259 int read
= client
.Read(read_buf
.get(), kReadBufSize
, CompletionCallback());
261 EXPECT_LE(read
, written
);
262 EXPECT_EQ(0, memcmp(kTestData
, read_buf
->data(), read
));
265 TestCompletionCallback callback
;
266 EXPECT_EQ(ERR_IO_PENDING
,
267 server
.Read(read_buf
.get(), kReadBufSize
, callback
.callback()));
269 written
= client
.Write(write_buf
.get(), kTestDataSize
, CompletionCallback());
270 EXPECT_GT(written
, 0);
271 EXPECT_LE(written
, kTestDataSize
);
273 read
= callback
.WaitForResult();
275 EXPECT_LE(read
, written
);
276 EXPECT_EQ(0, memcmp(kTestData
, read_buf
->data(), read
));
279 class SSLServerSocketTest
: public PlatformTest
{
281 SSLServerSocketTest()
282 : socket_factory_(ClientSocketFactory::GetDefaultFactory()),
283 cert_verifier_(new MockCertVerifier()),
284 transport_security_state_(new TransportSecurityState
) {
285 cert_verifier_
->set_default_result(CERT_STATUS_AUTHORITY_INVALID
);
290 scoped_ptr
<ClientSocketHandle
> client_connection(new ClientSocketHandle
);
291 client_connection
->SetSocket(
292 scoped_ptr
<StreamSocket
>(new FakeSocket(&channel_1_
, &channel_2_
)));
293 scoped_ptr
<StreamSocket
> server_socket(
294 new FakeSocket(&channel_2_
, &channel_1_
));
296 base::FilePath
certs_dir(GetTestCertsDirectory());
298 base::FilePath cert_path
= certs_dir
.AppendASCII("unittest.selfsigned.der");
299 std::string cert_der
;
300 ASSERT_TRUE(base::ReadFileToString(cert_path
, &cert_der
));
302 scoped_refptr
<X509Certificate
> cert
=
303 X509Certificate::CreateFromBytes(cert_der
.data(), cert_der
.size());
305 base::FilePath key_path
= certs_dir
.AppendASCII("unittest.key.bin");
306 std::string key_string
;
307 ASSERT_TRUE(base::ReadFileToString(key_path
, &key_string
));
308 std::vector
<uint8
> key_vector(
309 reinterpret_cast<const uint8
*>(key_string
.data()),
310 reinterpret_cast<const uint8
*>(key_string
.data() +
311 key_string
.length()));
313 scoped_ptr
<crypto::RSAPrivateKey
> private_key(
314 crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(key_vector
));
316 SSLConfig ssl_config
;
317 ssl_config
.false_start_enabled
= false;
318 ssl_config
.channel_id_enabled
= false;
320 // Certificate provided by the host doesn't need authority.
321 SSLConfig::CertAndStatus cert_and_status
;
322 cert_and_status
.cert_status
= CERT_STATUS_AUTHORITY_INVALID
;
323 cert_and_status
.der_cert
= cert_der
;
324 ssl_config
.allowed_bad_certs
.push_back(cert_and_status
);
326 HostPortPair
host_and_pair("unittest", 0);
327 SSLClientSocketContext context
;
328 context
.cert_verifier
= cert_verifier_
.get();
329 context
.transport_security_state
= transport_security_state_
.get();
331 socket_factory_
->CreateSSLClientSocket(
332 client_connection
.Pass(), host_and_pair
, ssl_config
, context
);
333 server_socket_
= CreateSSLServerSocket(
334 server_socket
.Pass(),
335 cert
.get(), private_key
.get(), SSLConfig());
338 FakeDataChannel channel_1_
;
339 FakeDataChannel channel_2_
;
340 scoped_ptr
<SSLClientSocket
> client_socket_
;
341 scoped_ptr
<SSLServerSocket
> server_socket_
;
342 ClientSocketFactory
* socket_factory_
;
343 scoped_ptr
<MockCertVerifier
> cert_verifier_
;
344 scoped_ptr
<TransportSecurityState
> transport_security_state_
;
347 // This test only executes creation of client and server sockets. This is to
348 // test that creation of sockets doesn't crash and have minimal code to run
349 // under valgrind in order to help debugging memory problems.
350 TEST_F(SSLServerSocketTest
, Initialize
) {
354 // This test executes Connect() on SSLClientSocket and Handshake() on
355 // SSLServerSocket to make sure handshaking between the two sockets is
356 // completed successfully.
357 TEST_F(SSLServerSocketTest
, Handshake
) {
360 TestCompletionCallback connect_callback
;
361 TestCompletionCallback handshake_callback
;
363 int server_ret
= server_socket_
->Handshake(handshake_callback
.callback());
364 EXPECT_TRUE(server_ret
== OK
|| server_ret
== ERR_IO_PENDING
);
366 int client_ret
= client_socket_
->Connect(connect_callback
.callback());
367 EXPECT_TRUE(client_ret
== OK
|| client_ret
== ERR_IO_PENDING
);
369 if (client_ret
== ERR_IO_PENDING
) {
370 EXPECT_EQ(OK
, connect_callback
.WaitForResult());
372 if (server_ret
== ERR_IO_PENDING
) {
373 EXPECT_EQ(OK
, handshake_callback
.WaitForResult());
376 // Make sure the cert status is expected.
378 client_socket_
->GetSSLInfo(&ssl_info
);
379 EXPECT_EQ(CERT_STATUS_AUTHORITY_INVALID
, ssl_info
.cert_status
);
382 TEST_F(SSLServerSocketTest
, DataTransfer
) {
385 TestCompletionCallback connect_callback
;
386 TestCompletionCallback handshake_callback
;
388 // Establish connection.
389 int client_ret
= client_socket_
->Connect(connect_callback
.callback());
390 ASSERT_TRUE(client_ret
== OK
|| client_ret
== ERR_IO_PENDING
);
392 int server_ret
= server_socket_
->Handshake(handshake_callback
.callback());
393 ASSERT_TRUE(server_ret
== OK
|| server_ret
== ERR_IO_PENDING
);
395 client_ret
= connect_callback
.GetResult(client_ret
);
396 ASSERT_EQ(OK
, client_ret
);
397 server_ret
= handshake_callback
.GetResult(server_ret
);
398 ASSERT_EQ(OK
, server_ret
);
400 const int kReadBufSize
= 1024;
401 scoped_refptr
<StringIOBuffer
> write_buf
=
402 new StringIOBuffer("testing123");
403 scoped_refptr
<DrainableIOBuffer
> read_buf
=
404 new DrainableIOBuffer(new IOBuffer(kReadBufSize
), kReadBufSize
);
407 TestCompletionCallback write_callback
;
408 TestCompletionCallback read_callback
;
409 server_ret
= server_socket_
->Write(
410 write_buf
.get(), write_buf
->size(), write_callback
.callback());
411 EXPECT_TRUE(server_ret
> 0 || server_ret
== ERR_IO_PENDING
);
412 client_ret
= client_socket_
->Read(
413 read_buf
.get(), read_buf
->BytesRemaining(), read_callback
.callback());
414 EXPECT_TRUE(client_ret
> 0 || client_ret
== ERR_IO_PENDING
);
416 server_ret
= write_callback
.GetResult(server_ret
);
417 EXPECT_GT(server_ret
, 0);
418 client_ret
= read_callback
.GetResult(client_ret
);
419 ASSERT_GT(client_ret
, 0);
421 read_buf
->DidConsume(client_ret
);
422 while (read_buf
->BytesConsumed() < write_buf
->size()) {
423 client_ret
= client_socket_
->Read(
424 read_buf
.get(), read_buf
->BytesRemaining(), read_callback
.callback());
425 EXPECT_TRUE(client_ret
> 0 || client_ret
== ERR_IO_PENDING
);
426 client_ret
= read_callback
.GetResult(client_ret
);
427 ASSERT_GT(client_ret
, 0);
428 read_buf
->DidConsume(client_ret
);
430 EXPECT_EQ(write_buf
->size(), read_buf
->BytesConsumed());
431 read_buf
->SetOffset(0);
432 EXPECT_EQ(0, memcmp(write_buf
->data(), read_buf
->data(), write_buf
->size()));
435 write_buf
= new StringIOBuffer("hello123");
436 server_ret
= server_socket_
->Read(
437 read_buf
.get(), read_buf
->BytesRemaining(), read_callback
.callback());
438 EXPECT_TRUE(server_ret
> 0 || server_ret
== ERR_IO_PENDING
);
439 client_ret
= client_socket_
->Write(
440 write_buf
.get(), write_buf
->size(), write_callback
.callback());
441 EXPECT_TRUE(client_ret
> 0 || client_ret
== ERR_IO_PENDING
);
443 server_ret
= read_callback
.GetResult(server_ret
);
444 ASSERT_GT(server_ret
, 0);
445 client_ret
= write_callback
.GetResult(client_ret
);
446 EXPECT_GT(client_ret
, 0);
448 read_buf
->DidConsume(server_ret
);
449 while (read_buf
->BytesConsumed() < write_buf
->size()) {
450 server_ret
= server_socket_
->Read(
451 read_buf
.get(), read_buf
->BytesRemaining(), read_callback
.callback());
452 EXPECT_TRUE(server_ret
> 0 || server_ret
== ERR_IO_PENDING
);
453 server_ret
= read_callback
.GetResult(server_ret
);
454 ASSERT_GT(server_ret
, 0);
455 read_buf
->DidConsume(server_ret
);
457 EXPECT_EQ(write_buf
->size(), read_buf
->BytesConsumed());
458 read_buf
->SetOffset(0);
459 EXPECT_EQ(0, memcmp(write_buf
->data(), read_buf
->data(), write_buf
->size()));
462 // A regression test for bug 127822 (http://crbug.com/127822).
463 // If the server closes the connection after the handshake is finished,
464 // the client's Write() call should not cause an infinite loop.
465 // NOTE: this is a test for SSLClientSocket rather than SSLServerSocket.
466 TEST_F(SSLServerSocketTest
, ClientWriteAfterServerClose
) {
469 TestCompletionCallback connect_callback
;
470 TestCompletionCallback handshake_callback
;
472 // Establish connection.
473 int client_ret
= client_socket_
->Connect(connect_callback
.callback());
474 ASSERT_TRUE(client_ret
== OK
|| client_ret
== ERR_IO_PENDING
);
476 int server_ret
= server_socket_
->Handshake(handshake_callback
.callback());
477 ASSERT_TRUE(server_ret
== OK
|| server_ret
== ERR_IO_PENDING
);
479 client_ret
= connect_callback
.GetResult(client_ret
);
480 ASSERT_EQ(OK
, client_ret
);
481 server_ret
= handshake_callback
.GetResult(server_ret
);
482 ASSERT_EQ(OK
, server_ret
);
484 scoped_refptr
<StringIOBuffer
> write_buf
= new StringIOBuffer("testing123");
486 // The server closes the connection. The server needs to write some
487 // data first so that the client's Read() calls from the transport
488 // socket won't return ERR_IO_PENDING. This ensures that the client
489 // will call Read() on the transport socket again.
490 TestCompletionCallback write_callback
;
492 server_ret
= server_socket_
->Write(
493 write_buf
.get(), write_buf
->size(), write_callback
.callback());
494 EXPECT_TRUE(server_ret
> 0 || server_ret
== ERR_IO_PENDING
);
496 server_ret
= write_callback
.GetResult(server_ret
);
497 EXPECT_GT(server_ret
, 0);
499 server_socket_
->Disconnect();
501 // The client writes some data. This should not cause an infinite loop.
502 client_ret
= client_socket_
->Write(
503 write_buf
.get(), write_buf
->size(), write_callback
.callback());
504 EXPECT_TRUE(client_ret
> 0 || client_ret
== ERR_IO_PENDING
);
506 client_ret
= write_callback
.GetResult(client_ret
);
507 EXPECT_GT(client_ret
, 0);
509 base::MessageLoop::current()->PostDelayedTask(
510 FROM_HERE
, base::MessageLoop::QuitClosure(),
511 base::TimeDelta::FromMilliseconds(10));
512 base::MessageLoop::current()->Run();
515 // This test executes ExportKeyingMaterial() on the client and server sockets,
516 // after connecting them, and verifies that the results match.
517 // This test will fail if False Start is enabled (see crbug.com/90208).
518 TEST_F(SSLServerSocketTest
, ExportKeyingMaterial
) {
521 TestCompletionCallback connect_callback
;
522 TestCompletionCallback handshake_callback
;
524 int client_ret
= client_socket_
->Connect(connect_callback
.callback());
525 ASSERT_TRUE(client_ret
== OK
|| client_ret
== ERR_IO_PENDING
);
527 int server_ret
= server_socket_
->Handshake(handshake_callback
.callback());
528 ASSERT_TRUE(server_ret
== OK
|| server_ret
== ERR_IO_PENDING
);
530 if (client_ret
== ERR_IO_PENDING
) {
531 ASSERT_EQ(OK
, connect_callback
.WaitForResult());
533 if (server_ret
== ERR_IO_PENDING
) {
534 ASSERT_EQ(OK
, handshake_callback
.WaitForResult());
537 const int kKeyingMaterialSize
= 32;
538 const char kKeyingLabel
[] = "EXPERIMENTAL-server-socket-test";
539 const char kKeyingContext
[] = "";
540 unsigned char server_out
[kKeyingMaterialSize
];
541 int rv
= server_socket_
->ExportKeyingMaterial(kKeyingLabel
,
542 false, kKeyingContext
,
543 server_out
, sizeof(server_out
));
546 unsigned char client_out
[kKeyingMaterialSize
];
547 rv
= client_socket_
->ExportKeyingMaterial(kKeyingLabel
,
548 false, kKeyingContext
,
549 client_out
, sizeof(client_out
));
551 EXPECT_EQ(0, memcmp(server_out
, client_out
, sizeof(server_out
)));
553 const char kKeyingLabelBad
[] = "EXPERIMENTAL-server-socket-test-bad";
554 unsigned char client_bad
[kKeyingMaterialSize
];
555 rv
= client_socket_
->ExportKeyingMaterial(kKeyingLabelBad
,
556 false, kKeyingContext
,
557 client_bad
, sizeof(client_bad
));
559 EXPECT_NE(0, memcmp(server_out
, client_bad
, sizeof(server_out
)));