Fix encryption request handling 50/282050/1
authorKrzysztof Jackiewicz <k.jackiewicz@samsung.com>
Mon, 26 Sep 2022 10:47:24 +0000 (12:47 +0200)
committerKrzysztof Jackiewicz <k.jackiewicz@samsung.com>
Mon, 26 Sep 2022 10:47:24 +0000 (12:47 +0200)
The key used in m_requestMap is not unique which may lead to errors when
requests from multiple clients are processed.

Use a separate request counter as the key.

Change-Id: Iffbf0a3c43ea0c091eb3d714ef0a77211f9b3a78

src/manager/main/service-messages.h
src/manager/service/encryption-logic.cpp
src/manager/service/encryption-logic.h
src/manager/service/encryption-service.cpp
src/manager/service/encryption-service.h
src/manager/service/iencryption-service.h

index dbe7648..6b40a7f 100644 (file)
@@ -35,15 +35,15 @@ namespace CKM {
 
 // inter-service communication message base class
 struct MsgBase {
-       explicit MsgBase(int id) : id(id) {}
+       explicit MsgBase(unsigned id) : id(id) {}
        virtual ~MsgBase() {}
 
-       int id;
+       unsigned id;
 };
 
 // key request
 struct MsgKeyRequest : public MsgBase {
-       MsgKeyRequest(int id, const Credentials &cred, const Name &name,
+       MsgKeyRequest(unsigned id, const Credentials &cred, const Name &name,
                                  const ClientId &explicitOwner, const Password &password) :
                MsgBase(id),
                cred(cred),
@@ -60,7 +60,7 @@ struct MsgKeyRequest : public MsgBase {
 
 // key response
 struct MsgKeyResponse : public MsgBase {
-       MsgKeyResponse(int id, const Crypto::GObjShPtr &key,
+       MsgKeyResponse(unsigned id, const Crypto::GObjShPtr &key,
                                   int errorCode = CKM_API_SUCCESS) :
                MsgBase(id), key(key), error(errorCode) {}
 
index 01dd966..e3cf1d6 100644 (file)
@@ -33,22 +33,23 @@ void EncryptionLogic::Crypt(const CryptoRequest &request)
                m_service.RespondToClient(request, CKM_API_ERROR_INPUT_PARAM);
                return;
        }
+       m_counter++;
 
        // store request in the map
-       auto ret = m_requestsMap.insert(std::make_pair(request.msgId, request));
+       auto ret = m_requestsMap.insert(std::make_pair(m_counter, request));
 
        if (!ret.second) {
-               LogError("Request with id " << request.msgId << " already exists");
-               m_service.RespondToClient(request, CKM_API_ERROR_INPUT_PARAM);
+               LogError("Request with id = " << m_counter << " already exists");
+               m_service.RespondToClient(request, CKM_API_ERROR_SERVER_ERROR);
                return;
        }
 
        // request key
        try {
-               m_service.RequestKey(request);
+               m_service.RequestKey(m_counter, request);
        } catch (...) {
                LogError("Key request failed");
-               m_requestsMap.erase(request.msgId);
+               m_requestsMap.erase(m_counter);
                m_service.RespondToClient(request, CKM_API_ERROR_SERVER_ERROR);
        }
 }
index 627ed85..7ae1e00 100644 (file)
@@ -21,7 +21,7 @@
 
 #pragma once
 
-#include <map>
+#include <unordered_map>
 #include <ckm/ckm-type.h>
 #include <generic-socket-manager.h>
 #include <protocols.h>
@@ -32,7 +32,7 @@ namespace CKM {
 
 class EncryptionLogic {
 public:
-       explicit EncryptionLogic(IEncryptionService &service) : m_service(service) {}
+       explicit EncryptionLogic(IEncryptionService &service) : m_service(service), m_counter(0) {}
        virtual ~EncryptionLogic() {}
 
        void Crypt(const CryptoRequest &request);
@@ -41,7 +41,8 @@ public:
 private:
        IEncryptionService &m_service;
 
-       std::map<int, CryptoRequest> m_requestsMap;
+       std::unordered_map<unsigned, CryptoRequest> m_requestsMap;
+       unsigned m_counter;
 };
 
 } /* namespace CKM */
index 96e7f14..f642870 100644 (file)
@@ -54,9 +54,9 @@ void EncryptionService::RespondToClient(const CryptoRequest &request,
        }
 }
 
-void EncryptionService::RequestKey(const CryptoRequest &request)
+void EncryptionService::RequestKey(unsigned id, const CryptoRequest &request)
 {
-       MsgKeyRequest kReq(request.msgId, request.cred, request.name,
+       MsgKeyRequest kReq(id, request.cred, request.name,
                                           request.explicitOwner, request.password);
 
        if (!m_commMgr->SendMessage(kReq))
index 69eb452..264b0fc 100644 (file)
@@ -76,7 +76,7 @@ private:
        virtual void RespondToClient(const CryptoRequest &request,
                                                                 int retCode,
                                                                 const RawBuffer &data = RawBuffer());
-       virtual void RequestKey(const CryptoRequest &request);
+       virtual void RequestKey(unsigned id, const CryptoRequest &request);
 
        EncryptionLogic m_logic;
 };
index eb5a8ae..8aa3be5 100644 (file)
@@ -34,7 +34,7 @@ public:
        virtual void RespondToClient(const CryptoRequest &request,
                                                                 int retCode,
                                                                 const RawBuffer &data = RawBuffer()) = 0;
-       virtual void RequestKey(const CryptoRequest &request) = 0;
+       virtual void RequestKey(unsigned id, const CryptoRequest &request) = 0;
 protected:
        ~IEncryptionService() {}
 };