From 582acb6711e1c2fa8c323d9cedff422b3464a0a0 Mon Sep 17 00:00:00 2001 From: Przemyslaw Ciezkowski Date: Tue, 28 Apr 2015 12:18:14 +0200 Subject: [PATCH] [KeyManager] getCertificate and saveCertificate [Verification] var cert = new tizen.Certificate("cert3", null, true); cert.save("MIIDGDC...DVC8w==", function() { console.log('ok'); var c = tizen.keymanager.getCertificate("cert3"); console.log(c.name); console.log(c.password); console.log(c.extractable); console.log(c.rawCert); }, function(e) { console.log(e.code); console.log(e.message); } ); Change-Id: I44ff150d6e83a9715d86e0bc1ca659047bc40a9c Signed-off-by: Przemyslaw Ciezkowski --- src/keymanager/keymanager_instance.cc | 100 +++++++++++++++++++++++-- src/keymanager/keymanager_instance.h | 3 + src/keymanager/keymanager_observers.cc | 22 ++++++ src/keymanager/keymanager_observers.h | 7 ++ 4 files changed, 125 insertions(+), 7 deletions(-) diff --git a/src/keymanager/keymanager_instance.cc b/src/keymanager/keymanager_instance.cc index bcd665fd..b20c9b79 100644 --- a/src/keymanager/keymanager_instance.cc +++ b/src/keymanager/keymanager_instance.cc @@ -39,6 +39,10 @@ KeyManagerInstance::KeyManagerInstance() { std::bind(&KeyManagerInstance::RemoveKey, this, _1, _2)); RegisterSyncHandler("KeyManager_generateKeyPair", std::bind(&KeyManagerInstance::GenerateKeyPair, this, _1, _2)); + RegisterSyncHandler("KeyManager_getCertificate", + std::bind(&KeyManagerInstance::GetCertificate, this, _1, _2)); + RegisterSyncHandler("KeyManager_saveCertificate", + std::bind(&KeyManagerInstance::SaveCertificate, this, _1, _2)); } KeyManagerInstance::~KeyManagerInstance() { @@ -213,6 +217,16 @@ void KeyManagerInstance::OnCreateKeyPair(double callbackId, PostMessage(res.serialize().c_str()); } +std::string RawBufferToBase64(const CKM::RawBuffer &buf) { + std::string result; + if (!buf.empty()) { + gchar* base64 = g_base64_encode(&buf[0], buf.size()); + result = base64; + g_free(base64); + } + return result; +} + void KeyManagerInstance::GetKey(const picojson::value& args, picojson::object& out) { LoggerD("Enter"); using CKM::KeyType; @@ -266,21 +280,93 @@ void KeyManagerInstance::GetKey(const picojson::value& args, picojson::object& o dict["keyType"] = picojson::value("KEY_AES"); break; } - CKM::RawBuffer buf = key->getDER(); - if (!buf.empty()) { - gchar* base64 = g_base64_encode(&buf[0], buf.size()); - dict["rawKey"] = picojson::value(std::string(base64)); - g_free(base64); + dict["rawKey"] = picojson::value(RawBufferToBase64(key->getDER())); + //if key was retrieved it is extractable from db + dict["extractable"] = picojson::value(true); + + picojson::value res(dict); + ReportSuccess(res, out); + } +} + +void KeyManagerInstance::GetCertificate(const picojson::value& args, + picojson::object& out) { + LoggerD("Enter"); + + CKM::Password pass; + if (args.get("password").is()) { + pass = args.get("password").get().c_str(); + } + const std::string& alias = args.get("name").get(); + CKM::CertificateShPtr cert; + int ret = CKM::Manager::create()->getCertificate(alias, pass, cert); + if (ret != CKM_API_SUCCESS) { + LoggerE("Failed to get cert: %d", ret); + if (ret == CKM_API_ERROR_DB_ALIAS_UNKNOWN) { + ReportError(common::PlatformResult(common::ErrorCode::NOT_FOUND_ERR, + "Cert alias not found"), &out); } else { - dict["rawKey"] = picojson::value(std::string()); + ReportError(common::PlatformResult(common::ErrorCode::UNKNOWN_ERR, + "Failed to get cert"), &out); } - //if key was retrieved it is extractable from db + } else { + picojson::object dict; + dict["name"] = args.get("name"); + if (args.get("password").is()) { + dict["password"] = args.get("password"); + } + //if cert was retrieved it is extractable from db dict["extractable"] = picojson::value(true); + dict["rawCert"] = picojson::value(RawBufferToBase64(cert->getDER())); picojson::value res(dict); ReportSuccess(res, out); } } +void KeyManagerInstance::SaveCertificate(const picojson::value& args, + picojson::object& out) { + LoggerD("Enter"); + + const picojson::value& crt = args.get("certificate"); + const std::string& alias = crt.get("name").get(); + std::string password; + if (crt.get("password").is()) { + password = crt.get("password").get(); + } + std::string base64 = args.get("rawCert").get(); + pcrecpp::RE_Options opt; + opt.set_multiline(true); + //remove first line and last line + pcrecpp::RE("-----[^-]*-----", opt).GlobalReplace("", &base64); + gsize len = 0; + guchar* rawData = g_base64_decode(base64.c_str(), &len); + CKM::RawBuffer rawBuffer; + rawBuffer.assign(rawData, rawData + len); + g_free(rawData); + CKM::Password pass(password.c_str()); + CKM::CertificateShPtr cert = CKM::Certificate::create(rawBuffer, + CKM::DataFormat::FORM_DER); + CKM::Policy policy(pass, crt.get("extractable").get()); + CKM::ManagerAsync::ObserverPtr observer(new SaveCertObserver(this, + args.get("callbackId").get())); + m_manager.saveCertificate(observer, alias, cert, policy); + + ReportSuccess(out); +} + +void KeyManagerInstance::OnSaveCert(double callbackId, + const common::PlatformResult& result) { + LoggerD("Enter"); + picojson::value::object dict; + dict["callbackId"] = picojson::value(callbackId); + if (result.IsError()) { + LoggerE("There was an error"); + ReportError(result, &dict); + } + picojson::value res(dict); + PostMessage(res.serialize().c_str()); +} + } // namespace keymanager } // namespace extension diff --git a/src/keymanager/keymanager_instance.h b/src/keymanager/keymanager_instance.h index a842b0b9..2421c58e 100644 --- a/src/keymanager/keymanager_instance.h +++ b/src/keymanager/keymanager_instance.h @@ -21,6 +21,7 @@ class KeyManagerInstance : virtual ~KeyManagerInstance(); void OnSaveKey(double callbackId, const common::PlatformResult& result); void OnCreateKeyPair(double callbackId, const common::PlatformResult& result); + void OnSaveCert(double callbackId, const common::PlatformResult& result); private: void GetAliasList(std::function coreFunc, picojson::object& out); @@ -32,6 +33,8 @@ class KeyManagerInstance : void SaveKey(const picojson::value& args, picojson::object& out); void RemoveKey(const picojson::value& args, picojson::object& out); void GenerateKeyPair(const picojson::value& args, picojson::object& out); + void GetCertificate(const picojson::value& args, picojson::object& out); + void SaveCertificate(const picojson::value& args, picojson::object& out); CKM::ManagerAsync m_manager; }; diff --git a/src/keymanager/keymanager_observers.cc b/src/keymanager/keymanager_observers.cc index b3e06459..763d5240 100644 --- a/src/keymanager/keymanager_observers.cc +++ b/src/keymanager/keymanager_observers.cc @@ -91,5 +91,27 @@ void CreateKeyObserver::ReceivedError(int error) { PlatformResult(code, message))); } +SaveCertObserver::SaveCertObserver(KeyManagerListener* listener, double callbackId): + CommonObserver(listener, callbackId) { +} + +void SaveCertObserver::ReceivedError(int error) { + LoggerD("Enter, error: %d", error); + ErrorCode code = ErrorCode::UNKNOWN_ERR; + if (error == CKM_API_ERROR_INPUT_PARAM) { + code = ErrorCode::INVALID_VALUES_ERR; + } + common::TaskQueue::GetInstance().Async(std::bind( + &KeyManagerListener::OnSaveCert, listener, callbackId, + PlatformResult(code, "Failed to save certificate"))); +} + +void SaveCertObserver::ReceivedSaveCertificate() { + LoggerD("Enter"); + common::TaskQueue::GetInstance().Async(std::bind( + &KeyManagerListener::OnSaveCert, listener, callbackId, + PlatformResult(ErrorCode::NO_ERROR))); +} + } // namespace keymanager } // namespace extension diff --git a/src/keymanager/keymanager_observers.h b/src/keymanager/keymanager_observers.h index 68f98e31..4c9f51cc 100644 --- a/src/keymanager/keymanager_observers.h +++ b/src/keymanager/keymanager_observers.h @@ -15,6 +15,7 @@ class KeyManagerListener { public: virtual void OnSaveKey(double callbackId, const common::PlatformResult& result) = 0; virtual void OnCreateKeyPair(double callbackId, const common::PlatformResult& result) = 0; + virtual void OnSaveCert(double callbackId, const common::PlatformResult& result) = 0; virtual ~KeyManagerListener() {} }; @@ -44,6 +45,12 @@ private: }; +struct SaveCertObserver: public CommonObserver { + SaveCertObserver(KeyManagerListener* listener, double callbackId); + void ReceivedError(int error); + void ReceivedSaveCertificate(); +}; + } // namespace keymanager } // namespace extension -- 2.34.1