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

Side by Side Diff: net/socket_stream/socket_stream.cc

Issue 8276031: SSL client authentication support for secure proxy in WebSocket (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 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 | Annotate | Revision Log
« no previous file with comments | « net/socket_stream/socket_stream.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 // TODO(ukai): code is similar with http_network_transaction.cc. We should 5 // TODO(ukai): code is similar with http_network_transaction.cc. We should
6 // think about ways to share code, if possible. 6 // think about ways to share code, if possible.
7 7
8 #include "net/socket_stream/socket_stream.h" 8 #include "net/socket_stream/socket_stream.h"
9 9
10 #include <set> 10 #include <set>
11 #include <string> 11 #include <string>
12 12
13 #include "base/compiler_specific.h" 13 #include "base/compiler_specific.h"
14 #include "base/logging.h" 14 #include "base/logging.h"
15 #include "base/message_loop.h" 15 #include "base/message_loop.h"
16 #include "base/string_util.h" 16 #include "base/string_util.h"
17 #include "base/stringprintf.h" 17 #include "base/stringprintf.h"
18 #include "base/utf_string_conversions.h" 18 #include "base/utf_string_conversions.h"
19 #include "net/base/auth.h" 19 #include "net/base/auth.h"
20 #include "net/base/host_resolver.h" 20 #include "net/base/host_resolver.h"
21 #include "net/base/io_buffer.h" 21 #include "net/base/io_buffer.h"
22 #include "net/base/net_errors.h" 22 #include "net/base/net_errors.h"
23 #include "net/base/net_util.h" 23 #include "net/base/net_util.h"
24 #include "net/base/ssl_cert_request_info.h"
24 #include "net/http/http_auth_handler_factory.h" 25 #include "net/http/http_auth_handler_factory.h"
26 #include "net/http/http_network_session.h"
25 #include "net/http/http_request_info.h" 27 #include "net/http/http_request_info.h"
26 #include "net/http/http_response_headers.h" 28 #include "net/http/http_response_headers.h"
29 #include "net/http/http_transaction_factory.h"
27 #include "net/http/http_util.h" 30 #include "net/http/http_util.h"
28 #include "net/socket/client_socket_factory.h" 31 #include "net/socket/client_socket_factory.h"
29 #include "net/socket/socks5_client_socket.h" 32 #include "net/socket/socks5_client_socket.h"
30 #include "net/socket/socks_client_socket.h" 33 #include "net/socket/socks_client_socket.h"
31 #include "net/socket/ssl_client_socket.h" 34 #include "net/socket/ssl_client_socket.h"
32 #include "net/socket/tcp_client_socket.h" 35 #include "net/socket/tcp_client_socket.h"
33 #include "net/socket_stream/socket_stream_metrics.h" 36 #include "net/socket_stream/socket_stream_metrics.h"
34 #include "net/url_request/url_request.h" 37 #include "net/url_request/url_request.h"
35 38
36 static const int kMaxPendingSendAllowed = 32768; // 32 kilobytes. 39 static const int kMaxPendingSendAllowed = 32768; // 32 kilobytes.
(...skipping 879 matching lines...) Expand 10 before | Expand all | Expand 10 after
916 next_state_ = STATE_SECURE_PROXY_CONNECT_COMPLETE; 919 next_state_ = STATE_SECURE_PROXY_CONNECT_COMPLETE;
917 metrics_->OnCountConnectionType(SocketStreamMetrics::SECURE_PROXY_CONNECTION); 920 metrics_->OnCountConnectionType(SocketStreamMetrics::SECURE_PROXY_CONNECTION);
918 return socket_->Connect(&io_callback_); 921 return socket_->Connect(&io_callback_);
919 } 922 }
920 923
921 int SocketStream::DoSecureProxyConnectComplete(int result) { 924 int SocketStream::DoSecureProxyConnectComplete(int result) {
922 DCHECK_EQ(STATE_NONE, next_state_); 925 DCHECK_EQ(STATE_NONE, next_state_);
923 result = DidEstablishSSL(result); 926 result = DidEstablishSSL(result);
924 if (next_state_ != STATE_NONE) 927 if (next_state_ != STATE_NONE)
925 return result; 928 return result;
929 if (result == ERR_SSL_CLIENT_AUTH_CERT_NEEDED)
930 return HandleCertificateRequest(result);
926 if (result == OK) 931 if (result == OK)
927 next_state_ = STATE_WRITE_TUNNEL_HEADERS; 932 next_state_ = STATE_WRITE_TUNNEL_HEADERS;
928 else 933 else
929 next_state_ = STATE_CLOSE; 934 next_state_ = STATE_CLOSE;
930 return result; 935 return result;
931 } 936 }
932 937
933 int SocketStream::DoSSLConnect() { 938 int SocketStream::DoSSLConnect() {
934 DCHECK(factory_); 939 DCHECK(factory_);
935 SSLClientSocketContext ssl_context; 940 SSLClientSocketContext ssl_context;
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
1081 auth_identity_.password = entry->password(); 1086 auth_identity_.password = entry->password();
1082 // Restart with auth info. 1087 // Restart with auth info.
1083 } 1088 }
1084 return ERR_PROXY_AUTH_UNSUPPORTED; 1089 return ERR_PROXY_AUTH_UNSUPPORTED;
1085 } else { 1090 } else {
1086 auth_identity_.invalid = false; 1091 auth_identity_.invalid = false;
1087 } 1092 }
1088 return ERR_TUNNEL_CONNECTION_FAILED; 1093 return ERR_TUNNEL_CONNECTION_FAILED;
1089 } 1094 }
1090 1095
1096 int SocketStream::HandleCertificateRequest(int result) {
1097 // TODO(toyoshim): We must support SSL client authentication for not only
1098 // secure proxy but also secure server.
1099
1100 if (ssl_config_.send_client_cert)
ukai 2011/10/17 01:48:56 we might need to have 2 SSLConfig? server_ssl_con
Takashi Toyoshima 2011/10/17 02:50:05 When we support client authentication for secure s
ukai 2011/10/17 04:18:08 even without client authentication, can we use the
Takashi Toyoshima 2011/10/17 04:42:30 Oops! Sorry, now I see what was wrong I fix it.
1101 // We already have performed SSL client authentication once and failed.
1102 return result;
1103
1104 DCHECK(socket_.get());
1105 scoped_refptr<SSLCertRequestInfo> cert_request_info = new SSLCertRequestInfo;
1106 SSLClientSocket* ssl_socket =
1107 reinterpret_cast<SSLClientSocket*>(socket_.get());
ukai 2011/10/17 01:48:56 static_cast ?
Takashi Toyoshima 2011/10/17 02:50:05 Right. I fixed it and a same wrong cast in DidEsta
1108 ssl_socket->GetSSLCertRequestInfo(cert_request_info);
1109
1110 HttpTransactionFactory* factory = context_->http_transaction_factory();
1111 if (!factory)
1112 return result;
1113 scoped_refptr<HttpNetworkSession> session = factory->GetSession();
1114 if (!session.get())
1115 return result;
1116
1117 scoped_refptr<X509Certificate> client_cert;
1118 bool found_cached_cert = session->ssl_client_auth_cache()->Lookup(
1119 cert_request_info->host_and_port, &client_cert);
1120 if (!found_cached_cert)
1121 return result;
1122 if (!client_cert)
1123 return result;
1124
1125 const std::vector<scoped_refptr<X509Certificate> >& client_certs =
1126 cert_request_info->client_certs;
1127 bool cert_still_valid = false;
1128 for (size_t i = 0; i < client_certs.size(); ++i) {
1129 if (client_cert->Equals(client_certs[i])) {
1130 cert_still_valid = true;
1131 break;
1132 }
1133 }
1134 if (!cert_still_valid)
1135 return result;
1136
1137 ssl_config_.send_client_cert = true;
1138 ssl_config_.client_cert = client_cert;
1139 next_state_ = STATE_TCP_CONNECT;
1140 return OK;
1141 }
1142
1091 void SocketStream::DoAuthRequired() { 1143 void SocketStream::DoAuthRequired() {
1092 if (delegate_ && auth_info_.get()) 1144 if (delegate_ && auth_info_.get())
1093 delegate_->OnAuthRequired(this, auth_info_.get()); 1145 delegate_->OnAuthRequired(this, auth_info_.get());
1094 else 1146 else
1095 DoLoop(ERR_UNEXPECTED); 1147 DoLoop(ERR_UNEXPECTED);
1096 } 1148 }
1097 1149
1098 void SocketStream::DoRestartWithAuth() { 1150 void SocketStream::DoRestartWithAuth() {
1099 DCHECK_EQ(next_state_, STATE_AUTH_REQUIRED); 1151 DCHECK_EQ(next_state_, STATE_AUTH_REQUIRED);
1100 auth_cache_.Add(ProxyAuthOrigin(), 1152 auth_cache_.Add(ProxyAuthOrigin(),
(...skipping 30 matching lines...) Expand all
1131 1183
1132 SSLConfigService* SocketStream::ssl_config_service() const { 1184 SSLConfigService* SocketStream::ssl_config_service() const {
1133 return context_->ssl_config_service(); 1185 return context_->ssl_config_service();
1134 } 1186 }
1135 1187
1136 ProxyService* SocketStream::proxy_service() const { 1188 ProxyService* SocketStream::proxy_service() const {
1137 return context_->proxy_service(); 1189 return context_->proxy_service();
1138 } 1190 }
1139 1191
1140 } // namespace net 1192 } // namespace net
OLDNEW
« no previous file with comments | « net/socket_stream/socket_stream.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698