From 3ba6d1a1228a46b9a921ce4b4674e9a09c124751 Mon Sep 17 00:00:00 2001 From: Krzysztof Jackiewicz Date: Mon, 26 Sep 2022 12:47:24 +0200 Subject: [PATCH] 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 --- src/manager/main/service-messages.h | 8 ++++---- src/manager/service/encryption-logic.cpp | 11 ++++++----- src/manager/service/encryption-logic.h | 7 ++++--- src/manager/service/encryption-service.cpp | 4 ++-- src/manager/service/encryption-service.h | 2 +- src/manager/service/iencryption-service.h | 2 +- 6 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/manager/main/service-messages.h b/src/manager/main/service-messages.h index dbe7648..6b40a7f 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 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) {} 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 627ed85..7ae1e00 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: - 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 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 96e7f14..f642870 100644 --- a/src/manager/service/encryption-service.cpp +++ b/src/manager/service/encryption-service.cpp @@ -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)) 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 eb5a8ae..8aa3be5 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; protected: ~IEncryptionService() {} }; -- 2.7.4