Key generation uses CryptoAlgorithm object provided by the client.
[platform/core/security/key-manager.git] / src / manager / client / client-manager-impl.cpp
1 /* Copyright (c) 2000 - 2013 Samsung Electronics Co., Ltd All Rights Reserved
2  *
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
6  *
7  *      http://www.apache.org/licenses/LICENSE-2.0
8  *
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
14  *
15  *
16  * @file        client-manager-impl.cpp
17  * @author      Bartlomiej Grzelewski (b.grzelewski@samsung.com)
18  * @version     1.0
19  * @brief       Manager implementation.
20  */
21 #include <openssl/evp.h>
22
23 #include <dpl/serialization.h>
24 #include <dpl/log/log.h>
25
26 #include <crypto-init.h>
27 #include <client-manager-impl.h>
28 #include <client-common.h>
29 #include <message-buffer.h>
30 #include <protocols.h>
31 #include <key-impl.h>
32 #include <certificate-impl.h>
33
34 namespace CKM {
35
36 namespace {
37 template <class T>
38 int getCertChain(
39     ServiceConnection & serviceConnection,
40     LogicCommand command,
41     int counter,
42     const CertificateShPtr &certificate,
43     const T &untrustedVector,
44     const T &trustedVector,
45     bool useTrustedSystemCertificates,
46     CertificateShPtrVector &certificateChainVector)
47 {
48     return try_catch([&] {
49
50         MessageBuffer recv;
51         auto send = MessageBuffer::Serialize(static_cast<int>(command),
52                                              counter,
53                                              certificate->getDER(),
54                                              untrustedVector,
55                                              trustedVector,
56                                              useTrustedSystemCertificates);
57
58         int retCode = serviceConnection.processRequest(send.Pop(), recv);
59         if (CKM_API_SUCCESS != retCode)
60             return retCode;
61
62         int retCommand;
63         int retCounter;
64         RawBufferVector rawBufferVector;
65         recv.Deserialize(retCommand, retCounter, retCode, rawBufferVector);
66
67         if ((counter != retCounter) || (static_cast<int>(command) != retCommand)) {
68             return CKM_API_ERROR_UNKNOWN;
69         }
70
71         if (retCode != CKM_API_SUCCESS) {
72             return retCode;
73         }
74
75         for (auto &e: rawBufferVector) {
76             CertificateShPtr cert(new CertificateImpl(e, DataFormat::FORM_DER));
77             if (cert->empty())
78                 return CKM_API_ERROR_BAD_RESPONSE;
79             certificateChainVector.push_back(cert);
80         }
81
82         return retCode;
83     });
84 }
85
86 } // namespace anonymous
87
88 ManagerImpl::ManagerImpl()
89   : m_counter(0),
90     m_storageConnection(SERVICE_SOCKET_CKM_STORAGE),
91     m_ocspConnection(SERVICE_SOCKET_OCSP),
92     m_encryptionConnection(SERVICE_SOCKET_ENCRYPTION)
93 {
94     initCryptoLib();
95 }
96
97
98 int ManagerImpl::saveBinaryData(
99     const Alias &alias,
100     DataType dataType,
101     const RawBuffer &rawData,
102     const Policy &policy)
103 {
104     int my_counter = ++m_counter;
105
106     return try_catch([&] {
107         if (alias.empty() || rawData.empty())
108             return CKM_API_ERROR_INPUT_PARAM;
109
110         MessageBuffer recv;
111         AliasSupport helper(alias);
112         auto send = MessageBuffer::Serialize(static_cast<int>(LogicCommand::SAVE),
113                                              my_counter,
114                                              static_cast<int>(dataType),
115                                              helper.getName(),
116                                              helper.getLabel(),
117                                              rawData,
118                                              PolicySerializable(policy));
119
120         int retCode = m_storageConnection.processRequest(send.Pop(), recv);
121         if (CKM_API_SUCCESS != retCode)
122             return retCode;
123
124         int command;
125         int counter;
126         int opType;
127         recv.Deserialize(command, counter, retCode, opType);
128
129         if (counter != my_counter)
130             return CKM_API_ERROR_UNKNOWN;
131
132         return retCode;
133     });
134 }
135
136 int ManagerImpl::saveKey(const Alias &alias, const KeyShPtr &key, const Policy &policy) {
137     if (key.get() == NULL)
138         return CKM_API_ERROR_INPUT_PARAM;
139     Try {
140         return saveBinaryData(alias, DataType(key->getType()), key->getDER(), policy);
141     } Catch (DataType::Exception::Base) {
142         LogError("Error in key conversion. Could not convert KeyType::NONE to DBDataType!");
143     }
144     return CKM_API_ERROR_INPUT_PARAM;
145 }
146
147 int ManagerImpl::saveCertificate(
148     const Alias &alias,
149     const CertificateShPtr &cert,
150     const Policy &policy)
151 {
152     if (cert.get() == NULL)
153         return CKM_API_ERROR_INPUT_PARAM;
154     return saveBinaryData(alias, DataType::CERTIFICATE, cert->getDER(), policy);
155 }
156
157 int ManagerImpl::saveData(const Alias &alias, const RawBuffer &rawData, const Policy &policy) {
158     if (!policy.extractable)
159         return CKM_API_ERROR_INPUT_PARAM;
160     return saveBinaryData(alias, DataType::BINARY_DATA, rawData, policy);
161 }
162
163
164 int ManagerImpl::savePKCS12(
165     const Alias & alias,
166     const PKCS12ShPtr &pkcs,
167     const Policy &keyPolicy,
168     const Policy &certPolicy)
169 {
170     if (alias.empty() || pkcs.get()==NULL)
171         return CKM_API_ERROR_INPUT_PARAM;
172
173     int my_counter = ++m_counter;
174
175     return try_catch([&] {
176         MessageBuffer recv;
177         AliasSupport helper(alias);
178         auto send = MessageBuffer::Serialize(static_cast<int>(LogicCommand::SAVE_PKCS12),
179                                              my_counter,
180                                              helper.getName(),
181                                              helper.getLabel(),
182                                              PKCS12Serializable(*pkcs.get()),
183                                              PolicySerializable(keyPolicy),
184                                              PolicySerializable(certPolicy));
185
186         int retCode = m_storageConnection.processRequest(send.Pop(), recv);
187         if (CKM_API_SUCCESS != retCode)
188             return retCode;
189
190         int command;
191         int counter;
192         recv.Deserialize(command, counter, retCode);
193
194         if (counter != my_counter)
195             return CKM_API_ERROR_UNKNOWN;
196
197         return retCode;
198     });
199 }
200
201 int ManagerImpl::getPKCS12(const Alias &alias, PKCS12ShPtr &pkcs)
202 {
203     return getPKCS12(alias, Password(), Password(), pkcs);
204 }
205
206 int ManagerImpl::getPKCS12(const Alias &alias, const Password &keyPass, const Password &certPass, PKCS12ShPtr &pkcs)
207 {
208     if (alias.empty())
209         return CKM_API_ERROR_INPUT_PARAM;
210
211     int my_counter = ++m_counter;
212
213     return try_catch([&] {
214         MessageBuffer recv;
215         AliasSupport helper(alias);
216         auto send = MessageBuffer::Serialize(static_cast<int>(LogicCommand::GET_PKCS12),
217                                              my_counter,
218                                              helper.getName(),
219                                              helper.getLabel(),
220                                              keyPass,
221                                              certPass);
222
223         int retCode = m_storageConnection.processRequest(send.Pop(), recv);
224         if (CKM_API_SUCCESS != retCode)
225             return retCode;
226
227         int command;
228         int counter;
229         PKCS12Serializable gotPkcs;
230         recv.Deserialize(command, counter, retCode, gotPkcs);
231
232         if (counter != my_counter)
233             return CKM_API_ERROR_UNKNOWN;
234
235         pkcs = std::make_shared<PKCS12Impl>(std::move(gotPkcs));
236
237         return retCode;
238     });
239 }
240
241
242 int ManagerImpl::removeAlias(const Alias &alias)
243 {
244     if (alias.empty())
245         return CKM_API_ERROR_INPUT_PARAM;
246
247     int my_counter = ++m_counter;
248
249     return try_catch([&] {
250         MessageBuffer recv;
251         AliasSupport helper(alias);
252         auto send = MessageBuffer::Serialize(static_cast<int>(LogicCommand::REMOVE),
253                                              my_counter,
254                                              helper.getName(),
255                                              helper.getLabel());
256
257         int retCode = m_storageConnection.processRequest(send.Pop(), recv);
258         if (CKM_API_SUCCESS != retCode)
259             return retCode;
260
261         int command;
262         int counter;
263         recv.Deserialize(command, counter, retCode);
264
265         if (counter != my_counter)
266             return CKM_API_ERROR_UNKNOWN;
267
268         return retCode;
269     });
270 }
271
272 int ManagerImpl::getBinaryData(
273     const Alias &alias,
274     DataType sendDataType,
275     const Password &password,
276     DataType &recvDataType,
277     RawBuffer &rawData)
278 {
279     if (alias.empty())
280         return CKM_API_ERROR_INPUT_PARAM;
281
282     int my_counter = ++m_counter;
283
284     return try_catch([&] {
285         MessageBuffer recv;
286         AliasSupport helper(alias);
287         auto send = MessageBuffer::Serialize(static_cast<int>(LogicCommand::GET),
288                                              my_counter,
289                                              static_cast<int>(sendDataType),
290                                              helper.getName(),
291                                              helper.getLabel(),
292                                              password);
293
294         int retCode = m_storageConnection.processRequest(send.Pop(), recv);
295         if (CKM_API_SUCCESS != retCode)
296             return retCode;
297
298         int command;
299         int counter;
300         int tmpDataType;
301         recv.Deserialize(command, counter, retCode, tmpDataType, rawData);
302         recvDataType = DataType(tmpDataType);
303
304         if (counter != my_counter)
305             return CKM_API_ERROR_UNKNOWN;
306
307         return retCode;
308     });
309 }
310
311 int ManagerImpl::getKey(const Alias &alias, const Password &password, KeyShPtr &key) {
312     DataType recvDataType;
313     RawBuffer rawData;
314
315     int retCode = getBinaryData(
316         alias,
317         DataType::KEY_RSA_PUBLIC,
318         password,
319         recvDataType,
320         rawData);
321
322     if (retCode != CKM_API_SUCCESS)
323         return retCode;
324
325     KeyShPtr keyParsed(new KeyImpl(rawData));
326
327     if (keyParsed->empty()) {
328         LogDebug("Key empty - failed to parse!");
329         return CKM_API_ERROR_BAD_RESPONSE;
330     }
331
332     key = keyParsed;
333
334     return CKM_API_SUCCESS;
335 }
336
337 int ManagerImpl::getCertificate(const Alias &alias, const Password &password, CertificateShPtr &cert)
338 {
339     DataType recvDataType;
340     RawBuffer rawData;
341
342     int retCode = getBinaryData(
343         alias,
344         DataType::CERTIFICATE,
345         password,
346         recvDataType,
347         rawData);
348
349     if (retCode != CKM_API_SUCCESS)
350         return retCode;
351
352     if (recvDataType != DataType::CERTIFICATE)
353         return CKM_API_ERROR_BAD_RESPONSE;
354
355     CertificateShPtr certParsed(new CertificateImpl(rawData, DataFormat::FORM_DER));
356
357     if (certParsed->empty())
358         return CKM_API_ERROR_BAD_RESPONSE;
359
360     cert = certParsed;
361
362     return CKM_API_SUCCESS;
363 }
364
365 int ManagerImpl::getData(const Alias &alias, const Password &password, RawBuffer &rawData)
366 {
367     DataType recvDataType = DataType::BINARY_DATA;
368
369     int retCode = getBinaryData(
370         alias,
371         DataType::BINARY_DATA,
372         password,
373         recvDataType,
374         rawData);
375
376     if (retCode != CKM_API_SUCCESS)
377         return retCode;
378
379     if (recvDataType != DataType::BINARY_DATA)
380         return CKM_API_ERROR_BAD_RESPONSE;
381
382     return CKM_API_SUCCESS;
383 }
384
385 int ManagerImpl::getBinaryDataAliasVector(DataType dataType, AliasVector &aliasVector)
386 {
387     int my_counter = ++m_counter;
388
389     return try_catch([&] {
390         MessageBuffer recv;
391         auto send = MessageBuffer::Serialize(static_cast<int>(LogicCommand::GET_LIST),
392                                              my_counter,
393                                              static_cast<int>(dataType));
394
395         int retCode = m_storageConnection.processRequest(send.Pop(), recv);
396         if (CKM_API_SUCCESS != retCode)
397             return retCode;
398
399         int command;
400         int counter;
401         int tmpDataType;
402         LabelNameVector labelNameVector;
403         recv.Deserialize(command, counter, retCode, tmpDataType, labelNameVector);
404         if ((command != static_cast<int>(LogicCommand::GET_LIST)) || (counter != my_counter)) {
405             return CKM_API_ERROR_UNKNOWN;
406         }
407
408         for(const auto &it : labelNameVector)
409             aliasVector.push_back( AliasSupport::merge(it.first, it.second) );
410
411         return retCode;
412     });
413 }
414
415 int ManagerImpl::getKeyAliasVector(AliasVector &aliasVector) {
416     // in fact datatype has no meaning here - if not certificate or binary data
417     // then manager decides to list all between DB_KEY_FIRST and DB_KEY_LAST
418     return getBinaryDataAliasVector(DataType::DB_KEY_LAST, aliasVector);
419 }
420
421 int ManagerImpl::getCertificateAliasVector(AliasVector &aliasVector) {
422     return getBinaryDataAliasVector(DataType::CERTIFICATE, aliasVector);
423 }
424
425 int ManagerImpl::getDataAliasVector(AliasVector &aliasVector) {
426     return getBinaryDataAliasVector(DataType::BINARY_DATA, aliasVector);
427 }
428
429 int ManagerImpl::createKeyPairRSA(
430     const int size,
431     const Alias &privateKeyAlias,
432     const Alias &publicKeyAlias,
433     const Policy &policyPrivateKey,
434     const Policy &policyPublicKey)
435 {
436     return this->createKeyPair(CKM::KeyType::KEY_RSA_PUBLIC, size, privateKeyAlias, publicKeyAlias, policyPrivateKey, policyPublicKey);
437 }
438
439 int ManagerImpl::createKeyPairDSA(
440     const int size,
441     const Alias &privateKeyAlias,
442     const Alias &publicKeyAlias,
443     const Policy &policyPrivateKey,
444     const Policy &policyPublicKey)
445 {
446     return this->createKeyPair(CKM::KeyType::KEY_DSA_PUBLIC, size, privateKeyAlias, publicKeyAlias, policyPrivateKey, policyPublicKey);
447 }
448
449 int ManagerImpl::createKeyPairECDSA(
450     ElipticCurve type,
451     const Alias &privateKeyAlias,
452     const Alias &publicKeyAlias,
453     const Policy &policyPrivateKey,
454     const Policy &policyPublicKey)
455 {
456     return this->createKeyPair(CKM::KeyType::KEY_ECDSA_PUBLIC, static_cast<int>(type), privateKeyAlias, publicKeyAlias, policyPrivateKey, policyPublicKey);
457 }
458
459 int ManagerImpl::createKeyPair(
460     const KeyType key_type,
461     const int     additional_param,
462     const Alias  &privateKeyAlias,
463     const Alias  &publicKeyAlias,
464     const Policy &policyPrivateKey,
465     const Policy &policyPublicKey)
466 {
467     // input type check
468     CryptoAlgorithm keyGenAlgorithm;
469     switch(key_type)
470     {
471         case KeyType::KEY_RSA_PUBLIC:
472         case KeyType::KEY_RSA_PRIVATE:
473             keyGenAlgorithm.addParam(ParamName::ALGO_TYPE, AlgoType::RSA_GEN);
474             keyGenAlgorithm.addParam(ParamName::GEN_KEY_LEN, additional_param);
475             break;
476
477         case KeyType::KEY_DSA_PUBLIC:
478         case KeyType::KEY_DSA_PRIVATE:
479             keyGenAlgorithm.addParam(ParamName::ALGO_TYPE, AlgoType::DSA_GEN);
480             keyGenAlgorithm.addParam(ParamName::GEN_KEY_LEN, additional_param);
481             break;
482
483         case KeyType::KEY_ECDSA_PUBLIC:
484         case KeyType::KEY_ECDSA_PRIVATE:
485             keyGenAlgorithm.addParam(ParamName::ALGO_TYPE, AlgoType::ECDSA_GEN);
486             keyGenAlgorithm.addParam(ParamName::GEN_EC, additional_param);
487             break;
488
489         default:
490             return CKM_API_ERROR_INPUT_PARAM;
491     }
492
493     // proceed with sending request
494     int my_counter = ++m_counter;
495
496     return try_catch([&] {
497
498         MessageBuffer recv;
499         AliasSupport privateHelper(privateKeyAlias);
500         AliasSupport publicHelper(publicKeyAlias);
501         auto send = MessageBuffer::Serialize(static_cast<int>(LogicCommand::CREATE_KEY_PAIR),
502                                              my_counter,
503                                              CryptoAlgorithmSerializable(keyGenAlgorithm),
504                                              PolicySerializable(policyPrivateKey),
505                                              PolicySerializable(policyPublicKey),
506                                              privateHelper.getName(),
507                                              privateHelper.getLabel(),
508                                              publicHelper.getName(),
509                                              publicHelper.getLabel());
510
511         int retCode = m_storageConnection.processRequest(send.Pop(), recv);
512         if (CKM_API_SUCCESS != retCode)
513             return retCode;
514
515         int command;
516         int counter;
517         recv.Deserialize(command, counter, retCode);
518         if (counter != my_counter) {
519             return CKM_API_ERROR_UNKNOWN;
520         }
521
522         return retCode;
523     });
524 }
525
526 int ManagerImpl::getCertificateChain(
527     const CertificateShPtr &certificate,
528     const CertificateShPtrVector &untrustedCertificates,
529     const CertificateShPtrVector &trustedCertificates,
530     bool useTrustedSystemCertificates,
531     CertificateShPtrVector &certificateChainVector)
532 {
533     RawBufferVector untrustedVector;
534     RawBufferVector trustedVector;
535
536     for (auto &e: untrustedCertificates) {
537         untrustedVector.push_back(e->getDER());
538     }
539     for (auto &e: trustedCertificates) {
540         trustedVector.push_back(e->getDER());
541     }
542
543     return getCertChain(
544             m_storageConnection,
545             LogicCommand::GET_CHAIN_CERT,
546             ++m_counter,
547             certificate,
548             untrustedVector,
549             trustedVector,
550             useTrustedSystemCertificates,
551             certificateChainVector);
552 }
553
554 int ManagerImpl::getCertificateChain(
555     const CertificateShPtr &certificate,
556     const AliasVector &untrustedCertificates,
557     const AliasVector &trustedCertificates,
558     bool useTrustedSystemCertificates,
559     CertificateShPtrVector &certificateChainVector)
560 {
561     LabelNameVector untrustedVector;
562     LabelNameVector trustedVector;
563
564     for (auto &e: untrustedCertificates) {
565         AliasSupport helper(e);
566         untrustedVector.push_back(std::make_pair(helper.getLabel(), helper.getName()));
567     }
568     for (auto &e: trustedCertificates) {
569         AliasSupport helper(e);
570         trustedVector.push_back(std::make_pair(helper.getLabel(), helper.getName()));
571     }
572
573     return getCertChain(
574             m_storageConnection,
575             LogicCommand::GET_CHAIN_ALIAS,
576             ++m_counter,
577             certificate,
578             untrustedVector,
579             trustedVector,
580             useTrustedSystemCertificates,
581             certificateChainVector);
582 }
583
584 int ManagerImpl::createSignature(
585     const Alias &privateKeyAlias,
586     const Password &password,           // password for private_key
587     const RawBuffer &message,
588     const HashAlgorithm hash,
589     const RSAPaddingAlgorithm padding,
590     RawBuffer &signature)
591 {
592     int my_counter = ++m_counter;
593
594     return try_catch([&] {
595
596         MessageBuffer recv;
597         AliasSupport helper(privateKeyAlias);
598         auto send = MessageBuffer::Serialize(static_cast<int>(LogicCommand::CREATE_SIGNATURE),
599                                              my_counter,
600                                              helper.getName(),
601                                              helper.getLabel(),
602                                              password,
603                                              message,
604                                              static_cast<int>(hash),
605                                              static_cast<int>(padding));
606
607         int retCode = m_storageConnection.processRequest(send.Pop(), recv);
608         if (CKM_API_SUCCESS != retCode)
609             return retCode;
610
611         int command;
612         int counter;
613         recv.Deserialize(command, counter, retCode, signature);
614
615         if ((command != static_cast<int>(LogicCommand::CREATE_SIGNATURE))
616             || (counter != my_counter))
617         {
618             return CKM_API_ERROR_UNKNOWN;
619         }
620
621         return retCode;
622     });
623 }
624
625 int ManagerImpl::verifySignature(
626     const Alias &publicKeyOrCertAlias,
627     const Password &password,           // password for public_key (optional)
628     const RawBuffer &message,
629     const RawBuffer &signature,
630     const HashAlgorithm hash,
631     const RSAPaddingAlgorithm padding)
632 {
633     int my_counter = ++m_counter;
634
635     return try_catch([&] {
636         MessageBuffer recv;
637         AliasSupport helper(publicKeyOrCertAlias);
638         auto send = MessageBuffer::Serialize(static_cast<int>(LogicCommand::VERIFY_SIGNATURE),
639                                              my_counter,
640                                              helper.getName(),
641                                              helper.getLabel(),
642                                              password,
643                                              message,
644                                              signature,
645                                              static_cast<int>(hash),
646                                              static_cast<int>(padding));
647
648         int retCode = m_storageConnection.processRequest(send.Pop(), recv);
649         if (CKM_API_SUCCESS != retCode)
650             return retCode;
651
652         int command;
653         int counter;
654         recv.Deserialize(command, counter, retCode);
655
656         if ((command != static_cast<int>(LogicCommand::VERIFY_SIGNATURE))
657             || (counter != my_counter))
658         {
659             return CKM_API_ERROR_UNKNOWN;
660         }
661
662         return retCode;
663     });
664 }
665
666 int ManagerImpl::ocspCheck(const CertificateShPtrVector &certChain, int &ocspStatus)
667 {
668     return try_catch([&] {
669         int my_counter = ++m_counter;
670         MessageBuffer recv;
671
672         RawBufferVector rawCertChain;
673         for (auto &e: certChain) {
674             rawCertChain.push_back(e->getDER());
675         }
676
677         auto send = MessageBuffer::Serialize(my_counter, rawCertChain);
678
679         int retCode = m_ocspConnection.processRequest(send.Pop(), recv);
680         if (CKM_API_SUCCESS != retCode)
681             return retCode;
682
683         int counter;
684         recv.Deserialize(counter, retCode, ocspStatus);
685
686         if (my_counter != counter) {
687             return CKM_API_ERROR_UNKNOWN;
688         }
689
690         return retCode;
691     });
692 }
693
694 int ManagerImpl::setPermission(const Alias &alias,
695                                const Label &accessor,
696                                PermissionMask permissionMask)
697 {
698     int my_counter = ++m_counter;
699
700     return try_catch([&] {
701         MessageBuffer recv;
702         AliasSupport helper(alias);
703         auto send = MessageBuffer::Serialize(static_cast<int>(LogicCommand::SET_PERMISSION),
704                                              my_counter,
705                                              helper.getName(),
706                                              helper.getLabel(),
707                                              accessor,
708                                              permissionMask);
709
710         int retCode = m_storageConnection.processRequest(send.Pop(), recv);
711         if (CKM_API_SUCCESS != retCode)
712             return retCode;
713
714         int command;
715         int counter;
716         recv.Deserialize(command, counter, retCode);
717
718         if (my_counter != counter) {
719             return CKM_API_ERROR_UNKNOWN;
720         }
721
722         return retCode;
723     });
724 }
725
726 int ManagerImpl::encrypt(const CryptoAlgorithm &algo,
727                          const Alias &keyAlias,
728                          const Password &password,
729                          const RawBuffer& plain,
730                          RawBuffer& encrypted)
731 {
732     int my_counter = ++m_counter;
733
734     return try_catch([&] {
735         MessageBuffer recv;
736         AliasSupport helper(keyAlias);
737         CryptoAlgorithmSerializable cas(algo);
738         auto send = MessageBuffer::Serialize(static_cast<int>(EncryptionCommand::ENCRYPT),
739                                              my_counter,
740                                              cas,
741                                              helper.getName(),
742                                              helper.getLabel(),
743                                              password,
744                                              plain);
745
746         int retCode = m_encryptionConnection.processRequest(send.Pop(), recv);
747         if (CKM_API_SUCCESS != retCode)
748             return retCode;
749
750         int command;
751         int counter;
752         recv.Deserialize(command, counter, encrypted);
753
754         if (my_counter != counter) {
755             return CKM_API_ERROR_UNKNOWN;
756         }
757
758         return retCode;
759     });
760 }
761
762 int ManagerImpl::decrypt(const CryptoAlgorithm &algo,
763                          const Alias &keyAlias,
764                          const Password &password,
765                          const RawBuffer& encrypted,
766                          RawBuffer& decrypted)
767 {
768     int my_counter = ++m_counter;
769
770     return try_catch([&] {
771         MessageBuffer recv;
772         AliasSupport helper(keyAlias);
773         CryptoAlgorithmSerializable cas(algo);
774         auto send = MessageBuffer::Serialize(static_cast<int>(EncryptionCommand::DECRYPT),
775                                              my_counter,
776                                              cas,
777                                              helper.getName(),
778                                              helper.getLabel(),
779                                              password,
780                                              encrypted);
781
782         int retCode = m_encryptionConnection.processRequest(send.Pop(), recv);
783         if (CKM_API_SUCCESS != retCode)
784             return retCode;
785
786         int command;
787         int counter;
788         recv.Deserialize(command, counter, decrypted);
789
790         if (my_counter != counter) {
791             return CKM_API_ERROR_UNKNOWN;
792         }
793
794         return retCode;
795     });
796 }
797
798 ManagerShPtr Manager::create() {
799     try {
800         return std::make_shared<ManagerImpl>();
801     } catch (const std::bad_alloc &) {
802         LogDebug("Bad alloc was caught during ManagerImpl creation.");
803     } catch (...) {
804         LogError("Critical error: Unknown exception was caught during ManagerImpl creation!");
805     }
806     return ManagerShPtr();
807 }
808
809 } // namespace CKM