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