blob: a28ac314fecaf3f9496a4bde6462f71f98fc52c2 [file] [log] [blame]
mmenkec951d412016-04-28 19:05:221// Copyright 2016 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.
4
5#include "net/socket/fuzzed_socket_factory.h"
6
7#include "base/logging.h"
csharrisonf30fc95f2016-08-19 21:43:448#include "base/test/fuzzed_data_provider.h"
mmenkec951d412016-04-28 19:05:229#include "net/base/address_list.h"
10#include "net/base/ip_endpoint.h"
11#include "net/base/net_errors.h"
12#include "net/base/network_change_notifier.h"
mikecironef22f9812016-10-04 03:40:1913#include "net/log/net_log_with_source.h"
mmenkec951d412016-04-28 19:05:2214#include "net/socket/client_socket_handle.h"
15#include "net/socket/connection_attempts.h"
tfarina5dd13c22016-11-16 12:08:2616#include "net/socket/fuzzed_datagram_client_socket.h"
mmenkec951d412016-04-28 19:05:2217#include "net/socket/fuzzed_socket.h"
18#include "net/socket/ssl_client_socket.h"
[email protected]a2b2cfc2017-12-06 09:06:0819#include "net/traffic_annotation/network_traffic_annotation.h"
mmenkec951d412016-04-28 19:05:2220
21namespace net {
22
mikecironef22f9812016-10-04 03:40:1923class NetLog;
24
mmenkec951d412016-04-28 19:05:2225namespace {
26
mmenkec951d412016-04-28 19:05:2227// SSLClientSocket implementation that always fails to connect.
28class FailingSSLClientSocket : public SSLClientSocket {
29 public:
Chris Watkins7a41d3552017-12-01 02:13:2730 FailingSSLClientSocket() = default;
31 ~FailingSSLClientSocket() override = default;
mmenkec951d412016-04-28 19:05:2232
33 // Socket implementation:
34 int Read(IOBuffer* buf,
35 int buf_len,
36 const CompletionCallback& callback) override {
37 NOTREACHED();
38 return ERR_UNEXPECTED;
39 }
40
41 int Write(IOBuffer* buf,
42 int buf_len,
[email protected]a2b2cfc2017-12-06 09:06:0843 const CompletionCallback& callback,
[email protected]578968d42017-12-13 15:39:3244 const NetworkTrafficAnnotationTag& traffic_annotation) override {
mmenkec951d412016-04-28 19:05:2245 NOTREACHED();
46 return ERR_UNEXPECTED;
47 }
48
49 int SetReceiveBufferSize(int32_t size) override { return OK; }
50 int SetSendBufferSize(int32_t size) override { return OK; }
51
52 // StreamSocket implementation:
53 int Connect(const CompletionCallback& callback) override {
54 return ERR_FAILED;
55 }
56
57 void Disconnect() override {}
58 bool IsConnected() const override { return false; }
59 bool IsConnectedAndIdle() const override { return false; }
60
61 int GetPeerAddress(IPEndPoint* address) const override {
62 return ERR_SOCKET_NOT_CONNECTED;
63 }
64 int GetLocalAddress(IPEndPoint* address) const override {
65 return ERR_SOCKET_NOT_CONNECTED;
66 }
67
tfarina42834112016-09-22 13:38:2068 const NetLogWithSource& NetLog() const override { return net_log_; }
mmenkec951d412016-04-28 19:05:2269
70 void SetSubresourceSpeculation() override {}
71 void SetOmniboxSpeculation() override {}
72
73 bool WasEverUsed() const override { return false; }
74
75 void EnableTCPFastOpenIfSupported() override {}
76
tfarina2846404c2016-12-25 14:31:3777 bool WasAlpnNegotiated() const override { return false; }
mmenkec951d412016-04-28 19:05:2278
79 NextProto GetNegotiatedProtocol() const override { return kProtoUnknown; }
80
81 bool GetSSLInfo(SSLInfo* ssl_info) override { return false; }
82
83 void GetConnectionAttempts(ConnectionAttempts* out) const override {
84 out->clear();
85 }
86
87 void ClearConnectionAttempts() override {}
88
89 void AddConnectionAttempts(const ConnectionAttempts& attempts) override {}
90
91 int64_t GetTotalReceivedBytes() const override { return 0; }
92
Paul Jensen0f49dec2017-12-12 23:39:5893 void ApplySocketTag(const net::SocketTag& tag) override {}
94
mmenkec951d412016-04-28 19:05:2295 // SSLSocket implementation:
96 int ExportKeyingMaterial(const base::StringPiece& label,
97 bool has_context,
98 const base::StringPiece& context,
99 unsigned char* out,
100 unsigned int outlen) override {
101 NOTREACHED();
102 return 0;
103 }
104
105 // SSLClientSocket implementation:
106 void GetSSLCertRequestInfo(SSLCertRequestInfo* cert_request_info) override {}
107
mmenkec951d412016-04-28 19:05:22108 ChannelIDService* GetChannelIDService() const override {
109 NOTREACHED();
110 return nullptr;
111 }
112
nharper78e6d2b2016-09-21 05:42:35113 Error GetTokenBindingSignature(crypto::ECPrivateKey* key,
114 TokenBindingType tb_type,
115 std::vector<uint8_t>* out) override {
mmenkec951d412016-04-28 19:05:22116 NOTREACHED();
117 return ERR_UNEXPECTED;
118 }
119
120 crypto::ECPrivateKey* GetChannelIDKey() const override {
121 NOTREACHED();
122 return nullptr;
123 }
124
mmenkec951d412016-04-28 19:05:22125 private:
tfarina42834112016-09-22 13:38:20126 NetLogWithSource net_log_;
mmenkec951d412016-04-28 19:05:22127
128 DISALLOW_COPY_AND_ASSIGN(FailingSSLClientSocket);
129};
130
131} // namespace
132
csharrisonf30fc95f2016-08-19 21:43:44133FuzzedSocketFactory::FuzzedSocketFactory(
134 base::FuzzedDataProvider* data_provider)
morlovich833190ec2017-02-10 16:53:04135 : data_provider_(data_provider), fuzz_connect_result_(true) {}
mmenkec951d412016-04-28 19:05:22136
Chris Watkins7a41d3552017-12-01 02:13:27137FuzzedSocketFactory::~FuzzedSocketFactory() = default;
mmenkec951d412016-04-28 19:05:22138
139std::unique_ptr<DatagramClientSocket>
140FuzzedSocketFactory::CreateDatagramClientSocket(
141 DatagramSocket::BindType bind_type,
mmenkec951d412016-04-28 19:05:22142 NetLog* net_log,
mikecironef22f9812016-10-04 03:40:19143 const NetLogSource& source) {
Jeremy Roman0579ed62017-08-29 15:56:19144 return std::make_unique<FuzzedDatagramClientSocket>(data_provider_);
mmenkec951d412016-04-28 19:05:22145}
146
Helen Lid5bb9222018-04-12 15:33:09147std::unique_ptr<TransportClientSocket>
148FuzzedSocketFactory::CreateTransportClientSocket(
mmenkec951d412016-04-28 19:05:22149 const AddressList& addresses,
150 std::unique_ptr<SocketPerformanceWatcher> socket_performance_watcher,
151 NetLog* net_log,
mikecironef22f9812016-10-04 03:40:19152 const NetLogSource& source) {
mmenkec951d412016-04-28 19:05:22153 std::unique_ptr<FuzzedSocket> socket(
154 new FuzzedSocket(data_provider_, net_log));
morlovich833190ec2017-02-10 16:53:04155 socket->set_fuzz_connect_result(fuzz_connect_result_);
mmenkec951d412016-04-28 19:05:22156 // Just use the first address.
157 socket->set_remote_address(*addresses.begin());
158 return std::move(socket);
159}
160
161std::unique_ptr<SSLClientSocket> FuzzedSocketFactory::CreateSSLClientSocket(
162 std::unique_ptr<ClientSocketHandle> transport_socket,
163 const HostPortPair& host_and_port,
164 const SSLConfig& ssl_config,
165 const SSLClientSocketContext& context) {
Jeremy Roman0579ed62017-08-29 15:56:19166 return std::make_unique<FailingSSLClientSocket>();
mmenkec951d412016-04-28 19:05:22167}
168
169void FuzzedSocketFactory::ClearSSLSessionCache() {}
170
171} // namespace net