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