| OLD | NEW |
| 1 // Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2009 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 // This file includes code GetDefaultCertNickname(), derived from | 5 // This file includes code GetDefaultCertNickname(), derived from |
| 6 // nsNSSCertificate::defaultServerNickName() | 6 // nsNSSCertificate::defaultServerNickName() |
| 7 // in mozilla/security/manager/ssl/src/nsNSSCertificate.cpp | 7 // in mozilla/security/manager/ssl/src/nsNSSCertificate.cpp |
| 8 // and SSLClientSocketNSS::DoVerifyCertComplete() derived from | 8 // and SSLClientSocketNSS::DoVerifyCertComplete() derived from |
| 9 // AuthCertificateCallback() in | 9 // AuthCertificateCallback() in |
| 10 // mozilla/security/manager/ssl/src/nsNSSCallbacks.cpp. | 10 // mozilla/security/manager/ssl/src/nsNSSCallbacks.cpp. |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 62 #include <sslerr.h> | 62 #include <sslerr.h> |
| 63 #include <pk11pub.h> | 63 #include <pk11pub.h> |
| 64 #undef Lock | 64 #undef Lock |
| 65 | 65 |
| 66 #include "base/compiler_specific.h" | 66 #include "base/compiler_specific.h" |
| 67 #include "base/logging.h" | 67 #include "base/logging.h" |
| 68 #include "base/nss_init.h" | 68 #include "base/nss_init.h" |
| 69 #include "base/string_util.h" | 69 #include "base/string_util.h" |
| 70 #include "net/base/cert_verifier.h" | 70 #include "net/base/cert_verifier.h" |
| 71 #include "net/base/io_buffer.h" | 71 #include "net/base/io_buffer.h" |
| 72 #include "net/base/load_log.h" |
| 72 #include "net/base/net_errors.h" | 73 #include "net/base/net_errors.h" |
| 73 #include "net/base/ssl_cert_request_info.h" | 74 #include "net/base/ssl_cert_request_info.h" |
| 74 #include "net/base/ssl_info.h" | 75 #include "net/base/ssl_info.h" |
| 75 #include "net/ocsp/nss_ocsp.h" | 76 #include "net/ocsp/nss_ocsp.h" |
| 76 | 77 |
| 77 static const int kRecvBufferSize = 4096; | 78 static const int kRecvBufferSize = 4096; |
| 78 | 79 |
| 79 namespace net { | 80 namespace net { |
| 80 | 81 |
| 81 // State machines are easier to debug if you log state transitions. | 82 // State machines are easier to debug if you log state transitions. |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 229 base::EnsureNSSInit(); | 230 base::EnsureNSSInit(); |
| 230 // We must call EnsureOCSPInit() here, on the IO thread, to get the IO loop | 231 // We must call EnsureOCSPInit() here, on the IO thread, to get the IO loop |
| 231 // by MessageLoopForIO::current(). | 232 // by MessageLoopForIO::current(). |
| 232 // X509Certificate::Verify() runs on a worker thread of CertVerifier. | 233 // X509Certificate::Verify() runs on a worker thread of CertVerifier. |
| 233 EnsureOCSPInit(); | 234 EnsureOCSPInit(); |
| 234 | 235 |
| 235 LeaveFunction(""); | 236 LeaveFunction(""); |
| 236 return OK; | 237 return OK; |
| 237 } | 238 } |
| 238 | 239 |
| 239 int SSLClientSocketNSS::Connect(CompletionCallback* callback) { | 240 int SSLClientSocketNSS::Connect(CompletionCallback* callback, |
| 241 LoadLog* load_log) { |
| 240 EnterFunction(""); | 242 EnterFunction(""); |
| 241 DCHECK(transport_.get()); | 243 DCHECK(transport_.get()); |
| 242 DCHECK(next_handshake_state_ == STATE_NONE); | 244 DCHECK(next_handshake_state_ == STATE_NONE); |
| 243 DCHECK(!user_read_callback_); | 245 DCHECK(!user_read_callback_); |
| 244 DCHECK(!user_write_callback_); | 246 DCHECK(!user_write_callback_); |
| 245 DCHECK(!user_connect_callback_); | 247 DCHECK(!user_connect_callback_); |
| 246 DCHECK(!user_read_buf_); | 248 DCHECK(!user_read_buf_); |
| 247 DCHECK(!user_write_buf_); | 249 DCHECK(!user_write_buf_); |
| 248 | 250 |
| 251 LoadLog::BeginEvent(load_log, LoadLog::TYPE_SSL_CONNECT); |
| 252 |
| 249 if (Init() != OK) { | 253 if (Init() != OK) { |
| 250 NOTREACHED() << "Couldn't initialize nss"; | 254 NOTREACHED() << "Couldn't initialize nss"; |
| 251 } | 255 } |
| 252 | 256 |
| 257 int rv = InitializeSSLOptions(); |
| 258 if (rv != OK) { |
| 259 LoadLog::EndEvent(load_log, LoadLog::TYPE_SSL_CONNECT); |
| 260 return rv; |
| 261 } |
| 262 |
| 263 GotoState(STATE_HANDSHAKE); |
| 264 rv = DoHandshakeLoop(OK); |
| 265 if (rv == ERR_IO_PENDING) { |
| 266 user_connect_callback_ = callback; |
| 267 load_log_ = load_log; |
| 268 } else { |
| 269 LoadLog::EndEvent(load_log, LoadLog::TYPE_SSL_CONNECT); |
| 270 } |
| 271 |
| 272 LeaveFunction(""); |
| 273 return rv > OK ? OK : rv; |
| 274 } |
| 275 |
| 276 int SSLClientSocketNSS::InitializeSSLOptions() { |
| 253 // Transport connected, now hook it up to nss | 277 // Transport connected, now hook it up to nss |
| 254 // TODO(port): specify rx and tx buffer sizes separately | 278 // TODO(port): specify rx and tx buffer sizes separately |
| 255 nss_fd_ = memio_CreateIOLayer(kRecvBufferSize); | 279 nss_fd_ = memio_CreateIOLayer(kRecvBufferSize); |
| 256 if (nss_fd_ == NULL) { | 280 if (nss_fd_ == NULL) { |
| 257 return 9999; // TODO(port): real error | 281 return 9999; // TODO(port): real error |
| 258 } | 282 } |
| 259 | 283 |
| 260 // Tell NSS who we're connected to | 284 // Tell NSS who we're connected to |
| 261 PRNetAddr peername; | 285 PRNetAddr peername; |
| 262 socklen_t len = sizeof(PRNetAddr); | 286 socklen_t len = sizeof(PRNetAddr); |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 330 rv = SSL_HandshakeCallback(nss_fd_, HandshakeCallback, this); | 354 rv = SSL_HandshakeCallback(nss_fd_, HandshakeCallback, this); |
| 331 if (rv != SECSuccess) | 355 if (rv != SECSuccess) |
| 332 return ERR_UNEXPECTED; | 356 return ERR_UNEXPECTED; |
| 333 | 357 |
| 334 // Tell SSL the hostname we're trying to connect to. | 358 // Tell SSL the hostname we're trying to connect to. |
| 335 SSL_SetURL(nss_fd_, hostname_.c_str()); | 359 SSL_SetURL(nss_fd_, hostname_.c_str()); |
| 336 | 360 |
| 337 // Tell SSL we're a client; needed if not letting NSPR do socket I/O | 361 // Tell SSL we're a client; needed if not letting NSPR do socket I/O |
| 338 SSL_ResetHandshake(nss_fd_, 0); | 362 SSL_ResetHandshake(nss_fd_, 0); |
| 339 | 363 |
| 340 GotoState(STATE_HANDSHAKE); | 364 return OK; |
| 341 rv = DoHandshakeLoop(OK); | |
| 342 if (rv == ERR_IO_PENDING) | |
| 343 user_connect_callback_ = callback; | |
| 344 | |
| 345 LeaveFunction(""); | |
| 346 return rv > OK ? OK : rv; | |
| 347 } | 365 } |
| 348 | 366 |
| 349 void SSLClientSocketNSS::InvalidateSessionIfBadCertificate() { | 367 void SSLClientSocketNSS::InvalidateSessionIfBadCertificate() { |
| 350 if (UpdateServerCert() != NULL && | 368 if (UpdateServerCert() != NULL && |
| 351 ssl_config_.IsAllowedBadCert(server_cert_)) { | 369 ssl_config_.IsAllowedBadCert(server_cert_)) { |
| 352 SSL_InvalidateSession(nss_fd_); | 370 SSL_InvalidateSession(nss_fd_); |
| 353 } | 371 } |
| 354 } | 372 } |
| 355 | 373 |
| 356 void SSLClientSocketNSS::Disconnect() { | 374 void SSLClientSocketNSS::Disconnect() { |
| (...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 569 | 587 |
| 570 CompletionCallback* c = user_connect_callback_; | 588 CompletionCallback* c = user_connect_callback_; |
| 571 user_connect_callback_ = NULL; | 589 user_connect_callback_ = NULL; |
| 572 c->Run(rv > OK ? OK : rv); | 590 c->Run(rv > OK ? OK : rv); |
| 573 LeaveFunction(""); | 591 LeaveFunction(""); |
| 574 } | 592 } |
| 575 | 593 |
| 576 void SSLClientSocketNSS::OnHandshakeIOComplete(int result) { | 594 void SSLClientSocketNSS::OnHandshakeIOComplete(int result) { |
| 577 EnterFunction(result); | 595 EnterFunction(result); |
| 578 int rv = DoHandshakeLoop(result); | 596 int rv = DoHandshakeLoop(result); |
| 579 if (rv != ERR_IO_PENDING) | 597 if (rv != ERR_IO_PENDING) { |
| 598 LoadLog::EndEvent(load_log_, net::LoadLog::TYPE_SSL_CONNECT); |
| 599 load_log_ = NULL; |
| 580 DoConnectCallback(rv); | 600 DoConnectCallback(rv); |
| 601 } |
| 581 LeaveFunction(""); | 602 LeaveFunction(""); |
| 582 } | 603 } |
| 583 | 604 |
| 584 void SSLClientSocketNSS::OnSendComplete(int result) { | 605 void SSLClientSocketNSS::OnSendComplete(int result) { |
| 585 EnterFunction(result); | 606 EnterFunction(result); |
| 586 if (next_handshake_state_ != STATE_NONE) { | 607 if (next_handshake_state_ != STATE_NONE) { |
| 587 // In handshake phase. | 608 // In handshake phase. |
| 588 OnHandshakeIOComplete(result); | 609 OnHandshakeIOComplete(result); |
| 589 LeaveFunction(""); | 610 LeaveFunction(""); |
| 590 return; | 611 return; |
| (...skipping 477 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1068 } | 1089 } |
| 1069 PRErrorCode prerr = PR_GetError(); | 1090 PRErrorCode prerr = PR_GetError(); |
| 1070 if (prerr == PR_WOULD_BLOCK_ERROR) { | 1091 if (prerr == PR_WOULD_BLOCK_ERROR) { |
| 1071 return ERR_IO_PENDING; | 1092 return ERR_IO_PENDING; |
| 1072 } | 1093 } |
| 1073 LeaveFunction(""); | 1094 LeaveFunction(""); |
| 1074 return NetErrorFromNSPRError(prerr); | 1095 return NetErrorFromNSPRError(prerr); |
| 1075 } | 1096 } |
| 1076 | 1097 |
| 1077 } // namespace net | 1098 } // namespace net |
| OLD | NEW |