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

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

Issue 1422573008: Plumbing SSLPrivateKey (//net) (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Removing un-needed forward decl. Created 5 years, 1 month 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 // 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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « net/socket/ssl_client_socket_openssl.h ('k') | net/socket/ssl_client_socket_openssl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698