1 /* Copyright (c) 2000 - 2019 Samsung Electronics Co., Ltd All Rights Reserved
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
7 * http://www.apache.org/licenses/LICENSE-2.0
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License
16 * @file client-manager-impl.cpp
17 * @author Bartlomiej Grzelewski (b.grzelewski@samsung.com)
19 * @brief Manager implementation.
21 #include <openssl/evp.h>
23 #include <dpl/serialization.h>
24 #include <dpl/log/log.h>
26 #include <crypto-init.h>
27 #include <client-manager-impl.h>
28 #include <client-common.h>
29 #include <exception.h>
30 #include <message-buffer.h>
31 #include <protocols.h>
33 #include <key-aes-impl.h>
34 #include <certificate-impl.h>
41 ServiceConnection &serviceConnection,
44 const CertificateShPtr &certificate,
45 const T &untrustedVector,
46 const T &trustedVector,
47 bool useTrustedSystemCertificates,
48 CertificateShPtrVector &certificateChainVector)
50 EXCEPTION_GUARD_START_CPPAPI
53 auto send = MessageBuffer::Serialize(static_cast<int>(command),
55 certificate->getDER(),
58 useTrustedSystemCertificates);
60 int retCode = serviceConnection.processRequest(send.Pop(), recv);
62 if (CKM_API_SUCCESS != retCode)
67 RawBufferVector rawBufferVector;
68 recv.Deserialize(retCommand, retCounter, retCode, rawBufferVector);
70 if ((counter != retCounter) || (static_cast<int>(command) != retCommand))
71 return CKM_API_ERROR_UNKNOWN;
73 if (retCode != CKM_API_SUCCESS)
76 for (auto &e : rawBufferVector) {
77 CertificateShPtr cert(new CertificateImpl(e, DataFormat::FORM_DER));
80 return CKM_API_ERROR_BAD_RESPONSE;
82 certificateChainVector.push_back(cert);
90 } // namespace anonymous
94 m_storageConnection(SERVICE_SOCKET_CKM_STORAGE),
95 m_ocspConnection(SERVICE_SOCKET_OCSP),
96 m_encryptionConnection(SERVICE_SOCKET_ENCRYPTION)
102 int Manager::Impl::saveBinaryData(
105 const RawBuffer &rawData,
106 const Policy &policy)
108 int my_counter = ++m_counter;
110 EXCEPTION_GUARD_START_CPPAPI
112 if (alias.empty() || rawData.empty())
113 return CKM_API_ERROR_INPUT_PARAM;
116 AliasSupport helper(alias);
117 auto send = MessageBuffer::Serialize(static_cast<int>(LogicCommand::SAVE),
119 static_cast<int>(dataType),
123 PolicySerializable(policy));
125 int retCode = m_storageConnection.processRequest(send.Pop(), recv);
127 if (CKM_API_SUCCESS != retCode)
133 recv.Deserialize(command, counter, retCode, opType);
135 if (counter != my_counter)
136 return CKM_API_ERROR_UNKNOWN;
143 int Manager::Impl::saveKey(const Alias &alias, const KeyShPtr &key,
144 const Policy &policy)
146 if (key.get() == NULL || key->empty())
147 return CKM_API_ERROR_INPUT_PARAM;
150 return saveBinaryData(alias, DataType(key->getType()), key->getDER(), policy);
151 } catch (const Exc::Exception &e) {
152 LogError("Exception: " << e.what());
157 int Manager::Impl::saveCertificate(
159 const CertificateShPtr &cert,
160 const Policy &policy)
162 if (cert.get() == NULL || cert->empty())
163 return CKM_API_ERROR_INPUT_PARAM;
165 return saveBinaryData(alias, DataType::CERTIFICATE, cert->getDER(), policy);
168 int Manager::Impl::saveData(const Alias &alias, const RawBuffer &rawData,
169 const Policy &policy)
171 if (!policy.extractable)
172 return CKM_API_ERROR_INPUT_PARAM;
174 return saveBinaryData(alias, DataType::BINARY_DATA, rawData, policy);
178 int Manager::Impl::savePKCS12(
180 const PKCS12ShPtr &pkcs,
181 const Policy &keyPolicy,
182 const Policy &certPolicy)
184 if (alias.empty() || pkcs.get() == NULL)
185 return CKM_API_ERROR_INPUT_PARAM;
187 int my_counter = ++m_counter;
189 EXCEPTION_GUARD_START_CPPAPI
192 AliasSupport helper(alias);
193 auto send = MessageBuffer::Serialize(static_cast<int>
194 (LogicCommand::SAVE_PKCS12),
198 PKCS12Serializable(*pkcs.get()),
199 PolicySerializable(keyPolicy),
200 PolicySerializable(certPolicy));
202 int retCode = m_storageConnection.processRequest(send.Pop(), recv);
204 if (CKM_API_SUCCESS != retCode)
209 recv.Deserialize(command, counter, retCode);
211 if (counter != my_counter)
212 return CKM_API_ERROR_UNKNOWN;
219 int Manager::Impl::getPKCS12(const Alias &alias, PKCS12ShPtr &pkcs)
221 return getPKCS12(alias, Password(), Password(), pkcs);
224 int Manager::Impl::getPKCS12(const Alias &alias, const Password &keyPass,
225 const Password &certPass, PKCS12ShPtr &pkcs)
228 return CKM_API_ERROR_INPUT_PARAM;
230 int my_counter = ++m_counter;
232 EXCEPTION_GUARD_START_CPPAPI
235 AliasSupport helper(alias);
236 auto send = MessageBuffer::Serialize(static_cast<int>(LogicCommand::GET_PKCS12),
243 int retCode = m_storageConnection.processRequest(send.Pop(), recv);
245 if (CKM_API_SUCCESS != retCode)
250 PKCS12Serializable gotPkcs;
251 recv.Deserialize(command, counter, retCode, gotPkcs);
253 if (counter != my_counter)
254 return CKM_API_ERROR_UNKNOWN;
256 pkcs = std::make_shared<PKCS12Impl>(std::move(gotPkcs));
264 int Manager::Impl::removeAlias(const Alias &alias)
267 return CKM_API_ERROR_INPUT_PARAM;
269 int my_counter = ++m_counter;
271 EXCEPTION_GUARD_START_CPPAPI
274 AliasSupport helper(alias);
275 auto send = MessageBuffer::Serialize(static_cast<int>(LogicCommand::REMOVE),
280 int retCode = m_storageConnection.processRequest(send.Pop(), recv);
282 if (CKM_API_SUCCESS != retCode)
287 recv.Deserialize(command, counter, retCode);
289 if (counter != my_counter)
290 return CKM_API_ERROR_UNKNOWN;
297 int Manager::Impl::getBinaryData(
299 DataType sendDataType,
300 const Password &password,
301 DataType &recvDataType,
305 return CKM_API_ERROR_INPUT_PARAM;
307 int my_counter = ++m_counter;
309 EXCEPTION_GUARD_START_CPPAPI
312 AliasSupport helper(alias);
313 auto send = MessageBuffer::Serialize(static_cast<int>(LogicCommand::GET),
315 static_cast<int>(sendDataType),
320 int retCode = m_storageConnection.processRequest(send.Pop(), recv);
322 if (CKM_API_SUCCESS != retCode)
328 recv.Deserialize(command, counter, retCode, tmpDataType, rawData);
329 recvDataType = DataType(tmpDataType);
331 if (counter != my_counter)
332 return CKM_API_ERROR_UNKNOWN;
339 int Manager::Impl::getBinaryDataEncryptionStatus(const DataType sendDataType,
340 const Alias &alias, bool &status)
344 return CKM_API_ERROR_INPUT_PARAM;
346 int my_counter = ++m_counter;
348 EXCEPTION_GUARD_START_CPPAPI
351 AliasSupport helper(alias);
352 auto send = MessageBuffer::Serialize(static_cast<int>(LogicCommand::GET_PROTECTION_STATUS),
354 static_cast<int>(sendDataType),
358 int retCode = m_storageConnection.processRequest(send.Pop(), recv);
360 if (CKM_API_SUCCESS != retCode)
366 bool passwordProtectionStatus;
367 recv.Deserialize(command, counter, retCode, tmpDataType, passwordProtectionStatus);
369 if (counter != my_counter)
370 return CKM_API_ERROR_UNKNOWN;
372 if (retCode != CKM_API_SUCCESS) {
375 status = passwordProtectionStatus;
376 return CKM_API_SUCCESS;
381 int Manager::Impl::getKey(const Alias &alias, const Password &password,
384 DataType recvDataType;
387 int retCode = getBinaryData(
389 DataType::KEY_RSA_PUBLIC,
394 if (retCode != CKM_API_SUCCESS)
399 if (DataType::KEY_AES == recvDataType)
400 keyParsed = KeyShPtr(new KeyAESImpl(rawData));
402 keyParsed = KeyShPtr(new KeyImpl(rawData));
404 if (keyParsed->empty()) {
405 LogDebug("Key empty - failed to parse!");
406 return CKM_API_ERROR_BAD_RESPONSE;
411 return CKM_API_SUCCESS;
414 int Manager::Impl::getCertificate(const Alias &alias, const Password &password,
415 CertificateShPtr &cert)
417 DataType recvDataType;
420 int retCode = getBinaryData(
422 DataType::CERTIFICATE,
427 if (retCode != CKM_API_SUCCESS)
430 if (recvDataType != DataType::CERTIFICATE)
431 return CKM_API_ERROR_BAD_RESPONSE;
433 CertificateShPtr certParsed(new CertificateImpl(rawData, DataFormat::FORM_DER));
435 if (certParsed->empty())
436 return CKM_API_ERROR_BAD_RESPONSE;
440 return CKM_API_SUCCESS;
443 int Manager::Impl::getData(const Alias &alias, const Password &password,
446 DataType recvDataType = DataType::BINARY_DATA;
448 int retCode = getBinaryData(
450 DataType::BINARY_DATA,
455 if (retCode != CKM_API_SUCCESS)
458 if (recvDataType != DataType::BINARY_DATA)
459 return CKM_API_ERROR_BAD_RESPONSE;
461 return CKM_API_SUCCESS;
464 int Manager::Impl::getBinaryDataAliasVectorHelper(DataType dataType,
465 OwnerNameVector &ownerNameVector)
467 int my_counter = ++m_counter;
470 auto send = MessageBuffer::Serialize(static_cast<int>(LogicCommand::GET_LIST),
472 static_cast<int>(dataType));
474 int retCode = m_storageConnection.processRequest(send.Pop(), recv);
476 if (retCode != CKM_API_SUCCESS)
483 recv.Deserialize(command, counter, retCode, tmpDataType, ownerNameVector);
485 if ((command != static_cast<int>(LogicCommand::GET_LIST)) ||
486 (counter != my_counter))
487 return CKM_API_ERROR_UNKNOWN;
489 return CKM_API_SUCCESS;
492 int Manager::Impl::getBinaryDataAliasVector(DataType dataType,
493 AliasVector &aliasVector)
495 EXCEPTION_GUARD_START_CPPAPI
496 OwnerNameVector ownerNameVector;
497 int retCode = getBinaryDataAliasVectorHelper(dataType, ownerNameVector);
499 if (retCode != CKM_API_SUCCESS)
502 for (const auto &it : ownerNameVector)
503 aliasVector.push_back(AliasSupport::merge(it.first, it.second));
505 return CKM_API_SUCCESS;
509 int Manager::Impl::getBinaryDataAliasPwdVector(DataType dataType,
510 AliasPwdVector &aliasPwdVector)
512 EXCEPTION_GUARD_START_CPPAPI
513 OwnerNameVector ownerNameVector;
514 OwnerNameEncryptionStatusVector ownerNameEncryptionStatusVector;
515 int retCode = getBinaryDataAliasVectorHelper(dataType, ownerNameVector);
517 if (retCode != CKM_API_SUCCESS)
520 for (const auto &it : ownerNameVector)
522 Alias alias = AliasSupport::merge(std::get<0>(it), std::get<1>(it));
524 retCode = getBinaryDataEncryptionStatus(dataType, alias, status);
526 if (retCode != CKM_API_SUCCESS)
529 aliasPwdVector.push_back(std::make_pair(alias, status));
531 return CKM_API_SUCCESS;
535 int Manager::Impl::getKeyAliasVector(AliasVector &aliasVector)
537 // in fact datatype has no meaning here - if not certificate or binary data
538 // then manager decides to list all between DB_KEY_FIRST and DB_KEY_LAST
539 return getBinaryDataAliasVector(DataType::DB_KEY_LAST, aliasVector);
542 int Manager::Impl::getCertificateAliasVector(AliasVector &aliasVector)
544 return getBinaryDataAliasVector(DataType::CERTIFICATE, aliasVector);
547 int Manager::Impl::getDataAliasVector(AliasVector &aliasVector)
549 return getBinaryDataAliasVector(DataType::BINARY_DATA, aliasVector);
552 int Manager::Impl::getKeyAliasPwdVector(AliasPwdVector &aliasPwdVector)
554 return getBinaryDataAliasPwdVector(DataType::DB_KEY_LAST, aliasPwdVector);
557 int Manager::Impl::getKeyEncryptionStatus(const Alias &alias, bool &status)
559 return getBinaryDataEncryptionStatus(DataType::DB_KEY_LAST, alias, status);
562 int Manager::Impl::getCertificateAliasPwdVector(AliasPwdVector &aliasPwdVector)
564 return getBinaryDataAliasPwdVector(DataType::CERTIFICATE, aliasPwdVector);
567 int Manager::Impl::getCertificateEncryptionStatus(const Alias &alias, bool &status)
569 return getBinaryDataEncryptionStatus(DataType::CERTIFICATE, alias, status);
572 int Manager::Impl::getDataAliasPwdVector(AliasPwdVector &aliasPwdVector)
574 return getBinaryDataAliasPwdVector(DataType::BINARY_DATA, aliasPwdVector);
577 int Manager::Impl::getDataEncryptionStatus(const Alias &alias, bool &status)
579 return getBinaryDataEncryptionStatus(DataType::BINARY_DATA, alias, status);
582 int Manager::Impl::createKeyPairRSA(
584 const Alias &privateKeyAlias,
585 const Alias &publicKeyAlias,
586 const Policy &policyPrivateKey,
587 const Policy &policyPublicKey)
589 return this->createKeyPair(CKM::KeyType::KEY_RSA_PUBLIC, size, privateKeyAlias,
590 publicKeyAlias, policyPrivateKey, policyPublicKey);
593 int Manager::Impl::createKeyPairDSA(
595 const Alias &privateKeyAlias,
596 const Alias &publicKeyAlias,
597 const Policy &policyPrivateKey,
598 const Policy &policyPublicKey)
600 return this->createKeyPair(CKM::KeyType::KEY_DSA_PUBLIC, size, privateKeyAlias,
601 publicKeyAlias, policyPrivateKey, policyPublicKey);
604 int Manager::Impl::createKeyPairECDSA(
606 const Alias &privateKeyAlias,
607 const Alias &publicKeyAlias,
608 const Policy &policyPrivateKey,
609 const Policy &policyPublicKey)
611 return this->createKeyPair(CKM::KeyType::KEY_ECDSA_PUBLIC,
612 static_cast<int>(type), privateKeyAlias, publicKeyAlias, policyPrivateKey,
616 int Manager::Impl::createKeyAES(
618 const Alias &keyAlias,
619 const Policy &policyKey)
621 // proceed with sending request
622 int my_counter = ++m_counter;
624 EXCEPTION_GUARD_START_CPPAPI
627 AliasSupport aliasHelper(keyAlias);
628 auto send = MessageBuffer::Serialize(static_cast<int>
629 (LogicCommand::CREATE_KEY_AES),
631 static_cast<int>(size),
632 PolicySerializable(policyKey),
633 aliasHelper.getName(),
634 aliasHelper.getOwner());
636 int retCode = m_storageConnection.processRequest(send.Pop(), recv);
638 if (CKM_API_SUCCESS != retCode)
643 recv.Deserialize(command, counter, retCode);
645 if (counter != my_counter)
646 return CKM_API_ERROR_UNKNOWN;
654 int Manager::Impl::createKeyPair(
655 const KeyType key_type,
656 const int additional_param,
657 const Alias &privateKeyAlias,
658 const Alias &publicKeyAlias,
659 const Policy &policyPrivateKey,
660 const Policy &policyPublicKey)
663 CryptoAlgorithm keyGenAlgorithm;
666 case KeyType::KEY_RSA_PUBLIC:
667 case KeyType::KEY_RSA_PRIVATE:
668 keyGenAlgorithm.setParam(ParamName::ALGO_TYPE, AlgoType::RSA_GEN);
669 keyGenAlgorithm.setParam(ParamName::GEN_KEY_LEN, additional_param);
672 case KeyType::KEY_DSA_PUBLIC:
673 case KeyType::KEY_DSA_PRIVATE:
674 keyGenAlgorithm.setParam(ParamName::ALGO_TYPE, AlgoType::DSA_GEN);
675 keyGenAlgorithm.setParam(ParamName::GEN_KEY_LEN, additional_param);
678 case KeyType::KEY_ECDSA_PUBLIC:
679 case KeyType::KEY_ECDSA_PRIVATE:
680 keyGenAlgorithm.setParam(ParamName::ALGO_TYPE, AlgoType::ECDSA_GEN);
681 keyGenAlgorithm.setParam(ParamName::GEN_EC, additional_param);
685 return CKM_API_ERROR_INPUT_PARAM;
688 // proceed with sending request
689 int my_counter = ++m_counter;
691 EXCEPTION_GUARD_START_CPPAPI
694 AliasSupport privateHelper(privateKeyAlias);
695 AliasSupport publicHelper(publicKeyAlias);
696 auto send = MessageBuffer::Serialize(static_cast<int>
697 (LogicCommand::CREATE_KEY_PAIR),
699 CryptoAlgorithmSerializable(keyGenAlgorithm),
700 PolicySerializable(policyPrivateKey),
701 PolicySerializable(policyPublicKey),
702 privateHelper.getName(),
703 privateHelper.getOwner(),
704 publicHelper.getName(),
705 publicHelper.getOwner());
707 int retCode = m_storageConnection.processRequest(send.Pop(), recv);
709 if (CKM_API_SUCCESS != retCode)
714 recv.Deserialize(command, counter, retCode);
716 if (counter != my_counter)
717 return CKM_API_ERROR_UNKNOWN;
724 int Manager::Impl::getCertificateChain(
725 const CertificateShPtr &certificate,
726 const CertificateShPtrVector &untrustedCertificates,
727 const CertificateShPtrVector &trustedCertificates,
728 bool useTrustedSystemCertificates,
729 CertificateShPtrVector &certificateChainVector)
731 RawBufferVector untrustedVector;
732 RawBufferVector trustedVector;
734 if (!certificate || certificate->empty())
735 return CKM_API_ERROR_INPUT_PARAM;
737 for (auto &e : untrustedCertificates) {
738 if (!e || e->empty())
739 return CKM_API_ERROR_INPUT_PARAM;
740 untrustedVector.push_back(e->getDER());
743 for (auto &e : trustedCertificates) {
744 if (!e || e->empty())
745 return CKM_API_ERROR_INPUT_PARAM;
746 trustedVector.push_back(e->getDER());
751 LogicCommand::GET_CHAIN_CERT,
756 useTrustedSystemCertificates,
757 certificateChainVector);
760 int Manager::Impl::getCertificateChain(
761 const CertificateShPtr &certificate,
762 const AliasVector &untrustedCertificates,
763 const AliasVector &trustedCertificates,
764 bool useTrustedSystemCertificates,
765 CertificateShPtrVector &certificateChainVector)
767 OwnerNameVector untrustedVector;
768 OwnerNameVector trustedVector;
770 if (!certificate || certificate->empty())
771 return CKM_API_ERROR_INPUT_PARAM;
773 for (auto &e : untrustedCertificates) {
774 AliasSupport helper(e);
775 untrustedVector.push_back(std::make_pair(helper.getOwner(), helper.getName()));
778 for (auto &e : trustedCertificates) {
779 AliasSupport helper(e);
780 trustedVector.push_back(std::make_pair(helper.getOwner(), helper.getName()));
785 LogicCommand::GET_CHAIN_ALIAS,
790 useTrustedSystemCertificates,
791 certificateChainVector);
794 int Manager::Impl::createSignature(
795 const Alias &privateKeyAlias,
796 const Password &password, // password for private_key
797 const RawBuffer &message,
798 const CryptoAlgorithm &cAlgorithm,
799 RawBuffer &signature)
801 int my_counter = ++m_counter;
803 EXCEPTION_GUARD_START_CPPAPI
806 AliasSupport helper(privateKeyAlias);
807 auto send = MessageBuffer::Serialize(static_cast<int>
808 (LogicCommand::CREATE_SIGNATURE),
814 CryptoAlgorithmSerializable(cAlgorithm));
816 int retCode = m_storageConnection.processRequest(send.Pop(), recv);
818 if (CKM_API_SUCCESS != retCode)
823 recv.Deserialize(command, counter, retCode, signature);
825 if ((command != static_cast<int>(LogicCommand::CREATE_SIGNATURE))
826 || (counter != my_counter))
827 return CKM_API_ERROR_UNKNOWN;
834 int Manager::Impl::verifySignature(
835 const Alias &publicKeyOrCertAlias,
836 const Password &password, // password for public_key (optional)
837 const RawBuffer &message,
838 const RawBuffer &signature,
839 const CryptoAlgorithm &cAlg)
841 int my_counter = ++m_counter;
843 EXCEPTION_GUARD_START_CPPAPI
846 AliasSupport helper(publicKeyOrCertAlias);
847 auto send = MessageBuffer::Serialize(static_cast<int>
848 (LogicCommand::VERIFY_SIGNATURE),
855 CryptoAlgorithmSerializable(cAlg));
857 int retCode = m_storageConnection.processRequest(send.Pop(), recv);
859 if (CKM_API_SUCCESS != retCode)
864 recv.Deserialize(command, counter, retCode);
866 if ((command != static_cast<int>(LogicCommand::VERIFY_SIGNATURE))
867 || (counter != my_counter))
868 return CKM_API_ERROR_UNKNOWN;
875 int Manager::Impl::ocspCheck(const CertificateShPtrVector &certChain,
878 EXCEPTION_GUARD_START_CPPAPI
880 int my_counter = ++m_counter;
883 RawBufferVector rawCertChain;
885 for (auto &e : certChain) {
886 if (!e || e->empty()) {
887 LogError("Empty certificate");
888 return CKM_API_ERROR_INPUT_PARAM;
891 rawCertChain.push_back(e->getDER());
894 auto send = MessageBuffer::Serialize(my_counter, rawCertChain);
896 int retCode = m_ocspConnection.processRequest(send.Pop(), recv);
898 if (CKM_API_SUCCESS != retCode)
902 recv.Deserialize(counter, retCode, ocspStatus);
904 if (my_counter != counter)
905 return CKM_API_ERROR_UNKNOWN;
912 int Manager::Impl::setPermission(const Alias &alias,
913 const ClientId &accessor,
914 PermissionMask permissionMask)
916 int my_counter = ++m_counter;
918 EXCEPTION_GUARD_START_CPPAPI
921 AliasSupport helper(alias);
922 auto send = MessageBuffer::Serialize(static_cast<int>
923 (LogicCommand::SET_PERMISSION),
930 int retCode = m_storageConnection.processRequest(send.Pop(), recv);
932 if (CKM_API_SUCCESS != retCode)
937 recv.Deserialize(command, counter, retCode);
939 if (my_counter != counter)
940 return CKM_API_ERROR_UNKNOWN;
947 int Manager::Impl::crypt(EncryptionCommand command,
948 const CryptoAlgorithm &algo,
949 const Alias &keyAlias,
950 const Password &password,
951 const RawBuffer &input,
954 int my_counter = ++m_counter;
956 EXCEPTION_GUARD_START_CPPAPI
959 AliasSupport helper(keyAlias);
960 CryptoAlgorithmSerializable cas(algo);
961 auto send = MessageBuffer::Serialize(static_cast<int>(command),
969 int retCode = m_encryptionConnection.processRequest(send.Pop(), recv);
971 if (CKM_API_SUCCESS != retCode)
976 recv.Deserialize(retCommand, counter, retCode, output);
978 if (my_counter != counter || retCommand != static_cast<int>(command))
979 return CKM_API_ERROR_UNKNOWN;
986 int Manager::Impl::encrypt(const CryptoAlgorithm &algo,
987 const Alias &keyAlias,
988 const Password &password,
989 const RawBuffer &plain,
990 RawBuffer &encrypted)
992 return crypt(EncryptionCommand::ENCRYPT, algo, keyAlias, password, plain,
996 int Manager::Impl::decrypt(const CryptoAlgorithm &algo,
997 const Alias &keyAlias,
998 const Password &password,
999 const RawBuffer &encrypted,
1000 RawBuffer &decrypted)
1002 return crypt(EncryptionCommand::DECRYPT, algo, keyAlias, password, encrypted,