| 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 494 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 505 // | 505 // |
| 506 // In the single-threaded mode (where the network and NSS task runners run on | 506 // In the single-threaded mode (where the network and NSS task runners run on |
| 507 // the same thread), these are all attempted synchronously, while in the | 507 // the same thread), these are all attempted synchronously, while in the |
| 508 // multi-threaded mode, message passing is used. | 508 // multi-threaded mode, message passing is used. |
| 509 // | 509 // |
| 510 // 1) NSS Task Runner: Execute NSS function (DoPayloadRead, DoPayloadWrite, | 510 // 1) NSS Task Runner: Execute NSS function (DoPayloadRead, DoPayloadWrite, |
| 511 // DoHandshake) | 511 // DoHandshake) |
| 512 // 2) NSS Task Runner: Prepare data to go from NSS to an IO function: | 512 // 2) NSS Task Runner: Prepare data to go from NSS to an IO function: |
| 513 // (BufferRecv, BufferSend) | 513 // (BufferRecv, BufferSend) |
| 514 // 3) Network Task Runner: Perform IO on that data (DoBufferRecv, | 514 // 3) Network Task Runner: Perform IO on that data (DoBufferRecv, |
| 515 // DoBufferSend, DoGetDomainBoundCert, OnGetDomainBoundCertComplete) | 515 // DoBufferSend, DoGetChannelID, OnGetChannelIDComplete) |
| 516 // 4) Both Task Runners: Callback for asynchronous completion or to marshal | 516 // 4) Both Task Runners: Callback for asynchronous completion or to marshal |
| 517 // data from the network task runner back to NSS (BufferRecvComplete, | 517 // data from the network task runner back to NSS (BufferRecvComplete, |
| 518 // BufferSendComplete, OnHandshakeIOComplete) | 518 // BufferSendComplete, OnHandshakeIOComplete) |
| 519 // | 519 // |
| 520 ///////////////////////////////////////////////////////////////////////////// | 520 ///////////////////////////////////////////////////////////////////////////// |
| 521 // Single-threaded example | 521 // Single-threaded example |
| 522 // | 522 // |
| 523 // |--------------------------Network Task Runner--------------------------| | 523 // |--------------------------Network Task Runner--------------------------| |
| 524 // SSLClientSocketNSS Core (Transport Socket) | 524 // SSLClientSocketNSS Core (Transport Socket) |
| 525 // Read() | 525 // Read() |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 573 class SSLClientSocketNSS::Core : public base::RefCountedThreadSafe<Core> { | 573 class SSLClientSocketNSS::Core : public base::RefCountedThreadSafe<Core> { |
| 574 public: | 574 public: |
| 575 // Creates a new Core. | 575 // Creates a new Core. |
| 576 // | 576 // |
| 577 // Any calls to NSS are executed on the |nss_task_runner|, while any calls | 577 // Any calls to NSS are executed on the |nss_task_runner|, while any calls |
| 578 // that need to operate on the underlying transport, net log, or server | 578 // that need to operate on the underlying transport, net log, or server |
| 579 // bound certificate fetching will happen on the |network_task_runner|, so | 579 // bound certificate fetching will happen on the |network_task_runner|, so |
| 580 // that their lifetimes match that of the owning SSLClientSocketNSS. | 580 // that their lifetimes match that of the owning SSLClientSocketNSS. |
| 581 // | 581 // |
| 582 // The caller retains ownership of |transport|, |net_log|, and | 582 // The caller retains ownership of |transport|, |net_log|, and |
| 583 // |server_bound_cert_service|, and they will not be accessed once Detach() | 583 // |channel_id_service|, and they will not be accessed once Detach() |
| 584 // has been called. | 584 // has been called. |
| 585 Core(base::SequencedTaskRunner* network_task_runner, | 585 Core(base::SequencedTaskRunner* network_task_runner, |
| 586 base::SequencedTaskRunner* nss_task_runner, | 586 base::SequencedTaskRunner* nss_task_runner, |
| 587 ClientSocketHandle* transport, | 587 ClientSocketHandle* transport, |
| 588 const HostPortPair& host_and_port, | 588 const HostPortPair& host_and_port, |
| 589 const SSLConfig& ssl_config, | 589 const SSLConfig& ssl_config, |
| 590 BoundNetLog* net_log, | 590 BoundNetLog* net_log, |
| 591 ServerBoundCertService* server_bound_cert_service); | 591 ChannelIDService* channel_id_service); |
| 592 | 592 |
| 593 // Called on the network task runner. | 593 // Called on the network task runner. |
| 594 // Transfers ownership of |socket|, an NSS SSL socket, and |buffers|, the | 594 // Transfers ownership of |socket|, an NSS SSL socket, and |buffers|, the |
| 595 // underlying memio implementation, to the Core. Returns true if the Core | 595 // underlying memio implementation, to the Core. Returns true if the Core |
| 596 // was successfully registered with the socket. | 596 // was successfully registered with the socket. |
| 597 bool Init(PRFileDesc* socket, memio_Private* buffers); | 597 bool Init(PRFileDesc* socket, memio_Private* buffers); |
| 598 | 598 |
| 599 // Called on the network task runner. | 599 // Called on the network task runner. |
| 600 // | 600 // |
| 601 // Attempts to perform an SSL handshake. If the handshake cannot be | 601 // Attempts to perform an SSL handshake. If the handshake cannot be |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 735 static SECStatus ClientChannelIDHandler( | 735 static SECStatus ClientChannelIDHandler( |
| 736 void* arg, | 736 void* arg, |
| 737 PRFileDesc* socket, | 737 PRFileDesc* socket, |
| 738 SECKEYPublicKey **out_public_key, | 738 SECKEYPublicKey **out_public_key, |
| 739 SECKEYPrivateKey **out_private_key); | 739 SECKEYPrivateKey **out_private_key); |
| 740 | 740 |
| 741 // ImportChannelIDKeys is a helper function for turning a DER-encoded cert and | 741 // ImportChannelIDKeys is a helper function for turning a DER-encoded cert and |
| 742 // key into a SECKEYPublicKey and SECKEYPrivateKey. Returns OK upon success | 742 // key into a SECKEYPublicKey and SECKEYPrivateKey. Returns OK upon success |
| 743 // and an error code otherwise. | 743 // and an error code otherwise. |
| 744 // Requires |domain_bound_private_key_| and |domain_bound_cert_| to have been | 744 // Requires |domain_bound_private_key_| and |domain_bound_cert_| to have been |
| 745 // set by a call to ServerBoundCertService->GetDomainBoundCert. The caller | 745 // set by a call to ChannelIDService->GetChannelID. The caller |
| 746 // takes ownership of the |*cert| and |*key|. | 746 // takes ownership of the |*cert| and |*key|. |
| 747 int ImportChannelIDKeys(SECKEYPublicKey** public_key, SECKEYPrivateKey** key); | 747 int ImportChannelIDKeys(SECKEYPublicKey** public_key, SECKEYPrivateKey** key); |
| 748 | 748 |
| 749 // Updates the NSS and platform specific certificates. | 749 // Updates the NSS and platform specific certificates. |
| 750 void UpdateServerCert(); | 750 void UpdateServerCert(); |
| 751 // Update the nss_handshake_state_ with the SignedCertificateTimestampList | 751 // Update the nss_handshake_state_ with the SignedCertificateTimestampList |
| 752 // received in the handshake via a TLS extension. | 752 // received in the handshake via a TLS extension. |
| 753 void UpdateSignedCertTimestamps(); | 753 void UpdateSignedCertTimestamps(); |
| 754 // Update the OCSP response cache with the stapled response received in the | 754 // Update the OCSP response cache with the stapled response received in the |
| 755 // handshake, and update nss_handshake_state_ with | 755 // handshake, and update nss_handshake_state_ with |
| 756 // the SignedCertificateTimestampList received in the stapled OCSP response. | 756 // the SignedCertificateTimestampList received in the stapled OCSP response. |
| 757 void UpdateStapledOCSPResponse(); | 757 void UpdateStapledOCSPResponse(); |
| 758 // Updates the nss_handshake_state_ with the negotiated security parameters. | 758 // Updates the nss_handshake_state_ with the negotiated security parameters. |
| 759 void UpdateConnectionStatus(); | 759 void UpdateConnectionStatus(); |
| 760 // Record histograms for channel id support during full handshakes - resumed | 760 // Record histograms for channel id support during full handshakes - resumed |
| 761 // handshakes are ignored. | 761 // handshakes are ignored. |
| 762 void RecordChannelIDSupportOnNSSTaskRunner(); | 762 void RecordChannelIDSupportOnNSSTaskRunner(); |
| 763 // UpdateNextProto gets any application-layer protocol that may have been | 763 // UpdateNextProto gets any application-layer protocol that may have been |
| 764 // negotiated by the TLS connection. | 764 // negotiated by the TLS connection. |
| 765 void UpdateNextProto(); | 765 void UpdateNextProto(); |
| 766 | 766 |
| 767 //////////////////////////////////////////////////////////////////////////// | 767 //////////////////////////////////////////////////////////////////////////// |
| 768 // Methods that are ONLY called on the network task runner: | 768 // Methods that are ONLY called on the network task runner: |
| 769 //////////////////////////////////////////////////////////////////////////// | 769 //////////////////////////////////////////////////////////////////////////// |
| 770 int DoBufferRecv(IOBuffer* buffer, int len); | 770 int DoBufferRecv(IOBuffer* buffer, int len); |
| 771 int DoBufferSend(IOBuffer* buffer, int len); | 771 int DoBufferSend(IOBuffer* buffer, int len); |
| 772 int DoGetDomainBoundCert(const std::string& host); | 772 int DoGetChannelID(const std::string& host); |
| 773 | 773 |
| 774 void OnGetDomainBoundCertComplete(int result); | 774 void OnGetChannelIDComplete(int result); |
| 775 void OnHandshakeStateUpdated(const HandshakeState& state); | 775 void OnHandshakeStateUpdated(const HandshakeState& state); |
| 776 void OnNSSBufferUpdated(int amount_in_read_buffer); | 776 void OnNSSBufferUpdated(int amount_in_read_buffer); |
| 777 void DidNSSRead(int result); | 777 void DidNSSRead(int result); |
| 778 void DidNSSWrite(int result); | 778 void DidNSSWrite(int result); |
| 779 void RecordChannelIDSupportOnNetworkTaskRunner( | 779 void RecordChannelIDSupportOnNetworkTaskRunner( |
| 780 bool negotiated_channel_id, | 780 bool negotiated_channel_id, |
| 781 bool channel_id_enabled, | 781 bool channel_id_enabled, |
| 782 bool supports_ecc) const; | 782 bool supports_ecc) const; |
| 783 | 783 |
| 784 //////////////////////////////////////////////////////////////////////////// | 784 //////////////////////////////////////////////////////////////////////////// |
| (...skipping 28 matching lines...) Expand all Loading... |
| 813 bool detached_; | 813 bool detached_; |
| 814 | 814 |
| 815 // The underlying transport to use for network IO. | 815 // The underlying transport to use for network IO. |
| 816 ClientSocketHandle* transport_; | 816 ClientSocketHandle* transport_; |
| 817 base::WeakPtrFactory<BoundNetLog> weak_net_log_factory_; | 817 base::WeakPtrFactory<BoundNetLog> weak_net_log_factory_; |
| 818 | 818 |
| 819 // The current handshake state. Mirrors |nss_handshake_state_|. | 819 // The current handshake state. Mirrors |nss_handshake_state_|. |
| 820 HandshakeState network_handshake_state_; | 820 HandshakeState network_handshake_state_; |
| 821 | 821 |
| 822 // The service for retrieving Channel ID keys. May be NULL. | 822 // The service for retrieving Channel ID keys. May be NULL. |
| 823 ServerBoundCertService* server_bound_cert_service_; | 823 ChannelIDService* channel_id_service_; |
| 824 ServerBoundCertService::RequestHandle domain_bound_cert_request_handle_; | 824 ChannelIDService::RequestHandle domain_bound_cert_request_handle_; |
| 825 | 825 |
| 826 // The information about NSS task runner. | 826 // The information about NSS task runner. |
| 827 int unhandled_buffer_size_; | 827 int unhandled_buffer_size_; |
| 828 bool nss_waiting_read_; | 828 bool nss_waiting_read_; |
| 829 bool nss_waiting_write_; | 829 bool nss_waiting_write_; |
| 830 bool nss_is_closed_; | 830 bool nss_is_closed_; |
| 831 | 831 |
| 832 // Set when Read() or Write() successfully reads or writes data to or from the | 832 // Set when Read() or Write() successfully reads or writes data to or from the |
| 833 // network. | 833 // network. |
| 834 bool was_ever_used_; | 834 bool was_ever_used_; |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 895 // Members that are accessed on both the network task runner and the NSS | 895 // Members that are accessed on both the network task runner and the NSS |
| 896 // task runner. | 896 // task runner. |
| 897 //////////////////////////////////////////////////////////////////////////// | 897 //////////////////////////////////////////////////////////////////////////// |
| 898 scoped_refptr<base::SequencedTaskRunner> network_task_runner_; | 898 scoped_refptr<base::SequencedTaskRunner> network_task_runner_; |
| 899 scoped_refptr<base::SequencedTaskRunner> nss_task_runner_; | 899 scoped_refptr<base::SequencedTaskRunner> nss_task_runner_; |
| 900 | 900 |
| 901 // Dereferenced only on the network task runner, but bound to tasks destined | 901 // Dereferenced only on the network task runner, but bound to tasks destined |
| 902 // for the network task runner from the NSS task runner. | 902 // for the network task runner from the NSS task runner. |
| 903 base::WeakPtr<BoundNetLog> weak_net_log_; | 903 base::WeakPtr<BoundNetLog> weak_net_log_; |
| 904 | 904 |
| 905 // Written on the network task runner by the |server_bound_cert_service_|, | 905 // Written on the network task runner by the |channel_id_service_|, |
| 906 // prior to invoking OnHandshakeIOComplete. | 906 // prior to invoking OnHandshakeIOComplete. |
| 907 // Read on the NSS task runner when once OnHandshakeIOComplete is invoked | 907 // Read on the NSS task runner when once OnHandshakeIOComplete is invoked |
| 908 // on the NSS task runner. | 908 // on the NSS task runner. |
| 909 std::string domain_bound_private_key_; | 909 std::string domain_bound_private_key_; |
| 910 std::string domain_bound_cert_; | 910 std::string domain_bound_cert_; |
| 911 | 911 |
| 912 DISALLOW_COPY_AND_ASSIGN(Core); | 912 DISALLOW_COPY_AND_ASSIGN(Core); |
| 913 }; | 913 }; |
| 914 | 914 |
| 915 SSLClientSocketNSS::Core::Core( | 915 SSLClientSocketNSS::Core::Core( |
| 916 base::SequencedTaskRunner* network_task_runner, | 916 base::SequencedTaskRunner* network_task_runner, |
| 917 base::SequencedTaskRunner* nss_task_runner, | 917 base::SequencedTaskRunner* nss_task_runner, |
| 918 ClientSocketHandle* transport, | 918 ClientSocketHandle* transport, |
| 919 const HostPortPair& host_and_port, | 919 const HostPortPair& host_and_port, |
| 920 const SSLConfig& ssl_config, | 920 const SSLConfig& ssl_config, |
| 921 BoundNetLog* net_log, | 921 BoundNetLog* net_log, |
| 922 ServerBoundCertService* server_bound_cert_service) | 922 ChannelIDService* channel_id_service) |
| 923 : detached_(false), | 923 : detached_(false), |
| 924 transport_(transport), | 924 transport_(transport), |
| 925 weak_net_log_factory_(net_log), | 925 weak_net_log_factory_(net_log), |
| 926 server_bound_cert_service_(server_bound_cert_service), | 926 channel_id_service_(channel_id_service), |
| 927 unhandled_buffer_size_(0), | 927 unhandled_buffer_size_(0), |
| 928 nss_waiting_read_(false), | 928 nss_waiting_read_(false), |
| 929 nss_waiting_write_(false), | 929 nss_waiting_write_(false), |
| 930 nss_is_closed_(false), | 930 nss_is_closed_(false), |
| 931 was_ever_used_(false), | 931 was_ever_used_(false), |
| 932 host_and_port_(host_and_port), | 932 host_and_port_(host_and_port), |
| 933 ssl_config_(ssl_config), | 933 ssl_config_(ssl_config), |
| 934 nss_fd_(NULL), | 934 nss_fd_(NULL), |
| 935 nss_bufs_(NULL), | 935 nss_bufs_(NULL), |
| 936 pending_read_result_(kNoPendingReadResult), | 936 pending_read_result_(kNoPendingReadResult), |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1019 this); | 1019 this); |
| 1020 #else | 1020 #else |
| 1021 rv = SSL_GetClientAuthDataHook( | 1021 rv = SSL_GetClientAuthDataHook( |
| 1022 nss_fd_, SSLClientSocketNSS::Core::ClientAuthHandler, this); | 1022 nss_fd_, SSLClientSocketNSS::Core::ClientAuthHandler, this); |
| 1023 #endif | 1023 #endif |
| 1024 if (rv != SECSuccess) { | 1024 if (rv != SECSuccess) { |
| 1025 LogFailedNSSFunction(*weak_net_log_, "SSL_GetClientAuthDataHook", ""); | 1025 LogFailedNSSFunction(*weak_net_log_, "SSL_GetClientAuthDataHook", ""); |
| 1026 return false; | 1026 return false; |
| 1027 } | 1027 } |
| 1028 | 1028 |
| 1029 if (IsChannelIDEnabled(ssl_config_, server_bound_cert_service_)) { | 1029 if (IsChannelIDEnabled(ssl_config_, channel_id_service_)) { |
| 1030 rv = SSL_SetClientChannelIDCallback( | 1030 rv = SSL_SetClientChannelIDCallback( |
| 1031 nss_fd_, SSLClientSocketNSS::Core::ClientChannelIDHandler, this); | 1031 nss_fd_, SSLClientSocketNSS::Core::ClientChannelIDHandler, this); |
| 1032 if (rv != SECSuccess) { | 1032 if (rv != SECSuccess) { |
| 1033 LogFailedNSSFunction( | 1033 LogFailedNSSFunction( |
| 1034 *weak_net_log_, "SSL_SetClientChannelIDCallback", ""); | 1034 *weak_net_log_, "SSL_SetClientChannelIDCallback", ""); |
| 1035 } | 1035 } |
| 1036 } | 1036 } |
| 1037 | 1037 |
| 1038 rv = SSL_SetCanFalseStartCallback( | 1038 rv = SSL_SetCanFalseStartCallback( |
| 1039 nss_fd_, SSLClientSocketNSS::Core::CanFalseStartCallback, this); | 1039 nss_fd_, SSLClientSocketNSS::Core::CanFalseStartCallback, this); |
| (...skipping 1237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2277 core->PostOrRunCallback( | 2277 core->PostOrRunCallback( |
| 2278 FROM_HERE, | 2278 FROM_HERE, |
| 2279 base::Bind(&AddLogEvent, core->weak_net_log_, | 2279 base::Bind(&AddLogEvent, core->weak_net_log_, |
| 2280 NetLog::TYPE_SSL_CHANNEL_ID_REQUESTED)); | 2280 NetLog::TYPE_SSL_CHANNEL_ID_REQUESTED)); |
| 2281 | 2281 |
| 2282 // We have negotiated the TLS channel ID extension. | 2282 // We have negotiated the TLS channel ID extension. |
| 2283 core->channel_id_xtn_negotiated_ = true; | 2283 core->channel_id_xtn_negotiated_ = true; |
| 2284 std::string host = core->host_and_port_.host(); | 2284 std::string host = core->host_and_port_.host(); |
| 2285 int error = ERR_UNEXPECTED; | 2285 int error = ERR_UNEXPECTED; |
| 2286 if (core->OnNetworkTaskRunner()) { | 2286 if (core->OnNetworkTaskRunner()) { |
| 2287 error = core->DoGetDomainBoundCert(host); | 2287 error = core->DoGetChannelID(host); |
| 2288 } else { | 2288 } else { |
| 2289 bool posted = core->network_task_runner_->PostTask( | 2289 bool posted = core->network_task_runner_->PostTask( |
| 2290 FROM_HERE, | 2290 FROM_HERE, |
| 2291 base::Bind( | 2291 base::Bind( |
| 2292 IgnoreResult(&Core::DoGetDomainBoundCert), | 2292 IgnoreResult(&Core::DoGetChannelID), |
| 2293 core, host)); | 2293 core, host)); |
| 2294 error = posted ? ERR_IO_PENDING : ERR_ABORTED; | 2294 error = posted ? ERR_IO_PENDING : ERR_ABORTED; |
| 2295 } | 2295 } |
| 2296 | 2296 |
| 2297 if (error == ERR_IO_PENDING) { | 2297 if (error == ERR_IO_PENDING) { |
| 2298 // Asynchronous case. | 2298 // Asynchronous case. |
| 2299 core->channel_id_needed_ = true; | 2299 core->channel_id_needed_ = true; |
| 2300 return SECWouldBlock; | 2300 return SECWouldBlock; |
| 2301 } | 2301 } |
| 2302 | 2302 |
| (...skipping 27 matching lines...) Expand all Loading... |
| 2330 NULL, | 2330 NULL, |
| 2331 PR_FALSE, | 2331 PR_FALSE, |
| 2332 PR_TRUE)); | 2332 PR_TRUE)); |
| 2333 if (cert == NULL) | 2333 if (cert == NULL) |
| 2334 return MapNSSError(PORT_GetError()); | 2334 return MapNSSError(PORT_GetError()); |
| 2335 | 2335 |
| 2336 crypto::ScopedPK11Slot slot(PK11_GetInternalSlot()); | 2336 crypto::ScopedPK11Slot slot(PK11_GetInternalSlot()); |
| 2337 // Set the private key. | 2337 // Set the private key. |
| 2338 if (!crypto::ECPrivateKey::ImportFromEncryptedPrivateKeyInfo( | 2338 if (!crypto::ECPrivateKey::ImportFromEncryptedPrivateKeyInfo( |
| 2339 slot.get(), | 2339 slot.get(), |
| 2340 ServerBoundCertService::kEPKIPassword, | 2340 ChannelIDService::kEPKIPassword, |
| 2341 reinterpret_cast<const unsigned char*>( | 2341 reinterpret_cast<const unsigned char*>( |
| 2342 domain_bound_private_key_.data()), | 2342 domain_bound_private_key_.data()), |
| 2343 domain_bound_private_key_.size(), | 2343 domain_bound_private_key_.size(), |
| 2344 &cert->subjectPublicKeyInfo, | 2344 &cert->subjectPublicKeyInfo, |
| 2345 false, | 2345 false, |
| 2346 false, | 2346 false, |
| 2347 key, | 2347 key, |
| 2348 public_key)) { | 2348 public_key)) { |
| 2349 int error = MapNSSError(PORT_GetError()); | 2349 int error = MapNSSError(PORT_GetError()); |
| 2350 return error; | 2350 return error; |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2550 ssl_config_.channel_id_enabled, | 2550 ssl_config_.channel_id_enabled, |
| 2551 crypto::ECPrivateKey::IsSupported())); | 2551 crypto::ECPrivateKey::IsSupported())); |
| 2552 } | 2552 } |
| 2553 | 2553 |
| 2554 void SSLClientSocketNSS::Core::RecordChannelIDSupportOnNetworkTaskRunner( | 2554 void SSLClientSocketNSS::Core::RecordChannelIDSupportOnNetworkTaskRunner( |
| 2555 bool negotiated_channel_id, | 2555 bool negotiated_channel_id, |
| 2556 bool channel_id_enabled, | 2556 bool channel_id_enabled, |
| 2557 bool supports_ecc) const { | 2557 bool supports_ecc) const { |
| 2558 DCHECK(OnNetworkTaskRunner()); | 2558 DCHECK(OnNetworkTaskRunner()); |
| 2559 | 2559 |
| 2560 RecordChannelIDSupport(server_bound_cert_service_, | 2560 RecordChannelIDSupport(channel_id_service_, |
| 2561 negotiated_channel_id, | 2561 negotiated_channel_id, |
| 2562 channel_id_enabled, | 2562 channel_id_enabled, |
| 2563 supports_ecc); | 2563 supports_ecc); |
| 2564 } | 2564 } |
| 2565 | 2565 |
| 2566 int SSLClientSocketNSS::Core::DoBufferRecv(IOBuffer* read_buffer, int len) { | 2566 int SSLClientSocketNSS::Core::DoBufferRecv(IOBuffer* read_buffer, int len) { |
| 2567 DCHECK(OnNetworkTaskRunner()); | 2567 DCHECK(OnNetworkTaskRunner()); |
| 2568 DCHECK_GT(len, 0); | 2568 DCHECK_GT(len, 0); |
| 2569 | 2569 |
| 2570 if (detached_) | 2570 if (detached_) |
| (...skipping 29 matching lines...) Expand all Loading... |
| 2600 if (!OnNSSTaskRunner() && rv != ERR_IO_PENDING) { | 2600 if (!OnNSSTaskRunner() && rv != ERR_IO_PENDING) { |
| 2601 nss_task_runner_->PostTask( | 2601 nss_task_runner_->PostTask( |
| 2602 FROM_HERE, | 2602 FROM_HERE, |
| 2603 base::Bind(&Core::BufferSendComplete, this, rv)); | 2603 base::Bind(&Core::BufferSendComplete, this, rv)); |
| 2604 return rv; | 2604 return rv; |
| 2605 } | 2605 } |
| 2606 | 2606 |
| 2607 return rv; | 2607 return rv; |
| 2608 } | 2608 } |
| 2609 | 2609 |
| 2610 int SSLClientSocketNSS::Core::DoGetDomainBoundCert(const std::string& host) { | 2610 int SSLClientSocketNSS::Core::DoGetChannelID(const std::string& host) { |
| 2611 DCHECK(OnNetworkTaskRunner()); | 2611 DCHECK(OnNetworkTaskRunner()); |
| 2612 | 2612 |
| 2613 if (detached_) | 2613 if (detached_) |
| 2614 return ERR_ABORTED; | 2614 return ERR_ABORTED; |
| 2615 | 2615 |
| 2616 weak_net_log_->BeginEvent(NetLog::TYPE_SSL_GET_DOMAIN_BOUND_CERT); | 2616 weak_net_log_->BeginEvent(NetLog::TYPE_SSL_GET_DOMAIN_BOUND_CERT); |
| 2617 | 2617 |
| 2618 int rv = server_bound_cert_service_->GetOrCreateDomainBoundCert( | 2618 int rv = channel_id_service_->GetOrCreateChannelID( |
| 2619 host, | 2619 host, |
| 2620 &domain_bound_private_key_, | 2620 &domain_bound_private_key_, |
| 2621 &domain_bound_cert_, | 2621 &domain_bound_cert_, |
| 2622 base::Bind(&Core::OnGetDomainBoundCertComplete, base::Unretained(this)), | 2622 base::Bind(&Core::OnGetChannelIDComplete, base::Unretained(this)), |
| 2623 &domain_bound_cert_request_handle_); | 2623 &domain_bound_cert_request_handle_); |
| 2624 | 2624 |
| 2625 if (rv != ERR_IO_PENDING && !OnNSSTaskRunner()) { | 2625 if (rv != ERR_IO_PENDING && !OnNSSTaskRunner()) { |
| 2626 nss_task_runner_->PostTask( | 2626 nss_task_runner_->PostTask( |
| 2627 FROM_HERE, | 2627 FROM_HERE, |
| 2628 base::Bind(&Core::OnHandshakeIOComplete, this, rv)); | 2628 base::Bind(&Core::OnHandshakeIOComplete, this, rv)); |
| 2629 return ERR_IO_PENDING; | 2629 return ERR_IO_PENDING; |
| 2630 } | 2630 } |
| 2631 | 2631 |
| 2632 return rv; | 2632 return rv; |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2692 return; | 2692 return; |
| 2693 } | 2693 } |
| 2694 | 2694 |
| 2695 DCHECK(OnNSSTaskRunner()); | 2695 DCHECK(OnNSSTaskRunner()); |
| 2696 | 2696 |
| 2697 int rv = DoHandshakeLoop(result); | 2697 int rv = DoHandshakeLoop(result); |
| 2698 if (rv != ERR_IO_PENDING) | 2698 if (rv != ERR_IO_PENDING) |
| 2699 DoConnectCallback(rv); | 2699 DoConnectCallback(rv); |
| 2700 } | 2700 } |
| 2701 | 2701 |
| 2702 void SSLClientSocketNSS::Core::OnGetDomainBoundCertComplete(int result) { | 2702 void SSLClientSocketNSS::Core::OnGetChannelIDComplete(int result) { |
| 2703 DVLOG(1) << __FUNCTION__ << " " << result; | 2703 DVLOG(1) << __FUNCTION__ << " " << result; |
| 2704 DCHECK(OnNetworkTaskRunner()); | 2704 DCHECK(OnNetworkTaskRunner()); |
| 2705 | 2705 |
| 2706 OnHandshakeIOComplete(result); | 2706 OnHandshakeIOComplete(result); |
| 2707 } | 2707 } |
| 2708 | 2708 |
| 2709 void SSLClientSocketNSS::Core::BufferRecvComplete( | 2709 void SSLClientSocketNSS::Core::BufferRecvComplete( |
| 2710 IOBuffer* read_buffer, | 2710 IOBuffer* read_buffer, |
| 2711 int result) { | 2711 int result) { |
| 2712 DCHECK(read_buffer); | 2712 DCHECK(read_buffer); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2777 scoped_ptr<ClientSocketHandle> transport_socket, | 2777 scoped_ptr<ClientSocketHandle> transport_socket, |
| 2778 const HostPortPair& host_and_port, | 2778 const HostPortPair& host_and_port, |
| 2779 const SSLConfig& ssl_config, | 2779 const SSLConfig& ssl_config, |
| 2780 const SSLClientSocketContext& context) | 2780 const SSLClientSocketContext& context) |
| 2781 : nss_task_runner_(nss_task_runner), | 2781 : nss_task_runner_(nss_task_runner), |
| 2782 transport_(transport_socket.Pass()), | 2782 transport_(transport_socket.Pass()), |
| 2783 host_and_port_(host_and_port), | 2783 host_and_port_(host_and_port), |
| 2784 ssl_config_(ssl_config), | 2784 ssl_config_(ssl_config), |
| 2785 cert_verifier_(context.cert_verifier), | 2785 cert_verifier_(context.cert_verifier), |
| 2786 cert_transparency_verifier_(context.cert_transparency_verifier), | 2786 cert_transparency_verifier_(context.cert_transparency_verifier), |
| 2787 server_bound_cert_service_(context.server_bound_cert_service), | 2787 channel_id_service_(context.channel_id_service), |
| 2788 ssl_session_cache_shard_(context.ssl_session_cache_shard), | 2788 ssl_session_cache_shard_(context.ssl_session_cache_shard), |
| 2789 completed_handshake_(false), | 2789 completed_handshake_(false), |
| 2790 next_handshake_state_(STATE_NONE), | 2790 next_handshake_state_(STATE_NONE), |
| 2791 nss_fd_(NULL), | 2791 nss_fd_(NULL), |
| 2792 net_log_(transport_->socket()->NetLog()), | 2792 net_log_(transport_->socket()->NetLog()), |
| 2793 transport_security_state_(context.transport_security_state), | 2793 transport_security_state_(context.transport_security_state), |
| 2794 valid_thread_id_(base::kInvalidThreadId) { | 2794 valid_thread_id_(base::kInvalidThreadId) { |
| 2795 EnterFunction(""); | 2795 EnterFunction(""); |
| 2796 InitCore(); | 2796 InitCore(); |
| 2797 LeaveFunction(""); | 2797 LeaveFunction(""); |
| (...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3088 return OK; | 3088 return OK; |
| 3089 } | 3089 } |
| 3090 | 3090 |
| 3091 void SSLClientSocketNSS::InitCore() { | 3091 void SSLClientSocketNSS::InitCore() { |
| 3092 core_ = new Core(base::ThreadTaskRunnerHandle::Get().get(), | 3092 core_ = new Core(base::ThreadTaskRunnerHandle::Get().get(), |
| 3093 nss_task_runner_.get(), | 3093 nss_task_runner_.get(), |
| 3094 transport_.get(), | 3094 transport_.get(), |
| 3095 host_and_port_, | 3095 host_and_port_, |
| 3096 ssl_config_, | 3096 ssl_config_, |
| 3097 &net_log_, | 3097 &net_log_, |
| 3098 server_bound_cert_service_); | 3098 channel_id_service_); |
| 3099 } | 3099 } |
| 3100 | 3100 |
| 3101 int SSLClientSocketNSS::InitializeSSLOptions() { | 3101 int SSLClientSocketNSS::InitializeSSLOptions() { |
| 3102 // Transport connected, now hook it up to nss | 3102 // Transport connected, now hook it up to nss |
| 3103 nss_fd_ = memio_CreateIOLayer(kRecvBufferSize, kSendBufferSize); | 3103 nss_fd_ = memio_CreateIOLayer(kRecvBufferSize, kSendBufferSize); |
| 3104 if (nss_fd_ == NULL) { | 3104 if (nss_fd_ == NULL) { |
| 3105 return ERR_OUT_OF_MEMORY; // TODO(port): map NSPR error code. | 3105 return ERR_OUT_OF_MEMORY; // TODO(port): map NSPR error code. |
| 3106 } | 3106 } |
| 3107 | 3107 |
| 3108 // Grab pointer to buffers | 3108 // Grab pointer to buffers |
| (...skipping 475 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3584 SignedCertificateTimestampAndStatus(*iter, | 3584 SignedCertificateTimestampAndStatus(*iter, |
| 3585 ct::SCT_STATUS_LOG_UNKNOWN)); | 3585 ct::SCT_STATUS_LOG_UNKNOWN)); |
| 3586 } | 3586 } |
| 3587 } | 3587 } |
| 3588 | 3588 |
| 3589 scoped_refptr<X509Certificate> | 3589 scoped_refptr<X509Certificate> |
| 3590 SSLClientSocketNSS::GetUnverifiedServerCertificateChain() const { | 3590 SSLClientSocketNSS::GetUnverifiedServerCertificateChain() const { |
| 3591 return core_->state().server_cert.get(); | 3591 return core_->state().server_cert.get(); |
| 3592 } | 3592 } |
| 3593 | 3593 |
| 3594 ServerBoundCertService* SSLClientSocketNSS::GetServerBoundCertService() const { | 3594 ChannelIDService* SSLClientSocketNSS::GetChannelIDService() const { |
| 3595 return server_bound_cert_service_; | 3595 return channel_id_service_; |
| 3596 } | 3596 } |
| 3597 | 3597 |
| 3598 } // namespace net | 3598 } // namespace net |
| OLD | NEW |