From 0d979af01c6d3eb8644db523fb806310f131835f Mon Sep 17 00:00:00 2001 From: Przemyslaw Ciezkowski Date: Mon, 27 Apr 2015 15:17:35 +0200 Subject: [PATCH] [KeyManager] generateKeyPair implementation [Verification] var myPrivKey = new tizen.Key("priv3", "priv_password", false); var myPubKey = new tizen.Key("pub3", null, true); tizen.keymanager.generateKeyPair(myPrivKey, myPubKey, "RSA", "2048", function() { console.log('ok'); }, function(e) { console.log(e.code); console.log(e.message); }); Change-Id: I6d59104f2d8d0f0022ed64b83a6036e10dd9f306 Signed-off-by: Przemyslaw Ciezkowski --- src/keymanager/keymanager_instance.cc | 66 ++++++++++++++++++++++++++ src/keymanager/keymanager_instance.h | 2 + src/keymanager/keymanager_observers.cc | 41 ++++++++++++++++ src/keymanager/keymanager_observers.h | 13 ++++- 4 files changed, 121 insertions(+), 1 deletion(-) diff --git a/src/keymanager/keymanager_instance.cc b/src/keymanager/keymanager_instance.cc index 8c6022e5..ce7f7847 100644 --- a/src/keymanager/keymanager_instance.cc +++ b/src/keymanager/keymanager_instance.cc @@ -16,6 +16,10 @@ namespace extension { namespace keymanager { +namespace { +const char* kTypeRSA = "RSA"; +const char* kTypeECDSA = "ECDSA"; +} KeyManagerInstance::KeyManagerInstance() { using std::placeholders::_1; @@ -27,6 +31,8 @@ KeyManagerInstance::KeyManagerInstance() { std::bind(&KeyManagerInstance::SaveKey, this, _1, _2)); RegisterSyncHandler("KeyManager_removeKey", std::bind(&KeyManagerInstance::RemoveKey, this, _1, _2)); + RegisterSyncHandler("KeyManager_generateKeyPair", + std::bind(&KeyManagerInstance::GenerateKeyPair, this, _1, _2)); } KeyManagerInstance::~KeyManagerInstance() { @@ -114,5 +120,65 @@ void KeyManagerInstance::RemoveKey(const picojson::value& args, } } +void KeyManagerInstance::GenerateKeyPair(const picojson::value& args, + picojson::object& out) { + LoggerD("Enter"); + + const picojson::value& priv_key = args.get("privKeyName"); + const picojson::value& pub_key = args.get("pubKeyName"); + const std::string& priv_name = priv_key.get("name").get(); + const std::string& pub_name = pub_key.get("name").get(); + const std::string& type = args.get("type").get(); + int size = std::stoi(args.get("size").get()); + + CKM::ManagerAsync::ObserverPtr observer(new CreateKeyObserver(this, + args.get("callbackId").get())); + + CKM::Password pass; + if (priv_key.get("password").is()) { + pass = priv_key.get("password").get().c_str(); + } + CKM::Policy priv_policy(pass, priv_key.get("extractable").get()); + + if (pub_key.get("password").is()) { + pass = pub_key.get("password").get().c_str(); + } else { + pass = ""; + } + CKM::Policy pub_policy(pass, pub_key.get("extractable").get()); + + if (type == kTypeRSA) { + m_manager.createKeyPairRSA(observer, size, priv_name, pub_name, priv_policy, pub_policy); + } else if (type == kTypeECDSA) { + CKM::ElipticCurve eliptic = CKM::ElipticCurve::prime192v1; + if (args.get("ellipticCurveType").is()) { + const std::string& eType = args.get("ellipticCurveType").get(); + if (eType == "PRIME256V1") { + eliptic = CKM::ElipticCurve::prime256v1; + } else if (eType == "EC_SECP384R1") { + eliptic = CKM::ElipticCurve::secp384r1; + } + } + m_manager.createKeyPairECDSA(observer, eliptic, priv_name, pub_name, priv_policy, pub_policy); + } else { + m_manager.createKeyPairDSA(observer, size, priv_name, pub_name, priv_policy, pub_policy); + } + + ReportSuccess(out); +} + +void KeyManagerInstance::OnCreateKeyPair(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 1d9f0b68..025c7e9a 100644 --- a/src/keymanager/keymanager_instance.h +++ b/src/keymanager/keymanager_instance.h @@ -20,10 +20,12 @@ class KeyManagerInstance : KeyManagerInstance(); virtual ~KeyManagerInstance(); void OnSaveKey(double callbackId, const common::PlatformResult& result); + void OnCreateKeyPair(double callbackId, const common::PlatformResult& result); private: void GetKeyAliasList(picojson::value const& args, picojson::object& out); 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); CKM::ManagerAsync m_manager; }; diff --git a/src/keymanager/keymanager_observers.cc b/src/keymanager/keymanager_observers.cc index 5e9dc95f..7c70c358 100644 --- a/src/keymanager/keymanager_observers.cc +++ b/src/keymanager/keymanager_observers.cc @@ -41,6 +41,47 @@ void SaveKeyObserver::ReceivedSaveKey() { PlatformResult(ErrorCode::NO_ERROR))); } +CreateKeyObserver::CreateKeyObserver(KeyManagerListener* listener, double callbackId): + CommonObserver(listener, callbackId) {} + +void CreateKeyObserver::ReceivedCreateKeyPairDSA() { + LoggerD("Enter"); + CallSuccess(); +} + +void CreateKeyObserver::ReceivedCreateKeyPairECDSA() { + LoggerD("Enter"); + CallSuccess(); +} + +void CreateKeyObserver::ReceivedCreateKeyPairRSA() { + LoggerD("Enter"); + CallSuccess(); +} + +void CreateKeyObserver::CallSuccess() { + common::TaskQueue::GetInstance().Async(std::bind( + &KeyManagerListener::OnCreateKeyPair, listener, callbackId, + PlatformResult(ErrorCode::NO_ERROR))); +} + +void CreateKeyObserver::ReceivedError(int error) { + LoggerD("Enter, error: %d", error); + ErrorCode code = ErrorCode::UNKNOWN_ERR; + std::string message = "Failed to create key pair"; + switch (error) { + case CKM_API_ERROR_INPUT_PARAM: + code = ErrorCode::INVALID_VALUES_ERR; + break; + case CKM_API_ERROR_DB_ALIAS_EXISTS: + code = ErrorCode::INVALID_VALUES_ERR; + message = "Key alias already exists"; + break; + } + common::TaskQueue::GetInstance().Async(std::bind( + &KeyManagerListener::OnCreateKeyPair, listener, callbackId, + PlatformResult(code, message))); +} } // namespace keymanager } // namespace extension diff --git a/src/keymanager/keymanager_observers.h b/src/keymanager/keymanager_observers.h index 86688e6c..68f98e31 100644 --- a/src/keymanager/keymanager_observers.h +++ b/src/keymanager/keymanager_observers.h @@ -14,8 +14,8 @@ namespace keymanager { class KeyManagerListener { public: virtual void OnSaveKey(double callbackId, const common::PlatformResult& result) = 0; + virtual void OnCreateKeyPair(double callbackId, const common::PlatformResult& result) = 0; virtual ~KeyManagerListener() {} - }; struct CommonObserver: public CKM::ManagerAsync::Observer { @@ -33,6 +33,17 @@ struct SaveKeyObserver: public CommonObserver { void ReceivedSaveKey(); }; +struct CreateKeyObserver: public CommonObserver { + CreateKeyObserver(KeyManagerListener* listener, double callbackId); + void ReceivedError(int error); + void ReceivedCreateKeyPairDSA(); + void ReceivedCreateKeyPairECDSA(); + void ReceivedCreateKeyPairRSA(); +private: + void CallSuccess(); + +}; + } // namespace keymanager } // namespace extension -- 2.34.1