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>
39 DataType type(int dbDataType)
41 switch(static_cast<DBDataType>(dbDataType))
43 case DBDataType::KEY_RSA_PUBLIC:
44 case DBDataType::KEY_RSA_PRIVATE:
45 case DBDataType::KEY_ECDSA_PUBLIC:
46 case DBDataType::KEY_ECDSA_PRIVATE:
47 case DBDataType::KEY_DSA_PUBLIC:
48 case DBDataType::KEY_DSA_PRIVATE:
49 case DBDataType::KEY_AES:
52 case DBDataType::CERTIFICATE:
53 return DataType::CERT;
55 case DBDataType::BINARY_DATA:
56 return DataType::DATA;
59 LogError("Unsupported data type: " <<dbDataType);
60 ThrowMsg(IReceiver::BadResponse, "Unsupported data type: " << dbDataType);
64 } // namespace anonymous
66 StorageReceiver::StorageReceiver(MessageBuffer& buffer, AsyncRequest::Map& requests) :
73 void StorageReceiver::parseResponse()
76 m_buffer.Deserialize(command, id);
78 auto it = m_requests.find(id);
79 if (it == m_requests.end()) {
80 LogError("Request with id " << id << " not found!");
81 ThrowMsg(BadResponse, "Request with id " << id << " not found!");
85 AsyncRequest req = std::move(m_requests.at(id));
88 m_observer = req.observer;
90 switch (static_cast<LogicCommand>(command)) {
91 case LogicCommand::GET:
94 case LogicCommand::GET_LIST:
95 parseGetListCommand();
97 case LogicCommand::SAVE:
100 case LogicCommand::REMOVE:
101 parseRemoveCommand();
103 case LogicCommand::CREATE_KEY_PAIR_RSA:
104 parseRetCode(&ManagerAsync::Observer::ReceivedCreateKeyPairRSA);
106 case LogicCommand::CREATE_KEY_PAIR_ECDSA:
107 parseRetCode(&ManagerAsync::Observer::ReceivedCreateKeyPairECDSA);
109 case LogicCommand::GET_CHAIN_CERT:
110 case LogicCommand::GET_CHAIN_ALIAS:
111 parseGetChainCertCommand();
113 case LogicCommand::CREATE_SIGNATURE:
114 parseCreateSignatureCommand();
116 case LogicCommand::VERIFY_SIGNATURE:
117 parseRetCode(&ManagerAsync::Observer::ReceivedVerifySignature);
119 case LogicCommand::CREATE_KEY_PAIR_DSA:
120 parseRetCode(&ManagerAsync::Observer::ReceivedCreateKeyPairDSA);
122 case LogicCommand::ALLOW_ACCESS:
123 parseRetCode(&ManagerAsync::Observer::ReceivedAllowAccess);
125 case LogicCommand::DENY_ACCESS:
126 parseRetCode(&ManagerAsync::Observer::ReceivedDenyAccess);
130 LogError("Unknown command id: " << command);
131 ThrowMsg(BadResponse, "Unknown command id: " << command);
136 void StorageReceiver::parseGetCommand()
139 int dataType, retCode;
140 m_buffer.Deserialize(retCode, dataType, rawData);
143 if (retCode != CKM_API_SUCCESS) {
144 m_observer->ReceivedError(retCode);
148 switch(type(dataType))
151 m_observer->ReceivedKey(KeyImpl(rawData));
154 m_observer->ReceivedCertificate(CertificateImpl(rawData, DataFormat::FORM_DER));
157 m_observer->ReceivedData(std::move(rawData));
162 void StorageReceiver::parseGetListCommand()
164 int dataType, retCode;
165 LabelAliasVector labelAliasVector;
166 m_buffer.Deserialize(retCode, dataType, labelAliasVector);
169 if (retCode != CKM_API_SUCCESS) {
170 m_observer->ReceivedError(retCode);
174 AliasVector aliasVector;
175 for(const auto it : labelAliasVector)
176 aliasVector.push_back( AliasSupport::merge(it.first, it.second) );
178 switch(type(dataType))
181 m_observer->ReceivedKeyAliasVector(std::move(aliasVector));
184 m_observer->ReceivedCertificateAliasVector(std::move(aliasVector));
187 m_observer->ReceivedDataAliasVector(std::move(aliasVector));
192 void StorageReceiver::parseSaveCommand()
194 int dataType, retCode;
195 m_buffer.Deserialize(retCode, dataType);
198 if (retCode != CKM_API_SUCCESS) {
199 m_observer->ReceivedError(retCode);
203 switch(type(dataType))
206 m_observer->ReceivedSaveKey();
209 m_observer->ReceivedSaveCertificate();
212 m_observer->ReceivedSaveData();
217 void StorageReceiver::parseRemoveCommand()
219 int dataType, retCode;
220 m_buffer.Deserialize(retCode, dataType);
223 if (retCode != CKM_API_SUCCESS) {
224 m_observer->ReceivedError(retCode);
228 switch(type(dataType))
231 m_observer->ReceivedSaveKey();
234 m_observer->ReceivedSaveCertificate();
237 m_observer->ReceivedSaveData();
242 void StorageReceiver::parseGetChainCertCommand()
244 CertificateShPtrVector certificateChainVector;
245 RawBufferVector rawBufferVector;
247 m_buffer.Deserialize(retCode, rawBufferVector);
250 if (retCode != CKM_API_SUCCESS) {
251 m_observer->ReceivedError(retCode);
255 for (auto &e: rawBufferVector) {
256 CertificateShPtr cert(new CertificateImpl(e, DataFormat::FORM_DER));
258 m_observer->ReceivedError(CKM_API_ERROR_BAD_RESPONSE);
261 certificateChainVector.push_back(cert);
263 m_observer->ReceivedGetCertificateChain(std::move(certificateChainVector));
266 void StorageReceiver::parseCreateSignatureCommand()
270 m_buffer.Deserialize(retCode, signature);
273 if (retCode != CKM_API_SUCCESS) {
274 m_observer->ReceivedError(retCode);
278 m_observer->ReceivedCreateSignature(std::move(signature));
281 void StorageReceiver::parseAllowAccessCommand()
284 m_buffer.Deserialize(retCode);
287 if (retCode != CKM_API_SUCCESS) {
288 m_observer->ReceivedError(retCode);
292 m_observer->ReceivedAllowAccess();
295 void StorageReceiver::parseDenyAccessCommand()
298 m_buffer.Deserialize(retCode);
301 if (retCode != CKM_API_SUCCESS) {
302 m_observer->ReceivedError(retCode);
306 m_observer->ReceivedDenyAccess();
309 void StorageReceiver::parseRetCode(ObserverCb callback)
312 m_buffer.Deserialize(retCode);
315 if (retCode != CKM_API_SUCCESS) {
316 m_observer->ReceivedError(retCode);
320 (m_observer.get()->*callback)();
323 } /* namespace CKM */