Deduplicate client manager impl de/serialization 52/242552/6
authorKonrad Lipinski <k.lipinski2@samsung.com>
Thu, 27 Aug 2020 18:29:24 +0000 (20:29 +0200)
committerKonrad Lipinski <k.lipinski2@samsung.com>
Wed, 16 Sep 2020 11:09:23 +0000 (13:09 +0200)
Change-Id: Iddcc5b42250584b7bed73a8ab6f64e0b61bd3520

src/manager/client/client-manager-impl.cpp
src/manager/client/client-manager-impl.h

index 8e3c86d..0640d81 100644 (file)
@@ -36,7 +36,7 @@ namespace CKM {
 
 namespace {
 template <class...T>
-int deserialize(const int msgId, MessageBuffer &recv, T&&...t)
+int deserializeResponse(const int msgId, MessageBuffer &recv, T&&...t)
 {
        int retMsgId, retCode;
        recv.Deserialize(retMsgId, retCode, std::forward<T>(t)...);
@@ -47,7 +47,7 @@ template <class T>
 int getCertChain(
        ServiceConnection &serviceConnection,
        LogicCommand command,
-       int msgId,
+       Manager::Impl &impl,
        const CertificateShPtr &certificate,
        const T &untrustedVector,
        const T &trustedVector,
@@ -56,21 +56,13 @@ int getCertChain(
 {
        EXCEPTION_GUARD_START_CPPAPI
 
-       MessageBuffer recv;
-       auto send = SerializeMessage(static_cast<int>(command),
-                                                                msgId,
-                                                                certificate->getDER(),
-                                                                untrustedVector,
-                                                                trustedVector,
-                                                                useTrustedSystemCertificates);
-
-       int retCode = serviceConnection.processRequest(send, recv);
-
-       if (CKM_API_SUCCESS != retCode)
-               return retCode;
+       Manager::Impl::Request rq(impl, command, serviceConnection,
+                       certificate->getDER(), untrustedVector, trustedVector, useTrustedSystemCertificates);
+       if (!rq)
+               return rq.err();
 
        RawBufferVector rawBufferVector;
-       retCode = deserialize(msgId, recv, rawBufferVector);
+       int retCode = rq.deserialize(rawBufferVector);
 
        if (retCode != CKM_API_SUCCESS)
                return retCode;
@@ -89,7 +81,7 @@ int getCertChain(
        EXCEPTION_GUARD_END
 }
 
-} // namespace anonymous
+} // namespace
 
 Manager::Impl::Impl()
        : m_counter(0),
@@ -99,6 +91,37 @@ Manager::Impl::Impl()
 {
 }
 
+template <class Cmd, class...T>
+Manager::Impl::Request::Request(Manager::Impl &impl, Cmd cmd, CKM::ServiceConnection &conn, T&&...t)
+{
+       static_assert(sizeof cmd <= sizeof(int));
+       const auto msgId = m_msgId = ++impl.m_counter;
+       m_retCode = conn.processRequest(
+                       SerializeMessage(static_cast<int>(cmd), msgId, std::forward<T>(t)...),
+                       m_recv);
+}
+
+Manager::Impl::Request::operator bool() const {
+       return CKM_API_SUCCESS == m_retCode;
+}
+
+int Manager::Impl::Request::err() const {
+       assert(!*this);
+       return m_retCode;
+}
+
+template <class...T>
+int Manager::Impl::Request::deserialize(T&&...t)
+{
+       assert(*this);
+       return deserializeResponse(m_msgId, m_recv, std::forward<T>(t)...);
+}
+
+template <class...T>
+int Manager::Impl::Request::maybeDeserialize(T&&...t)
+{
+       return *this ? deserialize(std::forward<T>(t)...) : err();
+}
 
 int Manager::Impl::saveBinaryData(
        const Alias &alias,
@@ -106,30 +129,17 @@ int Manager::Impl::saveBinaryData(
        const RawBuffer &rawData,
        const Policy &policy)
 {
-       int msgId = ++m_counter;
-
        EXCEPTION_GUARD_START_CPPAPI
 
        if (alias.empty() || rawData.empty())
                return CKM_API_ERROR_INPUT_PARAM;
 
-       MessageBuffer recv;
        AliasSupport helper(alias);
-       auto send = SerializeMessage(static_cast<int>(LogicCommand::SAVE),
-                                                                msgId,
-                                                                dataType,
-                                                                helper.getName(),
-                                                                helper.getOwner(),
-                                                                rawData,
-                                                                PolicySerializable(policy));
-
-       int retCode = m_storageConnection.processRequest(send, recv);
-
-       if (CKM_API_SUCCESS != retCode)
-               return retCode;
 
        int opType;
-       return deserialize(msgId, recv, opType);
+       return Request(*this, LogicCommand::SAVE, m_storageConnection,
+                       dataType, helper.getName(), helper.getOwner(), rawData, PolicySerializable(policy)
+               ).maybeDeserialize(opType);
 
        EXCEPTION_GUARD_END
 }
@@ -178,26 +188,14 @@ int Manager::Impl::savePKCS12(
        if (alias.empty() || pkcs.get() == NULL)
                return CKM_API_ERROR_INPUT_PARAM;
 
-       int msgId = ++m_counter;
-
        EXCEPTION_GUARD_START_CPPAPI
 
-       MessageBuffer recv;
        AliasSupport helper(alias);
-       auto send = SerializeMessage(static_cast<int>(LogicCommand::SAVE_PKCS12),
-                                                                msgId,
-                                                                helper.getName(),
-                                                                helper.getOwner(),
-                                                                PKCS12Serializable(*pkcs.get()),
-                                                                PolicySerializable(keyPolicy),
-                                                                PolicySerializable(certPolicy));
 
-       int retCode = m_storageConnection.processRequest(send, recv);
-
-       if (CKM_API_SUCCESS != retCode)
-               return retCode;
-
-       return deserialize(msgId, recv);
+       return Request(*this, LogicCommand::SAVE_PKCS12, m_storageConnection,
+                       helper.getName(), helper.getOwner(), PKCS12Serializable(*pkcs.get()),
+                       PolicySerializable(keyPolicy), PolicySerializable(certPolicy)
+               ).maybeDeserialize();
 
        EXCEPTION_GUARD_END
 }
@@ -213,12 +211,12 @@ int Manager::Impl::getPKCS12(const Alias &alias, const Password &keyPass,
        if (alias.empty())
                return CKM_API_ERROR_INPUT_PARAM;
 
-       int msgId = ++m_counter;
-
        EXCEPTION_GUARD_START_CPPAPI
 
-       MessageBuffer recv;
        AliasSupport helper(alias);
+
+       int msgId = ++m_counter;
+       MessageBuffer recv;
        auto send = SerializeMessage(static_cast<int>(LogicCommand::GET_PKCS12),
                                                                 msgId,
                                                                 helper.getName(),
@@ -251,23 +249,13 @@ int Manager::Impl::removeAlias(const Alias &alias)
        if (alias.empty())
                return CKM_API_ERROR_INPUT_PARAM;
 
-       int msgId = ++m_counter;
-
        EXCEPTION_GUARD_START_CPPAPI
 
-       MessageBuffer recv;
        AliasSupport helper(alias);
-       auto send = SerializeMessage(static_cast<int>(LogicCommand::REMOVE),
-                                                                msgId,
-                                                                helper.getName(),
-                                                                helper.getOwner());
-
-       int retCode = m_storageConnection.processRequest(send, recv);
-
-       if (CKM_API_SUCCESS != retCode)
-               return retCode;
 
-       return deserialize(msgId, recv);
+       return Request(*this, LogicCommand::REMOVE, m_storageConnection,
+                       helper.getName(), helper.getOwner()
+               ).maybeDeserialize();
 
        EXCEPTION_GUARD_END
 }
@@ -282,25 +270,13 @@ int Manager::Impl::getBinaryData(
        if (alias.empty())
                return CKM_API_ERROR_INPUT_PARAM;
 
-       int msgId = ++m_counter;
-
        EXCEPTION_GUARD_START_CPPAPI
 
-       MessageBuffer recv;
        AliasSupport helper(alias);
-       auto send = SerializeMessage(static_cast<int>(LogicCommand::GET),
-                                                                msgId,
-                                                                sendDataType,
-                                                                helper.getName(),
-                                                                helper.getOwner(),
-                                                                password);
-
-       int retCode = m_storageConnection.processRequest(send, recv);
 
-       if (CKM_API_SUCCESS != retCode)
-               return retCode;
-
-       return deserialize(msgId, recv, recvDataType, rawData);
+       return Request(*this, LogicCommand::GET, m_storageConnection,
+                       sendDataType, helper.getName(), helper.getOwner(), password
+               ).maybeDeserialize(recvDataType, rawData);
 
        EXCEPTION_GUARD_END
 }
@@ -312,26 +288,15 @@ int Manager::Impl::getBinaryDataEncryptionStatus(const DataType sendDataType,
        if (alias.empty())
                return CKM_API_ERROR_INPUT_PARAM;
 
-       int msgId = ++m_counter;
-
        EXCEPTION_GUARD_START_CPPAPI
 
-       MessageBuffer recv;
        AliasSupport helper(alias);
-       auto send = SerializeMessage(static_cast<int>(LogicCommand::GET_PROTECTION_STATUS),
-                                                                msgId,
-                                                                sendDataType,
-                                                                helper.getName(),
-                                                                helper.getOwner());
-
-       int retCode = m_storageConnection.processRequest(send, recv);
-
-       if (CKM_API_SUCCESS != retCode)
-               return retCode;
-
        DataType tmpDataType;
        bool passwordProtectionStatus;
-       retCode = deserialize(msgId, recv, tmpDataType, passwordProtectionStatus);
+
+       int retCode = Request(*this, LogicCommand::GET_PROTECTION_STATUS, m_storageConnection,
+                       sendDataType, helper.getName(), helper.getOwner()
+               ).maybeDeserialize(tmpDataType, passwordProtectionStatus);
 
        if (retCode != CKM_API_SUCCESS) {
                return retCode;
@@ -428,21 +393,10 @@ int Manager::Impl::getData(const Alias &alias, const Password &password,
 int Manager::Impl::getBinaryDataAliasVectorHelper(DataType dataType,
                OwnerNameVector &ownerNameVector)
 {
-       int msgId = ++m_counter;
-
-       MessageBuffer recv;
-       auto send = SerializeMessage(static_cast<int>(LogicCommand::GET_LIST), msgId, dataType);
-
-       int retCode = m_storageConnection.processRequest(send, recv);
-
-       if (retCode != CKM_API_SUCCESS)
-               return retCode;
-
-       int retMsgId;
        DataType tmpDataType;
-       recv.Deserialize(retMsgId, retCode, tmpDataType, ownerNameVector);
-
-       return retMsgId != msgId ? CKM_API_ERROR_UNKNOWN : retCode;
+       return Request(*this, LogicCommand::GET_LIST, m_storageConnection,
+                       dataType
+               ).maybeDeserialize(tmpDataType, ownerNameVector);
 }
 
 int Manager::Impl::getBinaryDataAliasVector(DataType dataType,
@@ -574,26 +528,14 @@ int Manager::Impl::createKeyAES(
        const Alias &keyAlias,
        const Policy &policyKey)
 {
-       // proceed with sending request
-       int msgId = ++m_counter;
-
        EXCEPTION_GUARD_START_CPPAPI
 
-       MessageBuffer recv;
        AliasSupport aliasHelper(keyAlias);
-       auto send = SerializeMessage(static_cast<int>(LogicCommand::CREATE_KEY_AES),
-                                                                msgId,
-                                                                static_cast<int>(size),
-                                                                PolicySerializable(policyKey),
-                                                                aliasHelper.getName(),
-                                                                aliasHelper.getOwner());
 
-       int retCode = m_storageConnection.processRequest(send, recv);
-
-       if (CKM_API_SUCCESS != retCode)
-               return retCode;
-
-       return deserialize(msgId, recv);
+       return Request(*this, LogicCommand::CREATE_KEY_AES, m_storageConnection,
+                       static_cast<int>(size), PolicySerializable(policyKey),
+                       aliasHelper.getName(), aliasHelper.getOwner()
+               ).maybeDeserialize();
 
        EXCEPTION_GUARD_END
 }
@@ -633,30 +575,18 @@ int Manager::Impl::createKeyPair(
                return CKM_API_ERROR_INPUT_PARAM;
        }
 
-       // proceed with sending request
-       int msgId = ++m_counter;
-
        EXCEPTION_GUARD_START_CPPAPI
 
-       MessageBuffer recv;
        AliasSupport privateHelper(privateKeyAlias);
        AliasSupport publicHelper(publicKeyAlias);
-       auto send = SerializeMessage(static_cast<int>(LogicCommand::CREATE_KEY_PAIR),
-                                                                msgId,
-                                                                CryptoAlgorithmSerializable(keyGenAlgorithm),
-                                                                PolicySerializable(policyPrivateKey),
-                                                                PolicySerializable(policyPublicKey),
-                                                                privateHelper.getName(),
-                                                                privateHelper.getOwner(),
-                                                                publicHelper.getName(),
-                                                                publicHelper.getOwner());
 
-       int retCode = m_storageConnection.processRequest(send, recv);
-
-       if (CKM_API_SUCCESS != retCode)
-               return retCode;
-
-       return deserialize(msgId, recv);
+       return Request(*this, LogicCommand::CREATE_KEY_PAIR, m_storageConnection,
+                       CryptoAlgorithmSerializable(keyGenAlgorithm),
+                       PolicySerializable(policyPrivateKey),
+                       PolicySerializable(policyPublicKey),
+                       privateHelper.getName(), privateHelper.getOwner(),
+                       publicHelper.getName(), publicHelper.getOwner()
+               ).maybeDeserialize();
 
        EXCEPTION_GUARD_END
 }
@@ -689,7 +619,7 @@ int Manager::Impl::getCertificateChain(
        return getCertChain(
                           m_storageConnection,
                           LogicCommand::GET_CHAIN_CERT,
-                          ++m_counter,
+                          *this,
                           certificate,
                           untrustedVector,
                           trustedVector,
@@ -723,7 +653,7 @@ int Manager::Impl::getCertificateChain(
        return getCertChain(
                           m_storageConnection,
                           LogicCommand::GET_CHAIN_ALIAS,
-                          ++m_counter,
+                          *this,
                           certificate,
                           untrustedVector,
                           trustedVector,
@@ -738,26 +668,14 @@ int Manager::Impl::createSignature(
        const CryptoAlgorithm &cAlgorithm,
        RawBuffer &signature)
 {
-       int msgId = ++m_counter;
-
        EXCEPTION_GUARD_START_CPPAPI
 
-       MessageBuffer recv;
        AliasSupport helper(privateKeyAlias);
-       auto send = SerializeMessage(static_cast<int>(LogicCommand::CREATE_SIGNATURE),
-                                                                msgId,
-                                                                helper.getName(),
-                                                                helper.getOwner(),
-                                                                password,
-                                                                message,
-                                                                CryptoAlgorithmSerializable(cAlgorithm));
-
-       int retCode = m_storageConnection.processRequest(send, recv);
-
-       if (CKM_API_SUCCESS != retCode)
-               return retCode;
 
-       return deserialize(msgId, recv, signature);
+       return Request(*this, LogicCommand::CREATE_SIGNATURE, m_storageConnection,
+                       helper.getName(), helper.getOwner(), password, message,
+                       CryptoAlgorithmSerializable(cAlgorithm)
+               ).maybeDeserialize(signature);
 
        EXCEPTION_GUARD_END
 }
@@ -769,27 +687,14 @@ int Manager::Impl::verifySignature(
        const RawBuffer &signature,
        const CryptoAlgorithm &cAlg)
 {
-       int msgId = ++m_counter;
-
        EXCEPTION_GUARD_START_CPPAPI
 
-       MessageBuffer recv;
        AliasSupport helper(publicKeyOrCertAlias);
-       auto send = SerializeMessage(static_cast<int>(LogicCommand::VERIFY_SIGNATURE),
-                                                                msgId,
-                                                                helper.getName(),
-                                                                helper.getOwner(),
-                                                                password,
-                                                                message,
-                                                                signature,
-                                                                CryptoAlgorithmSerializable(cAlg));
 
-       int retCode = m_storageConnection.processRequest(send, recv);
-
-       if (CKM_API_SUCCESS != retCode)
-               return retCode;
-
-       return deserialize(msgId, recv);
+       return Request(*this, LogicCommand::VERIFY_SIGNATURE, m_storageConnection,
+                       helper.getName(), helper.getOwner(), password, message, signature,
+                       CryptoAlgorithmSerializable(cAlg)
+               ).maybeDeserialize();
 
        EXCEPTION_GUARD_END
 }
@@ -820,7 +725,7 @@ int Manager::Impl::ocspCheck(const CertificateShPtrVector &certChain,
        if (CKM_API_SUCCESS != retCode)
                return retCode;
 
-       return deserialize(msgId, recv, ocspStatus);
+       return deserializeResponse(msgId, recv, ocspStatus);
 
        EXCEPTION_GUARD_END
 }
@@ -829,25 +734,13 @@ int Manager::Impl::setPermission(const Alias &alias,
                                                                 const ClientId &accessor,
                                                                 PermissionMask permissionMask)
 {
-       int msgId = ++m_counter;
-
        EXCEPTION_GUARD_START_CPPAPI
 
-       MessageBuffer recv;
        AliasSupport helper(alias);
-       auto send = SerializeMessage(static_cast<int>(LogicCommand::SET_PERMISSION),
-                                                                msgId,
-                                                                helper.getName(),
-                                                                helper.getOwner(),
-                                                                accessor,
-                                                                permissionMask);
-
-       int retCode = m_storageConnection.processRequest(send, recv);
 
-       if (CKM_API_SUCCESS != retCode)
-               return retCode;
-
-       return deserialize(msgId, recv);
+       return Request(*this, LogicCommand::SET_PERMISSION, m_storageConnection,
+                       helper.getName(), helper.getOwner(), accessor, permissionMask
+               ).maybeDeserialize();
 
        EXCEPTION_GUARD_END
 }
@@ -859,27 +752,14 @@ int Manager::Impl::crypt(EncryptionCommand command,
                                                 const RawBuffer &input,
                                                 RawBuffer &output)
 {
-       int msgId = ++m_counter;
-
        EXCEPTION_GUARD_START_CPPAPI
 
-       MessageBuffer recv;
        AliasSupport helper(keyAlias);
        CryptoAlgorithmSerializable cas(algo);
-       auto send = SerializeMessage(static_cast<int>(command),
-                                                                msgId,
-                                                                cas,
-                                                                helper.getName(),
-                                                                helper.getOwner(),
-                                                                password,
-                                                                input);
-
-       int retCode = m_encryptionConnection.processRequest(send, recv);
-
-       if (CKM_API_SUCCESS != retCode)
-               return retCode;
 
-       return deserialize(msgId, recv, output);
+       return Request(*this, command, m_encryptionConnection,
+                       cas, helper.getName(), helper.getOwner(), password, input
+               ).maybeDeserialize(output);
 
        EXCEPTION_GUARD_END
 }
index 9b4ca25..939e2ac 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2000 - 2019 Samsung Electronics Co., Ltd All Rights Reserved
+/* Copyright (c) 2000-2020 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.
@@ -187,6 +187,29 @@ protected:
        CKM::ServiceConnection m_storageConnection;
        CKM::ServiceConnection m_ocspConnection;
        CKM::ServiceConnection m_encryptionConnection;
+
+private:
+       class Request final {
+               int m_msgId, m_retCode;
+               MessageBuffer m_recv;
+       public:
+               Request(Request &&) = delete;
+               Request(const Request &) = delete;
+               Request &operator=(Request &&) = delete;
+               Request &operator=(const Request &) = delete;
+
+               template <class Cmd, class...T>
+               Request(Manager::Impl &, Cmd, CKM::ServiceConnection &, T&&...);
+
+               explicit operator bool() const;
+               int err() const;
+
+               template <class...T>
+               int deserialize(T&&...);
+
+               template <class...T>
+               int maybeDeserialize(T&&...);
+       };
 };
 
 } // namespace CKM