From: Krzysztof Jackiewicz Date: Mon, 26 Sep 2022 10:47:24 +0000 (+0200) Subject: Fix encryption request handling X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fheads%2Ftizen_5.0;p=platform%2Fcore%2Fsecurity%2Fkey-manager.git Fix encryption request handling 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 --- diff --git a/src/manager/main/service-messages.h b/src/manager/main/service-messages.h index 0815f6d..2b59230 100644 --- a/src/manager/main/service-messages.h +++ b/src/manager/main/service-messages.h @@ -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 Label &label, const Password &password) : MsgBase(id), cred(cred), name(name), label(label), password(password) {} @@ -55,7 +55,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) {} diff --git a/src/manager/service/encryption-logic.cpp b/src/manager/service/encryption-logic.cpp index 01dd966..e3cf1d6 100644 --- a/src/manager/service/encryption-logic.cpp +++ b/src/manager/service/encryption-logic.cpp @@ -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); } } diff --git a/src/manager/service/encryption-logic.h b/src/manager/service/encryption-logic.h index b51439e..81d8a91 100644 --- a/src/manager/service/encryption-logic.h +++ b/src/manager/service/encryption-logic.h @@ -21,7 +21,7 @@ #pragma once -#include +#include #include #include #include @@ -32,7 +32,7 @@ namespace CKM { class EncryptionLogic { public: - EncryptionLogic(IEncryptionService &service) : m_service(service) {} + 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 m_requestsMap; + std::unordered_map m_requestsMap; + unsigned m_counter; }; } /* namespace CKM */ diff --git a/src/manager/service/encryption-service.cpp b/src/manager/service/encryption-service.cpp index e403584..07047e0 100644 --- a/src/manager/service/encryption-service.cpp +++ b/src/manager/service/encryption-service.cpp @@ -55,10 +55,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, request.label, - request.password); + MsgKeyRequest kReq(id, request.cred, request.name, request.label, request.password); if (!m_commMgr->SendMessage(kReq)) throw std::runtime_error("No listener found");// TODO diff --git a/src/manager/service/encryption-service.h b/src/manager/service/encryption-service.h index 69eb452..264b0fc 100644 --- a/src/manager/service/encryption-service.h +++ b/src/manager/service/encryption-service.h @@ -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; }; diff --git a/src/manager/service/iencryption-service.h b/src/manager/service/iencryption-service.h index 35281e2..7b40f2d 100644 --- a/src/manager/service/iencryption-service.h +++ b/src/manager/service/iencryption-service.h @@ -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; }; } // namespace CKM