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/err.h> | 12 #include <openssl/err.h> |
13 #include <openssl/ssl.h> | 13 #include <openssl/ssl.h> |
14 | 14 |
15 #include "base/bind.h" | 15 #include "base/bind.h" |
16 #include "base/callback_helpers.h" | 16 #include "base/callback_helpers.h" |
17 #include "base/environment.h" | 17 #include "base/environment.h" |
18 #include "base/memory/singleton.h" | 18 #include "base/memory/singleton.h" |
19 #include "base/metrics/histogram.h" | 19 #include "base/metrics/histogram.h" |
20 #include "base/strings/string_piece.h" | 20 #include "base/strings/string_piece.h" |
21 #include "base/synchronization/lock.h" | 21 #include "base/synchronization/lock.h" |
22 #include "crypto/ec_private_key.h" | 22 #include "crypto/ec_private_key.h" |
23 #include "crypto/openssl_util.h" | 23 #include "crypto/openssl_util.h" |
24 #include "crypto/scoped_openssl_types.h" | 24 #include "crypto/scoped_openssl_types.h" |
25 #include "net/base/net_errors.h" | 25 #include "net/base/net_errors.h" |
26 #include "net/cert/cert_verifier.h" | 26 #include "net/cert/cert_verifier.h" |
27 #include "net/cert/ct_verifier.h" | 27 #include "net/cert/ct_verifier.h" |
28 #include "net/cert/single_request_cert_verifier.h" | 28 #include "net/cert/single_request_cert_verifier.h" |
29 #include "net/cert/x509_certificate_net_log_param.h" | 29 #include "net/cert/x509_certificate_net_log_param.h" |
| 30 #include "net/cert/x509_util_openssl.h" |
30 #include "net/http/transport_security_state.h" | 31 #include "net/http/transport_security_state.h" |
31 #include "net/socket/ssl_session_cache_openssl.h" | 32 #include "net/socket/ssl_session_cache_openssl.h" |
32 #include "net/ssl/openssl_ssl_util.h" | 33 #include "net/ssl/openssl_ssl_util.h" |
33 #include "net/ssl/ssl_cert_request_info.h" | 34 #include "net/ssl/ssl_cert_request_info.h" |
34 #include "net/ssl/ssl_connection_status_flags.h" | 35 #include "net/ssl/ssl_connection_status_flags.h" |
35 #include "net/ssl/ssl_info.h" | 36 #include "net/ssl/ssl_info.h" |
36 | 37 |
37 #if defined(OS_WIN) | 38 #if defined(OS_WIN) |
38 #include "base/win/windows_version.h" | 39 #include "base/win/windows_version.h" |
39 #endif | 40 #endif |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
244 ~PeerCertificateChain() {} | 245 ~PeerCertificateChain() {} |
245 PeerCertificateChain& operator=(const PeerCertificateChain& other); | 246 PeerCertificateChain& operator=(const PeerCertificateChain& other); |
246 | 247 |
247 // Resets the PeerCertificateChain to the set of certificates in|chain|, | 248 // Resets the PeerCertificateChain to the set of certificates in|chain|, |
248 // which may be NULL, indicating to empty the store certificates. | 249 // which may be NULL, indicating to empty the store certificates. |
249 // Note: If an error occurs, such as being unable to parse the certificates, | 250 // Note: If an error occurs, such as being unable to parse the certificates, |
250 // this will behave as if Reset(NULL) was called. | 251 // this will behave as if Reset(NULL) was called. |
251 void Reset(STACK_OF(X509)* chain); | 252 void Reset(STACK_OF(X509)* chain); |
252 | 253 |
253 // Note that when USE_OPENSSL is defined, OSCertHandle is X509* | 254 // Note that when USE_OPENSSL is defined, OSCertHandle is X509* |
254 const scoped_refptr<X509Certificate>& AsOSChain() const { return os_chain_; } | 255 scoped_refptr<X509Certificate> AsOSChain() const; |
255 | 256 |
256 size_t size() const { | 257 size_t size() const { |
257 if (!openssl_chain_.get()) | 258 if (!openssl_chain_.get()) |
258 return 0; | 259 return 0; |
259 return sk_X509_num(openssl_chain_.get()); | 260 return sk_X509_num(openssl_chain_.get()); |
260 } | 261 } |
261 | 262 |
262 X509* operator[](size_t index) const { | 263 bool empty() const { |
| 264 return size() == 0; |
| 265 } |
| 266 |
| 267 X509* Get(size_t index) const { |
263 DCHECK_LT(index, size()); | 268 DCHECK_LT(index, size()); |
264 return sk_X509_value(openssl_chain_.get(), index); | 269 return sk_X509_value(openssl_chain_.get(), index); |
265 } | 270 } |
266 | 271 |
267 bool IsValid() { return os_chain_.get() && openssl_chain_.get(); } | |
268 | |
269 private: | 272 private: |
270 ScopedX509Stack openssl_chain_; | 273 ScopedX509Stack openssl_chain_; |
271 | |
272 scoped_refptr<X509Certificate> os_chain_; | |
273 }; | 274 }; |
274 | 275 |
275 SSLClientSocketOpenSSL::PeerCertificateChain& | 276 SSLClientSocketOpenSSL::PeerCertificateChain& |
276 SSLClientSocketOpenSSL::PeerCertificateChain::operator=( | 277 SSLClientSocketOpenSSL::PeerCertificateChain::operator=( |
277 const PeerCertificateChain& other) { | 278 const PeerCertificateChain& other) { |
278 if (this == &other) | 279 if (this == &other) |
279 return *this; | 280 return *this; |
280 | 281 |
281 // os_chain_ is reference counted by scoped_refptr; | |
282 os_chain_ = other.os_chain_; | |
283 | |
284 openssl_chain_.reset(X509_chain_up_ref(other.openssl_chain_.get())); | 282 openssl_chain_.reset(X509_chain_up_ref(other.openssl_chain_.get())); |
285 | |
286 return *this; | 283 return *this; |
287 } | 284 } |
288 | 285 |
289 #if defined(USE_OPENSSL_CERTS) | |
290 // When OSCertHandle is typedef'ed to X509, this implementation does a short cut | |
291 // to avoid converting back and forth between der and X509 struct. | |
292 void SSLClientSocketOpenSSL::PeerCertificateChain::Reset( | 286 void SSLClientSocketOpenSSL::PeerCertificateChain::Reset( |
293 STACK_OF(X509)* chain) { | 287 STACK_OF(X509)* chain) { |
294 openssl_chain_.reset(NULL); | 288 openssl_chain_.reset(chain ? X509_chain_up_ref(chain) : NULL); |
295 os_chain_ = NULL; | 289 } |
296 | 290 |
297 if (!chain) | 291 scoped_refptr<X509Certificate> |
298 return; | 292 SSLClientSocketOpenSSL::PeerCertificateChain::AsOSChain() const { |
| 293 #if defined(USE_OPENSSL_CERTS) |
| 294 // When OSCertHandle is typedef'ed to X509, this implementation does a short |
| 295 // cut to avoid converting back and forth between DER and the X509 struct. |
| 296 X509Certificate::OSCertHandles intermediates; |
| 297 for (size_t i = 1; i < sk_X509_num(openssl_chain_.get()); ++i) { |
| 298 intermediates.push_back(sk_X509_value(openssl_chain_.get(), i)); |
| 299 } |
299 | 300 |
300 X509Certificate::OSCertHandles intermediates; | 301 return make_scoped_refptr(X509Certificate::CreateFromHandle( |
301 for (size_t i = 1; i < sk_X509_num(chain); ++i) | 302 sk_X509_value(openssl_chain_.get(), 0), intermediates)); |
302 intermediates.push_back(sk_X509_value(chain, i)); | 303 #else |
303 | 304 // DER-encode the chain and convert to a platform certificate handle. |
304 os_chain_ = | |
305 X509Certificate::CreateFromHandle(sk_X509_value(chain, 0), intermediates); | |
306 | |
307 openssl_chain_.reset(X509_chain_up_ref(chain)); | |
308 } | |
309 #else // !defined(USE_OPENSSL_CERTS) | |
310 void SSLClientSocketOpenSSL::PeerCertificateChain::Reset( | |
311 STACK_OF(X509)* chain) { | |
312 openssl_chain_.reset(NULL); | |
313 os_chain_ = NULL; | |
314 | |
315 if (!chain) | |
316 return; | |
317 | |
318 openssl_chain_.reset(X509_chain_up_ref(chain)); | |
319 | |
320 std::vector<base::StringPiece> der_chain; | 305 std::vector<base::StringPiece> der_chain; |
321 for (size_t i = 0; i < sk_X509_num(openssl_chain_.get()); ++i) { | 306 for (size_t i = 0; i < sk_X509_num(openssl_chain_.get()); ++i) { |
322 X509* x = sk_X509_value(openssl_chain_.get(), i); | 307 X509* x = sk_X509_value(openssl_chain_.get(), i); |
323 | 308 base::StringPiece der; |
324 unsigned char* cert_data = NULL; | 309 if (!x509_util::GetDER(x, &der)) |
325 int cert_data_length = i2d_X509(x, &cert_data); | 310 return NULL; |
326 if (cert_data_length && cert_data) | 311 der_chain.push_back(der); |
327 der_chain.push_back(base::StringPiece(reinterpret_cast<char*>(cert_data), | |
328 cert_data_length)); | |
329 } | 312 } |
330 | 313 |
331 os_chain_ = X509Certificate::CreateFromDERCertChain(der_chain); | 314 return make_scoped_refptr(X509Certificate::CreateFromDERCertChain(der_chain)); |
332 | 315 #endif |
333 for (size_t i = 0; i < der_chain.size(); ++i) { | |
334 OPENSSL_free(const_cast<char*>(der_chain[i].data())); | |
335 } | |
336 | |
337 if (der_chain.size() != | |
338 static_cast<size_t>(sk_X509_num(openssl_chain_.get()))) { | |
339 openssl_chain_.reset(NULL); | |
340 os_chain_ = NULL; | |
341 } | |
342 } | 316 } |
343 #endif // defined(USE_OPENSSL_CERTS) | |
344 | 317 |
345 // static | 318 // static |
346 SSLSessionCacheOpenSSL::Config | 319 SSLSessionCacheOpenSSL::Config |
347 SSLClientSocketOpenSSL::SSLContext::kDefaultSessionCacheConfig = { | 320 SSLClientSocketOpenSSL::SSLContext::kDefaultSessionCacheConfig = { |
348 &GetSessionCacheKey, // key_func | 321 &GetSessionCacheKey, // key_func |
349 1024, // max_entries | 322 1024, // max_entries |
350 256, // expiration_check_count | 323 256, // expiration_check_count |
351 60 * 60, // timeout_seconds | 324 60 * 60, // timeout_seconds |
352 }; | 325 }; |
353 | 326 |
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
606 bool SSLClientSocketOpenSSL::UsingTCPFastOpen() const { | 579 bool SSLClientSocketOpenSSL::UsingTCPFastOpen() const { |
607 if (transport_.get() && transport_->socket()) | 580 if (transport_.get() && transport_->socket()) |
608 return transport_->socket()->UsingTCPFastOpen(); | 581 return transport_->socket()->UsingTCPFastOpen(); |
609 | 582 |
610 NOTREACHED(); | 583 NOTREACHED(); |
611 return false; | 584 return false; |
612 } | 585 } |
613 | 586 |
614 bool SSLClientSocketOpenSSL::GetSSLInfo(SSLInfo* ssl_info) { | 587 bool SSLClientSocketOpenSSL::GetSSLInfo(SSLInfo* ssl_info) { |
615 ssl_info->Reset(); | 588 ssl_info->Reset(); |
616 if (!server_cert_.get()) | 589 if (server_cert_chain_->empty()) |
617 return false; | 590 return false; |
618 | 591 |
619 ssl_info->cert = server_cert_verify_result_.verified_cert; | 592 ssl_info->cert = server_cert_verify_result_.verified_cert; |
620 ssl_info->cert_status = server_cert_verify_result_.cert_status; | 593 ssl_info->cert_status = server_cert_verify_result_.cert_status; |
621 ssl_info->is_issued_by_known_root = | 594 ssl_info->is_issued_by_known_root = |
622 server_cert_verify_result_.is_issued_by_known_root; | 595 server_cert_verify_result_.is_issued_by_known_root; |
623 ssl_info->public_key_hashes = | 596 ssl_info->public_key_hashes = |
624 server_cert_verify_result_.public_key_hashes; | 597 server_cert_verify_result_.public_key_hashes; |
625 ssl_info->client_cert_sent = | 598 ssl_info->client_cert_sent = |
626 ssl_config_.send_client_cert && ssl_config_.client_cert.get(); | 599 ssl_config_.send_client_cert && ssl_config_.client_cert.get(); |
(...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
954 size_t ocsp_response_len; | 927 size_t ocsp_response_len; |
955 SSL_get0_ocsp_response(ssl_, &ocsp_response, &ocsp_response_len); | 928 SSL_get0_ocsp_response(ssl_, &ocsp_response, &ocsp_response_len); |
956 set_stapled_ocsp_response_received(ocsp_response_len != 0); | 929 set_stapled_ocsp_response_received(ocsp_response_len != 0); |
957 | 930 |
958 uint8_t* sct_list; | 931 uint8_t* sct_list; |
959 size_t sct_list_len; | 932 size_t sct_list_len; |
960 SSL_get0_signed_cert_timestamp_list(ssl_, &sct_list, &sct_list_len); | 933 SSL_get0_signed_cert_timestamp_list(ssl_, &sct_list, &sct_list_len); |
961 set_signed_cert_timestamps_received(sct_list_len != 0); | 934 set_signed_cert_timestamps_received(sct_list_len != 0); |
962 | 935 |
963 // Verify the certificate. | 936 // Verify the certificate. |
964 const bool got_cert = !!UpdateServerCert(); | 937 UpdateServerCert(); |
965 DCHECK(got_cert); | |
966 net_log_.AddEvent( | |
967 NetLog::TYPE_SSL_CERTIFICATES_RECEIVED, | |
968 base::Bind(&NetLogX509CertificateCallback, | |
969 base::Unretained(server_cert_.get()))); | |
970 GotoState(STATE_VERIFY_CERT); | 938 GotoState(STATE_VERIFY_CERT); |
971 } else { | 939 } else { |
972 int ssl_error = SSL_get_error(ssl_, rv); | 940 int ssl_error = SSL_get_error(ssl_, rv); |
973 | 941 |
974 if (ssl_error == SSL_ERROR_WANT_CHANNEL_ID_LOOKUP) { | 942 if (ssl_error == SSL_ERROR_WANT_CHANNEL_ID_LOOKUP) { |
975 // The server supports channel ID. Stop to look one up before returning to | 943 // The server supports channel ID. Stop to look one up before returning to |
976 // the handshake. | 944 // the handshake. |
977 channel_id_xtn_negotiated_ = true; | 945 channel_id_xtn_negotiated_ = true; |
978 GotoState(STATE_CHANNEL_ID_LOOKUP); | 946 GotoState(STATE_CHANNEL_ID_LOOKUP); |
979 return OK; | 947 return OK; |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1042 return MapOpenSSLError(err, err_tracer); | 1010 return MapOpenSSLError(err, err_tracer); |
1043 } | 1011 } |
1044 | 1012 |
1045 // Return to the handshake. | 1013 // Return to the handshake. |
1046 set_channel_id_sent(true); | 1014 set_channel_id_sent(true); |
1047 GotoState(STATE_HANDSHAKE); | 1015 GotoState(STATE_HANDSHAKE); |
1048 return OK; | 1016 return OK; |
1049 } | 1017 } |
1050 | 1018 |
1051 int SSLClientSocketOpenSSL::DoVerifyCert(int result) { | 1019 int SSLClientSocketOpenSSL::DoVerifyCert(int result) { |
1052 DCHECK(server_cert_.get()); | 1020 DCHECK(!server_cert_chain_->empty()); |
1053 DCHECK(start_cert_verification_time_.is_null()); | 1021 DCHECK(start_cert_verification_time_.is_null()); |
| 1022 |
1054 GotoState(STATE_VERIFY_CERT_COMPLETE); | 1023 GotoState(STATE_VERIFY_CERT_COMPLETE); |
1055 | 1024 |
| 1025 // If the certificate is bad and has been previously accepted, use |
| 1026 // the previous status and bypass the error. |
| 1027 base::StringPiece der_cert; |
| 1028 if (!x509_util::GetDER(server_cert_chain_->Get(0), &der_cert)) { |
| 1029 NOTREACHED(); |
| 1030 return ERR_CERT_INVALID; |
| 1031 } |
1056 CertStatus cert_status; | 1032 CertStatus cert_status; |
1057 if (ssl_config_.IsAllowedBadCert(server_cert_.get(), &cert_status)) { | 1033 if (ssl_config_.IsAllowedBadCert(der_cert, &cert_status)) { |
1058 VLOG(1) << "Received an expected bad cert with status: " << cert_status; | 1034 VLOG(1) << "Received an expected bad cert with status: " << cert_status; |
1059 server_cert_verify_result_.Reset(); | 1035 server_cert_verify_result_.Reset(); |
1060 server_cert_verify_result_.cert_status = cert_status; | 1036 server_cert_verify_result_.cert_status = cert_status; |
1061 server_cert_verify_result_.verified_cert = server_cert_; | 1037 server_cert_verify_result_.verified_cert = server_cert_; |
1062 return OK; | 1038 return OK; |
1063 } | 1039 } |
1064 | 1040 |
| 1041 // When running in a sandbox, it may not be possible to create an |
| 1042 // X509Certificate*, as that may depend on OS functionality blocked |
| 1043 // in the sandbox. |
| 1044 if (!server_cert_.get()) { |
| 1045 server_cert_verify_result_.Reset(); |
| 1046 server_cert_verify_result_.cert_status = CERT_STATUS_INVALID; |
| 1047 return ERR_CERT_INVALID; |
| 1048 } |
| 1049 |
1065 start_cert_verification_time_ = base::TimeTicks::Now(); | 1050 start_cert_verification_time_ = base::TimeTicks::Now(); |
1066 | 1051 |
1067 int flags = 0; | 1052 int flags = 0; |
1068 if (ssl_config_.rev_checking_enabled) | 1053 if (ssl_config_.rev_checking_enabled) |
1069 flags |= CertVerifier::VERIFY_REV_CHECKING_ENABLED; | 1054 flags |= CertVerifier::VERIFY_REV_CHECKING_ENABLED; |
1070 if (ssl_config_.verify_ev_cert) | 1055 if (ssl_config_.verify_ev_cert) |
1071 flags |= CertVerifier::VERIFY_EV_CERT; | 1056 flags |= CertVerifier::VERIFY_EV_CERT; |
1072 if (ssl_config_.cert_io_enabled) | 1057 if (ssl_config_.cert_io_enabled) |
1073 flags |= CertVerifier::VERIFY_CERT_IO_ENABLED; | 1058 flags |= CertVerifier::VERIFY_CERT_IO_ENABLED; |
1074 if (ssl_config_.rev_checking_required_local_anchors) | 1059 if (ssl_config_.rev_checking_required_local_anchors) |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1140 void SSLClientSocketOpenSSL::DoConnectCallback(int rv) { | 1125 void SSLClientSocketOpenSSL::DoConnectCallback(int rv) { |
1141 if (rv < OK) | 1126 if (rv < OK) |
1142 OnHandshakeCompletion(); | 1127 OnHandshakeCompletion(); |
1143 if (!user_connect_callback_.is_null()) { | 1128 if (!user_connect_callback_.is_null()) { |
1144 CompletionCallback c = user_connect_callback_; | 1129 CompletionCallback c = user_connect_callback_; |
1145 user_connect_callback_.Reset(); | 1130 user_connect_callback_.Reset(); |
1146 c.Run(rv > OK ? OK : rv); | 1131 c.Run(rv > OK ? OK : rv); |
1147 } | 1132 } |
1148 } | 1133 } |
1149 | 1134 |
1150 X509Certificate* SSLClientSocketOpenSSL::UpdateServerCert() { | 1135 void SSLClientSocketOpenSSL::UpdateServerCert() { |
1151 server_cert_chain_->Reset(SSL_get_peer_cert_chain(ssl_)); | 1136 server_cert_chain_->Reset(SSL_get_peer_cert_chain(ssl_)); |
1152 server_cert_ = server_cert_chain_->AsOSChain(); | 1137 server_cert_ = server_cert_chain_->AsOSChain(); |
1153 | 1138 |
1154 if (!server_cert_chain_->IsValid()) | 1139 if (server_cert_.get()) { |
1155 DVLOG(1) << "UpdateServerCert received invalid certificate chain from peer"; | 1140 net_log_.AddEvent( |
1156 | 1141 NetLog::TYPE_SSL_CERTIFICATES_RECEIVED, |
1157 return server_cert_.get(); | 1142 base::Bind(&NetLogX509CertificateCallback, |
| 1143 base::Unretained(server_cert_.get()))); |
| 1144 } |
1158 } | 1145 } |
1159 | 1146 |
1160 void SSLClientSocketOpenSSL::VerifyCT() { | 1147 void SSLClientSocketOpenSSL::VerifyCT() { |
1161 if (!cert_transparency_verifier_) | 1148 if (!cert_transparency_verifier_) |
1162 return; | 1149 return; |
1163 | 1150 |
1164 uint8_t* ocsp_response_raw; | 1151 uint8_t* ocsp_response_raw; |
1165 size_t ocsp_response_len; | 1152 size_t ocsp_response_len; |
1166 SSL_get0_ocsp_response(ssl_, &ocsp_response_raw, &ocsp_response_len); | 1153 SSL_get0_ocsp_response(ssl_, &ocsp_response_raw, &ocsp_response_len); |
1167 std::string ocsp_response; | 1154 std::string ocsp_response; |
(...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1612 return 1; | 1599 return 1; |
1613 } | 1600 } |
1614 | 1601 |
1615 int SSLClientSocketOpenSSL::CertVerifyCallback(X509_STORE_CTX* store_ctx) { | 1602 int SSLClientSocketOpenSSL::CertVerifyCallback(X509_STORE_CTX* store_ctx) { |
1616 if (!completed_connect_) { | 1603 if (!completed_connect_) { |
1617 // If the first handshake hasn't completed then we accept any certificates | 1604 // If the first handshake hasn't completed then we accept any certificates |
1618 // because we verify after the handshake. | 1605 // because we verify after the handshake. |
1619 return 1; | 1606 return 1; |
1620 } | 1607 } |
1621 | 1608 |
1622 CHECK(server_cert_.get()); | 1609 // Disallow the server certificate to change in a renegotiation. |
| 1610 if (server_cert_chain_->empty()) { |
| 1611 LOG(ERROR) << "Received invalid certificate chain between handshakes"; |
| 1612 return 0; |
| 1613 } |
| 1614 base::StringPiece old_der, new_der; |
| 1615 if (store_ctx->cert == NULL || |
| 1616 !x509_util::GetDER(server_cert_chain_->Get(0), &old_der) || |
| 1617 !x509_util::GetDER(store_ctx->cert, &new_der)) { |
| 1618 LOG(ERROR) << "Failed to encode certificates"; |
| 1619 return 0; |
| 1620 } |
| 1621 if (old_der != new_der) { |
| 1622 LOG(ERROR) << "Server certificate changed between handshakes"; |
| 1623 return 0; |
| 1624 } |
1623 | 1625 |
1624 PeerCertificateChain chain(store_ctx->untrusted); | 1626 return 1; |
1625 if (chain.IsValid() && server_cert_->Equals(chain.AsOSChain().get())) | |
1626 return 1; | |
1627 | |
1628 if (!chain.IsValid()) | |
1629 LOG(ERROR) << "Received invalid certificate chain between handshakes"; | |
1630 else | |
1631 LOG(ERROR) << "Server certificate changed between handshakes"; | |
1632 return 0; | |
1633 } | 1627 } |
1634 | 1628 |
1635 // SelectNextProtoCallback is called by OpenSSL during the handshake. If the | 1629 // SelectNextProtoCallback is called by OpenSSL during the handshake. If the |
1636 // server supports NPN, selects a protocol from the list that the server | 1630 // server supports NPN, selects a protocol from the list that the server |
1637 // provides. According to third_party/openssl/openssl/ssl/ssl_lib.c, the | 1631 // provides. According to third_party/openssl/openssl/ssl/ssl_lib.c, the |
1638 // callback can assume that |in| is syntactically valid. | 1632 // callback can assume that |in| is syntactically valid. |
1639 int SSLClientSocketOpenSSL::SelectNextProtoCallback(unsigned char** out, | 1633 int SSLClientSocketOpenSSL::SelectNextProtoCallback(unsigned char** out, |
1640 unsigned char* outlen, | 1634 unsigned char* outlen, |
1641 const unsigned char* in, | 1635 const unsigned char* in, |
1642 unsigned int inlen) { | 1636 unsigned int inlen) { |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1773 ct::SCT_STATUS_LOG_UNKNOWN)); | 1767 ct::SCT_STATUS_LOG_UNKNOWN)); |
1774 } | 1768 } |
1775 } | 1769 } |
1776 | 1770 |
1777 scoped_refptr<X509Certificate> | 1771 scoped_refptr<X509Certificate> |
1778 SSLClientSocketOpenSSL::GetUnverifiedServerCertificateChain() const { | 1772 SSLClientSocketOpenSSL::GetUnverifiedServerCertificateChain() const { |
1779 return server_cert_; | 1773 return server_cert_; |
1780 } | 1774 } |
1781 | 1775 |
1782 } // namespace net | 1776 } // namespace net |
OLD | NEW |