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