Add Manager Implementation.
authorBartlomiej Grzelewski <b.grzelewski@samsung.com>
Fri, 30 May 2014 14:31:19 +0000 (16:31 +0200)
committerBartlomiej Grzelewski <b.grzelewski@samsung.com>
Fri, 30 May 2014 17:38:44 +0000 (19:38 +0200)
Change-Id: I12db0dc94a111eef089a2ad4d4ed2a5f3023e6ea

12 files changed:
src/CMakeLists.txt
src/include/ckm/ckm-type.h
src/include/ckm/key-manager.h
src/manager/client/client-key-impl.cpp
src/manager/client/client-key-impl.h
src/manager/client/client-key.cpp
src/manager/client/client-manager-impl.cpp
src/manager/client/client-manager-impl.h
src/manager/client/client-manager.cpp
src/manager/common/protocols.cpp
src/manager/common/protocols.h
src/manager/dpl/core/include/dpl/serialization.h

index d4ce5a5..54b2781 100644 (file)
@@ -64,6 +64,7 @@ SET(KEY_MANAGER_CLIENT_SOURCES
     ${KEY_MANAGER_CLIENT_SRC_PATH}/client-echo.cpp
     ${KEY_MANAGER_CLIENT_SRC_PATH}/client-key.cpp
     ${KEY_MANAGER_CLIENT_SRC_PATH}/client-key-impl.cpp
+    ${KEY_MANAGER_CLIENT_SRC_PATH}/client-manager.cpp
     ${KEY_MANAGER_CLIENT_SRC_PATH}/client-manager-impl.cpp
     )
 
index 0d52e72..7308613 100644 (file)
@@ -46,6 +46,7 @@ struct Policy {
       , extractable(extract)
       , restricted(rest)
     {}
+    virtual ~Policy(){}
     RawData password;  // byte array used to encrypt data inside CKM
     bool extractable;  // if true key may be extracted from storage
     bool restricted;   // if true only key owner may see data
index b05a739..64f9bc2 100644 (file)
@@ -161,13 +161,13 @@ private:
 
 class Manager {
 public:
-    Manager(){}
+    Manager();
 //     Manager(int uid);   // connect to database related with uid
     Manager(const Manager &connection) = delete;
     Manager(Manager &&connection) = delete;
     Manager operator=(const Manager &connection) = delete;
     Manager operator=(Manager && connection) = delete;
-    virtual ~Manager(){}
+    virtual ~Manager();
 
     int saveKey(const Alias &alias, const Key &key, const Policy &policy);
        // Certificate could not be nonexportable because we must be able to read
index 063a1e1..93df029 100644 (file)
@@ -35,6 +35,28 @@ Key::KeyImpl::KeyImpl()
   : m_type(KeyType::KEY_NONE)
 {}
 
+Key::KeyImpl::KeyImpl(const KeyImpl &second)
+  : m_type(second.m_type)
+  , m_key(second.m_key)
+{}
+
+Key::KeyImpl::KeyImpl(KeyImpl &&second)
+  : m_type(second.m_type)
+  , m_key(std::move(second.m_key))
+{}
+
+Key::KeyImpl& Key::KeyImpl::operator=(const KeyImpl &second) {
+    m_type = second.m_type;
+    m_key = second.m_key;
+    return *this;
+}
+
+Key::KeyImpl& Key::KeyImpl::operator=(KeyImpl &&second) {
+    m_type = std::move(second.m_type);
+    m_key = std::move(second.m_key);
+    return *this;
+}
+
 Key::KeyImpl::KeyImpl(IStream &stream) {
     int type;
     Deserialization::Deserialize(stream, type);
@@ -96,7 +118,7 @@ Key::KeyImpl::KeyImpl(const RawData &data, KeyType type, const RawData &password
     BIO_free_all(bio);
 }
 
-void Key::KeyImpl::Serialize(IStream &stream) {
+void Key::KeyImpl::Serialize(IStream &stream) const {
     Serialization::Serialize(stream, static_cast<int>(m_type));
     Serialization::Serialize(stream, m_key);
 }
index e79adcb..89afe01 100644 (file)
 
 namespace CKM {
 
-class Key::KeyImpl {
+class Key::KeyImpl : public ISerializable {
 public:
     KeyImpl();
     KeyImpl(IStream &stream);
     KeyImpl(const RawData &data, KeyType type, const RawData &password);
-    KeyImpl(const KeyImpl &) = delete;
-    KeyImpl(KeyImpl &&) = delete;
-    KeyImpl& operator=(const KeyImpl &) = delete;
-    KeyImpl& operator=(KeyImpl &&) = delete;
+    KeyImpl(const KeyImpl &);
+    KeyImpl(KeyImpl &&);
+    KeyImpl& operator=(const KeyImpl &);
+    KeyImpl& operator=(KeyImpl &&);
 
     KeyType getType() const {
         return m_type;
@@ -49,7 +49,7 @@ public:
         return m_key.empty();
     }
 
-    void Serialize(IStream &stream);
+    void Serialize(IStream &stream) const;
 
     virtual ~KeyImpl();
 private:
index 4f6572e..8a22e65 100644 (file)
@@ -41,7 +41,7 @@ bool Key::empty() const {
     return m_impl->empty();
 }
 
-Key::KeyType Key::getType() const {
+KeyType Key::getType() const {
     return m_impl->getType();
 }
 
index e69de29..ec5c4ec 100644 (file)
@@ -0,0 +1,147 @@
+/* Copyright (c) 2000 - 2013 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License
+ *
+ *
+ * @file        client-manager-impl.cpp
+ * @author      Bartlomiej Grzelewski (b.grzelewski@samsung.com)
+ * @version     1.0
+ * @brief       Manager implementation.
+ */
+#include <client-manager-impl.h>
+#include <message-buffer.h>
+#include <client-common.h>
+#include <dpl/serialization.h>
+#include <protocols.h>
+#include <client-key-impl.h>
+
+namespace CKM {
+
+int Manager::ManagerImpl::saveKey(const Alias &alias, const Key &key, const Policy &policy) {
+    m_counter++;
+
+    return try_catch([&] {
+        if (alias.empty() || key.empty())
+            return KEY_MANAGER_API_ERROR_INPUT_PARAM;
+
+        MessageBuffer send, recv;
+        Serialization::Serialize(send, static_cast<int>(StorageCommand::SAVE));
+        Serialization::Serialize(send, m_counter);
+        Serialization::Serialize(send, static_cast<int>(toDBDataType(key.getType())));
+        Serialization::Serialize(send, alias);
+        Serialization::Serialize(send, key.getImpl());
+        Serialization::Serialize(send, PolicySerializable(policy));
+
+        int retCode = sendToServer(
+            SERVICE_SOCKET_CKM_STORAGE,
+            send.Pop(),
+            recv);
+
+        if (KEY_MANAGER_API_SUCCESS != retCode) {
+            return retCode;
+        }
+
+        int command;
+        int counter;
+        int opType;
+        Deserialization::Deserialize(recv, command);
+        Deserialization::Deserialize(recv, counter);
+        Deserialization::Deserialize(recv, opType);
+        Deserialization::Deserialize(recv, retCode);
+
+        if (counter != m_counter) {
+            return KEY_MANAGER_API_ERROR_UNKNOWN;
+        }
+
+        return retCode;
+    });
+}
+
+int Manager::ManagerImpl::removeKey(const Alias &alias) {
+    return try_catch([&] {
+        if (alias.empty())
+            return KEY_MANAGER_API_ERROR_INPUT_PARAM;
+
+        MessageBuffer send, recv;
+        Serialization::Serialize(send, static_cast<int>(StorageCommand::REMOVE));
+        Serialization::Serialize(send, m_counter);
+        Serialization::Serialize(send, static_cast<int>(DBDataType::KEY_RSA_PUBLIC));
+        Serialization::Serialize(send, alias);
+
+        int retCode = sendToServer(
+            SERVICE_SOCKET_CKM_STORAGE,
+            send.Pop(),
+            recv);
+
+        if (KEY_MANAGER_API_SUCCESS != retCode) {
+            return retCode;
+        }
+
+        int command;
+        int counter;
+        int opType;
+        Deserialization::Deserialize(recv, command);
+        Deserialization::Deserialize(recv, counter);
+        Deserialization::Deserialize(recv, opType);
+        Deserialization::Deserialize(recv, retCode);
+
+        if (counter != m_counter) {
+            return KEY_MANAGER_API_ERROR_UNKNOWN;
+        }
+
+        return retCode;
+    });
+}
+
+int Manager::ManagerImpl::getKey(const Alias &alias, const RawData &password, Key &key) {
+    return try_catch([&] {
+        if (alias.empty())
+            return KEY_MANAGER_API_ERROR_INPUT_PARAM;
+
+        MessageBuffer send, recv;
+        Serialization::Serialize(send, static_cast<int>(StorageCommand::GET));
+        Serialization::Serialize(send, m_counter);
+        Serialization::Serialize(send, static_cast<int>(DBDataType::KEY_RSA_PUBLIC));
+        Serialization::Serialize(send, alias);
+        Serialization::Serialize(send, password);
+
+        int retCode = sendToServer(
+            SERVICE_SOCKET_CKM_STORAGE,
+            send.Pop(),
+            recv);
+
+        if (KEY_MANAGER_API_SUCCESS != retCode) {
+            return retCode;
+        }
+
+        int command;
+        int counter;
+        int opType;
+        Deserialization::Deserialize(recv, command);
+        Deserialization::Deserialize(recv, counter);
+        Deserialization::Deserialize(recv, opType);
+        Deserialization::Deserialize(recv, retCode);
+
+        if (retCode == KEY_MANAGER_API_SUCCESS)
+            Deserialization::Deserialize(recv, *(key.getImpl()));
+
+        if (counter != m_counter) {
+            return KEY_MANAGER_API_ERROR_UNKNOWN;
+        }
+
+        return retCode;
+    });
+}
+
+} // namespace CKM
+
index 732581d..8e8f0d9 100644 (file)
@@ -13,7 +13,7 @@
  *  limitations under the License
  *
  *
- * @file        client-manager-impl.cpp
+ * @file        client-manager-impl.h
  * @author      Bartlomiej Grzelewski (b.grzelewski@samsung.com)
  * @version     1.0
  * @brief       Manager implementation.
@@ -31,105 +31,13 @@ public:
     {}
     virtual ~ManagerImpl(){}
 
-    int saveKey(const Alias &alias, const Key &key, const Policy &policy) {
-        m_counter++;
-
-        return try_catch([&] {
-            if (user.empty() || key.empty())
-                return KEY_MANAGER_API_ERROR_INPUT_PARAM;
-
-            Message send, recv;
-            Serialization::Serialization(send, static_cast<int>(StorageCommand::SAVE_KEY));
-            Serialization::Serialize(send, m_counter);
-            Serialization::Serialize(send, alias);
-            Serialization::Serialize(send, key.getImpl());
-            Serialization::Serialize(send, policy);
-
-            int retCode = sendToServer(
-                SERVICE_SOCKET_CKM_STORAGE,
-                send.Pop(),
-                recv);
-
-            if (KEY_MANAGER_API_SUCCESS != retCode) {
-                return retCode;
-            }
-
-            int id;
-            Deserialization::Deserialize(recv, id);
-            Deserialization::Deserialize(recv, retCode);
-
-            if (id != m_counter) {
-                return KEY_MANAGER_API_ERROR_UNKNOWN;
-            }
-
-            return retCode;
-        });
-    }
-
-    int removeKey(const Alias &alias) {
-        return try_catch([&] {
-            if (user.empty() || key.empty())
-                return KEY_MANAGER_API_ERROR_INPUT_PARAM;
-
-            Message send, recv;
-            Serialization::Serialization(send, static_cast<int>(StorageCommand::REMOVE_KEY));
-            Serialization::Serialize(send, m_counter);
-            Serialization::Serialize(send, alias);
-
-            int retCode = sendToServer(
-                SERVICE_SOCKET_CKM_STORAGE,
-                send.Pop(),
-                recv);
-
-            if (KEY_MANAGER_API_SUCCESS != retCode) {
-                return retCode;
-            }
-
-            int id;
-            Deserialization::Deserialize(recv, id);
-            Deserialization::Deserialize(recv, retCode);
-
-            if (id != m_counter) {
-                return KEY_MANAGER_API_ERROR_UNKNOWN;
-            }
-
-            return retCode;
-    }
-
-    int getKey(const Alias &alias, const RawData &password, Key &key) {
-        return try_catch([&] {
-            if (user.empty() || key.empty())
-                return KEY_MANAGER_API_ERROR_INPUT_PARAM;
-
-            Message send, recv;
-            Serialization::Serialization(send, static_cast<int>(StorageCommand::REMOVE_KEY));
-            Serialization::Serialize(send, m_counter);
-            Serialization::Serialize(send, alias);
-            Serialization::Serialize(send, password);
-            Serialization::Serialize(send, key.getImpl());
-
-            int retCode = sendToServer(
-                SERVICE_SOCKET_CKM_STORAGE,
-                send.Pop(),
-                recv);
-
-            if (KEY_MANAGER_API_SUCCESS != retCode) {
-                return retCode;
-            }
-
-            int id;
-            Deserialization::Deserialize(recv, id);
-            Deserialization::Deserialize(recv, retCode);
-
-            if (id != m_counter) {
-                return KEY_MANAGER_API_ERROR_UNKNOWN;
-            }
-
-            return retCode;
-    }
+    int saveKey(const Alias &alias, const Key &key, const Policy &policy);
+    int removeKey(const Alias &alias);
+    int getKey(const Alias &alias, const RawData &password, Key &key);
 
 private:
     int m_counter;
 };
 
+} // namespace CKM
 
index f6ab038..047fb7d 100644 (file)
@@ -31,15 +31,15 @@ Manager::Manager()
 Manager::~Manager(){}
 
 int Manager::saveKey(const Alias &alias, const Key &key, const Policy &policy) {
-    m_impl->saveKey(alias, key, policy);
+    return m_impl->saveKey(alias, key, policy);
 }
 
 int Manager::removeKey(const Alias &alias) {
-    m_impl->removeKey(alias);
+    return m_impl->removeKey(alias);
 }
 
-int Manager::getKey(const Alias &alias, Key &key, const RawData &password) {
-    m_impl->getKey(alias, password, key);
+int Manager::getKey(const Alias &alias, const RawData &password, Key &key) {
+    return m_impl->getKey(alias, password, key);
 }
 
 } // namespace CKM
index d200656..89ea258 100644 (file)
 
 #include <protocols.h>
 
+#include <dpl/serialization.h>
+
 namespace CKM {
 
 char const * const SERVICE_SOCKET_ECHO = "/tmp/.central-key-manager-echo.sock";
 char const * const SERVICE_SOCKET_CKM_CONTROL = "/tmp/.central-key-manager-api-control.sock";
 char const * const SERVICE_SOCKET_CKM_STORAGE = "/tmp/.central-key-manager-api-storage.sock";
 
+DBDataType toDBDataType(KeyType key) {
+    switch(key) {
+    case KeyType::KEY_RSA_PUBLIC:  return DBDataType::KEY_RSA_PRIVATE;
+    case KeyType::KEY_RSA_PRIVATE: return DBDataType::KEY_RSA_PUBLIC;
+    default:
+        // TODO
+        throw 1;
+
+    }
+}
+
+PolicySerializable::PolicySerializable(const Policy &policy)
+  : Policy(policy)
+{}
+
+PolicySerializable::PolicySerializable(IStream &stream) {
+    Deserialization::Deserialize(stream, password);
+    Deserialization::Deserialize(stream, extractable);
+    Deserialization::Deserialize(stream, restricted);
+}
+
+void PolicySerializable::Serialize(IStream &stream) const {
+    Serialization::Serialize(stream, password);
+    Serialization::Serialize(stream, extractable);
+    Serialization::Serialize(stream, restricted);
+}
+
 } // namespace CKM
 
index 9b6446c..860feb5 100644 (file)
  */
 #pragma once
 
+#include <ckm/ckm-type.h>
+
+#include <dpl/serialization.h>
+
 namespace CKM {
 
 extern char const * const SERVICE_SOCKET_ECHO;
@@ -36,8 +40,13 @@ enum class ControlCommand : int {
     RESET_USER_PASSWORD
 };
 
+enum class StorageCommand : int {
+    GET,
+    SAVE,
+    REMOVE,
+};
+
 enum class DBDataType : int {
-    UNKNOWN,
     KEY_RSA_PUBLIC,
     KEY_RSA_PRIVATE,
     KEY_ECDSA_PUBLIC,
@@ -47,5 +56,15 @@ enum class DBDataType : int {
     BINARY_DATA
 };
 
+DBDataType toDBDataType(KeyType key);
+
+class IStream;
+
+struct PolicySerializable : public Policy, ISerializable {
+    explicit PolicySerializable(const Policy &);
+    explicit PolicySerializable(IStream &);
+    void Serialize(IStream &) const;
+};
+
 } // namespace CKM
 
index 2e1a8fe..58773ed 100644 (file)
@@ -57,6 +57,7 @@ struct Serialization {
     {
         object.Serialize(stream);
     }
+
     static void Serialize(IStream& stream, const ISerializable* const object)
     {
         object->Serialize(stream);