Index: content/browser/renderer_host/pepper/pepper_socket_utils.cc |
diff --git a/content/browser/renderer_host/pepper/pepper_socket_utils.cc b/content/browser/renderer_host/pepper/pepper_socket_utils.cc |
index 9dc585e3315032c7bf99121835f01e3c4306bef7..32f2ef47e89469a2668cbcd853eb5ba1f7e6040b 100644 |
--- a/content/browser/renderer_host/pepper/pepper_socket_utils.cc |
+++ b/content/browser/renderer_host/pepper/pepper_socket_utils.cc |
@@ -8,13 +8,16 @@ |
#include <vector> |
#include "base/logging.h" |
+#include "base/memory/ref_counted.h" |
#include "content/public/browser/browser_thread.h" |
#include "content/public/browser/content_browser_client.h" |
#include "content/public/browser/render_view_host.h" |
#include "content/public/browser/site_instance.h" |
#include "content/public/common/content_client.h" |
+#include "net/cert/x509_certificate.h" |
#include "ppapi/c/private/ppb_net_address_private.h" |
#include "ppapi/shared_impl/private/net_address_private_impl.h" |
+#include "ppapi/shared_impl/private/ppb_x509_certificate_private_shared.h" |
namespace content { |
namespace pepper_socket_utils { |
@@ -77,5 +80,60 @@ bool CanUseSocketAPIs(bool external_plugin, |
return true; |
} |
+bool GetCertificateFields(const net::X509Certificate& cert, |
+ ppapi::PPB_X509Certificate_Fields* fields) { |
+ const net::CertPrincipal& issuer = cert.issuer(); |
+ fields->SetField(PP_X509CERTIFICATE_PRIVATE_ISSUER_COMMON_NAME, |
+ new base::StringValue(issuer.common_name)); |
+ fields->SetField(PP_X509CERTIFICATE_PRIVATE_ISSUER_LOCALITY_NAME, |
+ new base::StringValue(issuer.locality_name)); |
+ fields->SetField(PP_X509CERTIFICATE_PRIVATE_ISSUER_STATE_OR_PROVINCE_NAME, |
+ new base::StringValue(issuer.state_or_province_name)); |
+ fields->SetField(PP_X509CERTIFICATE_PRIVATE_ISSUER_COUNTRY_NAME, |
+ new base::StringValue(issuer.country_name)); |
+ fields->SetField(PP_X509CERTIFICATE_PRIVATE_ISSUER_ORGANIZATION_NAME, |
+ new base::StringValue(JoinString(issuer.organization_names, '\n'))); |
+ fields->SetField(PP_X509CERTIFICATE_PRIVATE_ISSUER_ORGANIZATION_UNIT_NAME, |
+ new base::StringValue(JoinString(issuer.organization_unit_names, '\n'))); |
+ |
+ const net::CertPrincipal& subject = cert.subject(); |
+ fields->SetField(PP_X509CERTIFICATE_PRIVATE_SUBJECT_COMMON_NAME, |
+ new base::StringValue(subject.common_name)); |
+ fields->SetField(PP_X509CERTIFICATE_PRIVATE_SUBJECT_LOCALITY_NAME, |
+ new base::StringValue(subject.locality_name)); |
+ fields->SetField(PP_X509CERTIFICATE_PRIVATE_SUBJECT_STATE_OR_PROVINCE_NAME, |
+ new base::StringValue(subject.state_or_province_name)); |
+ fields->SetField(PP_X509CERTIFICATE_PRIVATE_SUBJECT_COUNTRY_NAME, |
+ new base::StringValue(subject.country_name)); |
+ fields->SetField(PP_X509CERTIFICATE_PRIVATE_SUBJECT_ORGANIZATION_NAME, |
+ new base::StringValue(JoinString(subject.organization_names, '\n'))); |
+ fields->SetField(PP_X509CERTIFICATE_PRIVATE_SUBJECT_ORGANIZATION_UNIT_NAME, |
+ new base::StringValue(JoinString(subject.organization_unit_names, '\n'))); |
+ |
+ const std::string& serial_number = cert.serial_number(); |
+ fields->SetField(PP_X509CERTIFICATE_PRIVATE_SERIAL_NUMBER, |
+ base::BinaryValue::CreateWithCopiedBuffer(serial_number.data(), |
+ serial_number.length())); |
+ fields->SetField(PP_X509CERTIFICATE_PRIVATE_VALIDITY_NOT_BEFORE, |
+ new base::FundamentalValue(cert.valid_start().ToDoubleT())); |
+ fields->SetField(PP_X509CERTIFICATE_PRIVATE_VALIDITY_NOT_AFTER, |
+ new base::FundamentalValue(cert.valid_expiry().ToDoubleT())); |
+ std::string der; |
+ net::X509Certificate::GetDEREncoded(cert.os_cert_handle(), &der); |
+ fields->SetField(PP_X509CERTIFICATE_PRIVATE_RAW, |
+ base::BinaryValue::CreateWithCopiedBuffer(der.data(), der.length())); |
+ return true; |
+} |
+ |
+bool GetCertificateFields(const char* der, |
+ uint32_t length, |
+ ppapi::PPB_X509Certificate_Fields* fields) { |
+ scoped_refptr<net::X509Certificate> cert = |
+ net::X509Certificate::CreateFromBytes(der, length); |
+ if (!cert.get()) |
+ return false; |
+ return GetCertificateFields(*cert.get(), fields); |
+} |
+ |
} // namespace pepper_socket_utils |
} // namespace content |