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 // OpenSSL binding for SSLClientSocket. The class layout and general principle | 5 // OpenSSL binding for SSLClientSocket. The class layout and general principle |
6 // of operation is derived from SSLClientSocketNSS. | 6 // of operation is derived from SSLClientSocketNSS. |
7 | 7 |
8 #include "net/socket/ssl_client_socket_openssl.h" | 8 #include "net/socket/ssl_client_socket_openssl.h" |
9 | 9 |
10 #include <errno.h> | 10 #include <errno.h> |
11 #include <openssl/bio.h> | 11 #include <openssl/bio.h> |
12 #include <openssl/bytestring.h> | 12 #include <openssl/bytestring.h> |
13 #include <openssl/err.h> | 13 #include <openssl/err.h> |
14 #include <openssl/evp.h> | 14 #include <openssl/evp.h> |
15 #include <openssl/mem.h> | 15 #include <openssl/mem.h> |
16 #include <openssl/ssl.h> | 16 #include <openssl/ssl.h> |
17 #include <string.h> | 17 #include <string.h> |
18 | 18 |
19 #include "base/bind.h" | 19 #include "base/bind.h" |
20 #include "base/callback_helpers.h" | 20 #include "base/callback_helpers.h" |
21 #include "base/lazy_instance.h" | 21 #include "base/lazy_instance.h" |
22 #include "base/memory/singleton.h" | 22 #include "base/memory/singleton.h" |
23 #include "base/metrics/histogram_macros.h" | 23 #include "base/metrics/histogram_macros.h" |
24 #include "base/profiler/scoped_tracker.h" | 24 #include "base/profiler/scoped_tracker.h" |
25 #include "base/stl_util.h" | 25 #include "base/stl_util.h" |
26 #include "base/strings/string_piece.h" | 26 #include "base/strings/string_piece.h" |
27 #include "base/synchronization/lock.h" | 27 #include "base/synchronization/lock.h" |
28 #include "base/threading/sequenced_worker_pool.h" | |
29 #include "base/threading/thread_local.h" | 28 #include "base/threading/thread_local.h" |
30 #include "base/values.h" | 29 #include "base/values.h" |
31 #include "crypto/ec_private_key.h" | 30 #include "crypto/ec_private_key.h" |
32 #include "crypto/openssl_util.h" | 31 #include "crypto/openssl_util.h" |
33 #include "crypto/scoped_openssl_types.h" | 32 #include "crypto/scoped_openssl_types.h" |
34 #include "net/base/ip_address_number.h" | 33 #include "net/base/ip_address_number.h" |
35 #include "net/base/net_errors.h" | 34 #include "net/base/net_errors.h" |
36 #include "net/cert/cert_policy_enforcer.h" | 35 #include "net/cert/cert_policy_enforcer.h" |
37 #include "net/cert/cert_verifier.h" | 36 #include "net/cert/cert_verifier.h" |
38 #include "net/cert/ct_ev_whitelist.h" | 37 #include "net/cert/ct_ev_whitelist.h" |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
171 *hash = SSLPrivateKey::Hash::SHA384; | 170 *hash = SSLPrivateKey::Hash::SHA384; |
172 return true; | 171 return true; |
173 case NID_sha512: | 172 case NID_sha512: |
174 *hash = SSLPrivateKey::Hash::SHA512; | 173 *hash = SSLPrivateKey::Hash::SHA512; |
175 return true; | 174 return true; |
176 default: | 175 default: |
177 return false; | 176 return false; |
178 } | 177 } |
179 } | 178 } |
180 | 179 |
181 #if !defined(OS_NACL) | |
182 class PlatformKeyTaskRunner { | |
183 public: | |
184 PlatformKeyTaskRunner() { | |
185 // Serialize all the private key operations on a single background | |
186 // thread to avoid problems with buggy smartcards. | |
187 worker_pool_ = new base::SequencedWorkerPool(1, "Platform Key Thread"); | |
188 task_runner_ = worker_pool_->GetSequencedTaskRunnerWithShutdownBehavior( | |
189 worker_pool_->GetSequenceToken(), | |
190 base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN); | |
191 } | |
192 | |
193 scoped_refptr<base::SequencedTaskRunner> task_runner() { | |
194 return task_runner_; | |
195 } | |
196 | |
197 private: | |
198 scoped_refptr<base::SequencedWorkerPool> worker_pool_; | |
199 scoped_refptr<base::SequencedTaskRunner> task_runner_; | |
200 | |
201 DISALLOW_COPY_AND_ASSIGN(PlatformKeyTaskRunner); | |
202 }; | |
203 | |
204 base::LazyInstance<PlatformKeyTaskRunner>::Leaky g_platform_key_task_runner = | |
205 LAZY_INSTANCE_INITIALIZER; | |
206 #endif | |
207 | |
208 class ScopedCBB { | 180 class ScopedCBB { |
209 public: | 181 public: |
210 ScopedCBB() { CBB_zero(&cbb_); } | 182 ScopedCBB() { CBB_zero(&cbb_); } |
211 ~ScopedCBB() { CBB_cleanup(&cbb_); } | 183 ~ScopedCBB() { CBB_cleanup(&cbb_); } |
212 | 184 |
213 CBB* get() { return &cbb_; } | 185 CBB* get() { return &cbb_; } |
214 | 186 |
215 private: | 187 private: |
216 CBB cbb_; | 188 CBB cbb_; |
217 DISALLOW_COPY_AND_ASSIGN(ScopedCBB); | 189 DISALLOW_COPY_AND_ASSIGN(ScopedCBB); |
218 }; | 190 }; |
219 | |
220 } // namespace | 191 } // namespace |
221 | 192 |
222 class SSLClientSocketOpenSSL::SSLContext { | 193 class SSLClientSocketOpenSSL::SSLContext { |
223 public: | 194 public: |
224 static SSLContext* GetInstance() { | 195 static SSLContext* GetInstance() { |
225 return base::Singleton<SSLContext>::get(); | 196 return base::Singleton<SSLContext>::get(); |
226 } | 197 } |
227 SSL_CTX* ssl_ctx() { return ssl_ctx_.get(); } | 198 SSL_CTX* ssl_ctx() { return ssl_ctx_.get(); } |
228 SSLClientSessionCacheOpenSSL* session_cache() { return &session_cache_; } | 199 SSLClientSessionCacheOpenSSL* session_cache() { return &session_cache_; } |
229 | 200 |
(...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
672 npn_status_ = kNextProtoUnsupported; | 643 npn_status_ = kNextProtoUnsupported; |
673 npn_proto_.clear(); | 644 npn_proto_.clear(); |
674 | 645 |
675 channel_id_sent_ = false; | 646 channel_id_sent_ = false; |
676 tb_was_negotiated_ = false; | 647 tb_was_negotiated_ = false; |
677 session_pending_ = false; | 648 session_pending_ = false; |
678 certificate_verified_ = false; | 649 certificate_verified_ = false; |
679 channel_id_request_.Cancel(); | 650 channel_id_request_.Cancel(); |
680 ssl_failure_state_ = SSL_FAILURE_NONE; | 651 ssl_failure_state_ = SSL_FAILURE_NONE; |
681 | 652 |
682 private_key_.reset(); | |
683 signature_result_ = kNoPendingResult; | 653 signature_result_ = kNoPendingResult; |
684 signature_.clear(); | 654 signature_.clear(); |
685 } | 655 } |
686 | 656 |
687 bool SSLClientSocketOpenSSL::IsConnected() const { | 657 bool SSLClientSocketOpenSSL::IsConnected() const { |
688 // If the handshake has not yet completed. | 658 // If the handshake has not yet completed. |
689 if (!completed_connect_) | 659 if (!completed_connect_) |
690 return false; | 660 return false; |
691 // If an asynchronous operation is still pending. | 661 // If an asynchronous operation is still pending. |
692 if (user_read_buf_.get() || user_write_buf_.get()) | 662 if (user_read_buf_.get() || user_write_buf_.get()) |
(...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1102 // The server supports channel ID. Stop to look one up before returning to | 1072 // The server supports channel ID. Stop to look one up before returning to |
1103 // the handshake. | 1073 // the handshake. |
1104 GotoState(STATE_CHANNEL_ID_LOOKUP); | 1074 GotoState(STATE_CHANNEL_ID_LOOKUP); |
1105 return OK; | 1075 return OK; |
1106 } | 1076 } |
1107 if (ssl_error == SSL_ERROR_WANT_X509_LOOKUP && | 1077 if (ssl_error == SSL_ERROR_WANT_X509_LOOKUP && |
1108 !ssl_config_.send_client_cert) { | 1078 !ssl_config_.send_client_cert) { |
1109 return ERR_SSL_CLIENT_AUTH_CERT_NEEDED; | 1079 return ERR_SSL_CLIENT_AUTH_CERT_NEEDED; |
1110 } | 1080 } |
1111 if (ssl_error == SSL_ERROR_WANT_PRIVATE_KEY_OPERATION) { | 1081 if (ssl_error == SSL_ERROR_WANT_PRIVATE_KEY_OPERATION) { |
1112 DCHECK(private_key_); | 1082 DCHECK(ssl_config_.client_private_key); |
1113 DCHECK_NE(kNoPendingResult, signature_result_); | 1083 DCHECK_NE(kNoPendingResult, signature_result_); |
1114 GotoState(STATE_HANDSHAKE); | 1084 GotoState(STATE_HANDSHAKE); |
1115 return ERR_IO_PENDING; | 1085 return ERR_IO_PENDING; |
1116 } | 1086 } |
1117 | 1087 |
1118 OpenSSLErrorInfo error_info; | 1088 OpenSSLErrorInfo error_info; |
1119 net_error = MapOpenSSLErrorWithDetails(ssl_error, err_tracer, &error_info); | 1089 net_error = MapOpenSSLErrorWithDetails(ssl_error, err_tracer, &error_info); |
1120 if (net_error == ERR_IO_PENDING) { | 1090 if (net_error == ERR_IO_PENDING) { |
1121 // If not done, stay in this state | 1091 // If not done, stay in this state |
1122 GotoState(STATE_HANDSHAKE); | 1092 GotoState(STATE_HANDSHAKE); |
(...skipping 450 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1573 // error, so it does not occur. The second and third are distinguished by | 1543 // error, so it does not occur. The second and third are distinguished by |
1574 // SSL_ERROR_ZERO_RETURN. | 1544 // SSL_ERROR_ZERO_RETURN. |
1575 pending_read_ssl_error_ = SSL_get_error(ssl_, ssl_ret); | 1545 pending_read_ssl_error_ = SSL_get_error(ssl_, ssl_ret); |
1576 if (pending_read_ssl_error_ == SSL_ERROR_ZERO_RETURN) { | 1546 if (pending_read_ssl_error_ == SSL_ERROR_ZERO_RETURN) { |
1577 pending_read_error_ = 0; | 1547 pending_read_error_ = 0; |
1578 } else if (pending_read_ssl_error_ == SSL_ERROR_WANT_X509_LOOKUP && | 1548 } else if (pending_read_ssl_error_ == SSL_ERROR_WANT_X509_LOOKUP && |
1579 !ssl_config_.send_client_cert) { | 1549 !ssl_config_.send_client_cert) { |
1580 pending_read_error_ = ERR_SSL_CLIENT_AUTH_CERT_NEEDED; | 1550 pending_read_error_ = ERR_SSL_CLIENT_AUTH_CERT_NEEDED; |
1581 } else if (pending_read_ssl_error_ == | 1551 } else if (pending_read_ssl_error_ == |
1582 SSL_ERROR_WANT_PRIVATE_KEY_OPERATION) { | 1552 SSL_ERROR_WANT_PRIVATE_KEY_OPERATION) { |
1583 DCHECK(private_key_); | 1553 DCHECK(ssl_config_.client_private_key); |
1584 DCHECK_NE(kNoPendingResult, signature_result_); | 1554 DCHECK_NE(kNoPendingResult, signature_result_); |
1585 pending_read_error_ = ERR_IO_PENDING; | 1555 pending_read_error_ = ERR_IO_PENDING; |
1586 } else { | 1556 } else { |
1587 pending_read_error_ = MapOpenSSLErrorWithDetails( | 1557 pending_read_error_ = MapOpenSSLErrorWithDetails( |
1588 pending_read_ssl_error_, err_tracer, &pending_read_error_info_); | 1558 pending_read_ssl_error_, err_tracer, &pending_read_error_info_); |
1589 } | 1559 } |
1590 | 1560 |
1591 // Many servers do not reliably send a close_notify alert when shutting down | 1561 // Many servers do not reliably send a close_notify alert when shutting down |
1592 // a connection, and instead terminate the TCP connection. This is reported | 1562 // a connection, and instead terminate the TCP connection. This is reported |
1593 // as ERR_CONNECTION_CLOSED. Because of this, map the unclean shutdown to a | 1563 // as ERR_CONNECTION_CLOSED. Because of this, map the unclean shutdown to a |
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1863 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_BAD_FORMAT); | 1833 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_BAD_FORMAT); |
1864 return -1; | 1834 return -1; |
1865 } | 1835 } |
1866 | 1836 |
1867 if (!SSL_use_certificate(ssl_, leaf_x509.get()) || | 1837 if (!SSL_use_certificate(ssl_, leaf_x509.get()) || |
1868 !SSL_set1_chain(ssl_, chain.get())) { | 1838 !SSL_set1_chain(ssl_, chain.get())) { |
1869 LOG(WARNING) << "Failed to set client certificate"; | 1839 LOG(WARNING) << "Failed to set client certificate"; |
1870 return -1; | 1840 return -1; |
1871 } | 1841 } |
1872 | 1842 |
1873 #if defined(OS_NACL) | 1843 if (!ssl_config_.client_private_key) { |
1874 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_NO_PRIVATE_KEY); | 1844 // The caller supplied a null private key. Fail the handshake and surface |
1875 return -1; | 1845 // an appropriate error to the caller. |
1876 #else | |
1877 // TODO(davidben): Lift this call up to the embedder so we can actually test | |
1878 // this code. https://crbug.com/394131 | |
1879 private_key_ = FetchClientCertPrivateKey( | |
1880 ssl_config_.client_cert.get(), | |
1881 g_platform_key_task_runner.Get().task_runner()); | |
1882 if (!private_key_) { | |
1883 // Could not find the private key. Fail the handshake and surface an | |
1884 // appropriate error to the caller. | |
1885 LOG(WARNING) << "Client cert found without private key"; | 1846 LOG(WARNING) << "Client cert found without private key"; |
1886 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_NO_PRIVATE_KEY); | 1847 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_NO_PRIVATE_KEY); |
1887 return -1; | 1848 return -1; |
1888 } | 1849 } |
1889 | 1850 |
1890 SSL_set_private_key_method(ssl_, &SSLContext::kPrivateKeyMethod); | 1851 SSL_set_private_key_method(ssl_, &SSLContext::kPrivateKeyMethod); |
1891 | 1852 |
1892 std::vector<SSLPrivateKey::Hash> digest_prefs = | 1853 std::vector<SSLPrivateKey::Hash> digest_prefs = |
1893 private_key_->GetDigestPreferences(); | 1854 ssl_config_.client_private_key->GetDigestPreferences(); |
1894 | 1855 |
1895 size_t digests_len = digest_prefs.size(); | 1856 size_t digests_len = digest_prefs.size(); |
1896 std::vector<int> digests; | 1857 std::vector<int> digests; |
1897 for (size_t i = 0; i < digests_len; i++) { | 1858 for (size_t i = 0; i < digests_len; i++) { |
1898 switch (digest_prefs[i]) { | 1859 switch (digest_prefs[i]) { |
1899 case SSLPrivateKey::Hash::SHA1: | 1860 case SSLPrivateKey::Hash::SHA1: |
1900 digests.push_back(NID_sha1); | 1861 digests.push_back(NID_sha1); |
1901 break; | 1862 break; |
1902 case SSLPrivateKey::Hash::SHA256: | 1863 case SSLPrivateKey::Hash::SHA256: |
1903 digests.push_back(NID_sha256); | 1864 digests.push_back(NID_sha256); |
1904 break; | 1865 break; |
1905 case SSLPrivateKey::Hash::SHA384: | 1866 case SSLPrivateKey::Hash::SHA384: |
1906 digests.push_back(NID_sha384); | 1867 digests.push_back(NID_sha384); |
1907 break; | 1868 break; |
1908 case SSLPrivateKey::Hash::SHA512: | 1869 case SSLPrivateKey::Hash::SHA512: |
1909 digests.push_back(NID_sha512); | 1870 digests.push_back(NID_sha512); |
1910 break; | 1871 break; |
1911 case SSLPrivateKey::Hash::MD5_SHA1: | 1872 case SSLPrivateKey::Hash::MD5_SHA1: |
1912 // MD5-SHA1 is not used in TLS 1.2. | 1873 // MD5-SHA1 is not used in TLS 1.2. |
1913 break; | 1874 break; |
1914 } | 1875 } |
1915 } | 1876 } |
1916 | 1877 |
1917 SSL_set_private_key_digest_prefs(ssl_, vector_as_array(&digests), | 1878 SSL_set_private_key_digest_prefs(ssl_, vector_as_array(&digests), |
1918 digests.size()); | 1879 digests.size()); |
1919 #endif // !OS_NACL | |
1920 | 1880 |
1921 int cert_count = 1 + sk_X509_num(chain.get()); | 1881 int cert_count = 1 + sk_X509_num(chain.get()); |
1922 net_log_.AddEvent(NetLog::TYPE_SSL_CLIENT_CERT_PROVIDED, | 1882 net_log_.AddEvent(NetLog::TYPE_SSL_CLIENT_CERT_PROVIDED, |
1923 NetLog::IntCallback("cert_count", cert_count)); | 1883 NetLog::IntCallback("cert_count", cert_count)); |
1924 return 1; | 1884 return 1; |
1925 } | 1885 } |
1926 #endif // defined(OS_IOS) | 1886 #endif // defined(OS_IOS) |
1927 | 1887 |
1928 // Send no client certificate. | 1888 // Send no client certificate. |
1929 net_log_.AddEvent(NetLog::TYPE_SSL_CLIENT_CERT_PROVIDED, | 1889 net_log_.AddEvent(NetLog::TYPE_SSL_CLIENT_CERT_PROVIDED, |
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2143 | 2103 |
2144 NextProto next_proto = NextProtoFromString(npn_proto_); | 2104 NextProto next_proto = NextProtoFromString(npn_proto_); |
2145 for (NextProto allowed : ssl_config_.renego_allowed_for_protos) { | 2105 for (NextProto allowed : ssl_config_.renego_allowed_for_protos) { |
2146 if (next_proto == allowed) | 2106 if (next_proto == allowed) |
2147 return true; | 2107 return true; |
2148 } | 2108 } |
2149 return false; | 2109 return false; |
2150 } | 2110 } |
2151 | 2111 |
2152 int SSLClientSocketOpenSSL::PrivateKeyTypeCallback() { | 2112 int SSLClientSocketOpenSSL::PrivateKeyTypeCallback() { |
2153 switch (private_key_->GetType()) { | 2113 switch (ssl_config_.client_private_key->GetType()) { |
2154 case SSLPrivateKey::Type::RSA: | 2114 case SSLPrivateKey::Type::RSA: |
2155 return EVP_PKEY_RSA; | 2115 return EVP_PKEY_RSA; |
2156 case SSLPrivateKey::Type::ECDSA: | 2116 case SSLPrivateKey::Type::ECDSA: |
2157 return EVP_PKEY_EC; | 2117 return EVP_PKEY_EC; |
2158 } | 2118 } |
2159 NOTREACHED(); | 2119 NOTREACHED(); |
2160 return EVP_PKEY_NONE; | 2120 return EVP_PKEY_NONE; |
2161 } | 2121 } |
2162 | 2122 |
2163 size_t SSLClientSocketOpenSSL::PrivateKeyMaxSignatureLenCallback() { | 2123 size_t SSLClientSocketOpenSSL::PrivateKeyMaxSignatureLenCallback() { |
2164 return private_key_->GetMaxSignatureLengthInBytes(); | 2124 return ssl_config_.client_private_key->GetMaxSignatureLengthInBytes(); |
2165 } | 2125 } |
2166 | 2126 |
2167 ssl_private_key_result_t SSLClientSocketOpenSSL::PrivateKeySignCallback( | 2127 ssl_private_key_result_t SSLClientSocketOpenSSL::PrivateKeySignCallback( |
2168 uint8_t* out, | 2128 uint8_t* out, |
2169 size_t* out_len, | 2129 size_t* out_len, |
2170 size_t max_out, | 2130 size_t max_out, |
2171 const EVP_MD* md, | 2131 const EVP_MD* md, |
2172 const uint8_t* in, | 2132 const uint8_t* in, |
2173 size_t in_len) { | 2133 size_t in_len) { |
2174 DCHECK_EQ(kNoPendingResult, signature_result_); | 2134 DCHECK_EQ(kNoPendingResult, signature_result_); |
2175 DCHECK(signature_.empty()); | 2135 DCHECK(signature_.empty()); |
2176 DCHECK(private_key_); | 2136 DCHECK(ssl_config_.client_private_key); |
2177 | 2137 |
2178 net_log_.BeginEvent(NetLog::TYPE_SSL_PRIVATE_KEY_OPERATION); | 2138 net_log_.BeginEvent(NetLog::TYPE_SSL_PRIVATE_KEY_OPERATION); |
2179 | 2139 |
2180 SSLPrivateKey::Hash hash; | 2140 SSLPrivateKey::Hash hash; |
2181 if (!EVP_MDToPrivateKeyHash(md, &hash)) { | 2141 if (!EVP_MDToPrivateKeyHash(md, &hash)) { |
2182 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED); | 2142 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED); |
2183 return ssl_private_key_failure; | 2143 return ssl_private_key_failure; |
2184 } | 2144 } |
2185 | 2145 |
2186 signature_result_ = ERR_IO_PENDING; | 2146 signature_result_ = ERR_IO_PENDING; |
2187 private_key_->SignDigest( | 2147 ssl_config_.client_private_key->SignDigest( |
2188 hash, base::StringPiece(reinterpret_cast<const char*>(in), in_len), | 2148 hash, base::StringPiece(reinterpret_cast<const char*>(in), in_len), |
2189 base::Bind(&SSLClientSocketOpenSSL::OnPrivateKeySignComplete, | 2149 base::Bind(&SSLClientSocketOpenSSL::OnPrivateKeySignComplete, |
2190 weak_factory_.GetWeakPtr())); | 2150 weak_factory_.GetWeakPtr())); |
2191 return ssl_private_key_retry; | 2151 return ssl_private_key_retry; |
2192 } | 2152 } |
2193 | 2153 |
2194 ssl_private_key_result_t SSLClientSocketOpenSSL::PrivateKeySignCompleteCallback( | 2154 ssl_private_key_result_t SSLClientSocketOpenSSL::PrivateKeySignCompleteCallback( |
2195 uint8_t* out, | 2155 uint8_t* out, |
2196 size_t* out_len, | 2156 size_t* out_len, |
2197 size_t max_out) { | 2157 size_t max_out) { |
2198 DCHECK_NE(kNoPendingResult, signature_result_); | 2158 DCHECK_NE(kNoPendingResult, signature_result_); |
2199 DCHECK(private_key_); | 2159 DCHECK(ssl_config_.client_private_key); |
2200 | 2160 |
2201 if (signature_result_ == ERR_IO_PENDING) | 2161 if (signature_result_ == ERR_IO_PENDING) |
2202 return ssl_private_key_retry; | 2162 return ssl_private_key_retry; |
2203 if (signature_result_ != OK) { | 2163 if (signature_result_ != OK) { |
2204 OpenSSLPutNetError(FROM_HERE, signature_result_); | 2164 OpenSSLPutNetError(FROM_HERE, signature_result_); |
2205 return ssl_private_key_failure; | 2165 return ssl_private_key_failure; |
2206 } | 2166 } |
2207 if (signature_.size() > max_out) { | 2167 if (signature_.size() > max_out) { |
2208 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED); | 2168 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED); |
2209 return ssl_private_key_failure; | 2169 return ssl_private_key_failure; |
2210 } | 2170 } |
2211 memcpy(out, vector_as_array(&signature_), signature_.size()); | 2171 memcpy(out, vector_as_array(&signature_), signature_.size()); |
2212 *out_len = signature_.size(); | 2172 *out_len = signature_.size(); |
2213 signature_.clear(); | 2173 signature_.clear(); |
2214 return ssl_private_key_success; | 2174 return ssl_private_key_success; |
2215 } | 2175 } |
2216 | 2176 |
2217 void SSLClientSocketOpenSSL::OnPrivateKeySignComplete( | 2177 void SSLClientSocketOpenSSL::OnPrivateKeySignComplete( |
2218 Error error, | 2178 Error error, |
2219 const std::vector<uint8_t>& signature) { | 2179 const std::vector<uint8_t>& signature) { |
2220 DCHECK_EQ(ERR_IO_PENDING, signature_result_); | 2180 DCHECK_EQ(ERR_IO_PENDING, signature_result_); |
2221 DCHECK(signature_.empty()); | 2181 DCHECK(signature_.empty()); |
2222 DCHECK(private_key_); | 2182 DCHECK(ssl_config_.client_private_key); |
2223 | 2183 |
2224 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_PRIVATE_KEY_OPERATION, | 2184 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_PRIVATE_KEY_OPERATION, |
2225 error); | 2185 error); |
2226 | 2186 |
2227 signature_result_ = error; | 2187 signature_result_ = error; |
2228 if (signature_result_ == OK) | 2188 if (signature_result_ == OK) |
2229 signature_ = signature; | 2189 signature_ = signature; |
2230 | 2190 |
2231 if (next_handshake_state_ == STATE_HANDSHAKE) { | 2191 if (next_handshake_state_ == STATE_HANDSHAKE) { |
2232 OnHandshakeIOComplete(signature_result_); | 2192 OnHandshakeIOComplete(signature_result_); |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2311 tb_was_negotiated_ = true; | 2271 tb_was_negotiated_ = true; |
2312 return 1; | 2272 return 1; |
2313 } | 2273 } |
2314 } | 2274 } |
2315 | 2275 |
2316 *out_alert_value = SSL_AD_ILLEGAL_PARAMETER; | 2276 *out_alert_value = SSL_AD_ILLEGAL_PARAMETER; |
2317 return 0; | 2277 return 0; |
2318 } | 2278 } |
2319 | 2279 |
2320 } // namespace net | 2280 } // namespace net |
OLD | NEW |