Home | History | Annotate | Download | only in socket
      1 // Copyright 2014 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 #ifndef NET_SOCKET_SSL_SERVER_SOCKET_OPENSSL_H_
      6 #define NET_SOCKET_SSL_SERVER_SOCKET_OPENSSL_H_
      7 
      8 #include "base/memory/scoped_ptr.h"
      9 #include "net/base/completion_callback.h"
     10 #include "net/base/io_buffer.h"
     11 #include "net/base/net_log.h"
     12 #include "net/socket/ssl_server_socket.h"
     13 #include "net/ssl/ssl_config_service.h"
     14 
     15 // Avoid including misc OpenSSL headers, i.e.:
     16 // <openssl/bio.h>
     17 typedef struct bio_st BIO;
     18 // <openssl/ssl.h>
     19 typedef struct ssl_st SSL;
     20 
     21 namespace net {
     22 
     23 class SSLInfo;
     24 
     25 class SSLServerSocketOpenSSL : public SSLServerSocket {
     26  public:
     27   // See comments on CreateSSLServerSocket for details of how these
     28   // parameters are used.
     29   SSLServerSocketOpenSSL(scoped_ptr<StreamSocket> socket,
     30                          scoped_refptr<X509Certificate> certificate,
     31                          crypto::RSAPrivateKey* key,
     32                          const SSLConfig& ssl_config);
     33   virtual ~SSLServerSocketOpenSSL();
     34 
     35   // SSLServerSocket interface.
     36   virtual int Handshake(const CompletionCallback& callback) OVERRIDE;
     37 
     38   // SSLSocket interface.
     39   virtual int ExportKeyingMaterial(const base::StringPiece& label,
     40                                    bool has_context,
     41                                    const base::StringPiece& context,
     42                                    unsigned char* out,
     43                                    unsigned int outlen) OVERRIDE;
     44   virtual int GetTLSUniqueChannelBinding(std::string* out) OVERRIDE;
     45 
     46   // Socket interface (via StreamSocket).
     47   virtual int Read(IOBuffer* buf, int buf_len,
     48                    const CompletionCallback& callback) OVERRIDE;
     49   virtual int Write(IOBuffer* buf, int buf_len,
     50                     const CompletionCallback& callback) OVERRIDE;
     51   virtual int SetReceiveBufferSize(int32 size) OVERRIDE;
     52   virtual int SetSendBufferSize(int32 size) OVERRIDE;
     53 
     54   // StreamSocket implementation.
     55   virtual int Connect(const CompletionCallback& callback) OVERRIDE;
     56   virtual void Disconnect() OVERRIDE;
     57   virtual bool IsConnected() const OVERRIDE;
     58   virtual bool IsConnectedAndIdle() const OVERRIDE;
     59   virtual int GetPeerAddress(IPEndPoint* address) const OVERRIDE;
     60   virtual int GetLocalAddress(IPEndPoint* address) const OVERRIDE;
     61   virtual const BoundNetLog& NetLog() const OVERRIDE;
     62   virtual void SetSubresourceSpeculation() OVERRIDE;
     63   virtual void SetOmniboxSpeculation() OVERRIDE;
     64   virtual bool WasEverUsed() const OVERRIDE;
     65   virtual bool UsingTCPFastOpen() const OVERRIDE;
     66   virtual bool WasNpnNegotiated() const OVERRIDE;
     67   virtual NextProto GetNegotiatedProtocol() const OVERRIDE;
     68   virtual bool GetSSLInfo(SSLInfo* ssl_info) OVERRIDE;
     69 
     70  private:
     71   enum State {
     72     STATE_NONE,
     73     STATE_HANDSHAKE,
     74   };
     75 
     76   void OnSendComplete(int result);
     77   void OnRecvComplete(int result);
     78   void OnHandshakeIOComplete(int result);
     79 
     80   int BufferSend();
     81   void BufferSendComplete(int result);
     82   void TransportWriteComplete(int result);
     83   int BufferRecv();
     84   void BufferRecvComplete(int result);
     85   int TransportReadComplete(int result);
     86   bool DoTransportIO();
     87   int DoPayloadRead();
     88   int DoPayloadWrite();
     89 
     90   int DoHandshakeLoop(int last_io_result);
     91   int DoReadLoop(int result);
     92   int DoWriteLoop(int result);
     93   int DoHandshake();
     94   void DoHandshakeCallback(int result);
     95   void DoReadCallback(int result);
     96   void DoWriteCallback(int result);
     97 
     98   int Init();
     99 
    100   // Members used to send and receive buffer.
    101   bool transport_send_busy_;
    102   bool transport_recv_busy_;
    103   bool transport_recv_eof_;
    104 
    105   scoped_refptr<DrainableIOBuffer> send_buffer_;
    106   scoped_refptr<IOBuffer> recv_buffer_;
    107 
    108   BoundNetLog net_log_;
    109 
    110   CompletionCallback user_handshake_callback_;
    111   CompletionCallback user_read_callback_;
    112   CompletionCallback user_write_callback_;
    113 
    114   // Used by Read function.
    115   scoped_refptr<IOBuffer> user_read_buf_;
    116   int user_read_buf_len_;
    117 
    118   // Used by Write function.
    119   scoped_refptr<IOBuffer> user_write_buf_;
    120   int user_write_buf_len_;
    121 
    122   // Used by TransportWriteComplete() and TransportReadComplete() to signify an
    123   // error writing to the transport socket. A value of OK indicates no error.
    124   int transport_write_error_;
    125 
    126   // OpenSSL stuff
    127   SSL* ssl_;
    128   BIO* transport_bio_;
    129 
    130   // StreamSocket for sending and receiving data.
    131   scoped_ptr<StreamSocket> transport_socket_;
    132 
    133   // Options for the SSL socket.
    134   SSLConfig ssl_config_;
    135 
    136   // Certificate for the server.
    137   scoped_refptr<X509Certificate> cert_;
    138 
    139   // Private key used by the server.
    140   scoped_ptr<crypto::RSAPrivateKey> key_;
    141 
    142   State next_handshake_state_;
    143   bool completed_handshake_;
    144 
    145   DISALLOW_COPY_AND_ASSIGN(SSLServerSocketOpenSSL);
    146 };
    147 
    148 }  // namespace net
    149 
    150 #endif  // NET_SOCKET_SSL_SERVER_SOCKET_OPENSSL_H_
    151