Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(52)

Side by Side Diff: net/socket/ssl_client_socket_openssl.h

Issue 3495005: Prototype OpenSSL client socket implementation. (Closed)
Patch Set: agl comments no. 2 Created 10 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright (c) 2010 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_CLIENT_SOCKET_OPENSSL_H_
6 #define NET_SOCKET_SSL_CLIENT_SOCKET_OPENSSL_H_
7 #pragma once
8
9 #include "base/scoped_ptr.h"
10 #include "net/base/completion_callback.h"
11 #include "net/base/io_buffer.h"
12 #include "net/base/ssl_config_service.h"
13 #include "net/socket/ssl_client_socket.h"
14 #include "net/socket/client_socket_handle.h"
15
16 typedef struct bio_st BIO;
17 typedef struct ssl_ctx_st SSL_CTX;
18 typedef struct ssl_st SSL;
19
20 namespace net {
21
22 class SSLCertRequestInfo;
23 class SSLConfig;
24 class SSLInfo;
25
26 // An SSL client socket implemented with OpenSSL.
27 class SSLClientSocketOpenSSL : public SSLClientSocket {
28 public:
29 // Takes ownership of the transport_socket, which may already be connected.
30 // The given hostname will be compared with the name(s) in the server's
31 // certificate during the SSL handshake. ssl_config specifies the SSL
32 // settings.
33 SSLClientSocketOpenSSL(ClientSocketHandle* transport_socket,
34 const std::string& hostname,
35 const SSLConfig& ssl_config);
36 ~SSLClientSocketOpenSSL();
37
38 // SSLClientSocket methods:
39 virtual void GetSSLInfo(SSLInfo* ssl_info);
40 virtual void GetSSLCertRequestInfo(SSLCertRequestInfo* cert_request_info);
41 virtual NextProtoStatus GetNextProto(std::string* proto);
42
43 // ClientSocket methods:
44 virtual int Connect(CompletionCallback* callback);
45 virtual void Disconnect();
46 virtual bool IsConnected() const;
47 virtual bool IsConnectedAndIdle() const;
48 virtual int GetPeerAddress(AddressList*) const;
49 virtual const BoundNetLog& NetLog() const;
50 virtual void SetSubresourceSpeculation();
51 virtual void SetOmniboxSpeculation();
52 virtual bool WasEverUsed() const;
53
54 // Socket methods:
55 virtual int Read(IOBuffer* buf, int buf_len, CompletionCallback* callback);
56 virtual int Write(IOBuffer* buf, int buf_len, CompletionCallback* callback);
57 virtual bool SetReceiveBufferSize(int32 size);
58 virtual bool SetSendBufferSize(int32 size);
59
60 private:
61 // Initializes OpenSSL SSL options. Returns a net error code.
62 bool InitializeSSLOptions();
63 bool InitOpenSSL();
wtc 2010/09/28 18:08:35 Please add a TODO comment to note that InitOpenSSL
joth 2010/09/29 11:58:54 Done.
64 bool Init();
65 void DoReadCallback(int result);
66 void DoWriteCallback(int result);
67
68 bool DoTransportIO();
69 int DoHandshake();
70 void DoConnectCallback(int result);
71
72 void OnHandshakeIOComplete(int result);
73 void OnSendComplete(int result);
74 void OnRecvComplete(int result);
75
76 int DoHandshakeLoop(int last_io_result);
77 int DoReadLoop(int result);
78 int DoWriteLoop(int result);
79 int DoPayloadRead();
80 int DoPayloadWrite();
81
82 int BufferSend();
83 int BufferRecv();
84 void BufferSendComplete(int result);
85 void BufferRecvComplete(int result);
86 void TransportWriteComplete(int result);
87 void TransportReadComplete(int result);
88
89 CompletionCallbackImpl<SSLClientSocketOpenSSL> buffer_send_callback_;
90 CompletionCallbackImpl<SSLClientSocketOpenSSL> buffer_recv_callback_;
91 bool transport_send_busy_;
92 scoped_refptr<DrainableIOBuffer> send_buffer_;
93 bool transport_recv_busy_;
94 scoped_refptr<IOBuffer> recv_buffer_;
95
96 CompletionCallback* user_connect_callback_;
97 CompletionCallback* user_read_callback_;
98 CompletionCallback* user_write_callback_;
99
100 // Used by Read function.
101 scoped_refptr<IOBuffer> user_read_buf_;
102 int user_read_buf_len_;
103
104 // Used by Write function.
105 scoped_refptr<IOBuffer> user_write_buf_;
106 int user_write_buf_len_;
107
108 // Stores client authentication information between ClientAuthHandler and
109 // GetSSLCertRequestInfo calls.
110 std::vector<scoped_refptr<X509Certificate> > client_certs_;
111 bool client_auth_cert_needed_;
112
113 // OpenSSL stuff
114 static SSL_CTX* g_ctx;
115 SSL* ssl_;
116 BIO* transport_bio_;
117
118 scoped_ptr<ClientSocketHandle> transport_;
119 std::string hostname_;
120 SSLConfig ssl_config_;
121
122 bool completed_handshake_;
123
124 enum State {
125 STATE_NONE,
126 STATE_HANDSHAKE,
127 STATE_VERIFY_CERT,
128 STATE_VERIFY_CERT_COMPLETE,
129 };
130 State next_handshake_state_;
131 BoundNetLog net_log_;
132 };
133
134 } // namespace net
135
136 #endif // NET_SOCKET_SSL_CLIENT_SOCKET_OPENSSL_H_
137
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698