Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 101 #include "net/base/ssl_info.h" | 101 #include "net/base/ssl_info.h" |
| 102 #include "net/base/x509_certificate_net_log_param.h" | 102 #include "net/base/x509_certificate_net_log_param.h" |
| 103 #include "net/ocsp/nss_ocsp.h" | 103 #include "net/ocsp/nss_ocsp.h" |
| 104 #include "net/socket/client_socket_handle.h" | 104 #include "net/socket/client_socket_handle.h" |
| 105 #include "net/socket/nss_ssl_util.h" | 105 #include "net/socket/nss_ssl_util.h" |
| 106 #include "net/socket/ssl_error_params.h" | 106 #include "net/socket/ssl_error_params.h" |
| 107 | 107 |
| 108 #if defined(OS_WIN) | 108 #if defined(OS_WIN) |
| 109 #include <windows.h> | 109 #include <windows.h> |
| 110 #include <wincrypt.h> | 110 #include <wincrypt.h> |
| 111 #include "base/win/windows_version.h" | |
| 111 #elif defined(OS_MACOSX) | 112 #elif defined(OS_MACOSX) |
| 112 #include <Security/SecBase.h> | 113 #include <Security/SecBase.h> |
| 113 #include <Security/SecCertificate.h> | 114 #include <Security/SecCertificate.h> |
| 114 #include <Security/SecIdentity.h> | 115 #include <Security/SecIdentity.h> |
| 115 #include "base/mac/mac_logging.h" | 116 #include "base/mac/mac_logging.h" |
| 117 #include "base/mac/mac_util.h" | |
| 116 #elif defined(USE_NSS) | 118 #elif defined(USE_NSS) |
| 117 #include <dlfcn.h> | 119 #include <dlfcn.h> |
| 118 #endif | 120 #endif |
| 119 | 121 |
| 120 static const int kRecvBufferSize = 4096; | 122 static const int kRecvBufferSize = 4096; |
| 121 | 123 |
| 122 #if defined(OS_WIN) | 124 #if defined(OS_WIN) |
| 123 // CERT_OCSP_RESPONSE_PROP_ID is only implemented on Vista+, but it can be | 125 // CERT_OCSP_RESPONSE_PROP_ID is only implemented on Vista+, but it can be |
| 124 // set on Windows XP without error. There is some overhead from the server | 126 // set on Windows XP without error. There is some overhead from the server |
| 125 // sending the OCSP response if it supports the extension, for the subset of | 127 // sending the OCSP response if it supports the extension, for the subset of |
| (...skipping 2981 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3107 } | 3109 } |
| 3108 | 3110 |
| 3109 for (std::vector<uint16>::const_iterator it = | 3111 for (std::vector<uint16>::const_iterator it = |
| 3110 ssl_config_.disabled_cipher_suites.begin(); | 3112 ssl_config_.disabled_cipher_suites.begin(); |
| 3111 it != ssl_config_.disabled_cipher_suites.end(); ++it) { | 3113 it != ssl_config_.disabled_cipher_suites.end(); ++it) { |
| 3112 // This will fail if the specified cipher is not implemented by NSS, but | 3114 // This will fail if the specified cipher is not implemented by NSS, but |
| 3113 // the failure is harmless. | 3115 // the failure is harmless. |
| 3114 SSL_CipherPrefSet(nss_fd_, *it, PR_FALSE); | 3116 SSL_CipherPrefSet(nss_fd_, *it, PR_FALSE); |
| 3115 } | 3117 } |
| 3116 | 3118 |
| 3119 // On some platforms we cannot verify ECDSA certificates. | |
| 3120 #if defined(OS_WIN) | |
| 3121 if (base::win::GetVersion() < base::win::VISTA) { | |
| 3122 DisableECDSA(); | |
| 3123 } | |
| 3124 #elif defined(OS_MACOSX) | |
| 3125 if (!base::mac::IsOSSnowLeopardOrLater()) { | |
| 3126 DisableECDSA(); | |
| 3127 } | |
| 3128 #endif | |
|
Ryan Sleevi
2012/08/15 00:40:27
Seems like you can move this into NSSSSLInitSingle
agl
2012/08/15 01:06:20
Good point, there's a SetDefault function too. Don
| |
| 3129 | |
| 3117 #ifdef SSL_ENABLE_SESSION_TICKETS | 3130 #ifdef SSL_ENABLE_SESSION_TICKETS |
| 3118 // Support RFC 5077 | 3131 // Support RFC 5077 |
| 3119 rv = SSL_OptionSet(nss_fd_, SSL_ENABLE_SESSION_TICKETS, PR_TRUE); | 3132 rv = SSL_OptionSet(nss_fd_, SSL_ENABLE_SESSION_TICKETS, PR_TRUE); |
| 3120 if (rv != SECSuccess) { | 3133 if (rv != SECSuccess) { |
| 3121 LogFailedNSSFunction( | 3134 LogFailedNSSFunction( |
| 3122 net_log_, "SSL_OptionSet", "SSL_ENABLE_SESSION_TICKETS"); | 3135 net_log_, "SSL_OptionSet", "SSL_ENABLE_SESSION_TICKETS"); |
| 3123 } | 3136 } |
| 3124 #else | 3137 #else |
| 3125 #error "You need to install NSS-3.12 or later to build chromium" | 3138 #error "You need to install NSS-3.12 or later to build chromium" |
| 3126 #endif | 3139 #endif |
| (...skipping 376 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3503 return; | 3516 return; |
| 3504 valid_thread_id_ = base::PlatformThread::CurrentId(); | 3517 valid_thread_id_ = base::PlatformThread::CurrentId(); |
| 3505 } | 3518 } |
| 3506 | 3519 |
| 3507 bool SSLClientSocketNSS::CalledOnValidThread() const { | 3520 bool SSLClientSocketNSS::CalledOnValidThread() const { |
| 3508 EnsureThreadIdAssigned(); | 3521 EnsureThreadIdAssigned(); |
| 3509 base::AutoLock auto_lock(lock_); | 3522 base::AutoLock auto_lock(lock_); |
| 3510 return valid_thread_id_ == base::PlatformThread::CurrentId(); | 3523 return valid_thread_id_ == base::PlatformThread::CurrentId(); |
| 3511 } | 3524 } |
| 3512 | 3525 |
| 3526 void SSLClientSocketNSS::DisableECDSA() { | |
| 3527 const PRUint16* ciphersuites = SSL_GetImplementedCiphers(); | |
| 3528 const unsigned num_ciphersuites = SSL_GetNumImplementedCiphers(); | |
| 3529 SECStatus rv; | |
| 3530 SSLCipherSuiteInfo info; | |
| 3531 | |
| 3532 for (unsigned i = 0; i < num_ciphersuites; i++) { | |
| 3533 rv = SSL_GetCipherSuiteInfo(ciphersuites[i], &info, sizeof(info)); | |
| 3534 if (rv != SECSuccess) { | |
| 3535 LogFailedNSSFunction(net_log_, "SSL_GetCipherSuiteInfo", ""); | |
| 3536 LOG(ERROR) << "SSL_GetCipherSuiteInfo failed"; | |
| 3537 break; | |
| 3538 } | |
| 3539 if (info.authAlgorithm == ssl_auth_ecdsa) { | |
| 3540 SSL_CipherPrefSet(nss_fd_, ciphersuites[i], PR_FALSE); | |
| 3541 } | |
| 3542 } | |
| 3543 } | |
| 3544 | |
| 3513 ServerBoundCertService* SSLClientSocketNSS::GetServerBoundCertService() const { | 3545 ServerBoundCertService* SSLClientSocketNSS::GetServerBoundCertService() const { |
| 3514 return server_bound_cert_service_; | 3546 return server_bound_cert_service_; |
| 3515 } | 3547 } |
| 3516 | 3548 |
| 3517 } // namespace net | 3549 } // namespace net |
| OLD | NEW |