mirror of
				https://bitbucket.org/chromiumembedded/cef
				synced 2025-06-05 21:39:12 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			138 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // Copyright (c) 2016 The Chromium Embedded Framework Authors. All rights
 | |
| // reserved. Use of this source code is governed by a BSD-style license that
 | |
| // can be found in the LICENSE file.
 | |
| 
 | |
| #include "libcef/browser/x509_certificate_impl.h"
 | |
| 
 | |
| #include "libcef/browser/x509_cert_principal_impl.h"
 | |
| #include "libcef/common/time_util.h"
 | |
| 
 | |
| #include "net/cert/x509_util.h"
 | |
| #include "net/ssl/ssl_private_key.h"
 | |
| 
 | |
| namespace {
 | |
| 
 | |
| CefRefPtr<CefBinaryValue> EncodeCertificate(const CRYPTO_BUFFER* cert_buffer,
 | |
|                                             bool der) {
 | |
|   std::string encoded;
 | |
|   if (der) {
 | |
|     encoded =
 | |
|         std::string(net::x509_util::CryptoBufferAsStringPiece(cert_buffer));
 | |
|   } else if (!net::X509Certificate::GetPEMEncoded(cert_buffer, &encoded)) {
 | |
|     return nullptr;
 | |
|   }
 | |
|   if (encoded.empty())
 | |
|     return nullptr;
 | |
|   return CefBinaryValue::Create(encoded.c_str(), encoded.size());
 | |
| }
 | |
| 
 | |
| }  // namespace
 | |
| 
 | |
| CefX509CertificateImpl::CefX509CertificateImpl(
 | |
|     std::unique_ptr<net::ClientCertIdentity> identity)
 | |
|     : identity_(std::move(identity)), cert_(identity_->certificate()) {}
 | |
| 
 | |
| CefX509CertificateImpl::CefX509CertificateImpl(
 | |
|     scoped_refptr<net::X509Certificate> cert)
 | |
|     : cert_(cert) {}
 | |
| 
 | |
| CefRefPtr<CefX509CertPrincipal> CefX509CertificateImpl::GetSubject() {
 | |
|   if (cert_)
 | |
|     return new CefX509CertPrincipalImpl(cert_->subject());
 | |
|   return nullptr;
 | |
| }
 | |
| 
 | |
| CefRefPtr<CefX509CertPrincipal> CefX509CertificateImpl::GetIssuer() {
 | |
|   if (cert_)
 | |
|     return new CefX509CertPrincipalImpl(cert_->issuer());
 | |
|   return nullptr;
 | |
| }
 | |
| 
 | |
| CefRefPtr<CefBinaryValue> CefX509CertificateImpl::GetSerialNumber() {
 | |
|   if (cert_) {
 | |
|     const std::string& serial = cert_->serial_number();
 | |
|     return CefBinaryValue::Create(serial.c_str(), serial.size());
 | |
|   }
 | |
|   return nullptr;
 | |
| }
 | |
| 
 | |
| CefTime CefX509CertificateImpl::GetValidStart() {
 | |
|   CefTime validity;
 | |
|   if (cert_) {
 | |
|     const base::Time& valid_time = cert_->valid_start();
 | |
|     if (!valid_time.is_null())
 | |
|       cef_time_from_basetime(valid_time, validity);
 | |
|   }
 | |
|   return validity;
 | |
| }
 | |
| 
 | |
| CefTime CefX509CertificateImpl::GetValidExpiry() {
 | |
|   CefTime validity;
 | |
|   if (cert_) {
 | |
|     const base::Time& valid_time = cert_->valid_expiry();
 | |
|     if (!valid_time.is_null())
 | |
|       cef_time_from_basetime(valid_time, validity);
 | |
|   }
 | |
|   return validity;
 | |
| }
 | |
| 
 | |
| CefRefPtr<CefBinaryValue> CefX509CertificateImpl::GetDEREncoded() {
 | |
|   if (cert_) {
 | |
|     const CRYPTO_BUFFER* cert_buffer = cert_->cert_buffer();
 | |
|     if (cert_buffer)
 | |
|       return EncodeCertificate(cert_buffer, true);
 | |
|   }
 | |
|   return nullptr;
 | |
| }
 | |
| 
 | |
| CefRefPtr<CefBinaryValue> CefX509CertificateImpl::GetPEMEncoded() {
 | |
|   if (cert_) {
 | |
|     const CRYPTO_BUFFER* cert_buffer = cert_->cert_buffer();
 | |
|     if (cert_buffer)
 | |
|       return EncodeCertificate(cert_buffer, false);
 | |
|   }
 | |
|   return nullptr;
 | |
| }
 | |
| 
 | |
| size_t CefX509CertificateImpl::GetIssuerChainSize() {
 | |
|   if (cert_)
 | |
|     return cert_->intermediate_buffers().size();
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| void CefX509CertificateImpl::AcquirePrivateKey(
 | |
|     const base::Callback<void(scoped_refptr<net::SSLPrivateKey>)>&
 | |
|         private_key_callback) {
 | |
|   if (identity_)
 | |
|     identity_->AcquirePrivateKey(private_key_callback);
 | |
|   else
 | |
|     private_key_callback.Run(nullptr);
 | |
| }
 | |
| 
 | |
| void CefX509CertificateImpl::GetEncodedIssuerChain(
 | |
|     CefX509Certificate::IssuerChainBinaryList& chain,
 | |
|     bool der) {
 | |
|   chain.clear();
 | |
|   if (cert_) {
 | |
|     for (const auto& it : cert_->intermediate_buffers()) {
 | |
|       // Add each to the chain, even if one conversion unexpectedly failed.
 | |
|       // GetIssuerChainSize depends on these being the same length.
 | |
|       chain.push_back(EncodeCertificate(it.get(), der));
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| void CefX509CertificateImpl::GetDEREncodedIssuerChain(
 | |
|     CefX509Certificate::IssuerChainBinaryList& chain) {
 | |
|   if (der_encoded_issuer_chain_.empty())
 | |
|     GetEncodedIssuerChain(der_encoded_issuer_chain_, true);
 | |
|   chain = der_encoded_issuer_chain_;
 | |
| }
 | |
| 
 | |
| void CefX509CertificateImpl::GetPEMEncodedIssuerChain(
 | |
|     CefX509Certificate::IssuerChainBinaryList& chain) {
 | |
|   if (pem_encoded_issuer_chain_.empty())
 | |
|     GetEncodedIssuerChain(pem_encoded_issuer_chain_, false);
 | |
|   chain = pem_encoded_issuer_chain_;
 | |
| }
 |