Chromium Code Reviews| Index: net/socket/ssl_client_socket_openssl.cc |
| diff --git a/net/socket/ssl_client_socket_openssl.cc b/net/socket/ssl_client_socket_openssl.cc |
| index b253dfeae50884859e2dceb3657363d2a6834b29..3f34e29cb3904cbc1f50aa8078cc12312c03abb0 100644 |
| --- a/net/socket/ssl_client_socket_openssl.cc |
| +++ b/net/socket/ssl_client_socket_openssl.cc |
| @@ -926,6 +926,7 @@ X509Certificate* SSLClientSocketOpenSSL::UpdateServerCert() { |
| return NULL; |
| } |
| +#if defined(USE_OPENSSL) |
| // Unlike SSL_get_peer_certificate, SSL_get_peer_cert_chain does not |
| // increment the reference so sk_X509_free does not need to be called. |
| STACK_OF(X509)* chain = SSL_get_peer_cert_chain(ssl_); |
| @@ -935,8 +936,39 @@ X509Certificate* SSLClientSocketOpenSSL::UpdateServerCert() { |
| intermediates.push_back(sk_X509_value(chain, i)); |
| } |
| server_cert_ = X509Certificate::CreateFromHandle(cert.get(), intermediates); |
| - DCHECK(server_cert_.get()); |
| +#else |
| + unsigned char* cert_data = NULL; |
| + int cert_data_length = i2d_X509(cert.get(), &cert_data); |
| + if (cert_data_length <= 0 || !cert_data) { |
| + return NULL; |
| + } |
|
Ryan Sleevi
2014/02/21 22:34:38
net/ style: Don't include braces on single-line co
haavardm
2014/03/11 18:43:20
Done.
|
| + std::vector<std::string> cert_chain; |
| + cert_chain.push_back( |
| + std::string(reinterpret_cast<char*>(cert_data), cert_data_length)); |
| + OPENSSL_free(cert_data); |
|
Ryan Sleevi
2014/02/21 22:34:38
Rather than copying all of these to strings, then
haavardm
2014/02/24 18:54:31
Right. Just to clear up one detail: I assume you m
Ryan Sleevi
2014/02/24 19:02:47
I'm not sure I grokked your clarification.
What I
haavardm
2014/02/24 20:47:00
That's how I understood it yes.
haavardm
2014/03/11 18:43:20
Done.
|
| + STACK_OF(X509)* chain = SSL_get_peer_cert_chain(ssl_); |
| + if (chain) { |
| + for (int i = 0; i < sk_X509_num(chain); ++i) { |
| + cert_data = NULL; |
| + cert_data_length = i2d_X509(sk_X509_value(chain, i), &cert_data); |
| + if (cert_data_length <= 0 || !cert_data) { |
| + return NULL; |
| + } |
| + cert_chain.push_back( |
| + std::string(reinterpret_cast<char*>(cert_data), cert_data_length)); |
|
wtc
2014/02/25 01:13:09
If you directly push a base::StringPiece to chain_
haavardm
2014/02/25 16:13:01
For that to work one must actually using C-type ca
haavardm
2014/03/11 18:43:20
Done.
|
| + OPENSSL_free(cert_data); |
| + } |
| + } |
| + |
| + std::vector<base::StringPiece> chain_ref; |
| + for (size_t i = 0; i < cert_chain.size();i++) { |
| + chain_ref.push_back(base::StringPiece(cert_chain[0])); |
|
haavardm
2014/02/24 18:54:31
Ouch, bad typo right there (cert_chain[0]). Will f
Ryan Sleevi
2014/02/24 19:02:47
No. There's no test that covers this. The CertVeri
haavardm
2014/03/11 18:43:20
Done.
|
| + } |
| + server_cert_ = X509Certificate::CreateFromDERCertChain(chain_ref); |
| +#endif // USE_OPENSSL |
| + |
| + DCHECK(server_cert_.get()); |
|
Ryan Sleevi
2014/02/21 22:34:38
This DCHECK is going to have to go when adding !Op
haavardm
2014/02/24 18:54:31
Ok. I'll move it into the USE_OPENSSL code.
Ryan Sleevi
2014/02/24 19:02:47
I was saying to remove it entirely.
haavardm
2014/03/11 18:43:20
Done.
|
| return server_cert_.get(); |
| } |