Implementation of remaining async API 41/29041/1
authorKrzysztof Jackiewicz <k.jackiewicz@samsung.com>
Fri, 10 Oct 2014 10:25:15 +0000 (12:25 +0200)
committerBartlomiej Grzelewski <b.grzelewski@samsung.com>
Thu, 16 Oct 2014 15:11:00 +0000 (17:11 +0200)
Change-Id: I019f368b90ecab9ede5e4e652e4cf0b48fe83b6f

src/CMakeLists.txt
src/manager/client-async/client-manager-async-impl.cpp
src/manager/client-async/client-manager-async-impl.h
src/manager/client-async/client-manager-async.cpp
src/manager/client-async/connection-thread.cpp
src/manager/client-async/ocsp-receiver.cpp [moved from src/manager/client-async/receiver.cpp with 53% similarity]
src/manager/client-async/ocsp-receiver.h [new file with mode: 0644]
src/manager/client-async/receiver.h
src/manager/client-async/service.cpp
src/manager/client-async/storage-receiver.cpp [new file with mode: 0644]
src/manager/client-async/storage-receiver.h [new file with mode: 0644]

index cc3dff9..76a4b98 100644 (file)
@@ -85,7 +85,8 @@ SET(KEY_MANAGER_CLIENT_SOURCES
     ${KEY_MANAGER_CLIENT_ASYNC_SRC_PATH}/connection-thread.cpp
     ${KEY_MANAGER_CLIENT_ASYNC_SRC_PATH}/async-request.cpp
     ${KEY_MANAGER_CLIENT_ASYNC_SRC_PATH}/service.cpp
-    ${KEY_MANAGER_CLIENT_ASYNC_SRC_PATH}/receiver.cpp
+    ${KEY_MANAGER_CLIENT_ASYNC_SRC_PATH}/storage-receiver.cpp
+    ${KEY_MANAGER_CLIENT_ASYNC_SRC_PATH}/ocsp-receiver.cpp
     ${KEY_MANAGER_CLIENT_CAPI_SRC_PATH}/ckmc-type.cpp
     ${KEY_MANAGER_CLIENT_CAPI_SRC_PATH}/ckmc-error.cpp
     ${KEY_MANAGER_CLIENT_CAPI_SRC_PATH}/ckmc-manager.cpp
index 817961b..128353c 100644 (file)
  * @version    1.0
  */
 
-#include <client-manager-async-impl.h>
+#include <stdexcept>
+
 #include <ckm/ckm-error.h>
 #include <message-buffer.h>
 #include <client-common.h>
-#include <stdexcept>
+
+#include <client-manager-async-impl.h>
 
 namespace CKM {
 
@@ -37,14 +39,13 @@ ManagerAsync::Impl::~Impl()
 {
 }
 
-void ManagerAsync::Impl::saveKey(const ManagerAsync::ObserverPtr& observer,
-                                 const Alias& alias,
-                                 const KeyShPtr& key,
-                                 const Policy& policy)
+void ManagerAsync::Impl::saveKey(const ObserverPtr& observer,
+                           const Alias& alias,
+                           const KeyShPtr& key,
+                           const Policy& policy)
 {
     observerCheck(observer);
-
-    if (!key) {
+    if (alias.empty() || !key) {
         observer->ReceivedError(CKM_API_ERROR_INPUT_PARAM);
         return;
     }
@@ -52,196 +53,256 @@ void ManagerAsync::Impl::saveKey(const ManagerAsync::ObserverPtr& observer,
 }
 
 void ManagerAsync::Impl::saveCertificate(const ObserverPtr& observer,
-                                         const Alias& /*alias*/,
-                                         const CertificateShPtr& /*cert*/,
-                                         const Policy& /*policy*/)
+                                   const Alias& alias,
+                                   const CertificateShPtr& cert,
+                                   const Policy& policy)
 {
     observerCheck(observer);
-    observer->ReceivedError(CKM_API_ERROR_UNKNOWN);
+    if (alias.empty() || !cert) {
+        observer->ReceivedError(CKM_API_ERROR_INPUT_PARAM);
+        return;
+    }
+    saveBinaryData(observer, alias, DBDataType::CERTIFICATE, cert->getDER(), policy);
 }
+
 void ManagerAsync::Impl::saveData(const ObserverPtr& observer,
-                                  const Alias& /*alias*/,
-                                  const RawBuffer& /*data*/,
-                                  const Policy& /*policy*/)
+                            const Alias& alias,
+                            const RawBuffer& data,
+                            const Policy& policy)
 {
     observerCheck(observer);
-    observer->ReceivedError(CKM_API_ERROR_UNKNOWN);
+    if (alias.empty() || data.empty()) {
+        observer->ReceivedError(CKM_API_ERROR_INPUT_PARAM);
+        return;
+    }
+    saveBinaryData(observer, alias, DBDataType::BINARY_DATA, data, policy);
 }
 
-void ManagerAsync::Impl::removeKey(const ObserverPtr& observer, const Alias& /*alias*/)
-{
-    observerCheck(observer);
-    observer->ReceivedError(CKM_API_ERROR_UNKNOWN);
-}
-void ManagerAsync::Impl::removeCertificate(const ObserverPtr& observer, const Alias& /*alias*/)
-{
-    observerCheck(observer);
-    observer->ReceivedError(CKM_API_ERROR_UNKNOWN);
-}
-void ManagerAsync::Impl::removeData(const ObserverPtr& observer, const Alias& /*alias*/)
+void ManagerAsync::Impl::saveBinaryData(const ManagerAsync::ObserverPtr& observer,
+                                        const Alias& alias,
+                                        DBDataType dataType,
+                                        const RawBuffer& rawData,
+                                        const Policy& policy)
 {
-    observerCheck(observer);
-    observer->ReceivedError(CKM_API_ERROR_UNKNOWN);
+    try_catch_async([&] {
+        sendToStorage(observer,
+                      static_cast<int>(LogicCommand::SAVE),
+                      m_counter,
+                      static_cast<int>(dataType),
+                      alias,
+                      rawData,
+                      PolicySerializable(policy));
+    }, [&observer](int error){ observer->ReceivedError(error); } );
 }
 
-void ManagerAsync::Impl::getKey(const ObserverPtr& observer,
-                                const Alias& /*alias*/,
-                                const Password& /*password*/)
-{
-    observerCheck(observer);
-    observer->ReceivedError(CKM_API_ERROR_UNKNOWN);
-}
-void ManagerAsync::Impl::getCertificate(const ObserverPtr& observer,
-                                        const Alias& /*alias*/,
-                                        const Password& /*password*/)
-{
-    observerCheck(observer);
-    observer->ReceivedError(CKM_API_ERROR_UNKNOWN);
-}
-void ManagerAsync::Impl::getData(const ObserverPtr& observer,
-                                 const Alias& /*alias*/,
-                                 const Password& /*password*/)
+void ManagerAsync::Impl::removeBinaryData(const ManagerAsync::ObserverPtr& observer,
+                                          const Alias& alias,
+                                          DBDataType dataType)
 {
     observerCheck(observer);
-    observer->ReceivedError(CKM_API_ERROR_UNKNOWN);
+    if (alias.empty()) {
+        observer->ReceivedError(CKM_API_ERROR_INPUT_PARAM);
+        return;
+    }
+    try_catch_async([&] {
+        sendToStorage(observer,
+                      static_cast<int>(LogicCommand::REMOVE),
+                      m_counter,
+                      static_cast<int>(dataType),
+                      alias);
+    }, [&observer](int error){ observer->ReceivedError(error); } );
 }
 
-void ManagerAsync::Impl::getKeyAliasVector(const ObserverPtr& observer)
+void ManagerAsync::Impl::getBinaryData(const ManagerAsync::ObserverPtr& observer,
+                                       const Alias &alias,
+                                       DBDataType sendDataType,
+                                       const Password &password)
 {
     observerCheck(observer);
-    observer->ReceivedError(CKM_API_ERROR_UNKNOWN);
-}
-void ManagerAsync::Impl::getCertificateAliasVector(const ObserverPtr& observer)
-{
-    observerCheck(observer);
-    observer->ReceivedError(CKM_API_ERROR_UNKNOWN);
-}
-void ManagerAsync::Impl::getDataAliasVector(const ObserverPtr& observer)
-{
-    observerCheck(observer);
-    observer->ReceivedError(CKM_API_ERROR_UNKNOWN);
+    if (alias.empty()) {
+        observer->ReceivedError(CKM_API_ERROR_INPUT_PARAM);
+        return;
+    }
+    try_catch_async([&] {
+        sendToStorage(observer,
+                      static_cast<int>(LogicCommand::GET),
+                      m_counter,
+                      static_cast<int>(sendDataType),
+                      alias,
+                      password);
+    }, [&observer](int error){ observer->ReceivedError(error); } );
 }
 
-void ManagerAsync::Impl::createKeyPairRSA(const ObserverPtr& observer,
-                                          int /*size*/,
-                                          const Alias& /*privateKeyAlias*/,
-                                          const Alias& /*publicKeyAlias*/,
-                                          const Policy& /*policyPrivateKey*/,
-                                          const Policy& /*policyPublicKey*/)
-{
-    observerCheck(observer);
-    observer->ReceivedError(CKM_API_ERROR_UNKNOWN);
-}
-void ManagerAsync::Impl::createKeyPairDSA(const ObserverPtr& observer,
-                                          int /*size*/,
-                                          const Alias& /*privateKeyAlias*/,
-                                          const Alias& /*publicKeyAlias*/,
-                                          const Policy& /*policyPrivateKey*/,
-                                          const Policy& /*policyPublicKey*/)
-{
-    observerCheck(observer);
-    observer->ReceivedError(CKM_API_ERROR_UNKNOWN);
-}
-void ManagerAsync::Impl::createKeyPairECDSA(const ObserverPtr& observer,
-                                            const ElipticCurve /*type*/,
-                                            const Alias& /*privateKeyAlias*/,
-                                            const Alias& /*publicKeyAlias*/,
-                                            const Policy& /*policyPrivateKey*/,
-                                            const Policy& /*policyPublicKey*/)
+void ManagerAsync::Impl::createSignature(const ObserverPtr& observer,
+                                         const Alias& privateKeyAlias,
+                                         const Password& password,
+                                         const RawBuffer& message,
+                                         const HashAlgorithm hash,
+                                         const RSAPaddingAlgorithm padding)
 {
     observerCheck(observer);
-    observer->ReceivedError(CKM_API_ERROR_UNKNOWN);
+    if (privateKeyAlias.empty() || message.empty()) {
+        observer->ReceivedError(CKM_API_ERROR_INPUT_PARAM);
+        return;
+    }
+    try_catch_async([&] {
+        sendToStorage(observer,
+                      static_cast<int>(LogicCommand::CREATE_SIGNATURE),
+                      m_counter,
+                      privateKeyAlias,
+                      password,
+                      message,
+                      static_cast<int>(hash),
+                      static_cast<int>(padding));
+    }, [&observer](int error) {observer->ReceivedError(error);});
 }
 
-void ManagerAsync::Impl::getCertificateChain(const ObserverPtr& observer,
-                                             const CertificateShPtr& /*certificate*/,
-                                             const CertificateShPtrVector& /*untrustedCertificates*/)
+void ManagerAsync::Impl::verifySignature(const ObserverPtr& observer,
+                                         const Alias& publicKeyOrCertAlias,
+                                         const Password& password,
+                                         const RawBuffer& message,
+                                         const RawBuffer& signature,
+                                         const HashAlgorithm hash,
+                                         const RSAPaddingAlgorithm padding)
 {
     observerCheck(observer);
-    observer->ReceivedError(CKM_API_ERROR_UNKNOWN);
+    if (publicKeyOrCertAlias.empty() || message.empty() || signature.empty()) {
+        observer->ReceivedError(CKM_API_ERROR_INPUT_PARAM);
+        return;
+    }
+    try_catch_async([&] {
+        sendToStorage(observer,
+                      static_cast<int>(LogicCommand::VERIFY_SIGNATURE),
+                      m_counter,
+                      publicKeyOrCertAlias,
+                      password,
+                      message,
+                      signature,
+                      static_cast<int>(hash),
+                      static_cast<int>(padding));
+    }, [&observer](int error){ observer->ReceivedError(error); } );
 }
 
-void ManagerAsync::Impl::getCertificateChain(const ObserverPtr& observer,
-                                             const CertificateShPtr& /*certificate*/,
-                                             const AliasVector& /*untrustedCertificates*/)
+void ManagerAsync::Impl::ocspCheck(const ObserverPtr& observer,
+                                   const CertificateShPtrVector& certificateChainVector)
 {
     observerCheck(observer);
-    observer->ReceivedError(CKM_API_ERROR_UNKNOWN);
-}
+    if (certificateChainVector.empty()) {
+        observer->ReceivedError(CKM_API_ERROR_INPUT_PARAM);
+        return;
+    }
+    try_catch_async([&] {
+        RawBufferVector rawCertChain;
+        for (auto &e: certificateChainVector) {
+            rawCertChain.push_back(e->getDER());
+        }
 
-void ManagerAsync::Impl::createSignature(const ObserverPtr& observer,
-                                         const Alias& /*privateKeyAlias*/,
-                                         const Password& /*password*/,
-                                         const RawBuffer& /*message*/,
-                                         const HashAlgorithm /*hash*/,
-                                         const RSAPaddingAlgorithm /*padding*/)
-{
-    observerCheck(observer);
-    observer->ReceivedError(CKM_API_ERROR_UNKNOWN);
-}
+        m_counter++;
+        auto send = MessageBuffer::Serialize(m_counter, rawCertChain);
 
-void ManagerAsync::Impl::verifySignature(const ObserverPtr& observer,
-                                         const Alias& /*publicKeyOrCertAlias*/,
-                                         const Password& /*password*/,
-                                         const RawBuffer& /*message*/,
-                                         const RawBuffer& /*signature*/,
-                                         const HashAlgorithm /*hash*/,
-                                         const RSAPaddingAlgorithm /*padding*/)
-{
-    observerCheck(observer);
-    observer->ReceivedError(CKM_API_ERROR_UNKNOWN);
+        thread()->sendMessage(AsyncRequest(observer,
+                                           SERVICE_SOCKET_OCSP,
+                                           send.Pop(),
+                                           m_counter));
+    }, [&observer](int error){ observer->ReceivedError(error); } );
 }
 
-void ManagerAsync::Impl::ocspCheck(const ObserverPtr& observer,
-                                   const CertificateShPtrVector& /*certificateChainVector*/)
+void ManagerAsync::Impl::allowAccess(const ObserverPtr& observer,
+                                     const std::string& alias,
+                                     const std::string& accessor,
+                                     AccessRight granted)
 {
     observerCheck(observer);
-    observer->ReceivedError(CKM_API_ERROR_UNKNOWN);
+    if (alias.empty() || accessor.empty()) {
+        observer->ReceivedError(CKM_API_ERROR_INPUT_PARAM);
+        return;
+    }
+    try_catch_async([&] {
+        sendToStorage(observer,
+                      static_cast<int>(LogicCommand::ALLOW_ACCESS),
+                      m_counter,
+                      alias,
+                      accessor,
+                      static_cast<int>(granted));
+    }, [&observer](int error){ observer->ReceivedError(error); } );
 }
 
-void ManagerAsync::Impl::allowAccess(const ObserverPtr& observer,
-                                     const std::string& /*alias*/,
-                                     const std::string& /*accessor*/,
-                                     AccessRight /*granted*/)
+void ManagerAsync::Impl::denyAccess(const ObserverPtr& observer,
+                                    const std::string& alias,
+                                    const std::string& accessor)
 {
     observerCheck(observer);
-    observer->ReceivedError(CKM_API_ERROR_UNKNOWN);
+    if (alias.empty() || accessor.empty()) {
+        observer->ReceivedError(CKM_API_ERROR_INPUT_PARAM);
+        return;
+    }
+    try_catch_async([&] {
+        sendToStorage(observer,
+                      static_cast<int>(LogicCommand::DENY_ACCESS),
+                      m_counter,
+                      alias,
+                      accessor);
+    }, [&observer](int error){ observer->ReceivedError(error); } );
 }
 
-void ManagerAsync::Impl::denyAccess(const ObserverPtr& observer,
-                                    const std::string& /*alias*/,
-                                    const std::string& /*accessor*/)
+void ManagerAsync::Impl::getBinaryDataAliasVector(const ManagerAsync::ObserverPtr& observer,
+                                                  DBDataType dataType)
 {
     observerCheck(observer);
-    observer->ReceivedError(CKM_API_ERROR_UNKNOWN);
+    try_catch_async([&] {
+        sendToStorage(observer,
+                      static_cast<int>(LogicCommand::GET_LIST),
+                      m_counter,
+                      static_cast<int>(dataType));
+    }, [&observer](int error){ observer->ReceivedError(error); } );
 }
 
-void ManagerAsync::Impl::saveBinaryData(const ManagerAsync::ObserverPtr& observer,
-                                        const Alias& alias,
-                                        DBDataType dataType,
-                                        const RawBuffer& rawData,
-                                        const Policy& policy)
+void ManagerAsync::Impl::createKeyPair(const ManagerAsync::ObserverPtr& observer,
+                                       const KeyType key_type,
+                                       const int     additional_param,
+                                       const Alias  &privateKeyAlias,
+                                       const Alias  &publicKeyAlias,
+                                       const Policy &policyPrivateKey,
+                                       const Policy &policyPublicKey)
 {
-    if (alias.empty() || rawData.empty()) {
+    observerCheck(observer);
+    if (privateKeyAlias.empty() || publicKeyAlias.empty()) {
         observer->ReceivedError(CKM_API_ERROR_INPUT_PARAM);
         return;
     }
+    // input type check
+    LogicCommand cmd_type;
+    switch(key_type)
+    {
+        case KeyType::KEY_RSA_PUBLIC:
+        case KeyType::KEY_RSA_PRIVATE:
+            cmd_type = LogicCommand::CREATE_KEY_PAIR_RSA;
+            break;
 
-    try_catch_async([&] {
-        m_counter++;
+        case KeyType::KEY_DSA_PUBLIC:
+        case KeyType::KEY_DSA_PRIVATE:
+            cmd_type = LogicCommand::CREATE_KEY_PAIR_DSA;
+            break;
 
-        auto send = MessageBuffer::Serialize(static_cast<int>(LogicCommand::SAVE),
-                                             m_counter,
-                                             static_cast<int>(dataType),
-                                             alias,
-                                             rawData,
-                                             PolicySerializable(policy));
+        case KeyType::KEY_ECDSA_PUBLIC:
+        case KeyType::KEY_ECDSA_PRIVATE:
+            cmd_type = LogicCommand::CREATE_KEY_PAIR_ECDSA;
+            break;
 
-        thread()->sendMessage(AsyncRequest(observer,
-                                           SERVICE_SOCKET_CKM_STORAGE,
-                                           send.Pop(),
-                                           m_counter));
+        default:
+            observer->ReceivedError(CKM_API_ERROR_INPUT_PARAM);
+            return;
+    }
 
+    try_catch_async([&] {
+        sendToStorage(observer,
+                      static_cast<int>(cmd_type),
+                      m_counter,
+                      static_cast<int>(additional_param),
+                      PolicySerializable(policyPrivateKey),
+                      PolicySerializable(policyPublicKey),
+                      privateKeyAlias,
+                      publicKeyAlias);
     }, [&observer](int error){ observer->ReceivedError(error); } );
 }
 
index d16593f..42b32db 100644 (file)
@@ -54,49 +54,6 @@ public:
             const RawBuffer& data,
             const Policy& policy);
 
-    void removeKey(const ObserverPtr& observer, const Alias& alias);
-    void removeCertificate(const ObserverPtr& observer, const Alias& alias);
-    void removeData(const ObserverPtr& observer, const Alias& alias);
-
-    void getKey(const ObserverPtr& observer, const Alias& alias, const Password& password);
-    void getCertificate(const ObserverPtr& observer, const Alias& alias, const Password& password);
-    void getData(const ObserverPtr& observer, const Alias& alias, const Password& password);
-
-    void getKeyAliasVector(const ObserverPtr& observer);
-    void getCertificateAliasVector(const ObserverPtr& observer);
-    void getDataAliasVector(const ObserverPtr& observer);
-
-    void createKeyPairRSA(
-            const ObserverPtr& observer,
-            int size,
-            const Alias& privateKeyAlias,
-            const Alias& publicKeyAlias,
-            const Policy& policyPrivateKey,
-            const Policy& policyPublicKey);
-    void createKeyPairDSA(
-            const ObserverPtr& observer,
-            int size,
-            const Alias& privateKeyAlias,
-            const Alias& publicKeyAlias,
-            const Policy& policyPrivateKey,
-            const Policy& policyPublicKey);
-    void createKeyPairECDSA(
-            const ObserverPtr& observer,
-            const ElipticCurve type,
-            const Alias& privateKeyAlias,
-            const Alias& publicKeyAlias,
-            const Policy& policyPrivateKey,
-            const Policy& policyPublicKey);
-
-    void getCertificateChain(
-            const ObserverPtr& observer,
-            const CertificateShPtr& certificate,
-            const CertificateShPtrVector& untrustedCertificates);
-    void getCertificateChain(
-            const ObserverPtr& observer,
-            const CertificateShPtr& certificate,
-            const AliasVector& untrustedCertificates);
-
     void createSignature(
             const ObserverPtr& observer,
             const Alias& privateKeyAlias,
@@ -127,12 +84,72 @@ public:
             const std::string& alias,
             const std::string& accessor);
 
+    // generic methods
+    void saveBinaryData(
+            const ManagerAsync::ObserverPtr& observer,
+            const Alias& alias,
+            DBDataType dataType,
+            const RawBuffer& rawData,
+            const Policy& policy);
+
+    void removeBinaryData(
+            const ManagerAsync::ObserverPtr& observer,
+            const Alias &alias,
+            DBDataType dataType);
+
+    void getBinaryData(
+            const ManagerAsync::ObserverPtr& observer,
+            const Alias &alias,
+            DBDataType sendDataType,
+            const Password &password);
+
+    void getBinaryDataAliasVector(
+            const ManagerAsync::ObserverPtr& observer,
+            DBDataType dataType);
+
+    void createKeyPair(
+            const ManagerAsync::ObserverPtr& observer,
+            const KeyType key_type,
+            const int     additional_param,
+            const Alias  &privateKeyAlias,
+            const Alias  &publicKeyAlias,
+            const Policy &policyPrivateKey,
+            const Policy &policyPublicKey);
+
+    template <typename T>
+    void getCertChain(
+            const ManagerAsync::ObserverPtr& observer,
+            LogicCommand command,
+            const CertificateShPtr &certificate,
+            const T &sendData)
+    {
+        observerCheck(observer);
+        if (!certificate || sendData.empty()) {
+            observer->ReceivedError(CKM_API_ERROR_INPUT_PARAM);
+            return;
+        }
+        try_catch_async([&] {
+            sendToStorage(observer,
+                          static_cast<int>(command),
+                          m_counter,
+                          certificate->getDER(),
+                          sendData);
+        }, [&observer](int error){ observer->ReceivedError(error); } );
+    }
+
 private:
-    void saveBinaryData(const ManagerAsync::ObserverPtr& observer,
-                        const Alias& alias,
-                        DBDataType dataType,
-                        const RawBuffer& rawData,
-                        const Policy& policy);
+
+    template <typename... Args>
+    void sendToStorage(const ManagerAsync::ObserverPtr& observer, const Args&... args)
+    {
+        m_counter++; // yes, it changes m_counter argument passed in args
+
+        auto send = MessageBuffer::Serialize(args...);
+        thread()->sendMessage(AsyncRequest(observer,
+                                           SERVICE_SOCKET_CKM_STORAGE,
+                                           send.Pop(),
+                                           m_counter));
+    }
 
     void observerCheck(const ManagerAsync::ObserverPtr& observer);
 
index 7c747bf..24db60c 100644 (file)
@@ -60,51 +60,51 @@ void ManagerAsync::saveData(const ObserverPtr& observer,
 
 void ManagerAsync::removeKey(const ObserverPtr& observer, const Alias& alias)
 {
-    m_impl->removeKey(observer, alias);
+    m_impl->removeBinaryData(observer, alias, DBDataType::DB_KEY_FIRST);
 }
 
 void ManagerAsync::removeCertificate(const ObserverPtr& observer, const Alias& alias)
 {
-    m_impl->removeCertificate(observer, alias);
+    m_impl->removeBinaryData(observer, alias, DBDataType::CERTIFICATE);
 }
 
 void ManagerAsync::removeData(const ObserverPtr& observer, const Alias& alias)
 {
-    m_impl->removeData(observer, alias);
+    m_impl->removeBinaryData(observer, alias, DBDataType::BINARY_DATA);
 }
 
 void ManagerAsync::getKey(const ObserverPtr& observer, const Alias& alias, const Password& password)
 {
-    m_impl->getKey(observer, alias, password);
+    m_impl->getBinaryData(observer, alias, DBDataType::DB_KEY_FIRST, password);
 }
 
 void ManagerAsync::getCertificate(const ObserverPtr& observer,
                                   const Alias& alias,
                                   const Password& password)
 {
-    m_impl->getCertificate(observer, alias, password);
+    m_impl->getBinaryData(observer, alias, DBDataType::CERTIFICATE, password);
 }
 
 void ManagerAsync::getData(const ObserverPtr& observer,
                            const Alias& alias,
                            const Password& password)
 {
-    m_impl->getData(observer, alias, password);
+    m_impl->getBinaryData(observer, alias, DBDataType::BINARY_DATA, password);
 }
 
 void ManagerAsync::getKeyAliasVector(const ObserverPtr& observer)
 {
-    m_impl->getKeyAliasVector(observer);
+    m_impl->getBinaryDataAliasVector(observer, DBDataType::DB_KEY_FIRST);
 }
 
 void ManagerAsync::getCertificateAliasVector(const ObserverPtr& observer)
 {
-    m_impl->getCertificateAliasVector(observer);
+    m_impl->getBinaryDataAliasVector(observer, DBDataType::CERTIFICATE);
 }
 
 void ManagerAsync::getDataAliasVector(const ObserverPtr& observer)
 {
-    m_impl->getDataAliasVector(observer);
+    m_impl->getBinaryDataAliasVector(observer, DBDataType::BINARY_DATA);
 }
 
 void ManagerAsync::createKeyPairRSA(const ObserverPtr& observer,
@@ -114,12 +114,13 @@ void ManagerAsync::createKeyPairRSA(const ObserverPtr& observer,
                                     const Policy& policyPrivateKey,
                                     const Policy& policyPublicKey)
 {
-    m_impl->createKeyPairRSA(observer,
-                             size,
-                             privateKeyAlias,
-                             publicKeyAlias,
-                             policyPrivateKey,
-                             policyPublicKey);
+    m_impl->createKeyPair(observer,
+                          KeyType::KEY_RSA_PUBLIC,
+                          size,
+                          privateKeyAlias,
+                          publicKeyAlias,
+                          policyPrivateKey,
+                          policyPublicKey);
 }
 
 void ManagerAsync::createKeyPairDSA(const ObserverPtr& observer,
@@ -129,12 +130,13 @@ void ManagerAsync::createKeyPairDSA(const ObserverPtr& observer,
                                     const Policy& policyPrivateKey,
                                     const Policy& policyPublicKey)
 {
-    m_impl->createKeyPairDSA(observer,
-                             size,
-                             privateKeyAlias,
-                             publicKeyAlias,
-                             policyPrivateKey,
-                             policyPublicKey);
+    m_impl->createKeyPair(observer,
+                          KeyType::KEY_DSA_PUBLIC,
+                          size,
+                          privateKeyAlias,
+                          publicKeyAlias,
+                          policyPrivateKey,
+                          policyPublicKey);
 }
 
 void ManagerAsync::createKeyPairECDSA(const ObserverPtr& observer,
@@ -144,26 +146,39 @@ void ManagerAsync::createKeyPairECDSA(const ObserverPtr& observer,
                                       const Policy& policyPrivateKey,
                                       const Policy& policyPublicKey)
 {
-    m_impl->createKeyPairECDSA(observer,
-                               type,
-                               privateKeyAlias,
-                               publicKeyAlias,
-                               policyPrivateKey,
-                               policyPublicKey);
+    m_impl->createKeyPair(observer,
+                          KeyType::KEY_ECDSA_PUBLIC,
+                          static_cast<int>(type),
+                          privateKeyAlias,
+                          publicKeyAlias,
+                          policyPrivateKey,
+                          policyPublicKey);
 }
 
 void ManagerAsync::getCertificateChain(const ObserverPtr& observer,
                                        const CertificateShPtr& certificate,
                                        const CertificateShPtrVector& untrustedCertificates)
 {
-    m_impl->getCertificateChain(observer, certificate, untrustedCertificates);
+    RawBufferVector rawBufferVector;
+
+    for (auto &e: untrustedCertificates) {
+        rawBufferVector.push_back(e->getDER());
+    }
+
+    m_impl->getCertChain(observer,
+                         LogicCommand::GET_CHAIN_CERT,
+                         certificate,
+                         rawBufferVector);
 }
 
 void ManagerAsync::getCertificateChain(const ObserverPtr& observer,
                                        const CertificateShPtr& certificate,
                                        const AliasVector& untrustedCertificates)
 {
-    m_impl->getCertificateChain(observer, certificate, untrustedCertificates);
+    m_impl->getCertChain(observer,
+                         LogicCommand::GET_CHAIN_ALIAS,
+                         certificate,
+                         untrustedCertificates);
 }
 
 void ManagerAsync::createSignature(const ObserverPtr& observer,
index 50d025f..a927d29 100644 (file)
@@ -70,7 +70,7 @@ void ConnectionThread::sendMessage(AsyncRequest&& req) {
     m_waitingReqs.push(std::move(req));
     lock.unlock();
 
-    // notifty via pipe
+    // notify via pipe
     m_pipe.notify();
 }
 
similarity index 53%
rename from src/manager/client-async/receiver.cpp
rename to src/manager/client-async/ocsp-receiver.cpp
index c56324e..933a4e3 100644 (file)
  *  limitations under the License
  */
 /*
- * @file       receiver.cpp
+ * @file       ocsp-receiver.cpp
  * @author     Krzysztof Jackiewicz (k.jackiewicz@samsung.com)
  * @version    1.0
  */
 
-#include <receiver.h>
+#include <ocsp-receiver.h>
 #include <protocols.h>
 #include <dpl/log/log.h>
 
 namespace CKM {
 
-Receiver::Receiver(MessageBuffer& buffer, AsyncRequest::Map& requests) :
+OcspReceiver::OcspReceiver(MessageBuffer& buffer, AsyncRequest::Map& requests) :
     m_buffer(buffer),
-    m_requests(requests),
-    m_observer(NULL)
+    m_requests(requests)
 {
 }
 
-void Receiver::parseResponse()
+void OcspReceiver::parseResponse()
 {
-    int command;
-    int id;
-    m_buffer.Deserialize(command, id);
+    int id, retCode, ocspStatus;
+    m_buffer.Deserialize(id, retCode, ocspStatus);
 
     auto it = m_requests.find(id);
     if (it == m_requests.end()) {
@@ -48,36 +46,10 @@ void Receiver::parseResponse()
     AsyncRequest req = std::move(m_requests.at(id));
     m_requests.erase(id);
 
-    m_observer = req.observer;
-
-    switch (static_cast<LogicCommand>(command)) {
-    case LogicCommand::SAVE:
-        parseSaveCommand();
-        break;
-    // TODO other cases
-    default:
-        LogError("Unknown command id: " << command);
-        ThrowMsg(BadResponse, "Unknown command id: " << command);
-        break;
-    }
-}
-
-void Receiver::parseSaveCommand()
-{
-    int retCode;
-    int dataType;
-
-    m_buffer.Deserialize(retCode, dataType);
-
-    DBDataType dt = static_cast<DBDataType>(dataType);
-    if (dt >= DBDataType::DB_KEY_FIRST && dt <= DBDataType::DB_KEY_LAST) {
-        if (retCode == CKM_API_SUCCESS)
-            m_observer->ReceivedSaveKey();
-        else
-            m_observer->ReceivedError(retCode);
-    } else {
-        // TODO
-    }
+    if (retCode == CKM_API_SUCCESS)
+        req.observer->ReceivedOCSPCheck(ocspStatus);
+    else
+        req.observer->ReceivedError(retCode);
 }
 
 } /* namespace CKM */
diff --git a/src/manager/client-async/ocsp-receiver.h b/src/manager/client-async/ocsp-receiver.h
new file mode 100644 (file)
index 0000000..bd6bf7b
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ *  Copyright (c) 2000 - 2014 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       ocsp-receiver.h
+ * @author     Krzysztof Jackiewicz (k.jackiewicz@samsung.com)
+ * @version    1.0
+ */
+
+#pragma once
+
+#include <message-buffer.h>
+#include <noncopyable.h>
+#include <async-request.h>
+#include <receiver.h>
+
+namespace CKM {
+
+class OcspReceiver : public IReceiver
+{
+public:
+    OcspReceiver(MessageBuffer& buffer, AsyncRequest::Map& reqMap);
+    virtual ~OcspReceiver() {}
+
+    NONCOPYABLE(OcspReceiver);
+
+    void parseResponse();
+
+private:
+    MessageBuffer& m_buffer;
+    AsyncRequest::Map& m_requests;
+};
+
+} /* namespace CKM */
index 4655791..106a93b 100644 (file)
 
 #pragma once
 
-#include <message-buffer.h>
-#include <noncopyable.h>
-#include <ckm/ckm-manager.h>
-#include <async-request.h>
-
 namespace CKM {
 
-class Receiver
-{
+class IReceiver {
 public:
     DECLARE_EXCEPTION_TYPE(CKM::Exception, BadResponse);
 
-    Receiver(MessageBuffer& buffer, AsyncRequest::Map& reqMap);
-    virtual ~Receiver() {}
-
-    NONCOPYABLE(Receiver);
-
-    void parseResponse();
-
-private:
-    void parseSaveCommand();
-
-    MessageBuffer& m_buffer;
-    AsyncRequest::Map& m_requests;
-    ManagerAsync::ObserverPtr m_observer;
+    virtual void parseResponse() = 0;
+    virtual ~IReceiver() {};
 };
 
-} /* namespace CKM */
+}
index b2e8e8d..5eb8756 100644 (file)
@@ -21,7 +21,9 @@
 
 #include <service.h>
 #include <dpl/log/log.h>
-#include <receiver.h>
+#include <storage-receiver.h>
+#include <ocsp-receiver.h>
+#include <protocols.h>
 
 namespace CKM {
 
@@ -97,7 +99,7 @@ void Service::socketReady(int sock, short revents)
             LogError("Unexpected event: " << revents << "!=" << POLLOUT);
             serviceError(CKM_API_ERROR_SOCKET);
         }
-    } catch (const Receiver::BadResponse&) {
+    } catch (const IReceiver::BadResponse&) {
         serviceError(CKM_API_ERROR_BAD_RESPONSE);
     } catch (std::exception &e) {
         LogError("STD exception " << e.what());
@@ -176,8 +178,17 @@ void Service::receiveData()
     // parse while you can
     while(m_responseBuffer->Ready())
     {
-        Receiver recv(*m_responseBuffer, m_responseMap);
-        recv.parseResponse();
+        std::unique_ptr<IReceiver> receiver;
+        if (m_interface == SERVICE_SOCKET_CKM_STORAGE)
+            receiver.reset(new StorageReceiver(*m_responseBuffer, m_responseMap));
+        else if (m_interface == SERVICE_SOCKET_OCSP)
+            receiver.reset(new OcspReceiver(*m_responseBuffer, m_responseMap));
+        else {
+            LogError("Unknown service " << m_interface);
+            serviceError(CKM_API_ERROR_RECV_FAILED);
+            return;
+        }
+        receiver->parseResponse();
 
         if (m_responseMap.empty())
             watch(m_sendQueue.empty()?0:POLLOUT);
diff --git a/src/manager/client-async/storage-receiver.cpp b/src/manager/client-async/storage-receiver.cpp
new file mode 100644 (file)
index 0000000..60d0da6
--- /dev/null
@@ -0,0 +1,318 @@
+/*
+ *  Copyright (c) 2000 - 2014 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       receiver.cpp
+ * @author     Krzysztof Jackiewicz (k.jackiewicz@samsung.com)
+ * @version    1.0
+ */
+
+#include <storage-receiver.h>
+#include <protocols.h>
+#include <dpl/log/log.h>
+#include <key-impl.h>
+#include <certificate-impl.h>
+
+namespace CKM {
+
+namespace {
+
+enum class DataType {
+    KEY,
+    CERT,
+    DATA
+};
+
+DataType type(int dbDataType)
+{
+    switch(static_cast<DBDataType>(dbDataType))
+    {
+    case DBDataType::KEY_RSA_PUBLIC:
+    case DBDataType::KEY_RSA_PRIVATE:
+    case DBDataType::KEY_ECDSA_PUBLIC:
+    case DBDataType::KEY_ECDSA_PRIVATE:
+    case DBDataType::KEY_DSA_PUBLIC:
+    case DBDataType::KEY_DSA_PRIVATE:
+    case DBDataType::KEY_AES:
+        return DataType::KEY;
+
+    case DBDataType::CERTIFICATE:
+        return DataType::CERT;
+
+    case DBDataType::BINARY_DATA:
+        return DataType::DATA;
+
+    default:
+        LogError("Unsupported data type: " <<dbDataType);
+        ThrowMsg(IReceiver::BadResponse, "Unsupported data type: " << dbDataType);
+    }
+}
+
+} // namespace anonymous
+
+StorageReceiver::StorageReceiver(MessageBuffer& buffer, AsyncRequest::Map& requests) :
+    m_buffer(buffer),
+    m_requests(requests),
+    m_observer(NULL)
+{
+}
+
+void StorageReceiver::parseResponse()
+{
+    int command, id;
+    m_buffer.Deserialize(command, id);
+
+    auto it = m_requests.find(id);
+    if (it == m_requests.end()) {
+        LogError("Request with id " << id << " not found!");
+        ThrowMsg(BadResponse, "Request with id " << id << " not found!");
+    }
+
+    // let it throw
+    AsyncRequest req = std::move(m_requests.at(id));
+    m_requests.erase(id);
+
+    m_observer = req.observer;
+
+    switch (static_cast<LogicCommand>(command)) {
+    case LogicCommand::GET:
+        parseGetCommand();
+        break ;
+    case LogicCommand::GET_LIST:
+        parseGetListCommand();
+        break;
+    case LogicCommand::SAVE:
+        parseSaveCommand();
+        break;
+    case LogicCommand::REMOVE:
+        parseRemoveCommand();
+        break;
+    case LogicCommand::CREATE_KEY_PAIR_RSA:
+        parseRetCode(&ManagerAsync::Observer::ReceivedCreateKeyPairRSA);
+        break;
+    case LogicCommand::CREATE_KEY_PAIR_ECDSA:
+        parseRetCode(&ManagerAsync::Observer::ReceivedCreateKeyPairECDSA);
+        break;
+    case LogicCommand::GET_CHAIN_CERT:
+    case LogicCommand::GET_CHAIN_ALIAS:
+        parseGetChainCertCommand();
+        break;
+    case LogicCommand::CREATE_SIGNATURE:
+        parseCreateSignatureCommand();
+        break;
+    case LogicCommand::VERIFY_SIGNATURE:
+        parseRetCode(&ManagerAsync::Observer::ReceivedVerifySignature);
+        break;
+    case LogicCommand::CREATE_KEY_PAIR_DSA:
+        parseRetCode(&ManagerAsync::Observer::ReceivedCreateKeyPairDSA);
+        break;
+    case LogicCommand::ALLOW_ACCESS:
+        parseRetCode(&ManagerAsync::Observer::ReceivedAllowAccess);
+        break;
+    case LogicCommand::DENY_ACCESS:
+        parseRetCode(&ManagerAsync::Observer::ReceivedDenyAccess);
+        break;
+
+    default:
+        LogError("Unknown command id: " << command);
+        ThrowMsg(BadResponse, "Unknown command id: " << command);
+        break;
+    }
+}
+
+void StorageReceiver::parseGetCommand()
+{
+    RawBuffer rawData;
+    int dataType, retCode;
+    m_buffer.Deserialize(retCode, dataType, rawData);
+
+    // check error code
+    if (retCode != CKM_API_SUCCESS) {
+         m_observer->ReceivedError(retCode);
+         return;
+    }
+
+    switch(type(dataType))
+    {
+    case DataType::KEY:
+        m_observer->ReceivedKey(KeyImpl(rawData));
+        break;
+    case DataType::CERT:
+        m_observer->ReceivedCertificate(CertificateImpl(rawData, DataFormat::FORM_DER));
+        break;
+    case DataType::DATA:
+        m_observer->ReceivedData(std::move(rawData));
+        break;
+    }
+}
+
+void StorageReceiver::parseGetListCommand()
+{
+    int dataType, retCode;
+    AliasVector aliasVector;
+    m_buffer.Deserialize(retCode, dataType, aliasVector);
+
+    // check error code
+    if (retCode != CKM_API_SUCCESS) {
+         m_observer->ReceivedError(retCode);
+         return;
+    }
+
+    switch(type(dataType))
+    {
+    case DataType::KEY:
+        m_observer->ReceivedKeyAliasVector(std::move(aliasVector));
+        break;
+    case DataType::CERT:
+        m_observer->ReceivedCertificateAliasVector(std::move(aliasVector));
+        break;
+    case DataType::DATA:
+        m_observer->ReceivedDataAliasVector(std::move(aliasVector));
+        break;
+    }
+}
+
+void StorageReceiver::parseSaveCommand()
+{
+    int dataType, retCode;
+    m_buffer.Deserialize(retCode, dataType);
+
+    // check error code
+    if (retCode != CKM_API_SUCCESS) {
+         m_observer->ReceivedError(retCode);
+         return;
+    }
+
+    switch(type(dataType))
+    {
+    case DataType::KEY:
+        m_observer->ReceivedSaveKey();
+        break;
+    case DataType::CERT:
+        m_observer->ReceivedSaveCertificate();
+        break;
+    case DataType::DATA:
+        m_observer->ReceivedSaveData();
+        break;
+    }
+}
+
+void StorageReceiver::parseRemoveCommand()
+{
+    int dataType, retCode;
+    m_buffer.Deserialize(retCode, dataType);
+
+    // check error code
+    if (retCode != CKM_API_SUCCESS) {
+         m_observer->ReceivedError(retCode);
+         return;
+    }
+
+    switch(type(dataType))
+    {
+    case DataType::KEY:
+        m_observer->ReceivedSaveKey();
+        break;
+    case DataType::CERT:
+        m_observer->ReceivedSaveCertificate();
+        break;
+    case DataType::DATA:
+        m_observer->ReceivedSaveData();
+        break;
+    }
+}
+
+void StorageReceiver::parseGetChainCertCommand()
+{
+    CertificateShPtrVector certificateChainVector;
+    RawBufferVector rawBufferVector;
+    int retCode;
+    m_buffer.Deserialize(retCode, rawBufferVector);
+
+    // check error code
+    if (retCode != CKM_API_SUCCESS) {
+         m_observer->ReceivedError(retCode);
+         return;
+    }
+
+    for (auto &e: rawBufferVector) {
+        CertificateShPtr cert(new CertificateImpl(e, DataFormat::FORM_DER));
+        if (cert->empty()) {
+            m_observer->ReceivedError(CKM_API_ERROR_BAD_RESPONSE);
+            return;
+        }
+        certificateChainVector.push_back(cert);
+    }
+    m_observer->ReceivedGetCertificateChain(std::move(certificateChainVector));
+}
+
+void StorageReceiver::parseCreateSignatureCommand()
+{
+    int retCode;
+    RawBuffer signature;
+    m_buffer.Deserialize(retCode, signature);
+
+    // check error code
+    if (retCode != CKM_API_SUCCESS) {
+         m_observer->ReceivedError(retCode);
+         return;
+    }
+
+    m_observer->ReceivedCreateSignature(std::move(signature));
+}
+
+void StorageReceiver::parseAllowAccessCommand()
+{
+    int retCode;
+    m_buffer.Deserialize(retCode);
+
+    // check error code
+    if (retCode != CKM_API_SUCCESS) {
+         m_observer->ReceivedError(retCode);
+         return;
+    }
+
+    m_observer->ReceivedAllowAccess();
+}
+
+void StorageReceiver::parseDenyAccessCommand()
+{
+    int retCode;
+    m_buffer.Deserialize(retCode);
+
+    // check error code
+    if (retCode != CKM_API_SUCCESS) {
+         m_observer->ReceivedError(retCode);
+         return;
+    }
+
+    m_observer->ReceivedDenyAccess();
+}
+
+void StorageReceiver::parseRetCode(ObserverCb callback)
+{
+    int retCode;
+    m_buffer.Deserialize(retCode);
+
+    // check error code
+    if (retCode != CKM_API_SUCCESS) {
+         m_observer->ReceivedError(retCode);
+         return;
+    }
+
+    (m_observer.get()->*callback)();
+}
+
+} /* namespace CKM */
diff --git a/src/manager/client-async/storage-receiver.h b/src/manager/client-async/storage-receiver.h
new file mode 100644 (file)
index 0000000..d9e6b47
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ *  Copyright (c) 2000 - 2014 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       storage-receiver.h
+ * @author     Krzysztof Jackiewicz (k.jackiewicz@samsung.com)
+ * @version    1.0
+ */
+
+#pragma once
+
+#include <message-buffer.h>
+#include <noncopyable.h>
+#include <ckm/ckm-manager.h>
+#include <async-request.h>
+#include <receiver.h>
+
+namespace CKM {
+
+class StorageReceiver : public IReceiver
+{
+public:
+    StorageReceiver(MessageBuffer& buffer, AsyncRequest::Map& reqMap);
+    virtual ~StorageReceiver() {}
+
+    NONCOPYABLE(StorageReceiver);
+
+    void parseResponse();
+
+private:
+    void parseGetCommand();
+    void parseGetListCommand();
+    void parseSaveCommand();
+    void parseRemoveCommand();
+    void parseGetChainCertCommand();
+    void parseCreateSignatureCommand();
+    void parseAllowAccessCommand();
+    void parseDenyAccessCommand();
+
+    typedef void (ManagerAsync::Observer::*ObserverCb)();
+
+    void parseRetCode(ObserverCb callback);
+
+    MessageBuffer& m_buffer;
+    AsyncRequest::Map& m_requests;
+    ManagerAsync::ObserverPtr m_observer;
+};
+
+} /* namespace CKM */