1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef NET_SOCKET_SSL_CLIENT_SOCKET_WIN_H_
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define NET_SOCKET_SSL_CLIENT_SOCKET_WIN_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define SECURITY_WIN32  // Needs to be defined before including security.h
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <windows.h>
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <wincrypt.h>
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <security.h>
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <string>
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/base/cert_verify_result.h"
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/base/completion_callback.h"
204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "net/base/host_port_pair.h"
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/net_log.h"
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/base/ssl_config_service.h"
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/socket/ssl_client_socket.h"
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace net {
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass BoundNetLog;
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass CertVerifier;
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ClientSocketHandle;
304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass HostPortPair;
3121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenclass SingleRequestCertVerifier;
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// An SSL client socket implemented with the Windows Schannel.
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass SSLClientSocketWin : public SSLClientSocket {
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public:
363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Takes ownership of the |transport_socket|, which must already be connected.
374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // The hostname specified in |host_and_port| will be compared with the name(s)
384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // in the server's certificate during the SSL handshake.  If SSL client
394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // authentication is requested, the host_and_port field of SSLCertRequestInfo
404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // will be populated with |host_and_port|.  |ssl_config| specifies
414a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // the SSL settings.
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SSLClientSocketWin(ClientSocketHandle* transport_socket,
434a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                     const HostPortPair& host_and_port,
4421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                     const SSLConfig& ssl_config,
4521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                     CertVerifier* cert_verifier);
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ~SSLClientSocketWin();
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // SSLClientSocket methods:
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual void GetSSLInfo(SSLInfo* ssl_info);
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual void GetSSLCertRequestInfo(SSLCertRequestInfo* cert_request_info);
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual NextProtoStatus GetNextProto(std::string* proto);
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // ClientSocket methods:
547b9ca917061470268bf3395c8925d4b9cc52d8e1Kristian Monsen  virtual int Connect(CompletionCallback* callback
557b9ca917061470268bf3395c8925d4b9cc52d8e1Kristian Monsen#ifdef ANDROID
567b9ca917061470268bf3395c8925d4b9cc52d8e1Kristian Monsen                      , bool wait_for_connect
577b9ca917061470268bf3395c8925d4b9cc52d8e1Kristian Monsen#endif
587b9ca917061470268bf3395c8925d4b9cc52d8e1Kristian Monsen                     );
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual void Disconnect();
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual bool IsConnected() const;
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual bool IsConnectedAndIdle() const;
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual int GetPeerAddress(AddressList* address) const;
63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual int GetLocalAddress(IPEndPoint* address) const;
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual const BoundNetLog& NetLog() const { return net_log_; }
653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void SetSubresourceSpeculation();
663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void SetOmniboxSpeculation();
673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool WasEverUsed() const;
68513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  virtual bool UsingTCPFastOpen() const;
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Socket methods:
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual int Read(IOBuffer* buf, int buf_len, CompletionCallback* callback);
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual int Write(IOBuffer* buf, int buf_len, CompletionCallback* callback);
73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual bool SetReceiveBufferSize(int32 size);
75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual bool SetSendBufferSize(int32 size);
76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private:
78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool completed_handshake() const {
79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return next_state_ == STATE_COMPLETED_HANDSHAKE;
80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Initializes the SSL options and security context. Returns a net error code.
83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int InitializeSSLContext();
84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void OnHandshakeIOComplete(int result);
86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void OnReadComplete(int result);
87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void OnWriteComplete(int result);
88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int DoLoop(int last_io_result);
90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int DoHandshakeRead();
91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int DoHandshakeReadComplete(int result);
92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int DoHandshakeWrite();
93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int DoHandshakeWriteComplete(int result);
94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int DoVerifyCert();
95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int DoVerifyCertComplete(int result);
96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int DoPayloadRead();
98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int DoPayloadReadComplete(int result);
99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int DoPayloadDecrypt();
100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int DoPayloadEncrypt();
101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int DoPayloadWrite();
102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int DoPayloadWriteComplete(int result);
103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int DoCompletedRenegotiation(int result);
104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int DidCallInitializeSecurityContext();
106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int DidCompleteHandshake();
107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void DidCompleteRenegotiation();
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void LogConnectionTypeMetrics() const;
109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void FreeSendBuffer();
110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Internal callbacks as async operations complete.
112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CompletionCallbackImpl<SSLClientSocketWin> handshake_io_callback_;
113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CompletionCallbackImpl<SSLClientSocketWin> read_callback_;
114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CompletionCallbackImpl<SSLClientSocketWin> write_callback_;
115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<ClientSocketHandle> transport_;
1174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  HostPortPair host_and_port_;
118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SSLConfig ssl_config_;
119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // User function to callback when the Connect() completes.
121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CompletionCallback* user_connect_callback_;
122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // User function to callback when a Read() completes.
124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CompletionCallback* user_read_callback_;
125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  scoped_refptr<IOBuffer> user_read_buf_;
126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int user_read_buf_len_;
127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // User function to callback when a Write() completes.
129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CompletionCallback* user_write_callback_;
130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  scoped_refptr<IOBuffer> user_write_buf_;
131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int user_write_buf_len_;
132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Used to Read and Write using transport_.
134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  scoped_refptr<IOBuffer> transport_read_buf_;
135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  scoped_refptr<IOBuffer> transport_write_buf_;
136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  enum State {
138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    STATE_NONE,
139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    STATE_HANDSHAKE_READ,
140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    STATE_HANDSHAKE_READ_COMPLETE,
141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    STATE_HANDSHAKE_WRITE,
142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    STATE_HANDSHAKE_WRITE_COMPLETE,
143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    STATE_VERIFY_CERT,
144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    STATE_VERIFY_CERT_COMPLETE,
145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    STATE_COMPLETED_RENEGOTIATION,
146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    STATE_COMPLETED_HANDSHAKE
147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // After the handshake, the socket remains
148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // in the STATE_COMPLETED_HANDSHAKE state,
149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // unless a renegotiate handshake occurs.
150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  };
151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  State next_state_;
152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SecPkgContext_StreamSizes stream_sizes_;
154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  scoped_refptr<X509Certificate> server_cert_;
15521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  CertVerifier* const cert_verifier_;
15621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  scoped_ptr<SingleRequestCertVerifier> verifier_;
157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CertVerifyResult server_cert_verify_result_;
158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CredHandle* creds_;
160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CtxtHandle ctxt_;
161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SecBuffer in_buffers_[2];  // Input buffers for InitializeSecurityContext.
162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SecBuffer send_buffer_;  // Output buffer for InitializeSecurityContext.
163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SECURITY_STATUS isc_status_;  // Return value of InitializeSecurityContext.
164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  scoped_array<char> payload_send_buffer_;
165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int payload_send_buffer_len_;
166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int bytes_sent_;
167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // recv_buffer_ holds the received ciphertext.  Since Schannel decrypts
169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // data in place, sometimes recv_buffer_ may contain decrypted plaintext and
170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // any undecrypted ciphertext.  (Ciphertext is decrypted one full SSL record
171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // at a time.)
172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //
173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // If bytes_decrypted_ is 0, the received ciphertext is at the beginning of
174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // recv_buffer_, ready to be passed to DecryptMessage.
175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  scoped_array<char> recv_buffer_;
176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  char* decrypted_ptr_;  // Points to the decrypted plaintext in recv_buffer_
177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int bytes_decrypted_;  // The number of bytes of decrypted plaintext.
178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  char* received_ptr_;  // Points to the received ciphertext in recv_buffer_
179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int bytes_received_;  // The number of bytes of received ciphertext.
180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // True if we're writing the first token (handshake message) to the server,
182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // false if we're writing a subsequent token.  After we have written a token
183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // successfully, DoHandshakeWriteComplete checks this member to set the next
184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // state.
185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool writing_first_token_;
186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Only used in the STATE_HANDSHAKE_READ_COMPLETE and
188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // STATE_PAYLOAD_READ_COMPLETE states.  True if a 'result' argument of OK
189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // should be ignored, to prevent it from being interpreted as EOF.
190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //
191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // The reason we need this flag is that OK means not only "0 bytes of data
192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // were read" but also EOF.  We set ignore_ok_result_ to true when we need
193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // to continue processing previously read data without reading more data.
194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // We have to pass a 'result' of OK to the DoLoop method, and don't want it
195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // to be interpreted as EOF.
196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool ignore_ok_result_;
197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Renegotiation is in progress.
199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool renegotiating_;
200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // True when the decrypter needs more data in order to decrypt.
202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool need_more_data_;
203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BoundNetLog net_log_;
205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace net
208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif  // NET_SOCKET_SSL_CLIENT_SOCKET_WIN_H_
210