From bde2a597f362fd3b1b4a024367442f8d71c9bc91 Mon Sep 17 00:00:00 2001 From: joshaber Date: Fri, 31 Mar 2017 21:27:49 -0400 Subject: [PATCH] Decode all the intermediates --- .../native_mate_converters/net_converter.cc | 43 +++++++++++++++---- 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/atom/common/native_mate_converters/net_converter.cc b/atom/common/native_mate_converters/net_converter.cc index 5ceb23a04b8d..bfd346835b75 100644 --- a/atom/common/native_mate_converters/net_converter.cc +++ b/atom/common/native_mate_converters/net_converter.cc @@ -84,6 +84,23 @@ v8::Local Converter>::ToV8( return dict.GetHandle(); } +bool CertFromData(const std::string& data, + scoped_refptr* out) { + auto cert_list = net::X509Certificate::CreateCertificateListFromBytes( + data.c_str(), data.length(), + net::X509Certificate::FORMAT_SINGLE_CERTIFICATE); + if (cert_list.empty()) + return false; + + auto leaf_cert = cert_list.front(); + if (!leaf_cert) + return false; + + *out = leaf_cert; + + return true; +} + bool Converter>::FromV8( v8::Isolate* isolate, v8::Local val, scoped_refptr* out) { @@ -93,18 +110,28 @@ bool Converter>::FromV8( std::string data; dict.Get("data", &data); - - auto certificate_list = net::X509Certificate::CreateCertificateListFromBytes( - data.c_str(), data.length(), - net::X509Certificate::FORMAT_SINGLE_CERTIFICATE); - if (certificate_list.empty()) + scoped_refptr leaf_cert; + if (!CertFromData(data, &leaf_cert)) return false; - auto certificate = certificate_list.front(); - if (!certificate) + std::vector intermediates_encoded; + dict.Get("intermediates", &intermediates_encoded); + std::vector intermediates; + for (size_t i = 0; i < intermediates_encoded.size(); i++) { + auto data = intermediates_encoded[i]; + scoped_refptr cert; + if (!CertFromData(data, &cert)) + return false; + + intermediates.push_back(cert->os_cert_handle()); + } + + auto cert = net::X509Certificate::CreateFromHandle( + leaf_cert->os_cert_handle(), intermediates); + if (!cert) return false; - *out = certificate; + *out = cert; return true; }