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

Side by Side Diff: trunk/src/net/socket/ssl_client_socket_nss.cc

Issue 18414004: Revert 209515 "Reland http://crrev.com/209278" (Closed) Base URL: svn://svn.chromium.org/chrome/
Patch Set: Created 7 years, 5 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
OLDNEW
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 1256 matching lines...) Expand 10 before | Expand all | Expand 10 after
1267 bool SSLClientSocketNSS::Core::OnNetworkTaskRunner() const { 1267 bool SSLClientSocketNSS::Core::OnNetworkTaskRunner() const {
1268 return network_task_runner_->RunsTasksOnCurrentThread(); 1268 return network_task_runner_->RunsTasksOnCurrentThread();
1269 } 1269 }
1270 1270
1271 // static 1271 // static
1272 SECStatus SSLClientSocketNSS::Core::OwnAuthCertHandler( 1272 SECStatus SSLClientSocketNSS::Core::OwnAuthCertHandler(
1273 void* arg, 1273 void* arg,
1274 PRFileDesc* socket, 1274 PRFileDesc* socket,
1275 PRBool checksig, 1275 PRBool checksig,
1276 PRBool is_server) { 1276 PRBool is_server) {
1277 #ifdef SSL_ENABLE_FALSE_START
1277 Core* core = reinterpret_cast<Core*>(arg); 1278 Core* core = reinterpret_cast<Core*>(arg);
1278 if (!core->handshake_callback_called_) { 1279 if (!core->handshake_callback_called_) {
1279 // Only need to turn off False Start in the initial handshake. Also, it is 1280 // Only need to turn off False Start in the initial handshake. Also, it is
1280 // unsafe to call SSL_OptionSet in a renegotiation because the "first 1281 // unsafe to call SSL_OptionSet in a renegotiation because the "first
1281 // handshake" lock isn't already held, which will result in an assertion 1282 // handshake" lock isn't already held, which will result in an assertion
1282 // failure in the ssl_Get1stHandshakeLock call in SSL_OptionSet. 1283 // failure in the ssl_Get1stHandshakeLock call in SSL_OptionSet.
1283 PRBool npn; 1284 PRBool npn;
1284 SECStatus rv = SSL_HandshakeNegotiatedExtension(socket, 1285 SECStatus rv = SSL_HandshakeNegotiatedExtension(socket,
1285 ssl_next_proto_nego_xtn, 1286 ssl_next_proto_nego_xtn,
1286 &npn); 1287 &npn);
1287 if (rv != SECSuccess || !npn) { 1288 if (rv != SECSuccess || !npn) {
1288 // If the server doesn't support NPN, then we don't do False Start with 1289 // If the server doesn't support NPN, then we don't do False Start with
1289 // it. 1290 // it.
1290 SSL_OptionSet(socket, SSL_ENABLE_FALSE_START, PR_FALSE); 1291 SSL_OptionSet(socket, SSL_ENABLE_FALSE_START, PR_FALSE);
1291 } 1292 }
1292 } 1293 }
1294 #endif
1293 1295
1294 // Tell NSS to not verify the certificate. 1296 // Tell NSS to not verify the certificate.
1295 return SECSuccess; 1297 return SECSuccess;
1296 } 1298 }
1297 1299
1298 #if defined(NSS_PLATFORM_CLIENT_AUTH) 1300 #if defined(NSS_PLATFORM_CLIENT_AUTH)
1299 // static 1301 // static
1300 SECStatus SSLClientSocketNSS::Core::PlatformClientAuthHandler( 1302 SECStatus SSLClientSocketNSS::Core::PlatformClientAuthHandler(
1301 void* arg, 1303 void* arg,
1302 PRFileDesc* socket, 1304 PRFileDesc* socket,
(...skipping 1107 matching lines...) Expand 10 before | Expand all | Expand 10 after
2410 nss_handshake_state_.ssl_connection_status |= 2412 nss_handshake_state_.ssl_connection_status |=
2411 (static_cast<int>(channel_info.cipherSuite) & 2413 (static_cast<int>(channel_info.cipherSuite) &
2412 SSL_CONNECTION_CIPHERSUITE_MASK) << 2414 SSL_CONNECTION_CIPHERSUITE_MASK) <<
2413 SSL_CONNECTION_CIPHERSUITE_SHIFT; 2415 SSL_CONNECTION_CIPHERSUITE_SHIFT;
2414 2416
2415 nss_handshake_state_.ssl_connection_status |= 2417 nss_handshake_state_.ssl_connection_status |=
2416 (static_cast<int>(channel_info.compressionMethod) & 2418 (static_cast<int>(channel_info.compressionMethod) &
2417 SSL_CONNECTION_COMPRESSION_MASK) << 2419 SSL_CONNECTION_COMPRESSION_MASK) <<
2418 SSL_CONNECTION_COMPRESSION_SHIFT; 2420 SSL_CONNECTION_COMPRESSION_SHIFT;
2419 2421
2420 // NSS 3.14.x doesn't have a version macro for TLS 1.2 (because NSS didn't 2422 // NSS 3.12.x doesn't have version macros for TLS 1.1 and 1.2 (because NSS
2421 // support it yet), so use 0x0303 directly. 2423 // doesn't support them yet), so we use 0x0302 and 0x0303 directly.
2422 int version = SSL_CONNECTION_VERSION_UNKNOWN; 2424 int version = SSL_CONNECTION_VERSION_UNKNOWN;
2423 if (channel_info.protocolVersion < SSL_LIBRARY_VERSION_3_0) { 2425 if (channel_info.protocolVersion < SSL_LIBRARY_VERSION_3_0) {
2424 // All versions less than SSL_LIBRARY_VERSION_3_0 are treated as SSL 2426 // All versions less than SSL_LIBRARY_VERSION_3_0 are treated as SSL
2425 // version 2. 2427 // version 2.
2426 version = SSL_CONNECTION_VERSION_SSL2; 2428 version = SSL_CONNECTION_VERSION_SSL2;
2427 } else if (channel_info.protocolVersion == SSL_LIBRARY_VERSION_3_0) { 2429 } else if (channel_info.protocolVersion == SSL_LIBRARY_VERSION_3_0) {
2428 version = SSL_CONNECTION_VERSION_SSL3; 2430 version = SSL_CONNECTION_VERSION_SSL3;
2429 } else if (channel_info.protocolVersion == SSL_LIBRARY_VERSION_3_1_TLS) { 2431 } else if (channel_info.protocolVersion == SSL_LIBRARY_VERSION_3_1_TLS) {
2430 version = SSL_CONNECTION_VERSION_TLS1; 2432 version = SSL_CONNECTION_VERSION_TLS1;
2431 } else if (channel_info.protocolVersion == SSL_LIBRARY_VERSION_TLS_1_1) { 2433 } else if (channel_info.protocolVersion == 0x0302) {
2432 version = SSL_CONNECTION_VERSION_TLS1_1; 2434 version = SSL_CONNECTION_VERSION_TLS1_1;
2433 } else if (channel_info.protocolVersion == 0x0303) { 2435 } else if (channel_info.protocolVersion == 0x0303) {
2434 version = SSL_CONNECTION_VERSION_TLS1_2; 2436 version = SSL_CONNECTION_VERSION_TLS1_2;
2435 } 2437 }
2436 nss_handshake_state_.ssl_connection_status |= 2438 nss_handshake_state_.ssl_connection_status |=
2437 (version & SSL_CONNECTION_VERSION_MASK) << 2439 (version & SSL_CONNECTION_VERSION_MASK) <<
2438 SSL_CONNECTION_VERSION_SHIFT; 2440 SSL_CONNECTION_VERSION_SHIFT;
2439 } 2441 }
2440 2442
2443 // SSL_HandshakeNegotiatedExtension was added in NSS 3.12.6.
2444 // Since SSL_MAX_EXTENSIONS was added at the same time, we can test
2445 // SSL_MAX_EXTENSIONS for the presence of SSL_HandshakeNegotiatedExtension.
2446 #if defined(SSL_MAX_EXTENSIONS)
2441 PRBool peer_supports_renego_ext; 2447 PRBool peer_supports_renego_ext;
2442 ok = SSL_HandshakeNegotiatedExtension(nss_fd_, ssl_renegotiation_info_xtn, 2448 ok = SSL_HandshakeNegotiatedExtension(nss_fd_, ssl_renegotiation_info_xtn,
2443 &peer_supports_renego_ext); 2449 &peer_supports_renego_ext);
2444 if (ok == SECSuccess) { 2450 if (ok == SECSuccess) {
2445 if (!peer_supports_renego_ext) { 2451 if (!peer_supports_renego_ext) {
2446 nss_handshake_state_.ssl_connection_status |= 2452 nss_handshake_state_.ssl_connection_status |=
2447 SSL_CONNECTION_NO_RENEGOTIATION_EXTENSION; 2453 SSL_CONNECTION_NO_RENEGOTIATION_EXTENSION;
2448 // Log an informational message if the server does not support secure 2454 // Log an informational message if the server does not support secure
2449 // renegotiation (RFC 5746). 2455 // renegotiation (RFC 5746).
2450 VLOG(1) << "The server " << host_and_port_.ToString() 2456 VLOG(1) << "The server " << host_and_port_.ToString()
(...skipping 13 matching lines...) Expand all
2464 // tools.ietf.org/html/draft-pettersen-tls-version-rollback-removal-00 . 2470 // tools.ietf.org/html/draft-pettersen-tls-version-rollback-removal-00 .
2465 // 2471 //
2466 // As a first step, measure how often clients perform version fallback 2472 // As a first step, measure how often clients perform version fallback
2467 // while the server advertises support secure renegotiation. 2473 // while the server advertises support secure renegotiation.
2468 if (ssl_config_.version_fallback && 2474 if (ssl_config_.version_fallback &&
2469 channel_info.protocolVersion == SSL_LIBRARY_VERSION_3_0) { 2475 channel_info.protocolVersion == SSL_LIBRARY_VERSION_3_0) {
2470 UMA_HISTOGRAM_BOOLEAN("Net.SSLv3FallbackToRenegoPatchedServer", 2476 UMA_HISTOGRAM_BOOLEAN("Net.SSLv3FallbackToRenegoPatchedServer",
2471 peer_supports_renego_ext == PR_TRUE); 2477 peer_supports_renego_ext == PR_TRUE);
2472 } 2478 }
2473 } 2479 }
2480 #endif
2474 2481
2475 if (ssl_config_.version_fallback) { 2482 if (ssl_config_.version_fallback) {
2476 nss_handshake_state_.ssl_connection_status |= 2483 nss_handshake_state_.ssl_connection_status |=
2477 SSL_CONNECTION_VERSION_FALLBACK; 2484 SSL_CONNECTION_VERSION_FALLBACK;
2478 } 2485 }
2479 } 2486 }
2480 2487
2481 void SSLClientSocketNSS::Core::UpdateNextProto() { 2488 void SSLClientSocketNSS::Core::UpdateNextProto() {
2482 uint8 buf[256]; 2489 uint8 buf[256];
2483 SSLNextProtoState state; 2490 SSLNextProtoState state;
(...skipping 655 matching lines...) Expand 10 before | Expand all | Expand 10 after
3139 } 3146 }
3140 3147
3141 for (std::vector<uint16>::const_iterator it = 3148 for (std::vector<uint16>::const_iterator it =
3142 ssl_config_.disabled_cipher_suites.begin(); 3149 ssl_config_.disabled_cipher_suites.begin();
3143 it != ssl_config_.disabled_cipher_suites.end(); ++it) { 3150 it != ssl_config_.disabled_cipher_suites.end(); ++it) {
3144 // This will fail if the specified cipher is not implemented by NSS, but 3151 // This will fail if the specified cipher is not implemented by NSS, but
3145 // the failure is harmless. 3152 // the failure is harmless.
3146 SSL_CipherPrefSet(nss_fd_, *it, PR_FALSE); 3153 SSL_CipherPrefSet(nss_fd_, *it, PR_FALSE);
3147 } 3154 }
3148 3155
3156 #ifdef SSL_ENABLE_SESSION_TICKETS
3149 // Support RFC 5077 3157 // Support RFC 5077
3150 rv = SSL_OptionSet(nss_fd_, SSL_ENABLE_SESSION_TICKETS, PR_TRUE); 3158 rv = SSL_OptionSet(nss_fd_, SSL_ENABLE_SESSION_TICKETS, PR_TRUE);
3151 if (rv != SECSuccess) { 3159 if (rv != SECSuccess) {
3152 LogFailedNSSFunction( 3160 LogFailedNSSFunction(
3153 net_log_, "SSL_OptionSet", "SSL_ENABLE_SESSION_TICKETS"); 3161 net_log_, "SSL_OptionSet", "SSL_ENABLE_SESSION_TICKETS");
3154 } 3162 }
3163 #else
3164 #error "You need to install NSS-3.12 or later to build chromium"
3165 #endif
3155 3166
3167 #ifdef SSL_ENABLE_FALSE_START
3156 rv = SSL_OptionSet(nss_fd_, SSL_ENABLE_FALSE_START, 3168 rv = SSL_OptionSet(nss_fd_, SSL_ENABLE_FALSE_START,
3157 ssl_config_.false_start_enabled); 3169 ssl_config_.false_start_enabled);
3158 if (rv != SECSuccess) 3170 if (rv != SECSuccess)
3159 LogFailedNSSFunction(net_log_, "SSL_OptionSet", "SSL_ENABLE_FALSE_START"); 3171 LogFailedNSSFunction(net_log_, "SSL_OptionSet", "SSL_ENABLE_FALSE_START");
3172 #endif
3160 3173
3174 #ifdef SSL_ENABLE_RENEGOTIATION
3161 // We allow servers to request renegotiation. Since we're a client, 3175 // We allow servers to request renegotiation. Since we're a client,
3162 // prohibiting this is rather a waste of time. Only servers are in a 3176 // prohibiting this is rather a waste of time. Only servers are in a
3163 // position to prevent renegotiation attacks. 3177 // position to prevent renegotiation attacks.
3164 // http://extendedsubset.com/?p=8 3178 // http://extendedsubset.com/?p=8
3165 3179
3166 rv = SSL_OptionSet(nss_fd_, SSL_ENABLE_RENEGOTIATION, 3180 rv = SSL_OptionSet(nss_fd_, SSL_ENABLE_RENEGOTIATION,
3167 SSL_RENEGOTIATE_TRANSITIONAL); 3181 SSL_RENEGOTIATE_TRANSITIONAL);
3168 if (rv != SECSuccess) { 3182 if (rv != SECSuccess) {
3169 LogFailedNSSFunction( 3183 LogFailedNSSFunction(
3170 net_log_, "SSL_OptionSet", "SSL_ENABLE_RENEGOTIATION"); 3184 net_log_, "SSL_OptionSet", "SSL_ENABLE_RENEGOTIATION");
3171 } 3185 }
3186 #endif // SSL_ENABLE_RENEGOTIATION
3172 3187
3188 #ifdef SSL_CBC_RANDOM_IV
3173 rv = SSL_OptionSet(nss_fd_, SSL_CBC_RANDOM_IV, PR_TRUE); 3189 rv = SSL_OptionSet(nss_fd_, SSL_CBC_RANDOM_IV, PR_TRUE);
3174 if (rv != SECSuccess) 3190 if (rv != SECSuccess)
3175 LogFailedNSSFunction(net_log_, "SSL_OptionSet", "SSL_CBC_RANDOM_IV"); 3191 LogFailedNSSFunction(net_log_, "SSL_OptionSet", "SSL_CBC_RANDOM_IV");
3192 #endif
3176 3193
3177 // Added in NSS 3.15
3178 #ifdef SSL_ENABLE_OCSP_STAPLING 3194 #ifdef SSL_ENABLE_OCSP_STAPLING
3179 if (IsOCSPStaplingSupported()) { 3195 if (IsOCSPStaplingSupported()) {
3180 rv = SSL_OptionSet(nss_fd_, SSL_ENABLE_OCSP_STAPLING, PR_TRUE); 3196 rv = SSL_OptionSet(nss_fd_, SSL_ENABLE_OCSP_STAPLING, PR_TRUE);
3181 if (rv != SECSuccess) { 3197 if (rv != SECSuccess) {
3182 LogFailedNSSFunction(net_log_, "SSL_OptionSet", 3198 LogFailedNSSFunction(net_log_, "SSL_OptionSet",
3183 "SSL_ENABLE_OCSP_STAPLING"); 3199 "SSL_ENABLE_OCSP_STAPLING");
3184 } 3200 }
3185 } 3201 }
3186 #endif 3202 #endif
3187 3203
3188 // Chromium patch to libssl
3189 #ifdef SSL_ENABLE_CACHED_INFO 3204 #ifdef SSL_ENABLE_CACHED_INFO
3190 rv = SSL_OptionSet(nss_fd_, SSL_ENABLE_CACHED_INFO, 3205 rv = SSL_OptionSet(nss_fd_, SSL_ENABLE_CACHED_INFO,
3191 ssl_config_.cached_info_enabled); 3206 ssl_config_.cached_info_enabled);
3192 if (rv != SECSuccess) 3207 if (rv != SECSuccess)
3193 LogFailedNSSFunction(net_log_, "SSL_OptionSet", "SSL_ENABLE_CACHED_INFO"); 3208 LogFailedNSSFunction(net_log_, "SSL_OptionSet", "SSL_ENABLE_CACHED_INFO");
3194 #endif 3209 #endif
3195 3210
3196 rv = SSL_OptionSet(nss_fd_, SSL_HANDSHAKE_AS_CLIENT, PR_TRUE); 3211 rv = SSL_OptionSet(nss_fd_, SSL_HANDSHAKE_AS_CLIENT, PR_TRUE);
3197 if (rv != SECSuccess) { 3212 if (rv != SECSuccess) {
3198 LogFailedNSSFunction(net_log_, "SSL_OptionSet", "SSL_HANDSHAKE_AS_CLIENT"); 3213 LogFailedNSSFunction(net_log_, "SSL_OptionSet", "SSL_HANDSHAKE_AS_CLIENT");
(...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after
3505 EnsureThreadIdAssigned(); 3520 EnsureThreadIdAssigned();
3506 base::AutoLock auto_lock(lock_); 3521 base::AutoLock auto_lock(lock_);
3507 return valid_thread_id_ == base::PlatformThread::CurrentId(); 3522 return valid_thread_id_ == base::PlatformThread::CurrentId();
3508 } 3523 }
3509 3524
3510 ServerBoundCertService* SSLClientSocketNSS::GetServerBoundCertService() const { 3525 ServerBoundCertService* SSLClientSocketNSS::GetServerBoundCertService() const {
3511 return server_bound_cert_service_; 3526 return server_bound_cert_service_;
3512 } 3527 }
3513 3528
3514 } // namespace net 3529 } // namespace net
OLDNEW
« no previous file with comments | « trunk/src/net/cert/cert_verify_proc_nss.cc ('k') | trunk/src/net/third_party/nss/README.chromium » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698