Index: chrome/browser/extensions/api/certificate_provider/certificate_provider_api.cc |
diff --git a/chrome/browser/extensions/api/certificate_provider/certificate_provider_api.cc b/chrome/browser/extensions/api/certificate_provider/certificate_provider_api.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..161d299a8426b7fd1af1f08714f78ec2e81b5eb5 |
--- /dev/null |
+++ b/chrome/browser/extensions/api/certificate_provider/certificate_provider_api.cc |
@@ -0,0 +1,93 @@ |
+#include "chrome/browser/extensions/api/certificate_provider/certificate_provider_api.h" |
+ |
+#include "base/memory/linked_ptr.h" |
+#include "base/stl_util.h" |
+#include "chrome/browser/chromeos/certificate_provider/certificate_provider_service.h" |
+#include "chrome/browser/chromeos/certificate_provider/certificate_provider_service_factory.h" |
+#include "chrome/common/extensions/api/certificate_provider.h" |
+#include "net/cert/x509_certificate.h" |
+ |
+namespace extensions { |
+ |
+namespace api_cp = api::certificate_provider; |
+ |
+namespace { |
+ |
+const char kErrorInvalidX509Cert[] = |
+ "Certificate is not a valid X.509 certificate."; |
+ |
+} // namespace |
+ |
+CertificateProviderPublishClientCertificatesFunction:: |
+ ~CertificateProviderPublishClientCertificatesFunction() {} |
+ |
+ExtensionFunction::ResponseAction |
+CertificateProviderPublishClientCertificatesFunction::Run() { |
+ scoped_ptr<api_cp::PublishClientCertificates::Params> params( |
+ api_cp::PublishClientCertificates::Params::Create(*args_)); |
+ EXTENSION_FUNCTION_VALIDATE(params); |
+ |
+ chromeos::CertificateProviderService* service = |
+ chromeos::CertificateProviderServiceFactory::GetForBrowserContext( |
+ browser_context()); |
+ DCHECK(service); |
+ |
+ chromeos::CertificateProviderService::CertificateInfos cert_infos; |
+ for (linked_ptr<api_cp::CertificateInfo> input_cert_info : |
+ params->certificates) { |
+ chromeos::CertificateProviderService::CertificateInfo new_cert_info; |
+ |
+ const std::vector<char>& cert_der = input_cert_info->certificate; |
+ if (cert_der.empty()) |
+ return RespondNow(Error(kErrorInvalidX509Cert)); |
+ |
+ new_cert_info.certificate = net::X509Certificate::CreateFromBytes( |
+ vector_as_array(&cert_der), cert_der.size()); |
+ if (!new_cert_info.certificate) |
+ return RespondNow(Error(kErrorInvalidX509Cert)); |
+ |
+ for (auto hash : input_cert_info->supported_hashes) { |
+ switch(hash) { |
+ case api_cp::HASH_MD5_SHA1: |
+ new_cert_info.supported_hashes.push_back( |
+ net::SSLPrivateKey::Hash::MD5_SHA1); |
+ break; |
+ case api_cp::HASH_SHA1: |
+ new_cert_info.supported_hashes.push_back( |
+ net::SSLPrivateKey::Hash::SHA1); |
+ break; |
+ case api_cp::HASH_SHA256: |
+ new_cert_info.supported_hashes.push_back( |
+ net::SSLPrivateKey::Hash::SHA256); |
+ break; |
+ case api_cp::HASH_SHA384: |
+ new_cert_info.supported_hashes.push_back( |
+ net::SSLPrivateKey::Hash::SHA384); |
+ break; |
+ case api_cp::HASH_SHA512: |
+ new_cert_info.supported_hashes.push_back( |
+ net::SSLPrivateKey::Hash::SHA512); |
+ break; |
+ case api_cp::HASH_NONE: |
+ return RespondNow(Error("Unknown hash function")); |
+ } |
+ } |
+ |
+ cert_infos.push_back(new_cert_info); |
+ } |
+ |
+ service->SetCertificatesProvidedByExtension(extension_id(), cert_infos); |
+ |
+ return RespondNow(NoArguments()); |
+// return RespondNow(Error("Not implemented")); |
+} |
+ |
+CertificateProviderReplyToSignRequestFunction:: |
+ ~CertificateProviderReplyToSignRequestFunction() {} |
+ |
+ExtensionFunction::ResponseAction |
+CertificateProviderReplyToSignRequestFunction::Run() { |
+ return RespondNow(Error("Not implemented")); |
+} |
+ |
+} // namespace extensions |