From b22cee0a1dd6faf86248f9d4270d0cfeccfd4f1c Mon Sep 17 00:00:00 2001
From: Pawel Andruszkiewicz
Date: Wed, 1 Jul 2015 11:26:17 +0200
Subject: [PATCH] [KeyManager] Implementation of Certificate.save().
[Verification] Code compiles.
Change-Id: I6aab253e960d8242b0e6bca36e4b807290c924cc
Signed-off-by: Pawel Andruszkiewicz
---
src/keymanager/keymanager_api.js | 2 +-
src/keymanager/keymanager_instance.cc | 63 +++++++++++++++++++++++++++
2 files changed, 64 insertions(+), 1 deletion(-)
diff --git a/src/keymanager/keymanager_api.js b/src/keymanager/keymanager_api.js
index af55c9ae..e4690e49 100755
--- a/src/keymanager/keymanager_api.js
+++ b/src/keymanager/keymanager_api.js
@@ -185,7 +185,7 @@ Certificate.prototype.save = function() {
native.call('KeyManager_saveCertificate', {
certificate: this,
- rawCert: args.rawCert
+ rawCert: stripPemString(args.rawCert)
}, function(msg) {
if (native.isFailure(msg)) {
if (type.isFunction(args.errorCallback)) {
diff --git a/src/keymanager/keymanager_instance.cc b/src/keymanager/keymanager_instance.cc
index ee02ca17..1fc93e8f 100755
--- a/src/keymanager/keymanager_instance.cc
+++ b/src/keymanager/keymanager_instance.cc
@@ -514,6 +514,69 @@ void KeyManagerInstance::GetCertificate(const picojson::value& args,
void KeyManagerInstance::SaveCertificate(const picojson::value& args,
picojson::object& out) {
LoggerD("Enter");
+
+ RawBuffer* raw_buffer = new RawBuffer(std::move(Base64ToRawBuffer(args.get("rawCert").get())));
+ const auto& certificate = args.get("certificate");
+ const auto& alias = certificate.get("name").get();
+ const auto& password_value = certificate.get("password");
+ const auto extractable = certificate.get("extractable").get();
+ double callback_id = args.get("callbackId").get();
+
+ std::string password;
+
+ if (password_value.is()) {
+ password = password_value.get();
+ }
+
+ auto save_certificate = [raw_buffer, password, extractable, alias](const std::shared_ptr& result) {
+ LoggerD("Enter save_certificate");
+
+ ckmc_cert_s certificate { const_cast(&(*raw_buffer)[0]), raw_buffer->size(), CKMC_FORM_DER };
+ ckmc_policy_s policy { const_cast(password.c_str()), extractable };
+
+ int ret = ckmc_save_cert(alias.c_str(), certificate, policy);
+
+ PlatformResult success(ErrorCode::NO_ERROR);
+
+ switch (ret) {
+ case CKMC_ERROR_NONE:
+ break;
+
+ case CKMC_ERROR_DB_ALIAS_UNKNOWN:
+ success = PlatformResult(ErrorCode::NOT_FOUND_ERR, "Alias not found");
+ break;
+
+ case CKMC_ERROR_INVALID_PARAMETER:
+ success = PlatformResult(ErrorCode::INVALID_VALUES_ERR, "Failed to save certificate");
+ break;
+
+ default:
+ success = PlatformResult(ErrorCode::UNKNOWN_ERR, "Failed to save certificate");
+ break;
+ }
+
+ if (success) {
+ common::tools::ReportSuccess(result->get());
+ } else {
+ LoggerE("Failed to save certificate: %d", ret);
+ common::tools::ReportError(success, &result->get());
+ }
+
+ delete raw_buffer;
+ };
+
+ auto save_certificate_result = [this, callback_id](const std::shared_ptr& result) {
+ LoggerD("Enter save_certificate_result");
+ result->get()["callbackId"] = picojson::value{callback_id};
+ this->PostMessage(result->serialize().c_str());
+ };
+
+ TaskQueue::GetInstance().Queue(
+ save_certificate,
+ save_certificate_result,
+ std::shared_ptr{new picojson::value{picojson::object()}});
+
+ ReportSuccess(out);
}
void KeyManagerInstance::LoadCertificateFromFile(const picojson::value& args,
--
2.34.1