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