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

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

Issue 1131763002: Reject renegotiations in SSLClientSocket by default. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: stray function prototype Created 5 years, 7 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
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 552 matching lines...) Expand 10 before | Expand all | Expand 10 after
563 CERTDistNames* ca_names, 563 CERTDistNames* ca_names,
564 CERTCertificate** result_certificate, 564 CERTCertificate** result_certificate,
565 SECKEYPrivateKey** result_private_key); 565 SECKEYPrivateKey** result_private_key);
566 566
567 // Called by NSS to determine if we can False Start. 567 // Called by NSS to determine if we can False Start.
568 // |arg| contains a pointer to the current SSLClientSocketNSS::Core. 568 // |arg| contains a pointer to the current SSLClientSocketNSS::Core.
569 static SECStatus CanFalseStartCallback(PRFileDesc* socket, 569 static SECStatus CanFalseStartCallback(PRFileDesc* socket,
570 void* arg, 570 void* arg,
571 PRBool* can_false_start); 571 PRBool* can_false_start);
572 572
573 // Called by NSS once the handshake has completed. 573 // Called by NSS each time a handshake completely finishes.
574 // |arg| contains a pointer to the current SSLClientSocketNSS::Core. 574 // |arg| contains a pointer to the current SSLClientSocketNSS::Core.
575 static void HandshakeCallback(PRFileDesc* socket, void* arg); 575 static void HandshakeCallback(PRFileDesc* socket, void* arg);
576 576
577 // Called once the handshake has succeeded. 577 // Called once for each successful handshake. If the initial handshake false
578 // starts, it is called when it false starts and not when it completely
579 // finishes.
578 void HandshakeSucceeded(); 580 void HandshakeSucceeded();
579 581
580 // Handles an NSS error generated while handshaking or performing IO. 582 // Handles an NSS error generated while handshaking or performing IO.
581 // Returns a network error code mapped from the original NSS error. 583 // Returns a network error code mapped from the original NSS error.
582 int HandleNSSError(PRErrorCode error); 584 int HandleNSSError(PRErrorCode error);
583 585
584 int DoHandshakeLoop(int last_io_result); 586 int DoHandshakeLoop(int last_io_result);
585 int DoReadLoop(int result); 587 int DoReadLoop(int result);
586 int DoWriteLoop(int result); 588 int DoWriteLoop(int result);
587 589
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
630 void UpdateConnectionStatus(); 632 void UpdateConnectionStatus();
631 // Record histograms for channel id support during full handshakes - resumed 633 // Record histograms for channel id support during full handshakes - resumed
632 // handshakes are ignored. 634 // handshakes are ignored.
633 void RecordChannelIDSupportOnNSSTaskRunner(); 635 void RecordChannelIDSupportOnNSSTaskRunner();
634 // UpdateNextProto gets any application-layer protocol that may have been 636 // UpdateNextProto gets any application-layer protocol that may have been
635 // negotiated by the TLS connection. 637 // negotiated by the TLS connection.
636 void UpdateNextProto(); 638 void UpdateNextProto();
637 // Record TLS extension used for protocol negotiation (NPN or ALPN). 639 // Record TLS extension used for protocol negotiation (NPN or ALPN).
638 void UpdateExtensionUsed(); 640 void UpdateExtensionUsed();
639 641
642 // Returns true if renegotiations are allowed.
643 bool IsRenegotiationAllowed() const;
644
640 //////////////////////////////////////////////////////////////////////////// 645 ////////////////////////////////////////////////////////////////////////////
641 // Methods that are ONLY called on the network task runner: 646 // Methods that are ONLY called on the network task runner:
642 //////////////////////////////////////////////////////////////////////////// 647 ////////////////////////////////////////////////////////////////////////////
643 int DoBufferRecv(IOBuffer* buffer, int len); 648 int DoBufferRecv(IOBuffer* buffer, int len);
644 int DoBufferSend(IOBuffer* buffer, int len); 649 int DoBufferSend(IOBuffer* buffer, int len);
645 int DoGetChannelID(const std::string& host); 650 int DoGetChannelID(const std::string& host);
646 651
647 void OnGetChannelIDComplete(int result); 652 void OnGetChannelIDComplete(int result);
648 void OnHandshakeStateUpdated(const HandshakeState& state); 653 void OnHandshakeStateUpdated(const HandshakeState& state);
649 void OnNSSBufferUpdated(int amount_in_read_buffer); 654 void OnNSSBufferUpdated(int amount_in_read_buffer);
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
734 std::vector<std::string> predicted_certs_; 739 std::vector<std::string> predicted_certs_;
735 740
736 State next_handshake_state_; 741 State next_handshake_state_;
737 742
738 // True if channel ID extension was negotiated. 743 // True if channel ID extension was negotiated.
739 bool channel_id_xtn_negotiated_; 744 bool channel_id_xtn_negotiated_;
740 // True if the handshake state machine was interrupted for channel ID. 745 // True if the handshake state machine was interrupted for channel ID.
741 bool channel_id_needed_; 746 bool channel_id_needed_;
742 // True if the handshake state machine was interrupted for client auth. 747 // True if the handshake state machine was interrupted for client auth.
743 bool client_auth_cert_needed_; 748 bool client_auth_cert_needed_;
744 // True if NSS has False Started. 749 // True if NSS has False Started in the initial handshake, but the initial
750 // handshake has not yet completely finished..
745 bool false_started_; 751 bool false_started_;
746 // True if NSS has called HandshakeCallback. 752 // True if NSS has called HandshakeCallback.
747 bool handshake_callback_called_; 753 bool handshake_callback_called_;
748 754
749 HandshakeState nss_handshake_state_; 755 HandshakeState nss_handshake_state_;
750 756
751 bool transport_recv_busy_; 757 bool transport_recv_busy_;
752 bool transport_recv_eof_; 758 bool transport_recv_eof_;
753 bool transport_send_busy_; 759 bool transport_send_busy_;
754 760
(...skipping 688 matching lines...) Expand 10 before | Expand all | Expand 10 after
1443 PostOrRunCallback( 1449 PostOrRunCallback(
1444 FROM_HERE, 1450 FROM_HERE,
1445 base::Bind(&AddLogEventWithCallback, weak_net_log_, 1451 base::Bind(&AddLogEventWithCallback, weak_net_log_,
1446 NetLog::TYPE_SSL_HANDSHAKE_ERROR, 1452 NetLog::TYPE_SSL_HANDSHAKE_ERROR,
1447 CreateNetLogSSLErrorCallback(net_error, 0))); 1453 CreateNetLogSSLErrorCallback(net_error, 0)));
1448 } else if (rv == SECSuccess) { 1454 } else if (rv == SECSuccess) {
1449 if (!handshake_callback_called_) { 1455 if (!handshake_callback_called_) {
1450 false_started_ = true; 1456 false_started_ = true;
1451 HandshakeSucceeded(); 1457 HandshakeSucceeded();
1452 } 1458 }
1459
1460 if (IsRenegotiationAllowed()) {
1461 // For compatibility, do not enforce RFC 5746 support. Per section 4.1,
1462 // enforcement falls largely on the server.
1463 SECStatus rv = SSL_OptionSet(nss_fd_, SSL_ENABLE_RENEGOTIATION,
1464 SSL_RENEGOTIATE_TRANSITIONAL);
1465 DCHECK_EQ(SECSuccess, rv);
1466 }
1453 } else { 1467 } else {
1454 PRErrorCode prerr = PR_GetError(); 1468 PRErrorCode prerr = PR_GetError();
1455 net_error = HandleNSSError(prerr); 1469 net_error = HandleNSSError(prerr);
1456 1470
1457 // If not done, stay in this state 1471 // If not done, stay in this state
1458 if (net_error == ERR_IO_PENDING) { 1472 if (net_error == ERR_IO_PENDING) {
1459 GotoState(STATE_HANDSHAKE); 1473 GotoState(STATE_HANDSHAKE);
1460 } else { 1474 } else {
1461 PostOrRunCallback( 1475 PostOrRunCallback(
1462 FROM_HERE, 1476 FROM_HERE,
(...skipping 651 matching lines...) Expand 10 before | Expand all | Expand 10 after
2114 } else { 2128 } else {
2115 rv = SSL_HandshakeNegotiatedExtension(nss_fd_, 2129 rv = SSL_HandshakeNegotiatedExtension(nss_fd_,
2116 ssl_next_proto_nego_xtn, 2130 ssl_next_proto_nego_xtn,
2117 &negotiated_extension); 2131 &negotiated_extension);
2118 if (rv == SECSuccess && negotiated_extension) { 2132 if (rv == SECSuccess && negotiated_extension) {
2119 nss_handshake_state_.negotiation_extension_ = kExtensionNPN; 2133 nss_handshake_state_.negotiation_extension_ = kExtensionNPN;
2120 } 2134 }
2121 } 2135 }
2122 } 2136 }
2123 2137
2138 bool SSLClientSocketNSS::Core::IsRenegotiationAllowed() const {
2139 DCHECK(OnNSSTaskRunner());
2140
2141 if (nss_handshake_state_.next_proto_status == kNextProtoUnsupported)
2142 return ssl_config_.renego_allowed_default;
2143
2144 NextProto next_proto = NextProtoFromString(nss_handshake_state_.next_proto);
2145 for (NextProto allowed : ssl_config_.renego_allowed_for_protos) {
2146 if (next_proto == allowed)
2147 return true;
2148 }
2149 return false;
2150 }
2151
2124 void SSLClientSocketNSS::Core::RecordChannelIDSupportOnNSSTaskRunner() { 2152 void SSLClientSocketNSS::Core::RecordChannelIDSupportOnNSSTaskRunner() {
2125 DCHECK(OnNSSTaskRunner()); 2153 DCHECK(OnNSSTaskRunner());
2126 if (nss_handshake_state_.resumed_handshake) 2154 if (nss_handshake_state_.resumed_handshake)
2127 return; 2155 return;
2128 2156
2129 // Copy the NSS task runner-only state to the network task runner and 2157 // Copy the NSS task runner-only state to the network task runner and
2130 // log histograms from there, since the histograms also need access to the 2158 // log histograms from there, since the histograms also need access to the
2131 // network task runner state. 2159 // network task runner state.
2132 PostOrRunCallback( 2160 PostOrRunCallback(
2133 FROM_HERE, 2161 FROM_HERE,
(...skipping 651 matching lines...) Expand 10 before | Expand all | Expand 10 after
2785 if (rv != SECSuccess) { 2813 if (rv != SECSuccess) {
2786 LogFailedNSSFunction( 2814 LogFailedNSSFunction(
2787 net_log_, "SSL_OptionSet", "SSL_ENABLE_SESSION_TICKETS"); 2815 net_log_, "SSL_OptionSet", "SSL_ENABLE_SESSION_TICKETS");
2788 } 2816 }
2789 2817
2790 rv = SSL_OptionSet(nss_fd_, SSL_ENABLE_FALSE_START, 2818 rv = SSL_OptionSet(nss_fd_, SSL_ENABLE_FALSE_START,
2791 ssl_config_.false_start_enabled); 2819 ssl_config_.false_start_enabled);
2792 if (rv != SECSuccess) 2820 if (rv != SECSuccess)
2793 LogFailedNSSFunction(net_log_, "SSL_OptionSet", "SSL_ENABLE_FALSE_START"); 2821 LogFailedNSSFunction(net_log_, "SSL_OptionSet", "SSL_ENABLE_FALSE_START");
2794 2822
2795 // We allow servers to request renegotiation. Since we're a client, 2823 // By default, renegotiations are rejected. After the initial handshake
2796 // prohibiting this is rather a waste of time. Only servers are in a 2824 // completes, some application protocols may re-enable it.
2797 // position to prevent renegotiation attacks. 2825 rv = SSL_OptionSet(nss_fd_, SSL_ENABLE_RENEGOTIATION, SSL_RENEGOTIATE_NEVER);
2798 // http://extendedsubset.com/?p=8
2799
2800 rv = SSL_OptionSet(nss_fd_, SSL_ENABLE_RENEGOTIATION,
2801 SSL_RENEGOTIATE_TRANSITIONAL);
2802 if (rv != SECSuccess) { 2826 if (rv != SECSuccess) {
2803 LogFailedNSSFunction( 2827 LogFailedNSSFunction(
2804 net_log_, "SSL_OptionSet", "SSL_ENABLE_RENEGOTIATION"); 2828 net_log_, "SSL_OptionSet", "SSL_ENABLE_RENEGOTIATION");
2805 } 2829 }
2806 2830
2807 rv = SSL_OptionSet(nss_fd_, SSL_CBC_RANDOM_IV, PR_TRUE); 2831 rv = SSL_OptionSet(nss_fd_, SSL_CBC_RANDOM_IV, PR_TRUE);
2808 if (rv != SECSuccess) 2832 if (rv != SECSuccess)
2809 LogFailedNSSFunction(net_log_, "SSL_OptionSet", "SSL_CBC_RANDOM_IV"); 2833 LogFailedNSSFunction(net_log_, "SSL_OptionSet", "SSL_CBC_RANDOM_IV");
2810 2834
2811 // Added in NSS 3.15 2835 // Added in NSS 3.15
(...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after
3175 scoped_refptr<X509Certificate> 3199 scoped_refptr<X509Certificate>
3176 SSLClientSocketNSS::GetUnverifiedServerCertificateChain() const { 3200 SSLClientSocketNSS::GetUnverifiedServerCertificateChain() const {
3177 return core_->state().server_cert.get(); 3201 return core_->state().server_cert.get();
3178 } 3202 }
3179 3203
3180 ChannelIDService* SSLClientSocketNSS::GetChannelIDService() const { 3204 ChannelIDService* SSLClientSocketNSS::GetChannelIDService() const {
3181 return channel_id_service_; 3205 return channel_id_service_;
3182 } 3206 }
3183 3207
3184 } // namespace net 3208 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698