| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 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 | 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 SSLClientSocketNSS::DoVerifyCertComplete() derived | 5 // This file includes code SSLClientSocketNSS::DoVerifyCertComplete() derived |
| 6 // from AuthCertificateCallback() in | 6 // from AuthCertificateCallback() in |
| 7 // mozilla/security/manager/ssl/src/nsNSSCallbacks.cpp. | 7 // mozilla/security/manager/ssl/src/nsNSSCallbacks.cpp. |
| 8 | 8 |
| 9 /* ***** BEGIN LICENSE BLOCK ***** | 9 /* ***** BEGIN LICENSE BLOCK ***** |
| 10 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | 10 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 |
| (...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 393 | 393 |
| 394 } // namespace | 394 } // namespace |
| 395 | 395 |
| 396 #if defined(OS_WIN) | 396 #if defined(OS_WIN) |
| 397 // static | 397 // static |
| 398 HCERTSTORE SSLClientSocketNSS::cert_store_ = NULL; | 398 HCERTSTORE SSLClientSocketNSS::cert_store_ = NULL; |
| 399 #endif | 399 #endif |
| 400 | 400 |
| 401 SSLClientSocketNSS::SSLClientSocketNSS(ClientSocketHandle* transport_socket, | 401 SSLClientSocketNSS::SSLClientSocketNSS(ClientSocketHandle* transport_socket, |
| 402 const std::string& hostname, | 402 const std::string& hostname, |
| 403 const SSLConfig& ssl_config, | 403 const SSLConfig& ssl_config) |
| 404 SSLHostInfo* ssl_host_info) | |
| 405 : ALLOW_THIS_IN_INITIALIZER_LIST(buffer_send_callback_( | 404 : ALLOW_THIS_IN_INITIALIZER_LIST(buffer_send_callback_( |
| 406 this, &SSLClientSocketNSS::BufferSendComplete)), | 405 this, &SSLClientSocketNSS::BufferSendComplete)), |
| 407 ALLOW_THIS_IN_INITIALIZER_LIST(buffer_recv_callback_( | 406 ALLOW_THIS_IN_INITIALIZER_LIST(buffer_recv_callback_( |
| 408 this, &SSLClientSocketNSS::BufferRecvComplete)), | 407 this, &SSLClientSocketNSS::BufferRecvComplete)), |
| 409 transport_send_busy_(false), | 408 transport_send_busy_(false), |
| 410 transport_recv_busy_(false), | 409 transport_recv_busy_(false), |
| 411 corked_(false), | 410 corked_(false), |
| 412 ALLOW_THIS_IN_INITIALIZER_LIST(handshake_io_callback_( | 411 ALLOW_THIS_IN_INITIALIZER_LIST(handshake_io_callback_( |
| 413 this, &SSLClientSocketNSS::OnHandshakeIOComplete)), | 412 this, &SSLClientSocketNSS::OnHandshakeIOComplete)), |
| 414 transport_(transport_socket), | 413 transport_(transport_socket), |
| (...skipping 10 matching lines...) Expand all Loading... |
| 425 completed_handshake_(false), | 424 completed_handshake_(false), |
| 426 pseudo_connected_(false), | 425 pseudo_connected_(false), |
| 427 eset_mitm_detected_(false), | 426 eset_mitm_detected_(false), |
| 428 netnanny_mitm_detected_(false), | 427 netnanny_mitm_detected_(false), |
| 429 dnssec_provider_(NULL), | 428 dnssec_provider_(NULL), |
| 430 next_handshake_state_(STATE_NONE), | 429 next_handshake_state_(STATE_NONE), |
| 431 nss_fd_(NULL), | 430 nss_fd_(NULL), |
| 432 nss_bufs_(NULL), | 431 nss_bufs_(NULL), |
| 433 net_log_(transport_socket->socket()->NetLog()), | 432 net_log_(transport_socket->socket()->NetLog()), |
| 434 predicted_npn_status_(kNextProtoUnsupported), | 433 predicted_npn_status_(kNextProtoUnsupported), |
| 435 predicted_npn_proto_used_(false), | 434 predicted_npn_proto_used_(false) { |
| 436 ssl_host_info_(ssl_host_info) { | |
| 437 EnterFunction(""); | 435 EnterFunction(""); |
| 438 } | 436 } |
| 439 | 437 |
| 440 SSLClientSocketNSS::~SSLClientSocketNSS() { | 438 SSLClientSocketNSS::~SSLClientSocketNSS() { |
| 441 EnterFunction(""); | 439 EnterFunction(""); |
| 442 Disconnect(); | 440 Disconnect(); |
| 443 LeaveFunction(""); | 441 LeaveFunction(""); |
| 444 } | 442 } |
| 445 | 443 |
| 446 int SSLClientSocketNSS::Init() { | 444 int SSLClientSocketNSS::Init() { |
| (...skipping 15 matching lines...) Expand all Loading... |
| 462 } | 460 } |
| 463 | 461 |
| 464 // This is a version number of the Snap Start information saved by | 462 // This is a version number of the Snap Start information saved by |
| 465 // |SaveSnapStartInfo| and loaded by |LoadSnapStartInfo|. Since the information | 463 // |SaveSnapStartInfo| and loaded by |LoadSnapStartInfo|. Since the information |
| 466 // can be saved on disk we might have version skew in the future. Any data with | 464 // can be saved on disk we might have version skew in the future. Any data with |
| 467 // a different version is ignored by |LoadSnapStartInfo|. | 465 // a different version is ignored by |LoadSnapStartInfo|. |
| 468 static const uint8 kSnapStartInfoVersion = 0; | 466 static const uint8 kSnapStartInfoVersion = 0; |
| 469 | 467 |
| 470 // SaveSnapStartInfo serialises the information needed to perform a Snap Start | 468 // SaveSnapStartInfo serialises the information needed to perform a Snap Start |
| 471 // with this server in the future (if any) and tells | 469 // with this server in the future (if any) and tells |
| 472 // |ssl_host_info_| to preserve it. | 470 // |ssl_config_.ssl_host_info| to preserve it. |
| 473 void SSLClientSocketNSS::SaveSnapStartInfo() { | 471 void SSLClientSocketNSS::SaveSnapStartInfo() { |
| 474 if (!ssl_host_info_.get()) | 472 if (!ssl_config_.ssl_host_info.get()) |
| 475 return; | 473 return; |
| 476 | 474 |
| 477 SECStatus rv; | 475 SECStatus rv; |
| 478 SSLSnapStartResult snap_start_type; | 476 SSLSnapStartResult snap_start_type; |
| 479 rv = SSL_GetSnapStartResult(nss_fd_, &snap_start_type); | 477 rv = SSL_GetSnapStartResult(nss_fd_, &snap_start_type); |
| 480 if (rv != SECSuccess) { | 478 if (rv != SECSuccess) { |
| 481 NOTREACHED(); | 479 NOTREACHED(); |
| 482 return; | 480 return; |
| 483 } | 481 } |
| 484 LOG(ERROR) << "Snap Start: " << snap_start_type << " " << hostname_; | 482 LOG(ERROR) << "Snap Start: " << snap_start_type << " " << hostname_; |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 587 node = CERT_LIST_NEXT(node), i++) { | 585 node = CERT_LIST_NEXT(node), i++) { |
| 588 data[j++] = node->cert->derCert.len >> 8; | 586 data[j++] = node->cert->derCert.len >> 8; |
| 589 data[j++] = node->cert->derCert.len; | 587 data[j++] = node->cert->derCert.len; |
| 590 memcpy(&data[j], node->cert->derCert.data, node->cert->derCert.len); | 588 memcpy(&data[j], node->cert->derCert.data, node->cert->derCert.len); |
| 591 j += node->cert->derCert.len; | 589 j += node->cert->derCert.len; |
| 592 } | 590 } |
| 593 | 591 |
| 594 DCHECK_EQ(j, len); | 592 DCHECK_EQ(j, len); |
| 595 | 593 |
| 596 LOG(ERROR) << "Setting Snap Start info " << hostname_ << " " << len; | 594 LOG(ERROR) << "Setting Snap Start info " << hostname_ << " " << len; |
| 597 ssl_host_info_->Set(std::string( | 595 ssl_config_.ssl_host_info->Set(std::string( |
| 598 reinterpret_cast<const char *>(&data[0]), len)); | 596 reinterpret_cast<const char *>(&data[0]), len)); |
| 599 | 597 |
| 600 CERT_DestroyCertList(cert_list); | 598 CERT_DestroyCertList(cert_list); |
| 601 } | 599 } |
| 602 | 600 |
| 603 static void DestroyCertificates(CERTCertificate** certs, unsigned len) { | 601 static void DestroyCertificates(CERTCertificate** certs, unsigned len) { |
| 604 for (unsigned i = 0; i < len; i++) | 602 for (unsigned i = 0; i < len; i++) |
| 605 CERT_DestroyCertificate(certs[i]); | 603 CERT_DestroyCertificate(certs[i]); |
| 606 } | 604 } |
| 607 | 605 |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 731 net_log_.EndEvent(NetLog::TYPE_SSL_CONNECT, NULL); | 729 net_log_.EndEvent(NetLog::TYPE_SSL_CONNECT, NULL); |
| 732 return rv; | 730 return rv; |
| 733 } | 731 } |
| 734 | 732 |
| 735 rv = InitializeSSLOptions(); | 733 rv = InitializeSSLOptions(); |
| 736 if (rv != OK) { | 734 if (rv != OK) { |
| 737 net_log_.EndEvent(NetLog::TYPE_SSL_CONNECT, NULL); | 735 net_log_.EndEvent(NetLog::TYPE_SSL_CONNECT, NULL); |
| 738 return rv; | 736 return rv; |
| 739 } | 737 } |
| 740 | 738 |
| 741 if (ssl_config_.snap_start_enabled && ssl_host_info_.get()) { | 739 if (ssl_config_.snap_start_enabled && ssl_config_.ssl_host_info.get()) { |
| 742 GotoState(STATE_SNAP_START_LOAD_INFO); | 740 GotoState(STATE_SNAP_START_LOAD_INFO); |
| 743 } else { | 741 } else { |
| 744 GotoState(STATE_HANDSHAKE); | 742 GotoState(STATE_HANDSHAKE); |
| 745 } | 743 } |
| 746 | 744 |
| 747 rv = DoHandshakeLoop(OK); | 745 rv = DoHandshakeLoop(OK); |
| 748 if (rv == ERR_IO_PENDING) { | 746 if (rv == ERR_IO_PENDING) { |
| 749 if (pseudo_connected_) { | 747 if (pseudo_connected_) { |
| 750 net_log_.EndEvent(NetLog::TYPE_SSL_CONNECT, NULL); | 748 net_log_.EndEvent(NetLog::TYPE_SSL_CONNECT, NULL); |
| 751 rv = OK; | 749 rv = OK; |
| (...skipping 1212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1964 | 1962 |
| 1965 that->handshake_callback_called_ = true; | 1963 that->handshake_callback_called_ = true; |
| 1966 | 1964 |
| 1967 that->UpdateServerCert(); | 1965 that->UpdateServerCert(); |
| 1968 | 1966 |
| 1969 that->CheckSecureRenegotiation(); | 1967 that->CheckSecureRenegotiation(); |
| 1970 } | 1968 } |
| 1971 | 1969 |
| 1972 int SSLClientSocketNSS::DoSnapStartLoadInfo() { | 1970 int SSLClientSocketNSS::DoSnapStartLoadInfo() { |
| 1973 EnterFunction(""); | 1971 EnterFunction(""); |
| 1974 int rv = ssl_host_info_->WaitForDataReady(&handshake_io_callback_); | 1972 int rv = ssl_config_.ssl_host_info->WaitForDataReady(&handshake_io_callback_); |
| 1975 | 1973 |
| 1976 if (rv == OK) { | 1974 if (rv == OK) { |
| 1977 LOG(ERROR) << "SSL host info size " << hostname_ << " " | 1975 LOG(ERROR) << "SSL host info size " << hostname_ << " " |
| 1978 << ssl_host_info_->data().size(); | 1976 << ssl_config_.ssl_host_info->data().size(); |
| 1979 if (LoadSnapStartInfo(ssl_host_info_->data())) { | 1977 if (LoadSnapStartInfo(ssl_config_.ssl_host_info->data())) { |
| 1980 pseudo_connected_ = true; | 1978 pseudo_connected_ = true; |
| 1981 GotoState(STATE_SNAP_START_WAIT_FOR_WRITE); | 1979 GotoState(STATE_SNAP_START_WAIT_FOR_WRITE); |
| 1982 if (user_connect_callback_) | 1980 if (user_connect_callback_) |
| 1983 DoConnectCallback(OK); | 1981 DoConnectCallback(OK); |
| 1984 } else { | 1982 } else { |
| 1985 GotoState(STATE_HANDSHAKE); | 1983 GotoState(STATE_HANDSHAKE); |
| 1986 } | 1984 } |
| 1987 } else { | 1985 } else { |
| 1988 DCHECK_EQ(ERR_IO_PENDING, rv); | 1986 DCHECK_EQ(ERR_IO_PENDING, rv); |
| 1989 GotoState(STATE_SNAP_START_LOAD_INFO); | 1987 GotoState(STATE_SNAP_START_LOAD_INFO); |
| (...skipping 459 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2449 return ERR_IO_PENDING; | 2447 return ERR_IO_PENDING; |
| 2450 } | 2448 } |
| 2451 LeaveFunction(""); | 2449 LeaveFunction(""); |
| 2452 rv = MapNSPRError(prerr); | 2450 rv = MapNSPRError(prerr); |
| 2453 net_log_.AddEvent(NetLog::TYPE_SSL_WRITE_ERROR, | 2451 net_log_.AddEvent(NetLog::TYPE_SSL_WRITE_ERROR, |
| 2454 new SSLErrorParams(rv, prerr)); | 2452 new SSLErrorParams(rv, prerr)); |
| 2455 return rv; | 2453 return rv; |
| 2456 } | 2454 } |
| 2457 | 2455 |
| 2458 } // namespace net | 2456 } // namespace net |
| OLD | NEW |