| Index: net/socket/ssl_client_socket_impl.cc
|
| diff --git a/net/socket/ssl_client_socket_impl.cc b/net/socket/ssl_client_socket_impl.cc
|
| index b8db10f14f38dff4b5bdc11c3df902495baeaa2e..085ef63ce4e7d682ec6de063fbfa84ac3eeac949 100644
|
| --- a/net/socket/ssl_client_socket_impl.cc
|
| +++ b/net/socket/ssl_client_socket_impl.cc
|
| @@ -225,6 +225,13 @@ scoped_refptr<X509Certificate> OSChainFromBuffers(STACK_OF(CRYPTO_BUFFER) *
|
| return nullptr;
|
| }
|
|
|
| +#if BUILDFLAG(USE_BYTE_CERTS)
|
| + std::vector<CRYPTO_BUFFER*> intermediate_chain;
|
| + for (size_t i = 1; i < sk_CRYPTO_BUFFER_num(openssl_chain); ++i)
|
| + intermediate_chain.push_back(sk_CRYPTO_BUFFER_value(openssl_chain, i));
|
| + return X509Certificate::CreateFromHandle(
|
| + sk_CRYPTO_BUFFER_value(openssl_chain, 0), intermediate_chain);
|
| +#else
|
| // Convert the certificate chains to a platform certificate handle.
|
| std::vector<base::StringPiece> der_chain;
|
| der_chain.reserve(sk_CRYPTO_BUFFER_num(openssl_chain));
|
| @@ -236,9 +243,10 @@ scoped_refptr<X509Certificate> OSChainFromBuffers(STACK_OF(CRYPTO_BUFFER) *
|
| CRYPTO_BUFFER_len(cert)));
|
| }
|
| return X509Certificate::CreateFromDERCertChain(der_chain);
|
| +#endif
|
| }
|
|
|
| -#if !defined(OS_IOS)
|
| +#if !defined(OS_IOS) && !BUILDFLAG(USE_BYTE_CERTS)
|
| bssl::UniquePtr<CRYPTO_BUFFER> OSCertHandleToBuffer(
|
| X509Certificate::OSCertHandle os_handle) {
|
| std::string der_encoded;
|
| @@ -1582,6 +1590,14 @@ int SSLClientSocketImpl::ClientCertRequestCallback(SSL* ssl) {
|
| return -1;
|
| }
|
|
|
| +#if BUILDFLAG(USE_BYTE_CERTS)
|
| + std::vector<CRYPTO_BUFFER*> chain_raw;
|
| + chain_raw.push_back(ssl_config_.client_cert->os_cert_handle());
|
| + for (X509Certificate::OSCertHandle cert :
|
| + ssl_config_.client_cert->GetIntermediateCertificates()) {
|
| + chain_raw.push_back(cert);
|
| + }
|
| +#else
|
| std::vector<bssl::UniquePtr<CRYPTO_BUFFER>> chain;
|
| std::vector<CRYPTO_BUFFER*> chain_raw;
|
| bssl::UniquePtr<CRYPTO_BUFFER> buf =
|
| @@ -1605,6 +1621,7 @@ int SSLClientSocketImpl::ClientCertRequestCallback(SSL* ssl) {
|
| chain_raw.push_back(buf.get());
|
| chain.push_back(std::move(buf));
|
| }
|
| +#endif
|
|
|
| if (!SSL_set_chain_and_key(ssl_.get(), chain_raw.data(), chain_raw.size(),
|
| nullptr, &SSLContext::kPrivateKeyMethod)) {
|
| @@ -1641,7 +1658,7 @@ int SSLClientSocketImpl::ClientCertRequestCallback(SSL* ssl) {
|
| digests.size());
|
|
|
| net_log_.AddEvent(NetLogEventType::SSL_CLIENT_CERT_PROVIDED,
|
| - NetLog::IntCallback("cert_count", chain.size()));
|
| + NetLog::IntCallback("cert_count", chain_raw.size()));
|
| return 1;
|
| }
|
| #endif // defined(OS_IOS)
|
|
|