1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Use of this source code is governed by a BSD-style license that can be 321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// found in the LICENSE file. 421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// This test suite uses SSLClientSocket to test the implementation of 621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// SSLServerSocket. In order to establish connections between the sockets 721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// we need two additional classes: 821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// 1. FakeSocket 921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Connects SSL socket to FakeDataChannel. This class is just a stub. 1021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// 1121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// 2. FakeDataChannel 1221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Implements the actual exchange of data between two FakeSockets. 1321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// 1421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Implementations of these two classes are included in this file. 1521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 1621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "net/socket/ssl_server_socket.h" 1721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 1821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include <queue> 1921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 2021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "base/file_path.h" 2121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "base/file_util.h" 2221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "base/path_service.h" 23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "crypto/nss_util.h" 24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "crypto/rsa_private_key.h" 2521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "net/base/address_list.h" 26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "net/base/cert_status_flags.h" 2721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "net/base/cert_verifier.h" 2821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "net/base/host_port_pair.h" 2921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "net/base/io_buffer.h" 30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "net/base/ip_endpoint.h" 3121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "net/base/net_errors.h" 3221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "net/base/net_log.h" 3321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "net/base/ssl_config_service.h" 3421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "net/base/x509_certificate.h" 3521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "net/socket/client_socket.h" 3621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "net/socket/client_socket_factory.h" 3721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "net/socket/socket_test_util.h" 3821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "net/socket/ssl_client_socket.h" 3921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "testing/gtest/include/gtest/gtest.h" 4021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "testing/platform_test.h" 4121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 4221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsennamespace net { 4321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 4421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsennamespace { 4521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 4621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenclass FakeDataChannel { 4721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen public: 4821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen FakeDataChannel() : read_callback_(NULL), read_buf_len_(0) { 4921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 5021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 5121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual int Read(IOBuffer* buf, int buf_len, 5221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen CompletionCallback* callback) { 5321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (data_.empty()) { 5421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen read_callback_ = callback; 5521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen read_buf_ = buf; 5621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen read_buf_len_ = buf_len; 5721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return net::ERR_IO_PENDING; 5821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 5921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return PropogateData(buf, buf_len); 6021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 6121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 6221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual int Write(IOBuffer* buf, int buf_len, 6321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen CompletionCallback* callback) { 6421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen data_.push(new net::DrainableIOBuffer(buf, buf_len)); 6521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen DoReadCallback(); 6621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return buf_len; 6721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 6821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 6921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen private: 7021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen void DoReadCallback() { 7121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (!read_callback_) 7221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return; 7321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 7421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int copied = PropogateData(read_buf_, read_buf_len_); 7521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen net::CompletionCallback* callback = read_callback_; 7621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen read_callback_ = NULL; 7721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen read_buf_ = NULL; 7821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen read_buf_len_ = 0; 7921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen callback->Run(copied); 8021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 8121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 8221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int PropogateData(scoped_refptr<net::IOBuffer> read_buf, int read_buf_len) { 8321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen scoped_refptr<net::DrainableIOBuffer> buf = data_.front(); 8421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int copied = std::min(buf->BytesRemaining(), read_buf_len); 8521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen memcpy(read_buf->data(), buf->data(), copied); 8621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen buf->DidConsume(copied); 8721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 8821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (!buf->BytesRemaining()) 8921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen data_.pop(); 9021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return copied; 9121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 9221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 9321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen net::CompletionCallback* read_callback_; 9421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen scoped_refptr<net::IOBuffer> read_buf_; 9521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int read_buf_len_; 9621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 9721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen std::queue<scoped_refptr<net::DrainableIOBuffer> > data_; 9821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 9921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen DISALLOW_COPY_AND_ASSIGN(FakeDataChannel); 10021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}; 10121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 10221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenclass FakeSocket : public ClientSocket { 10321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen public: 10421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen FakeSocket(FakeDataChannel* incoming_channel, 10521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen FakeDataChannel* outgoing_channel) 10621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen : incoming_(incoming_channel), 10721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen outgoing_(outgoing_channel) { 10821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 10921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 11021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual ~FakeSocket() { 11121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 11221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 11321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 11421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual int Read(IOBuffer* buf, int buf_len, 11521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen CompletionCallback* callback) { 11621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return incoming_->Read(buf, buf_len, callback); 11721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 11821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 11921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual int Write(IOBuffer* buf, int buf_len, 12021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen CompletionCallback* callback) { 12121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return outgoing_->Write(buf, buf_len, callback); 12221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 12321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 12421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual bool SetReceiveBufferSize(int32 size) { 12521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return true; 12621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 12721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 12821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual bool SetSendBufferSize(int32 size) { 12921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return true; 13021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 13121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 13221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual int Connect(CompletionCallback* callback) { 13321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return net::OK; 13421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 13521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 13621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual void Disconnect() {} 13721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 13821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual bool IsConnected() const { 13921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return true; 14021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 14121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 14221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual bool IsConnectedAndIdle() const { 14321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return true; 14421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 14521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 14621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual int GetPeerAddress(AddressList* address) const { 14721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen net::IPAddressNumber ip_address(4); 14821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen *address = net::AddressList(ip_address, 0, false); 14921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return net::OK; 15021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 15121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual int GetLocalAddress(IPEndPoint* address) const { 153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen net::IPAddressNumber ip_address(4); 154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *address = net::IPEndPoint(ip_address, 0); 155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return net::OK; 156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 15821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual const BoundNetLog& NetLog() const { 15921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return net_log_; 16021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 16121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 16221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual void SetSubresourceSpeculation() {} 16321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual void SetOmniboxSpeculation() {} 16421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 16521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual bool WasEverUsed() const { 16621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return true; 16721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 16821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 16921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual bool UsingTCPFastOpen() const { 17021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return false; 17121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 17221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 17321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen private: 17421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen net::BoundNetLog net_log_; 17521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen FakeDataChannel* incoming_; 17621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen FakeDataChannel* outgoing_; 17721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 17821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen DISALLOW_COPY_AND_ASSIGN(FakeSocket); 17921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}; 18021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 18121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} // namespace 18221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 18321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Verify the correctness of the test helper classes first. 18421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenTEST(FakeSocketTest, DataTransfer) { 18521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Establish channels between two sockets. 18621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen FakeDataChannel channel_1; 18721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen FakeDataChannel channel_2; 18821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen FakeSocket client(&channel_1, &channel_2); 18921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen FakeSocket server(&channel_2, &channel_1); 19021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 19121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const char kTestData[] = "testing123"; 19221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const int kTestDataSize = strlen(kTestData); 19321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const int kReadBufSize = 1024; 19421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen scoped_refptr<net::IOBuffer> write_buf = new net::StringIOBuffer(kTestData); 19521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen scoped_refptr<net::IOBuffer> read_buf = new net::IOBuffer(kReadBufSize); 19621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 19721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Write then read. 19821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_EQ(kTestDataSize, server.Write(write_buf, kTestDataSize, NULL)); 19921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_EQ(kTestDataSize, client.Read(read_buf, kReadBufSize, NULL)); 20021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_EQ(0, memcmp(kTestData, read_buf->data(), kTestDataSize)); 20121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 20221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Read then write. 20321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen TestCompletionCallback callback; 20421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_EQ(net::ERR_IO_PENDING, 20521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen server.Read(read_buf, kReadBufSize, &callback)); 20621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_EQ(kTestDataSize, client.Write(write_buf, kTestDataSize, NULL)); 20721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_EQ(kTestDataSize, callback.WaitForResult()); 20821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_EQ(0, memcmp(kTestData, read_buf->data(), kTestDataSize)); 20921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 21021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 21121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenclass SSLServerSocketTest : public PlatformTest { 21221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen public: 21321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen SSLServerSocketTest() 21421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen : socket_factory_(net::ClientSocketFactory::GetDefaultFactory()) { 21521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 21621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 21721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen protected: 21821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen void Initialize() { 21921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen FakeSocket* fake_client_socket = new FakeSocket(&channel_1_, &channel_2_); 22021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen FakeSocket* fake_server_socket = new FakeSocket(&channel_2_, &channel_1_); 22121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 22221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen FilePath certs_dir; 22321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen PathService::Get(base::DIR_SOURCE_ROOT, &certs_dir); 22421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen certs_dir = certs_dir.AppendASCII("net"); 22521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen certs_dir = certs_dir.AppendASCII("data"); 22621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen certs_dir = certs_dir.AppendASCII("ssl"); 22721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen certs_dir = certs_dir.AppendASCII("certificates"); 22821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 22921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen FilePath cert_path = certs_dir.AppendASCII("unittest.selfsigned.der"); 23021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen std::string cert_der; 23121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_TRUE(file_util::ReadFileToString(cert_path, &cert_der)); 23221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 23321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen scoped_refptr<net::X509Certificate> cert = 23421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen X509Certificate::CreateFromBytes(cert_der.data(), cert_der.size()); 23521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 23621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen FilePath key_path = certs_dir.AppendASCII("unittest.key.bin"); 23721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen std::string key_string; 23821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_TRUE(file_util::ReadFileToString(key_path, &key_string)); 23921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen std::vector<uint8> key_vector( 24021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen reinterpret_cast<const uint8*>(key_string.data()), 24121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen reinterpret_cast<const uint8*>(key_string.data() + 24221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen key_string.length())); 24321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 244ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_ptr<crypto::RSAPrivateKey> private_key( 245ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(key_vector)); 24621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 24721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen net::SSLConfig ssl_config; 24821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ssl_config.false_start_enabled = false; 24921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ssl_config.ssl3_enabled = true; 25021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ssl_config.tls1_enabled = true; 25121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 25221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Certificate provided by the host doesn't need authority. 25321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen net::SSLConfig::CertAndStatus cert_and_status; 254ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen cert_and_status.cert_status = net::CERT_STATUS_AUTHORITY_INVALID; 25521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen cert_and_status.cert = cert; 25621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ssl_config.allowed_bad_certs.push_back(cert_and_status); 25721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 25821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen net::HostPortPair host_and_pair("unittest", 0); 25921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen client_socket_.reset( 26021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen socket_factory_->CreateSSLClientSocket( 26121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen fake_client_socket, host_and_pair, ssl_config, NULL, 26221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen &cert_verifier_)); 26321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen server_socket_.reset(net::CreateSSLServerSocket(fake_server_socket, 26421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen cert, private_key.get(), 26521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen net::SSLConfig())); 26621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 26721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 26821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen FakeDataChannel channel_1_; 26921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen FakeDataChannel channel_2_; 27021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen scoped_ptr<net::SSLClientSocket> client_socket_; 27121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen scoped_ptr<net::SSLServerSocket> server_socket_; 27221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen net::ClientSocketFactory* socket_factory_; 27321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen net::CertVerifier cert_verifier_; 27421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}; 27521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 27621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// SSLServerSocket is only implemented using NSS. 27721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#if defined(USE_NSS) || defined(OS_WIN) || defined(OS_MACOSX) 27821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 27921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// This test only executes creation of client and server sockets. This is to 28021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// test that creation of sockets doesn't crash and have minimal code to run 28121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// under valgrind in order to help debugging memory problems. 28221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenTEST_F(SSLServerSocketTest, Initialize) { 28321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen Initialize(); 28421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 28521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 28621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// This test executes Connect() of SSLClientSocket and Accept() of 28721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// SSLServerSocket to make sure handshaking between the two sockets are 28821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// completed successfully. 28921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenTEST_F(SSLServerSocketTest, Handshake) { 29021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen Initialize(); 29121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 29221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen TestCompletionCallback connect_callback; 29321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen TestCompletionCallback accept_callback; 29421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 29521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int server_ret = server_socket_->Accept(&accept_callback); 29621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_TRUE(server_ret == net::OK || server_ret == net::ERR_IO_PENDING); 29721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 29821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int client_ret = client_socket_->Connect(&connect_callback); 29921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_TRUE(client_ret == net::OK || client_ret == net::ERR_IO_PENDING); 30021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 30121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (client_ret == net::ERR_IO_PENDING) { 30221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_EQ(net::OK, connect_callback.WaitForResult()); 30321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 30421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (server_ret == net::ERR_IO_PENDING) { 30521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_EQ(net::OK, accept_callback.WaitForResult()); 30621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 30721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 30821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 30921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenTEST_F(SSLServerSocketTest, DataTransfer) { 31021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen Initialize(); 31121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 31221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen TestCompletionCallback connect_callback; 31321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen TestCompletionCallback accept_callback; 31421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 31521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Establish connection. 31621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int client_ret = client_socket_->Connect(&connect_callback); 31772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_TRUE(client_ret == net::OK || client_ret == net::ERR_IO_PENDING); 31821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 31921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int server_ret = server_socket_->Accept(&accept_callback); 32072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_TRUE(server_ret == net::OK || server_ret == net::ERR_IO_PENDING); 32121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 32221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (client_ret == net::ERR_IO_PENDING) { 32372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_EQ(net::OK, connect_callback.WaitForResult()); 32421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 32521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (server_ret == net::ERR_IO_PENDING) { 32672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_EQ(net::OK, accept_callback.WaitForResult()); 32721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 32821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 32921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const int kReadBufSize = 1024; 33021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen scoped_refptr<net::StringIOBuffer> write_buf = 33121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen new net::StringIOBuffer("testing123"); 33221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen scoped_refptr<net::IOBuffer> read_buf = new net::IOBuffer(kReadBufSize); 33321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 33421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Write then read. 33521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen TestCompletionCallback write_callback; 33621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen TestCompletionCallback read_callback; 33721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen server_ret = server_socket_->Write(write_buf, write_buf->size(), 33821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen &write_callback); 33921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_TRUE(server_ret > 0 || server_ret == net::ERR_IO_PENDING); 34021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen client_ret = client_socket_->Read(read_buf, kReadBufSize, &read_callback); 34121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_TRUE(client_ret > 0 || client_ret == net::ERR_IO_PENDING); 34221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 34321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (server_ret == net::ERR_IO_PENDING) { 34421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_GT(write_callback.WaitForResult(), 0); 34521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 34621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (client_ret == net::ERR_IO_PENDING) { 34721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_GT(read_callback.WaitForResult(), 0); 34821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 34921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_EQ(0, memcmp(write_buf->data(), read_buf->data(), write_buf->size())); 35021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 35121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Read then write. 35221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen write_buf = new net::StringIOBuffer("hello123"); 35321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen server_ret = server_socket_->Read(read_buf, kReadBufSize, &read_callback); 35421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_TRUE(server_ret > 0 || server_ret == net::ERR_IO_PENDING); 35521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen client_ret = client_socket_->Write(write_buf, write_buf->size(), 35621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen &write_callback); 35721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_TRUE(client_ret > 0 || client_ret == net::ERR_IO_PENDING); 35821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 35921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (server_ret == net::ERR_IO_PENDING) { 36021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_GT(read_callback.WaitForResult(), 0); 36121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 36221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (client_ret == net::ERR_IO_PENDING) { 36321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_GT(write_callback.WaitForResult(), 0); 36421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 36521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_EQ(0, memcmp(write_buf->data(), read_buf->data(), write_buf->size())); 36621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 36721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#endif 36821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 36921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} // namespace net 370