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