2 * Copyright (c) 2000 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License
18 * @author Krzysztof Jackiewicz (k.jackiewicz@samsung.com)
22 #include <storage-receiver.h>
23 #include <protocols.h>
24 #include <dpl/log/log.h>
26 #include <certificate-impl.h>
27 #include <client-common.h>
31 StorageReceiver::StorageReceiver(MessageBuffer& buffer, AsyncRequest::Map& requests) :
38 void StorageReceiver::parseResponse()
40 int command = 0, id = 0;
41 m_buffer.Deserialize(command, id);
43 auto it = m_requests.find(id);
44 if (it == m_requests.end()) {
45 LogError("Request with id " << id << " not found!");
46 ThrowMsg(BadResponse, "Request with id " << id << " not found!");
50 AsyncRequest req = std::move(m_requests.at(id));
53 m_observer = req.observer;
55 switch (static_cast<LogicCommand>(command)) {
56 case LogicCommand::GET:
59 case LogicCommand::GET_PKCS12:
60 parseGetPKCS12Command();
62 case LogicCommand::GET_LIST:
63 parseGetListCommand();
65 case LogicCommand::SAVE:
68 case LogicCommand::SAVE_PKCS12:
69 parseSavePKCS12Command();
71 case LogicCommand::REMOVE:
74 case LogicCommand::CREATE_KEY_AES:
75 parseRetCode(&ManagerAsync::Observer::ReceivedCreateKeyAES);
77 case LogicCommand::CREATE_KEY_PAIR:
78 parseRetCode(&ManagerAsync::Observer::ReceivedCreateKeyPair);
80 case LogicCommand::GET_CHAIN_CERT:
81 case LogicCommand::GET_CHAIN_ALIAS:
82 parseGetChainCertCommand();
84 case LogicCommand::CREATE_SIGNATURE:
85 parseCreateSignatureCommand();
87 case LogicCommand::VERIFY_SIGNATURE:
88 parseRetCode(&ManagerAsync::Observer::ReceivedVerifySignature);
90 case LogicCommand::SET_PERMISSION:
91 parseRetCode(&ManagerAsync::Observer::ReceivedSetPermission);
95 LogError("Unknown command id: " << command);
96 ThrowMsg(BadResponse, "Unknown command id: " << command);
101 void StorageReceiver::parseGetCommand()
104 int dataType = 0, retCode = 0;
105 m_buffer.Deserialize(retCode, dataType, rawData);
108 if (retCode != CKM_API_SUCCESS) {
109 m_observer->ReceivedError(retCode);
113 DataType type(dataType);
115 m_observer->ReceivedKey(KeyImpl(rawData));
116 else if (type.isCertificate())
117 m_observer->ReceivedCertificate(CertificateImpl(rawData, DataFormat::FORM_DER));
118 else if (type.isBinaryData())
119 m_observer->ReceivedData(std::move(rawData));
121 m_observer->ReceivedError(CKM_API_ERROR_BAD_RESPONSE);
124 void StorageReceiver::parseGetPKCS12Command()
127 PKCS12Serializable gotPkcs;
128 m_buffer.Deserialize(retCode, gotPkcs);
131 if (retCode != CKM_API_SUCCESS) {
132 m_observer->ReceivedError(retCode);
136 m_observer->ReceivedPKCS12(std::make_shared<PKCS12Impl>(std::move(gotPkcs)));
139 void StorageReceiver::parseGetListCommand()
141 int dataType = 0, retCode = 0;
142 LabelNameVector labelNameVector;
143 m_buffer.Deserialize(retCode, dataType, labelNameVector);
146 if (retCode != CKM_API_SUCCESS) {
147 m_observer->ReceivedError(retCode);
151 AliasVector aliasVector;
152 for(const auto &it : labelNameVector)
153 aliasVector.push_back( AliasSupport::merge(it.first, it.second) );
155 DataType type(dataType);
158 m_observer->ReceivedKeyAliasVector(std::move(aliasVector));
159 else if (type.isCertificate())
160 m_observer->ReceivedCertificateAliasVector(std::move(aliasVector));
161 else if (type.isBinaryData())
162 m_observer->ReceivedDataAliasVector(std::move(aliasVector));
164 m_observer->ReceivedError(CKM_API_ERROR_BAD_RESPONSE);
167 void StorageReceiver::parseSaveCommand()
169 int dataType = 0, retCode = 0;
170 m_buffer.Deserialize(retCode, dataType);
173 if (retCode != CKM_API_SUCCESS) {
174 m_observer->ReceivedError(retCode);
178 DataType type(dataType);
180 m_observer->ReceivedSaveKey();
181 else if (type.isCertificate())
182 m_observer->ReceivedSaveCertificate();
183 else if (type.isBinaryData())
184 m_observer->ReceivedSaveData();
186 m_observer->ReceivedError(CKM_API_ERROR_BAD_RESPONSE);
189 void StorageReceiver::parseSavePKCS12Command()
192 m_buffer.Deserialize(retCode);
195 if (retCode != CKM_API_SUCCESS) {
196 m_observer->ReceivedError(retCode);
200 m_observer->ReceivedSavePKCS12();
203 void StorageReceiver::parseRemoveCommand()
206 m_buffer.Deserialize(retCode);
209 if (retCode != CKM_API_SUCCESS) {
210 m_observer->ReceivedError(retCode);
214 m_observer->ReceivedRemovedAlias();
217 void StorageReceiver::parseGetChainCertCommand()
219 CertificateShPtrVector certificateChainVector;
220 RawBufferVector rawBufferVector;
222 m_buffer.Deserialize(retCode, rawBufferVector);
225 if (retCode != CKM_API_SUCCESS) {
226 m_observer->ReceivedError(retCode);
230 for (auto &e: rawBufferVector) {
231 CertificateShPtr cert(new CertificateImpl(e, DataFormat::FORM_DER));
233 m_observer->ReceivedError(CKM_API_ERROR_BAD_RESPONSE);
236 certificateChainVector.push_back(cert);
238 m_observer->ReceivedGetCertificateChain(std::move(certificateChainVector));
241 void StorageReceiver::parseCreateSignatureCommand()
245 m_buffer.Deserialize(retCode, signature);
248 if (retCode != CKM_API_SUCCESS) {
249 m_observer->ReceivedError(retCode);
253 m_observer->ReceivedCreateSignature(std::move(signature));
256 void StorageReceiver::parseSetPermission()
259 m_buffer.Deserialize(retCode);
262 if (retCode != CKM_API_SUCCESS) {
263 m_observer->ReceivedError(retCode);
267 m_observer->ReceivedSetPermission();
270 void StorageReceiver::parseRetCode(ObserverCb callback)
273 m_buffer.Deserialize(retCode);
276 if (retCode != CKM_API_SUCCESS) {
277 m_observer->ReceivedError(retCode);
281 (m_observer.get()->*callback)();
284 } /* namespace CKM */