1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef NET_SOCKET_SOCKS5_CLIENT_SOCKET_H_ 6*6777b538SAndroid Build Coastguard Worker #define NET_SOCKET_SOCKS5_CLIENT_SOCKET_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <stddef.h> 9*6777b538SAndroid Build Coastguard Worker #include <stdint.h> 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker #include <memory> 12*6777b538SAndroid Build Coastguard Worker #include <string> 13*6777b538SAndroid Build Coastguard Worker 14*6777b538SAndroid Build Coastguard Worker #include "base/memory/scoped_refptr.h" 15*6777b538SAndroid Build Coastguard Worker #include "net/base/address_list.h" 16*6777b538SAndroid Build Coastguard Worker #include "net/base/completion_once_callback.h" 17*6777b538SAndroid Build Coastguard Worker #include "net/base/completion_repeating_callback.h" 18*6777b538SAndroid Build Coastguard Worker #include "net/base/host_port_pair.h" 19*6777b538SAndroid Build Coastguard Worker #include "net/base/net_errors.h" 20*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h" 21*6777b538SAndroid Build Coastguard Worker #include "net/log/net_log_with_source.h" 22*6777b538SAndroid Build Coastguard Worker #include "net/socket/stream_socket.h" 23*6777b538SAndroid Build Coastguard Worker #include "net/traffic_annotation/network_traffic_annotation.h" 24*6777b538SAndroid Build Coastguard Worker #include "url/gurl.h" 25*6777b538SAndroid Build Coastguard Worker 26*6777b538SAndroid Build Coastguard Worker namespace net { 27*6777b538SAndroid Build Coastguard Worker 28*6777b538SAndroid Build Coastguard Worker // This StreamSocket is used to setup a SOCKSv5 handshake with a socks proxy. 29*6777b538SAndroid Build Coastguard Worker // Currently no SOCKSv5 authentication is supported. 30*6777b538SAndroid Build Coastguard Worker class NET_EXPORT_PRIVATE SOCKS5ClientSocket : public StreamSocket { 31*6777b538SAndroid Build Coastguard Worker public: 32*6777b538SAndroid Build Coastguard Worker // |destination| contains the hostname and port to which the socket above will 33*6777b538SAndroid Build Coastguard Worker // communicate to via the SOCKS layer. 34*6777b538SAndroid Build Coastguard Worker // 35*6777b538SAndroid Build Coastguard Worker // Although SOCKS 5 supports 3 different modes of addressing, we will 36*6777b538SAndroid Build Coastguard Worker // always pass it a hostname. This means the DNS resolving is done 37*6777b538SAndroid Build Coastguard Worker // proxy side. 38*6777b538SAndroid Build Coastguard Worker SOCKS5ClientSocket(std::unique_ptr<StreamSocket> transport_socket, 39*6777b538SAndroid Build Coastguard Worker const HostPortPair& destination, 40*6777b538SAndroid Build Coastguard Worker const NetworkTrafficAnnotationTag& traffic_annotation); 41*6777b538SAndroid Build Coastguard Worker 42*6777b538SAndroid Build Coastguard Worker SOCKS5ClientSocket(const SOCKS5ClientSocket&) = delete; 43*6777b538SAndroid Build Coastguard Worker SOCKS5ClientSocket& operator=(const SOCKS5ClientSocket&) = delete; 44*6777b538SAndroid Build Coastguard Worker 45*6777b538SAndroid Build Coastguard Worker // On destruction Disconnect() is called. 46*6777b538SAndroid Build Coastguard Worker ~SOCKS5ClientSocket() override; 47*6777b538SAndroid Build Coastguard Worker 48*6777b538SAndroid Build Coastguard Worker // StreamSocket implementation. 49*6777b538SAndroid Build Coastguard Worker 50*6777b538SAndroid Build Coastguard Worker // Does the SOCKS handshake and completes the protocol. 51*6777b538SAndroid Build Coastguard Worker int Connect(CompletionOnceCallback callback) override; 52*6777b538SAndroid Build Coastguard Worker void Disconnect() override; 53*6777b538SAndroid Build Coastguard Worker bool IsConnected() const override; 54*6777b538SAndroid Build Coastguard Worker bool IsConnectedAndIdle() const override; 55*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& NetLog() const override; 56*6777b538SAndroid Build Coastguard Worker bool WasEverUsed() const override; 57*6777b538SAndroid Build Coastguard Worker NextProto GetNegotiatedProtocol() const override; 58*6777b538SAndroid Build Coastguard Worker bool GetSSLInfo(SSLInfo* ssl_info) override; 59*6777b538SAndroid Build Coastguard Worker int64_t GetTotalReceivedBytes() const override; 60*6777b538SAndroid Build Coastguard Worker void ApplySocketTag(const SocketTag& tag) override; 61*6777b538SAndroid Build Coastguard Worker 62*6777b538SAndroid Build Coastguard Worker // Socket implementation. 63*6777b538SAndroid Build Coastguard Worker int Read(IOBuffer* buf, 64*6777b538SAndroid Build Coastguard Worker int buf_len, 65*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback) override; 66*6777b538SAndroid Build Coastguard Worker int Write(IOBuffer* buf, 67*6777b538SAndroid Build Coastguard Worker int buf_len, 68*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback, 69*6777b538SAndroid Build Coastguard Worker const NetworkTrafficAnnotationTag& traffic_annotation) override; 70*6777b538SAndroid Build Coastguard Worker 71*6777b538SAndroid Build Coastguard Worker int SetReceiveBufferSize(int32_t size) override; 72*6777b538SAndroid Build Coastguard Worker int SetSendBufferSize(int32_t size) override; 73*6777b538SAndroid Build Coastguard Worker 74*6777b538SAndroid Build Coastguard Worker int GetPeerAddress(IPEndPoint* address) const override; 75*6777b538SAndroid Build Coastguard Worker int GetLocalAddress(IPEndPoint* address) const override; 76*6777b538SAndroid Build Coastguard Worker 77*6777b538SAndroid Build Coastguard Worker private: 78*6777b538SAndroid Build Coastguard Worker enum State { 79*6777b538SAndroid Build Coastguard Worker STATE_GREET_WRITE, 80*6777b538SAndroid Build Coastguard Worker STATE_GREET_WRITE_COMPLETE, 81*6777b538SAndroid Build Coastguard Worker STATE_GREET_READ, 82*6777b538SAndroid Build Coastguard Worker STATE_GREET_READ_COMPLETE, 83*6777b538SAndroid Build Coastguard Worker STATE_HANDSHAKE_WRITE, 84*6777b538SAndroid Build Coastguard Worker STATE_HANDSHAKE_WRITE_COMPLETE, 85*6777b538SAndroid Build Coastguard Worker STATE_HANDSHAKE_READ, 86*6777b538SAndroid Build Coastguard Worker STATE_HANDSHAKE_READ_COMPLETE, 87*6777b538SAndroid Build Coastguard Worker STATE_NONE, 88*6777b538SAndroid Build Coastguard Worker }; 89*6777b538SAndroid Build Coastguard Worker 90*6777b538SAndroid Build Coastguard Worker // Addressing type that can be specified in requests or responses. 91*6777b538SAndroid Build Coastguard Worker enum SocksEndPointAddressType { 92*6777b538SAndroid Build Coastguard Worker kEndPointDomain = 0x03, 93*6777b538SAndroid Build Coastguard Worker kEndPointResolvedIPv4 = 0x01, 94*6777b538SAndroid Build Coastguard Worker kEndPointResolvedIPv6 = 0x04, 95*6777b538SAndroid Build Coastguard Worker }; 96*6777b538SAndroid Build Coastguard Worker 97*6777b538SAndroid Build Coastguard Worker static const unsigned int kGreetReadHeaderSize; 98*6777b538SAndroid Build Coastguard Worker static const unsigned int kWriteHeaderSize; 99*6777b538SAndroid Build Coastguard Worker static const unsigned int kReadHeaderSize; 100*6777b538SAndroid Build Coastguard Worker static const uint8_t kSOCKS5Version; 101*6777b538SAndroid Build Coastguard Worker static const uint8_t kTunnelCommand; 102*6777b538SAndroid Build Coastguard Worker static const uint8_t kNullByte; 103*6777b538SAndroid Build Coastguard Worker 104*6777b538SAndroid Build Coastguard Worker void DoCallback(int result); 105*6777b538SAndroid Build Coastguard Worker void OnIOComplete(int result); 106*6777b538SAndroid Build Coastguard Worker void OnReadWriteComplete(CompletionOnceCallback callback, int result); 107*6777b538SAndroid Build Coastguard Worker 108*6777b538SAndroid Build Coastguard Worker int DoLoop(int last_io_result); 109*6777b538SAndroid Build Coastguard Worker int DoHandshakeRead(); 110*6777b538SAndroid Build Coastguard Worker int DoHandshakeReadComplete(int result); 111*6777b538SAndroid Build Coastguard Worker int DoHandshakeWrite(); 112*6777b538SAndroid Build Coastguard Worker int DoHandshakeWriteComplete(int result); 113*6777b538SAndroid Build Coastguard Worker int DoGreetRead(); 114*6777b538SAndroid Build Coastguard Worker int DoGreetReadComplete(int result); 115*6777b538SAndroid Build Coastguard Worker int DoGreetWrite(); 116*6777b538SAndroid Build Coastguard Worker int DoGreetWriteComplete(int result); 117*6777b538SAndroid Build Coastguard Worker 118*6777b538SAndroid Build Coastguard Worker // Writes the SOCKS handshake buffer into |handshake| 119*6777b538SAndroid Build Coastguard Worker // and return OK on success. 120*6777b538SAndroid Build Coastguard Worker int BuildHandshakeWriteBuffer(std::string* handshake) const; 121*6777b538SAndroid Build Coastguard Worker 122*6777b538SAndroid Build Coastguard Worker CompletionRepeatingCallback io_callback_; 123*6777b538SAndroid Build Coastguard Worker 124*6777b538SAndroid Build Coastguard Worker // Stores the underlying socket. 125*6777b538SAndroid Build Coastguard Worker std::unique_ptr<StreamSocket> transport_socket_; 126*6777b538SAndroid Build Coastguard Worker 127*6777b538SAndroid Build Coastguard Worker State next_state_ = STATE_NONE; 128*6777b538SAndroid Build Coastguard Worker 129*6777b538SAndroid Build Coastguard Worker // Stores the callback to the layer above, called on completing Connect(). 130*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback user_callback_; 131*6777b538SAndroid Build Coastguard Worker 132*6777b538SAndroid Build Coastguard Worker // This IOBuffer is used by the class to read and write 133*6777b538SAndroid Build Coastguard Worker // SOCKS handshake data. The length contains the expected size to 134*6777b538SAndroid Build Coastguard Worker // read or write. 135*6777b538SAndroid Build Coastguard Worker scoped_refptr<IOBuffer> handshake_buf_; 136*6777b538SAndroid Build Coastguard Worker 137*6777b538SAndroid Build Coastguard Worker // While writing, this buffer stores the complete write handshake data. 138*6777b538SAndroid Build Coastguard Worker // While reading, it stores the handshake information received so far. 139*6777b538SAndroid Build Coastguard Worker std::string buffer_; 140*6777b538SAndroid Build Coastguard Worker 141*6777b538SAndroid Build Coastguard Worker // This becomes true when the SOCKS handshake has completed and the 142*6777b538SAndroid Build Coastguard Worker // overlying connection is free to communicate. 143*6777b538SAndroid Build Coastguard Worker bool completed_handshake_ = false; 144*6777b538SAndroid Build Coastguard Worker 145*6777b538SAndroid Build Coastguard Worker // These contain the bytes sent / received by the SOCKS handshake. 146*6777b538SAndroid Build Coastguard Worker size_t bytes_sent_ = 0; 147*6777b538SAndroid Build Coastguard Worker size_t bytes_received_ = 0; 148*6777b538SAndroid Build Coastguard Worker 149*6777b538SAndroid Build Coastguard Worker size_t read_header_size; 150*6777b538SAndroid Build Coastguard Worker 151*6777b538SAndroid Build Coastguard Worker bool was_ever_used_ = false; 152*6777b538SAndroid Build Coastguard Worker 153*6777b538SAndroid Build Coastguard Worker const HostPortPair destination_; 154*6777b538SAndroid Build Coastguard Worker 155*6777b538SAndroid Build Coastguard Worker NetLogWithSource net_log_; 156*6777b538SAndroid Build Coastguard Worker 157*6777b538SAndroid Build Coastguard Worker // Traffic annotation for socket control. 158*6777b538SAndroid Build Coastguard Worker NetworkTrafficAnnotationTag traffic_annotation_; 159*6777b538SAndroid Build Coastguard Worker }; 160*6777b538SAndroid Build Coastguard Worker 161*6777b538SAndroid Build Coastguard Worker } // namespace net 162*6777b538SAndroid Build Coastguard Worker 163*6777b538SAndroid Build Coastguard Worker #endif // NET_SOCKET_SOCKS5_CLIENT_SOCKET_H_ 164