| 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> |
| (...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 237 | 237 |
| 238 SSLClientSocketOpenSSL::PeerCertificateChain& | 238 SSLClientSocketOpenSSL::PeerCertificateChain& |
| 239 SSLClientSocketOpenSSL::PeerCertificateChain::operator=( | 239 SSLClientSocketOpenSSL::PeerCertificateChain::operator=( |
| 240 const PeerCertificateChain& other) { | 240 const PeerCertificateChain& other) { |
| 241 if (this == &other) | 241 if (this == &other) |
| 242 return *this; | 242 return *this; |
| 243 | 243 |
| 244 // os_chain_ is reference counted by scoped_refptr; | 244 // os_chain_ is reference counted by scoped_refptr; |
| 245 os_chain_ = other.os_chain_; | 245 os_chain_ = other.os_chain_; |
| 246 | 246 |
| 247 // Must increase the reference count manually for sk_X509_dup | 247 openssl_chain_.reset(X509_chain_up_ref(other.openssl_chain_.get())); |
| 248 openssl_chain_.reset(sk_X509_dup(other.openssl_chain_.get())); | 248 |
| 249 for (size_t i = 0; i < sk_X509_num(openssl_chain_.get()); ++i) { | |
| 250 X509* x = sk_X509_value(openssl_chain_.get(), i); | |
| 251 CRYPTO_add(&x->references, 1, CRYPTO_LOCK_X509); | |
| 252 } | |
| 253 return *this; | 249 return *this; |
| 254 } | 250 } |
| 255 | 251 |
| 256 #if defined(USE_OPENSSL_CERTS) | 252 #if defined(USE_OPENSSL_CERTS) |
| 257 // When OSCertHandle is typedef'ed to X509, this implementation does a short cut | 253 // When OSCertHandle is typedef'ed to X509, this implementation does a short cut |
| 258 // to avoid converting back and forth between der and X509 struct. | 254 // to avoid converting back and forth between der and X509 struct. |
| 259 void SSLClientSocketOpenSSL::PeerCertificateChain::Reset( | 255 void SSLClientSocketOpenSSL::PeerCertificateChain::Reset( |
| 260 STACK_OF(X509)* chain) { | 256 STACK_OF(X509)* chain) { |
| 261 openssl_chain_.reset(NULL); | 257 openssl_chain_.reset(NULL); |
| 262 os_chain_ = NULL; | 258 os_chain_ = NULL; |
| 263 | 259 |
| 264 if (!chain) | 260 if (!chain) |
| 265 return; | 261 return; |
| 266 | 262 |
| 267 X509Certificate::OSCertHandles intermediates; | 263 X509Certificate::OSCertHandles intermediates; |
| 268 for (size_t i = 1; i < sk_X509_num(chain); ++i) | 264 for (size_t i = 1; i < sk_X509_num(chain); ++i) |
| 269 intermediates.push_back(sk_X509_value(chain, i)); | 265 intermediates.push_back(sk_X509_value(chain, i)); |
| 270 | 266 |
| 271 os_chain_ = | 267 os_chain_ = |
| 272 X509Certificate::CreateFromHandle(sk_X509_value(chain, 0), intermediates); | 268 X509Certificate::CreateFromHandle(sk_X509_value(chain, 0), intermediates); |
| 273 | 269 |
| 274 // sk_X509_dup does not increase reference count on the certs in the stack. | 270 openssl_chain_.reset(X509_chain_up_ref(chain)); |
| 275 openssl_chain_.reset(sk_X509_dup(chain)); | |
| 276 | |
| 277 std::vector<base::StringPiece> der_chain; | |
| 278 for (size_t i = 0; i < sk_X509_num(openssl_chain_.get()); ++i) { | |
| 279 X509* x = sk_X509_value(openssl_chain_.get(), i); | |
| 280 // Increase the reference count for the certs in openssl_chain_. | |
| 281 CRYPTO_add(&x->references, 1, CRYPTO_LOCK_X509); | |
| 282 } | |
| 283 } | 271 } |
| 284 #else // !defined(USE_OPENSSL_CERTS) | 272 #else // !defined(USE_OPENSSL_CERTS) |
| 285 void SSLClientSocketOpenSSL::PeerCertificateChain::Reset( | 273 void SSLClientSocketOpenSSL::PeerCertificateChain::Reset( |
| 286 STACK_OF(X509)* chain) { | 274 STACK_OF(X509)* chain) { |
| 287 openssl_chain_.reset(NULL); | 275 openssl_chain_.reset(NULL); |
| 288 os_chain_ = NULL; | 276 os_chain_ = NULL; |
| 289 | 277 |
| 290 if (!chain) | 278 if (!chain) |
| 291 return; | 279 return; |
| 292 | 280 |
| 293 // sk_X509_dup does not increase reference count on the certs in the stack. | 281 openssl_chain_.reset(X509_chain_up_ref(chain)); |
| 294 openssl_chain_.reset(sk_X509_dup(chain)); | |
| 295 | 282 |
| 296 std::vector<base::StringPiece> der_chain; | 283 std::vector<base::StringPiece> der_chain; |
| 297 for (size_t i = 0; i < sk_X509_num(openssl_chain_.get()); ++i) { | 284 for (size_t i = 0; i < sk_X509_num(openssl_chain_.get()); ++i) { |
| 298 X509* x = sk_X509_value(openssl_chain_.get(), i); | 285 X509* x = sk_X509_value(openssl_chain_.get(), i); |
| 299 | 286 |
| 300 // Increase the reference count for the certs in openssl_chain_. | |
| 301 CRYPTO_add(&x->references, 1, CRYPTO_LOCK_X509); | |
| 302 | |
| 303 unsigned char* cert_data = NULL; | 287 unsigned char* cert_data = NULL; |
| 304 int cert_data_length = i2d_X509(x, &cert_data); | 288 int cert_data_length = i2d_X509(x, &cert_data); |
| 305 if (cert_data_length && cert_data) | 289 if (cert_data_length && cert_data) |
| 306 der_chain.push_back(base::StringPiece(reinterpret_cast<char*>(cert_data), | 290 der_chain.push_back(base::StringPiece(reinterpret_cast<char*>(cert_data), |
| 307 cert_data_length)); | 291 cert_data_length)); |
| 308 } | 292 } |
| 309 | 293 |
| 310 os_chain_ = X509Certificate::CreateFromDERCertChain(der_chain); | 294 os_chain_ = X509Certificate::CreateFromDERCertChain(der_chain); |
| 311 | 295 |
| 312 for (size_t i = 0; i < der_chain.size(); ++i) { | 296 for (size_t i = 0; i < der_chain.size(); ++i) { |
| (...skipping 1322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1635 if (handshake_succeeded_ && marked_session_as_good_) | 1619 if (handshake_succeeded_ && marked_session_as_good_) |
| 1636 OnHandshakeCompletion(); | 1620 OnHandshakeCompletion(); |
| 1637 } | 1621 } |
| 1638 | 1622 |
| 1639 scoped_refptr<X509Certificate> | 1623 scoped_refptr<X509Certificate> |
| 1640 SSLClientSocketOpenSSL::GetUnverifiedServerCertificateChain() const { | 1624 SSLClientSocketOpenSSL::GetUnverifiedServerCertificateChain() const { |
| 1641 return server_cert_; | 1625 return server_cert_; |
| 1642 } | 1626 } |
| 1643 | 1627 |
| 1644 } // namespace net | 1628 } // namespace net |
| OLD | NEW |