Index: net/base/x509_certificate_openssl.cc |
diff --git a/net/base/x509_certificate_openssl.cc b/net/base/x509_certificate_openssl.cc |
index 4280404db637a1cf5dc5a49bed1f6dde564f11d8..06ba6d0ad7b2a91abc426f9239efa92445c3d679 100644 |
--- a/net/base/x509_certificate_openssl.cc |
+++ b/net/base/x509_certificate_openssl.cc |
@@ -307,6 +307,11 @@ void X509Certificate::FreeOSCertHandle(OSCertHandle cert_handle) { |
X509_free(cert_handle); |
} |
+// static |
+void X509Certificate::FreeOSCertListHandle(OSCertListHandle cert_list) { |
+ sk_X509_pop_free(cert_list, X509_free); |
+} |
+ |
void X509Certificate::Initialize() { |
base::EnsureOpenSSLInit(); |
fingerprint_ = CalculateFingerprint(cert_handle_); |
@@ -353,6 +358,32 @@ bool X509Certificate::WriteCertHandleToPickle(OSCertHandle cert_handle, |
der_cache.data_length); |
} |
+X509Certificate::OSCertListHandle |
+X509Certificate::CreateOSCertListHandle() const { |
+ STACK_OF(X509)* cert_list_handle = sk_X509_new_null(); |
+ if (!cert_list_handle) |
+ return NULL; |
+ |
+ if (!sk_X509_push(cert_list_handle, DupOSCertHandle(cert_handle_))) { |
+ FreeOSCertListHandle(cert_list_handle); |
+ return NULL; |
+ } |
+ |
+ bool ok = true; |
+ for (size_t i = 0; i < intermediate_ca_certs_.size(); ++i) { |
+ if (!sk_X509_push(cert_list_handle, |
+ DupOSCertHandle(intermediate_ca_certs_[i]))) { |
+ ok = false; |
+ break; |
+ } |
+ } |
+ if (!ok) { |
+ FreeOSCertListHandle(cert_list_handle); |
+ return NULL; |
+ } |
+ |
+ return cert_list_handle; |
+} |
// static |
X509Certificate::OSCertHandle X509Certificate::CreateOSCertHandleFromBytes( |