Decode all the intermediates
This commit is contained in:
parent
69defc5166
commit
bde2a597f3
1 changed files with 35 additions and 8 deletions
|
@ -84,6 +84,23 @@ v8::Local<v8::Value> Converter<scoped_refptr<net::X509Certificate>>::ToV8(
|
||||||
return dict.GetHandle();
|
return dict.GetHandle();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CertFromData(const std::string& data,
|
||||||
|
scoped_refptr<net::X509Certificate>* 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<scoped_refptr<net::X509Certificate>>::FromV8(
|
bool Converter<scoped_refptr<net::X509Certificate>>::FromV8(
|
||||||
v8::Isolate* isolate, v8::Local<v8::Value> val,
|
v8::Isolate* isolate, v8::Local<v8::Value> val,
|
||||||
scoped_refptr<net::X509Certificate>* out) {
|
scoped_refptr<net::X509Certificate>* out) {
|
||||||
|
@ -93,18 +110,28 @@ bool Converter<scoped_refptr<net::X509Certificate>>::FromV8(
|
||||||
|
|
||||||
std::string data;
|
std::string data;
|
||||||
dict.Get("data", &data);
|
dict.Get("data", &data);
|
||||||
|
scoped_refptr<net::X509Certificate> leaf_cert;
|
||||||
auto certificate_list = net::X509Certificate::CreateCertificateListFromBytes(
|
if (!CertFromData(data, &leaf_cert))
|
||||||
data.c_str(), data.length(),
|
|
||||||
net::X509Certificate::FORMAT_SINGLE_CERTIFICATE);
|
|
||||||
if (certificate_list.empty())
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
auto certificate = certificate_list.front();
|
std::vector<std::string> intermediates_encoded;
|
||||||
if (!certificate)
|
dict.Get("intermediates", &intermediates_encoded);
|
||||||
|
std::vector<net::X509Certificate::OSCertHandle> intermediates;
|
||||||
|
for (size_t i = 0; i < intermediates_encoded.size(); i++) {
|
||||||
|
auto data = intermediates_encoded[i];
|
||||||
|
scoped_refptr<net::X509Certificate> cert;
|
||||||
|
if (!CertFromData(data, &cert))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
*out = certificate;
|
intermediates.push_back(cert->os_cert_handle());
|
||||||
|
}
|
||||||
|
|
||||||
|
auto cert = net::X509Certificate::CreateFromHandle(
|
||||||
|
leaf_cert->os_cert_handle(), intermediates);
|
||||||
|
if (!cert)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
*out = cert;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue