Concatenated wrapping sw-backend implementation 14/312314/1
authorDariusz Michaluk <d.michaluk@samsung.com>
Fri, 19 Apr 2024 13:24:49 +0000 (15:24 +0200)
committerDariusz Michaluk <d.michaluk@samsung.com>
Thu, 6 Jun 2024 10:03:11 +0000 (12:03 +0200)
Change-Id: I28856286c05c2ec1919674b0e7cf8add90cc20e1

12 files changed:
src/include/ckm/ckm-manager.h
src/manager/client-capi/ckmc-manager.cpp
src/manager/client/client-manager-impl.cpp
src/manager/client/client-manager-impl.h
src/manager/client/client-manager.cpp
src/manager/common/protocols.h
src/manager/crypto/generic-backend/gobj.h
src/manager/crypto/sw-backend/obj.cpp
src/manager/crypto/sw-backend/obj.h
src/manager/service/ckm-logic.cpp
src/manager/service/ckm-logic.h
src/manager/service/ckm-service.cpp

index b98b4c8db42fcbc5174eebb3518a3d67c639efea..fbf633c50da78affeadc5e7b2b5e1f91e6b90416 100644 (file)
@@ -192,6 +192,23 @@ public:
                                                 KeyType &keyType,
                                                 RawBuffer &wrappedKey);
 
+       int wrapConcatenatedData(const CryptoAlgorithm &params,
+                                                        const Alias &wrappingKeyAlias,
+                                                        const Password &wrappingKeyPassword,
+                                                        const Alias &alias,
+                                                        const Password &password,
+                                                        const RawBuffer &data,
+                                                        RawBuffer &wrappedKey);
+
+       int unwrapConcatenatedData(const CryptoAlgorithm &params,
+                                                          const Alias &wrappingKeyAlias,
+                                                          const Password &wrappingKeyPassword,
+                                                          const RawBuffer &wrappedKey,
+                                                          const Alias &alias,
+                                                          size_t size,
+                                                          const Policy &policy,
+                                                          RawBuffer &data);
+
        int initializeCipher(const CryptoAlgorithm &params,
                                                 const Alias &keyAlias,
                                                 const Password &keyPassword,
index 3712becf9b446272da6e7251f1fc5f39b1a98696..e0c3be2b73cae74c386717f1b5d56c51b44c28c8 100644 (file)
@@ -1268,15 +1268,43 @@ int ckmc_wrap_concatenated_data(const ckmc_param_list_h params,
                                 const ckmc_raw_buffer_s *data,
                                 ckmc_key_s **ppwrapped_key)
 {
-       (void) params;
-       (void) wrapping_key_alias;
-       (void) wrapping_key_password;
-       (void) alias;
-       (void) password;
-       (void) data;
-       (void) ppwrapped_key;
+       EXCEPTION_GUARD_START_CAPI
 
-       return CKMC_ERROR_NONE;
+       if (params == nullptr || wrapping_key_alias == nullptr ||
+               alias == nullptr || data == nullptr || ppwrapped_key == nullptr)
+                       return CKMC_ERROR_INVALID_PARAMETER;
+
+       const CKM::CryptoAlgorithm *ca = reinterpret_cast<const CKM::CryptoAlgorithm *>
+                                                                        (params);
+
+       int ret = 0;
+       ckmc_key_s *wrapped_key = nullptr;
+       CKM::RawBuffer wrapped_key_buffer;
+       CKM::KeyType key_type = CKM::KeyType::KEY_AES;
+
+       auto mgr = CKM::Manager::create();
+
+       ret = to_ckmc_error(
+               mgr->wrapConcatenatedData(*ca,
+                                                                 CKM::Alias(wrapping_key_alias),
+                                                                 _tostring(wrapping_key_password),
+                                                                 CKM::Alias(alias),
+                                                                 _tostring(password),
+                                                                 CKM::RawBuffer(data->data, data->data + data->size),
+                                                                 wrapped_key_buffer));
+
+       if (ret == CKMC_ERROR_NONE) {
+               ret = ckmc_key_new(wrapped_key_buffer.data(),
+                                  wrapped_key_buffer.size(),
+                                  static_cast<ckmc_key_type_e>(key_type),
+                                  nullptr,
+                                  &wrapped_key);
+               if (ret == CKMC_ERROR_NONE)
+                       *ppwrapped_key = wrapped_key;
+       }
+
+       return ret;
+       EXCEPTION_GUARD_END
 }
 
 KEY_MANAGER_CAPI
@@ -1289,14 +1317,46 @@ int ckmc_unwrap_concatenated_data(const ckmc_param_list_h params,
                                   const ckmc_policy_s policy,
                                   ckmc_raw_buffer_s **ppdata)
 {
-       (void) params;
-       (void) wrapping_key_alias;
-       (void) wrapping_key_password;
-       (void) wrapped_key;
-       (void) alias;
-       (void) size;
-       (void) policy;
-       (void) ppdata;
+       EXCEPTION_GUARD_START_CAPI
 
-       return CKMC_ERROR_NONE;
+       if (params == nullptr || wrapping_key_alias == nullptr ||
+               wrapped_key == nullptr ||
+               wrapped_key->raw_key == nullptr ||
+               wrapped_key->key_size == 0 ||
+               wrapped_key->key_size * 8  < size ||
+               alias == nullptr ||
+               ((size != 128) & (size != 192) & (size != 256)) ||
+               ppdata == nullptr)
+                       return CKMC_ERROR_INVALID_PARAMETER;
+
+       const CKM::CryptoAlgorithm *ca = reinterpret_cast<const CKM::CryptoAlgorithm *>
+                                                                        (params);
+
+       int ret = 0;
+       CKM::RawBuffer data_buffer;
+
+       if (static_cast<CKM::KeyType>(wrapped_key->key_type) != CKM::KeyType::KEY_AES)
+               return CKMC_ERROR_INVALID_PARAMETER;
+
+       auto mgr = CKM::Manager::create();
+
+       ret = to_ckmc_error(
+               mgr->unwrapConcatenatedData(*ca,
+                                                                       CKM::Alias(wrapping_key_alias),
+                                                                       _tostring(wrapping_key_password),
+                                                                       CKM::RawBuffer(wrapped_key->raw_key,
+                                                                                                  wrapped_key->raw_key + wrapped_key->key_size),
+                                                                       CKM::Alias(alias),
+                                                                       size,
+                                                                       _toCkmPolicy(policy),
+                                                                       data_buffer));
+
+       if (ret == CKMC_ERROR_NONE) {
+               ret = ckmc_buffer_new(data_buffer.data(),
+                                                         data_buffer.size(),
+                                                         ppdata);
+       }
+
+       return ret;
+       EXCEPTION_GUARD_END
 }
\ No newline at end of file
index 961f31dbc0b130829e6afb4d311300e491f817dd..05993f6cf9c8ee39107b30adfdafb1d0b1a45f51 100644 (file)
@@ -813,6 +813,76 @@ int Manager::Impl::exportWrappedKey(const CryptoAlgorithm &params,
        EXCEPTION_GUARD_END
 }
 
+int Manager::Impl::wrapConcatenatedData(const CryptoAlgorithm &params,
+                                                                               const Alias &wrappingKeyAlias,
+                                                                               const Password &wrappingKeyPassword,
+                                                                               const Alias &alias,
+                                                                               const Password &password,
+                                                                               const RawBuffer &data,
+                                                                               RawBuffer &wrappedKey)
+{
+       EXCEPTION_GUARD_START_CPPAPI
+
+       AliasSupport wrappingAliasHelper(wrappingKeyAlias);
+       AliasSupport aliasHelper(alias);
+       DataType dataTypeKey;
+
+       int retCode = Request(*this,
+               LogicCommand::WRAP_CONCATENATED_DATA,
+               m_storageConnection,
+               CryptoAlgorithmSerializable(params),
+               wrappingAliasHelper.getName(),
+               wrappingAliasHelper.getOwner(),
+               wrappingKeyPassword,
+               aliasHelper.getName(),
+               aliasHelper.getOwner(),
+               password,
+               data
+       ).maybeDeserialize(dataTypeKey, wrappedKey);
+
+       if (retCode != CKM_API_SUCCESS)
+               return retCode;
+
+       if (!dataTypeKey.isSymmetricKey()) {
+               return CKM_API_ERROR_INVALID_FORMAT;
+       }
+
+       return retCode;
+
+       EXCEPTION_GUARD_END
+}
+
+int Manager::Impl::unwrapConcatenatedData(const CryptoAlgorithm &params,
+                                                                                 const Alias &wrappingKeyAlias,
+                                                                                 const Password &wrappingKeyPassword,
+                                                                                 const RawBuffer &wrappedKey,
+                                                                                 const Alias &alias,
+                                                                                 size_t size,
+                                                                                 const Policy &policy,
+                                                                                 RawBuffer &data)
+{
+       EXCEPTION_GUARD_START_CPPAPI
+
+       AliasSupport wrappingAliasHelper(wrappingKeyAlias);
+       AliasSupport aliasHelper(alias);
+
+       return Request(*this,
+               LogicCommand::UNWRAP_CONCATENATED_DATA,
+               m_storageConnection,
+               CryptoAlgorithmSerializable(params),
+               wrappingAliasHelper.getName(),
+               wrappingAliasHelper.getOwner(),
+               wrappingKeyPassword,
+               wrappedKey,
+               aliasHelper.getName(),
+               aliasHelper.getOwner(),
+               size,
+               PolicySerializable(policy)
+       ).maybeDeserialize(data);
+
+       EXCEPTION_GUARD_END
+}
+
 int Manager::Impl::initializeCipher(
        const CryptoAlgorithm &params,
        const Alias &keyAlias,
index 6e9b3d039fe7dcc46ff49fd837dda6bb7c946d3d..d7fa94b7e7e77a9033ae3f270f3bb9a13b96af40 100644 (file)
@@ -157,6 +157,23 @@ public:
                                                 KeyType &keyType,
                                                 RawBuffer &wrappedKey);
 
+       int wrapConcatenatedData(const CryptoAlgorithm &params,
+                                                        const Alias &wrappingKeyAlias,
+                                                        const Password &wrappingKeyPassword,
+                                                        const Alias &alias,
+                                                        const Password &password,
+                                                        const RawBuffer &data,
+                                                        RawBuffer &wrappedKey);
+
+       int unwrapConcatenatedData(const CryptoAlgorithm &params,
+                                                          const Alias &wrappingKeyAlias,
+                                                          const Password &wrappingKeyPassword,
+                                                          const RawBuffer &wrappedKey,
+                                                          const Alias &alias,
+                                                          size_t size,
+                                                          const Policy &policy,
+                                                          RawBuffer &data);
+
        int initializeCipher(const CryptoAlgorithm &params,
                                                 const Alias &keyAlias,
                                                 const Password &keyPassword,
index c808eb96282463c7301ad7c23cdf3fa61a9287fb..eb8f42cd9ca0c448a2caa8c8c96f1d743520204f 100644 (file)
@@ -334,6 +334,48 @@ int Manager::exportWrappedKey(
        );
 }
 
+int Manager::wrapConcatenatedData(
+       const CryptoAlgorithm &params,
+       const Alias &wrappingKeyAlias,
+       const Password &wrappingKeyPassword,
+       const Alias &alias,
+       const Password &password,
+       const RawBuffer &data,
+       RawBuffer &wrappedKey)
+{
+       return m_impl->wrapConcatenatedData(
+               params,
+               wrappingKeyAlias,
+               wrappingKeyPassword,
+               alias,
+               password,
+               data,
+               wrappedKey
+       );
+}
+
+int Manager::unwrapConcatenatedData(
+       const CryptoAlgorithm &params,
+       const Alias &wrappingKeyAlias,
+       const Password &wrappingKeyPassword,
+       const RawBuffer &wrappedKey,
+       const Alias &alias,
+       size_t size,
+       const Policy &policy,
+       RawBuffer &data)
+{
+       return m_impl->unwrapConcatenatedData(
+               params,
+               wrappingKeyAlias,
+               wrappingKeyPassword,
+               wrappedKey,
+               alias,
+               size,
+               policy,
+               data
+       );
+}
+
 int Manager::initializeCipher(
        const CryptoAlgorithm &params,
        const Alias &keyAlias,
index 75c12cf90eae7bf7fc323101aed7391716b6648d..bfbf53beb5942af8310e5ec3af812cb7a07ea628 100644 (file)
@@ -70,6 +70,8 @@ enum class LogicCommand : int {
        DERIVE,
        IMPORT_WRAPPED_KEY,
        EXPORT_WRAPPED_KEY,
+       WRAP_CONCATENATED_DATA,
+       UNWRAP_CONCATENATED_DATA,
        GET_BACKEND_INFO
 };
 
index f67a0bb8958ef85f210300ab4e7ed9c6a96a5918..300498057597499bc7e8ec505c38a7ca3134f880 100644 (file)
@@ -92,6 +92,23 @@ public:
                ThrowErr(Exc::Crypto::OperationNotSupported);
        }
 
+       virtual RawBuffer wrapConcatenated(const CryptoAlgorithm &,
+                                                                          const Token &,
+                                                                          const Password &,
+                                                                          const RawBuffer &)
+       {
+               ThrowErr(Exc::Crypto::OperationNotSupported);
+       }
+
+       virtual std::tuple<Token, RawBuffer> unwrapConcatenated(const CryptoAlgorithm &,
+                                                                                                                       const Data &,
+                                                                                                                       const Password &,
+                                                                                                                       size_t,
+                                                                                                                       const RawBuffer &)
+       {
+               ThrowErr(Exc::Crypto::OperationNotSupported);
+       }
+
        // onward = true for encryption/signing, false for decryption/verification
        virtual GCtxShPtr initContext(const CryptoAlgorithm &, bool /*onward*/)
        {
index 9043f832131411a097b614df3d4160a0dbbe1030..c95702f429d8a24fb0482b417791a7a34b9d4950 100644 (file)
@@ -105,7 +105,6 @@ RawBuffer Key::wrap(const CryptoAlgorithm &params,
        return encrypt(params, data);
 }
 
-
 RawBuffer SKey::encrypt(const CryptoAlgorithm &alg, const RawBuffer &data)
 {
        return Internals::symmetricEncrypt(getBinary(), alg, data);
@@ -219,6 +218,43 @@ GCtxShPtr AKey::initContext(const CryptoAlgorithm &, bool)
        ThrowErr(Exc::Crypto::OperationNotSupported);
 }
 
+RawBuffer AKey::wrapConcatenated(const CryptoAlgorithm &params,
+                                                               const Token &keyToWrap,
+                                                               const Password &keyToWrapPass,
+                                                               const RawBuffer &data)
+{
+       RawBuffer key = Store::unpack(keyToWrap.data, keyToWrapPass);
+
+       key.insert(key.end(), data.begin(), data.begin() + data.size());
+       return encrypt(params, key);
+}
+
+std::tuple<Token, RawBuffer> AKey::unwrapConcatenated(const CryptoAlgorithm &params,
+                                                                                                        const Data &wrappedKey,
+                                                                                                        const Password &pass,
+                                                                                                        size_t size,
+                                                                                                        const RawBuffer &)
+{
+       if (!wrappedKey.type.isSymmetricKey()) {
+               ThrowErr(Exc::Crypto::InputParam, "Wrapped data is not a symmetric key");
+       }
+
+       auto decrypted = decrypt(params, wrappedKey.data);
+       RawBuffer key;
+       key.reserve(size/8);
+       key.insert(key.end(), decrypted.begin(), decrypted.begin() + size/8);
+       RawBuffer data;
+       data.reserve(decrypted.size() - size/8);
+       data.insert(data.end(), decrypted.begin() + size/8, decrypted.end());
+
+       // validate the decrypted key
+       auto tmp = CKM::Key::createAES(key);
+       if (!tmp)
+               ThrowErr(Exc::Crypto::InputParam, "Wrapped data is not a valid AES key");
+
+       return std::make_tuple(Token(backendId(), wrappedKey.type, Store::pack(key, pass)), data);
+}
+
 EvpShPtr Cert::getEvpShPtr()
 {
        if (m_evp)
@@ -253,6 +289,21 @@ RawBuffer Cert::wrap(const CryptoAlgorithm &, const Token &, const Password &)
        ThrowErr(Exc::Crypto::OperationNotSupported);
 }
 
+RawBuffer Cert::wrapConcatenated(const CryptoAlgorithm &,
+                                                                const Token &, const Password &,
+                                                                const RawBuffer &)
+{
+       ThrowErr(Exc::Crypto::OperationNotSupported);
+}
+
+std::tuple<Token, RawBuffer> Cert::unwrapConcatenated(const CryptoAlgorithm &,
+                                                                                                         const Data &, const Password &,
+                                                                                                         size_t,
+                                                                                                         const RawBuffer &)
+{
+       ThrowErr(Exc::Crypto::OperationNotSupported);
+}
+
 } // namespace SW
 } // namespace Crypto
 } // namespace CKM
index 697e4ff4e587ba6eb4b2613d3deac23fb018690f..37cc1777b84b7b0e2f51f96268d85a971b8fa8a9 100644 (file)
@@ -61,7 +61,6 @@ class Key : public BData {
        RawBuffer wrap(const CryptoAlgorithm &params,
                                   const Token &keyToWrap,
                                   const Password &keyToWrapPass) override;
-
 };
 
 class SKey : public Key {
@@ -86,6 +85,17 @@ public:
        Token derive(const CryptoAlgorithm &, const Password &, const RawBuffer &) override;
        GCtxShPtr initContext(const CryptoAlgorithm &, bool) override;
 
+       RawBuffer wrapConcatenated(const CryptoAlgorithm &params,
+                                                          const Token &keyToWrap,
+                                                          const Password &keyToWrapPass,
+                                                          const RawBuffer &data) override;
+
+       std::tuple<Token, RawBuffer> unwrapConcatenated(const CryptoAlgorithm &params,
+                                                                                                       const Data &wrappedKey,
+                                                                                                       const Password &pass,
+                                                                                                       size_t size,
+                                                                                                       const RawBuffer &data) override;
+
 protected:
        virtual EvpShPtr getEvpShPtr();
 
@@ -106,6 +116,15 @@ public:
                                   const Token &,
                                   const Password &) override;
 
+       RawBuffer wrapConcatenated(const CryptoAlgorithm &,
+                                                          const Token &, const Password &,
+                                                          const RawBuffer &) override;
+
+       std::tuple<Token, RawBuffer> unwrapConcatenated(const CryptoAlgorithm &,
+                                                                                                       const Data &, const Password &,
+                                                                                                       size_t,
+                                                                                                       const RawBuffer &) override;
+
 protected:
        EvpShPtr getEvpShPtr() override;
 };
index 4bcb3c7c6564fc43a9a21770d5065b34bb32ec67..a6b24707a95b963cc788c8d5d82fe74507bc7c1d 100644 (file)
@@ -1652,9 +1652,15 @@ RawBuffer CKMLogic::exportWrappedKey(
 
                retCode2 = readRowHelper(false, cred, DataType::DB_KEY_FIRST, keyName,
                                                                 keyOwner, keyPassword, wrappedKeyRow, wrappedKeyType);
+
                if (retCode2 != CKM_API_SUCCESS)
                        return retCode2;
 
+               if (wrappingKey->backendId() != wrappedKeyRow.backendId) {
+                       LogError("Mismatched backends");
+                       return CKM_API_ERROR_INPUT_PARAM;
+               }
+
                if (!wrappedKeyType.isSymmetricKey()) {
                        LogError("Only symmetric key can be exported");
                        return CKM_API_ERROR_INPUT_PARAM;
@@ -1668,6 +1674,113 @@ RawBuffer CKMLogic::exportWrappedKey(
        return SerializeMessage(msgID, retCode, wrappedKeyType, wrappedKey);
 }
 
+RawBuffer CKMLogic::wrapConcatenatedData(
+       const Credentials &cred,
+       const int msgID,
+       const CryptoAlgorithm &params,
+       const Name &wrappingKeyName,
+       const ClientId &wrappingKeyOwner,
+       const Password &wrappingKeyPassword,
+       const Name &keyName,
+       const ClientId &keyOwner,
+       const Password &keyPassword,
+       const RawBuffer &data)
+{
+       Crypto::GObjUPtr wrappingKey;
+       DB::Row keyRow;
+       DataType keyType;
+       RawBuffer wrappedKey;
+
+       auto retCode = tryRet([&] {
+               auto retCode2 = readDataHelper(false, cred, DataType::KEY_RSA_PUBLIC, wrappingKeyName,
+                                                                          wrappingKeyOwner, wrappingKeyPassword, wrappingKey);
+               if (retCode2 != CKM_API_SUCCESS)
+                       return retCode2;
+
+               retCode2 = readRowHelper(false, cred, DataType::DB_KEY_FIRST, keyName,
+                                                                keyOwner, keyPassword, keyRow, keyType);
+               if (retCode2 != CKM_API_SUCCESS)
+                       return retCode2;
+
+               if (wrappingKey->backendId() != keyRow.backendId) {
+                       LogError("Mismatched backends");
+                       return CKM_API_ERROR_INPUT_PARAM;
+               }
+
+               if (!keyType.isSymmetricKey()) {
+                       LogError("Only symmetric key can be exported");
+                       return CKM_API_ERROR_INPUT_PARAM;
+               }
+
+               wrappedKey = wrappingKey->wrapConcatenated(params, keyRow, keyPassword, data);
+
+               return retCode2;
+       });
+
+       return SerializeMessage(msgID, retCode, keyType, wrappedKey);
+}
+
+RawBuffer CKMLogic::unwrapConcatenatedData(
+       const Credentials &cred,
+       const int msgID,
+       const CryptoAlgorithm &params,
+       const Name &wrappingKeyName,
+       const ClientId &wrappingKeyOwner,
+       const Password &wrappingKeyPassword,
+       const RawBuffer &wrappedKey,
+       const Name &keyName,
+       const ClientId &keyOwner,
+       size_t size,
+       const PolicySerializable &policy)
+{
+       RawBuffer data;
+
+       auto retCode = tryRet([&] {
+               Crypto::GObjUPtr wrappingKey;
+
+               auto [dbOp, digest, retCode2] = beginSaveAndGetHash(cred, keyName, keyOwner);
+               if (retCode2 != CKM_API_SUCCESS)
+                       return retCode2;
+
+               DataType wrappingKeyType;
+               retCode2 = readDataHelper(false,
+                                                                cred,
+                                                                DataType::DB_KEY_FIRST,
+                                                                wrappingKeyName,
+                                                                wrappingKeyOwner,
+                                                                wrappingKeyPassword,
+                                                                wrappingKey,
+                                                                wrappingKeyType);
+               if (retCode2 != CKM_API_SUCCESS)
+                       return retCode2;
+
+               if (wrappingKeyType != DataType::KEY_RSA_PRIVATE) {
+                       LogError("Only a private RSA key can be used for decryption");
+                       return CKM_API_ERROR_INPUT_PARAM;
+               }
+
+               if (!m_decider.checkStore(wrappingKey->backendId(), DataType::KEY_AES, policy, true)) {
+                       LogDebug("Can't import the wrapped key to backend " <<
+                                static_cast<int>(wrappingKey->backendId()) << " with given policy");
+                       return CKM_API_ERROR_INPUT_PARAM;
+               }
+
+               std::tuple<Token, RawBuffer> tokenWithData =
+                       wrappingKey->unwrapConcatenated(params,
+                                                                                       Crypto::Data(DataType::KEY_AES, wrappedKey),
+                                                                                       policy.password,
+                                                                                       size,
+                                                                                       digest);
+
+               dbOp.finalize(std::move(std::get<0>(tokenWithData)), policy);
+               data = std::get<1>(tokenWithData);
+
+               return retCode2;
+       });
+
+       return SerializeMessage(msgID, retCode, data);
+}
+
 RawBuffer CKMLogic::getBackendInfo(const int msgID, BackendId backend)
 {
        BackendInfo info;
index a8fc1b7360caf9436f3f520b4fa7425965cb6fa8..4188bb25e229a11db792a57e01b42e8f960e6ce4 100644 (file)
@@ -226,6 +226,31 @@ public:
                const ClientId &keyOwner,
                const Password &keyPassword);
 
+       RawBuffer wrapConcatenatedData(
+               const Credentials &cred,
+               const int msgID,
+               const CryptoAlgorithm &params,
+               const Name &wrappingKeyName,
+               const ClientId &wrappingKeyOwner,
+               const Password &wrappingKeyPassword,
+               const Name &keyName,
+               const ClientId &keyOwner,
+               const Password &keyPassword,
+               const RawBuffer &data);
+
+       RawBuffer unwrapConcatenatedData(
+               const Credentials &cred,
+               const int msgID,
+               const CryptoAlgorithm &params,
+               const Name &wrappingKeyName,
+               const ClientId &wrappingKeyOwner,
+               const Password &wrappingKeyPassword,
+               const RawBuffer &wrappedKey,
+               const Name &keyName,
+               const ClientId &keyOwner,
+               size_t size,
+               const PolicySerializable &policy);
+
        RawBuffer getBackendInfo(
                const int msgID,
                BackendId backend);
index 1803635581ca3b3034aa3db86e7af71a230e3d2c..be4ebfe1e0d8fdeaf81680702376e464c3cc2fcd 100644 (file)
@@ -517,6 +517,71 @@ RawBuffer CKMService::ProcessStorage(Credentials &cred, MessageBuffer &buffer)
                                        keyPassword);
        }
 
+       case LogicCommand::WRAP_CONCATENATED_DATA: {
+               CryptoAlgorithmSerializable params;
+               Name wrappingKeyName;
+               ClientId wrappingKeyOwner;
+               Password wrappingKeyPassword;
+               Name keyName;
+               Password keyPassword;
+               RawBuffer data;
+
+               buffer.Deserialize(params,
+                                                  wrappingKeyName,
+                                                  wrappingKeyOwner,
+                                                  wrappingKeyPassword,
+                                                  keyName,
+                                                  explicitOwner,
+                                                  keyPassword,
+                                                  data);
+
+               return m_logic->wrapConcatenatedData(
+                                       cred,
+                                       msgId,
+                                       params,
+                                       wrappingKeyName,
+                                       cred.effectiveOwner(wrappingKeyOwner),
+                                       wrappingKeyPassword,
+                                       keyName,
+                                       cred.effectiveOwner(explicitOwner),
+                                       keyPassword,
+                                       data);
+       }
+
+       case LogicCommand::UNWRAP_CONCATENATED_DATA: {
+               CryptoAlgorithmSerializable params;
+               Name wrappingKeyName;
+               ClientId wrappingKeyOwner;
+               Password wrappingKeyPassword;
+               RawBuffer wrappedKey;
+               Name keyName;
+               size_t size;
+               PolicySerializable policy;
+
+               buffer.Deserialize(params,
+                                                  wrappingKeyName,
+                                                  wrappingKeyOwner,
+                                                  wrappingKeyPassword,
+                                                  wrappedKey,
+                                                  keyName,
+                                                  explicitOwner,
+                                                  size,
+                                                  policy);
+
+               return m_logic->unwrapConcatenatedData(
+                                       cred,
+                                       msgId,
+                                       params,
+                                       wrappingKeyName,
+                                       cred.effectiveOwner(wrappingKeyOwner),
+                                       wrappingKeyPassword,
+                                       wrappedKey,
+                                       keyName,
+                                       cred.effectiveOwner(explicitOwner),
+                                       size,
+                                       policy);
+       }
+
        case LogicCommand::GET_BACKEND_INFO: {
                BackendId backend;