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_PAIR:
75 parseRetCode(&ManagerAsync::Observer::ReceivedCreateKeyPair);
77 case LogicCommand::GET_CHAIN_CERT:
78 case LogicCommand::GET_CHAIN_ALIAS:
79 parseGetChainCertCommand();
81 case LogicCommand::CREATE_SIGNATURE:
82 parseCreateSignatureCommand();
84 case LogicCommand::VERIFY_SIGNATURE:
85 parseRetCode(&ManagerAsync::Observer::ReceivedVerifySignature);
87 case LogicCommand::SET_PERMISSION:
88 parseRetCode(&ManagerAsync::Observer::ReceivedSetPermission);
92 LogError("Unknown command id: " << command);
93 ThrowMsg(BadResponse, "Unknown command id: " << command);
98 void StorageReceiver::parseGetCommand()
101 int dataType = 0, retCode = 0;
102 m_buffer.Deserialize(retCode, dataType, rawData);
105 if (retCode != CKM_API_SUCCESS) {
106 m_observer->ReceivedError(retCode);
110 DataType type(dataType);
112 m_observer->ReceivedKey(KeyImpl(rawData));
113 else if (type.isCertificate())
114 m_observer->ReceivedCertificate(CertificateImpl(rawData, DataFormat::FORM_DER));
115 else if (type.isBinaryData())
116 m_observer->ReceivedData(std::move(rawData));
118 m_observer->ReceivedError(CKM_API_ERROR_BAD_RESPONSE);
121 void StorageReceiver::parseGetPKCS12Command()
124 PKCS12Serializable gotPkcs;
125 m_buffer.Deserialize(retCode, gotPkcs);
128 if (retCode != CKM_API_SUCCESS) {
129 m_observer->ReceivedError(retCode);
133 m_observer->ReceivedPKCS12(std::make_shared<PKCS12Impl>(std::move(gotPkcs)));
136 void StorageReceiver::parseGetListCommand()
138 int dataType = 0, retCode = 0;
139 LabelNameVector labelNameVector;
140 m_buffer.Deserialize(retCode, dataType, labelNameVector);
143 if (retCode != CKM_API_SUCCESS) {
144 m_observer->ReceivedError(retCode);
148 AliasVector aliasVector;
149 for(const auto &it : labelNameVector)
150 aliasVector.push_back( AliasSupport::merge(it.first, it.second) );
152 DataType type(dataType);
155 m_observer->ReceivedKeyAliasVector(std::move(aliasVector));
156 else if (type.isCertificate())
157 m_observer->ReceivedCertificateAliasVector(std::move(aliasVector));
158 else if (type.isBinaryData())
159 m_observer->ReceivedDataAliasVector(std::move(aliasVector));
161 m_observer->ReceivedError(CKM_API_ERROR_BAD_RESPONSE);
164 void StorageReceiver::parseSaveCommand()
166 int dataType = 0, retCode = 0;
167 m_buffer.Deserialize(retCode, dataType);
170 if (retCode != CKM_API_SUCCESS) {
171 m_observer->ReceivedError(retCode);
175 DataType type(dataType);
177 m_observer->ReceivedSaveKey();
178 else if (type.isCertificate())
179 m_observer->ReceivedSaveCertificate();
180 else if (type.isBinaryData())
181 m_observer->ReceivedSaveData();
183 m_observer->ReceivedError(CKM_API_ERROR_BAD_RESPONSE);
186 void StorageReceiver::parseSavePKCS12Command()
189 m_buffer.Deserialize(retCode);
192 if (retCode != CKM_API_SUCCESS) {
193 m_observer->ReceivedError(retCode);
197 m_observer->ReceivedSavePKCS12();
200 void StorageReceiver::parseRemoveCommand()
203 m_buffer.Deserialize(retCode);
206 if (retCode != CKM_API_SUCCESS) {
207 m_observer->ReceivedError(retCode);
211 m_observer->ReceivedRemovedAlias();
214 void StorageReceiver::parseGetChainCertCommand()
216 CertificateShPtrVector certificateChainVector;
217 RawBufferVector rawBufferVector;
219 m_buffer.Deserialize(retCode, rawBufferVector);
222 if (retCode != CKM_API_SUCCESS) {
223 m_observer->ReceivedError(retCode);
227 for (auto &e: rawBufferVector) {
228 CertificateShPtr cert(new CertificateImpl(e, DataFormat::FORM_DER));
230 m_observer->ReceivedError(CKM_API_ERROR_BAD_RESPONSE);
233 certificateChainVector.push_back(cert);
235 m_observer->ReceivedGetCertificateChain(std::move(certificateChainVector));
238 void StorageReceiver::parseCreateSignatureCommand()
242 m_buffer.Deserialize(retCode, signature);
245 if (retCode != CKM_API_SUCCESS) {
246 m_observer->ReceivedError(retCode);
250 m_observer->ReceivedCreateSignature(std::move(signature));
253 void StorageReceiver::parseSetPermission()
256 m_buffer.Deserialize(retCode);
259 if (retCode != CKM_API_SUCCESS) {
260 m_observer->ReceivedError(retCode);
264 m_observer->ReceivedSetPermission();
267 void StorageReceiver::parseRetCode(ObserverCb callback)
270 m_buffer.Deserialize(retCode);
273 if (retCode != CKM_API_SUCCESS) {
274 m_observer->ReceivedError(retCode);
278 (m_observer.get()->*callback)();
281 } /* namespace CKM */