1 /* Copyright (c) 2000 - 2013 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 <dpl/serialization.h>
23 #include <client-manager-impl.h>
24 #include <client-common.h>
25 #include <message-buffer.h>
26 #include <protocols.h>
30 int Manager::ManagerImpl::saveBinaryData(
33 const RawBuffer &rawData,
38 return try_catch([&] {
39 if (alias.empty() || rawData.empty())
40 return KEY_MANAGER_API_ERROR_INPUT_PARAM;
42 MessageBuffer send, recv;
43 Serialization::Serialize(send, static_cast<int>(LogicCommand::SAVE));
44 Serialization::Serialize(send, m_counter);
45 Serialization::Serialize(send, static_cast<int>(dataType));
46 Serialization::Serialize(send, alias);
47 Serialization::Serialize(send, rawData);
48 Serialization::Serialize(send, PolicySerializable(policy));
50 int retCode = sendToServer(
51 SERVICE_SOCKET_CKM_STORAGE,
55 if (KEY_MANAGER_API_SUCCESS != retCode) {
62 Deserialization::Deserialize(recv, command);
63 Deserialization::Deserialize(recv, counter);
64 Deserialization::Deserialize(recv, retCode);
65 Deserialization::Deserialize(recv, opType);
67 if (counter != m_counter) {
68 return KEY_MANAGER_API_ERROR_UNKNOWN;
75 int Manager::ManagerImpl::saveKey(const Alias &alias, const Key &key, const Policy &policy) {
76 return saveBinaryData(alias, toDBDataType(key.getType()), key.getDER(), policy);
79 int Manager::ManagerImpl::saveCertificate(
81 const Certificate &cert,
84 return saveBinaryData(alias, DBDataType::CERTIFICATE, cert.getDER(), policy);
87 int Manager::ManagerImpl::saveData(const Alias &alias, const RawBuffer &rawData, const Policy &policy) {
88 return saveBinaryData(alias, DBDataType::BINARY_DATA, rawData, policy);
91 int Manager::ManagerImpl::removeBinaryData(const Alias &alias, DBDataType dataType)
93 return try_catch([&] {
95 return KEY_MANAGER_API_ERROR_INPUT_PARAM;
97 MessageBuffer send, recv;
98 Serialization::Serialize(send, static_cast<int>(LogicCommand::REMOVE));
99 Serialization::Serialize(send, m_counter);
100 Serialization::Serialize(send, static_cast<int>(dataType));
101 Serialization::Serialize(send, alias);
103 int retCode = sendToServer(
104 SERVICE_SOCKET_CKM_STORAGE,
108 if (KEY_MANAGER_API_SUCCESS != retCode) {
115 Deserialization::Deserialize(recv, command);
116 Deserialization::Deserialize(recv, counter);
117 Deserialization::Deserialize(recv, retCode);
118 Deserialization::Deserialize(recv, opType);
120 if (counter != m_counter) {
121 return KEY_MANAGER_API_ERROR_UNKNOWN;
128 int Manager::ManagerImpl::removeKey(const Alias &alias) {
129 return removeBinaryData(alias, DBDataType::KEY_RSA_PUBLIC);
132 int Manager::ManagerImpl::removeCertificate(const Alias &alias) {
133 return removeBinaryData(alias, DBDataType::CERTIFICATE);
136 int Manager::ManagerImpl::removeData(const Alias &alias) {
137 return removeBinaryData(alias, DBDataType::BINARY_DATA);
140 int Manager::ManagerImpl::getBinaryData(
142 DBDataType sendDataType,
143 const std::string &password,
144 DBDataType &recvDataType,
147 return try_catch([&] {
149 return KEY_MANAGER_API_ERROR_INPUT_PARAM;
151 MessageBuffer send, recv;
152 Serialization::Serialize(send, static_cast<int>(LogicCommand::GET));
153 Serialization::Serialize(send, m_counter);
154 Serialization::Serialize(send, static_cast<int>(sendDataType));
155 Serialization::Serialize(send, alias);
156 Serialization::Serialize(send, password);
158 int retCode = sendToServer(
159 SERVICE_SOCKET_CKM_STORAGE,
163 if (KEY_MANAGER_API_SUCCESS != retCode) {
170 Deserialization::Deserialize(recv, command);
171 Deserialization::Deserialize(recv, counter);
172 Deserialization::Deserialize(recv, retCode);
173 Deserialization::Deserialize(recv, tmpDataType);
174 Deserialization::Deserialize(recv, rawData);
175 recvDataType = static_cast<DBDataType>(tmpDataType);
177 if (counter != m_counter) {
178 return KEY_MANAGER_API_ERROR_UNKNOWN;
185 int Manager::ManagerImpl::getKey(const Alias &alias, const std::string &password, Key &key) {
186 DBDataType recvDataType;
189 int retCode = getBinaryData(
191 DBDataType::KEY_RSA_PUBLIC,
196 if (retCode != KEY_MANAGER_API_SUCCESS)
199 Key keyParsed(rawData, toKeyType(recvDataType));
201 if (keyParsed.empty())
202 return KEY_MANAGER_API_ERROR_BAD_RESPONSE;
206 return KEY_MANAGER_API_SUCCESS;
209 int Manager::ManagerImpl::getCertificate(const Alias &alias, const std::string &password, Certificate &cert)
211 DBDataType recvDataType;
214 int retCode = getBinaryData(
216 DBDataType::CERTIFICATE,
221 if (retCode != KEY_MANAGER_API_SUCCESS)
224 if (recvDataType != DBDataType::CERTIFICATE)
225 return KEY_MANAGER_API_ERROR_BAD_RESPONSE;
227 Certificate certParsed(rawData, DataFormat::FORM_DER);
229 if (certParsed.empty())
230 return KEY_MANAGER_API_ERROR_BAD_RESPONSE;
234 return KEY_MANAGER_API_SUCCESS;
237 int Manager::ManagerImpl::getData(const Alias &alias, const std::string &password, RawBuffer &rawData)
239 DBDataType recvDataType;
241 int retCode = getBinaryData(
243 DBDataType::BINARY_DATA,
248 if (retCode != KEY_MANAGER_API_SUCCESS)
251 if (recvDataType != DBDataType::BINARY_DATA)
252 return KEY_MANAGER_API_ERROR_BAD_RESPONSE;
254 return KEY_MANAGER_API_SUCCESS;
257 int Manager::ManagerImpl::getBinaryDataAliasVector(DBDataType dataType, AliasVector &aliasVector)
259 return try_catch([&] {
261 MessageBuffer send, recv;
262 Serialization::Serialize(send, static_cast<int>(LogicCommand::GET_LIST));
263 Serialization::Serialize(send, m_counter);
264 Serialization::Serialize(send, static_cast<int>(dataType));
266 int retCode = sendToServer(
267 SERVICE_SOCKET_CKM_STORAGE,
271 if (KEY_MANAGER_API_SUCCESS != retCode) {
279 Deserialization::Deserialize(recv, command);
280 Deserialization::Deserialize(recv, counter);
281 Deserialization::Deserialize(recv, retCode);
282 Deserialization::Deserialize(recv, tmpDataType);
283 Deserialization::Deserialize(recv, aliasVector);
285 if (counter != m_counter) {
286 return KEY_MANAGER_API_ERROR_UNKNOWN;
293 int Manager::ManagerImpl::getKeyAliasVector(AliasVector &aliasVector) {
294 return getBinaryDataAliasVector(DBDataType::KEY_RSA_PUBLIC, aliasVector);
297 int Manager::ManagerImpl::getCertificateAliasVector(AliasVector &aliasVector) {
298 return getBinaryDataAliasVector(DBDataType::CERTIFICATE, aliasVector);
301 int Manager::ManagerImpl::getDataAliasVector(AliasVector &aliasVector) {
302 return getBinaryDataAliasVector(DBDataType::BINARY_DATA, aliasVector);
305 int Manager::ManagerImpl::createKeyPairRSA(
306 const int size, // size in bits [1024, 2048, 4096]
307 const Alias &privateKeyAlias,
308 const Alias &publicKeyAlias,
309 const Policy &policyPrivateKey,
310 const Policy &policyPublicKey)
313 int my_counter = m_counter;
314 return try_catch([&] {
316 MessageBuffer send, recv;
317 Serialization::Serialize(send, static_cast<int>(LogicCommand::CREATE_KEY_PAIR_RSA));
318 Serialization::Serialize(send, my_counter);
319 Serialization::Serialize(send, static_cast<int>(size));
320 Serialization::Serialize(send, PolicySerializable(policyPrivateKey));
321 Serialization::Serialize(send, PolicySerializable(policyPublicKey));
322 Serialization::Serialize(send, privateKeyAlias);
323 Serialization::Serialize(send, publicKeyAlias);
327 int retCode = sendToServer(
328 SERVICE_SOCKET_CKM_STORAGE,
332 if (KEY_MANAGER_API_SUCCESS != retCode) {
340 Deserialization::Deserialize(recv, command);
341 Deserialization::Deserialize(recv, counter);
342 Deserialization::Deserialize(recv, retCode);
344 if (counter != my_counter) {
345 return KEY_MANAGER_API_ERROR_UNKNOWN;
352 int Manager::ManagerImpl::createKeyPairECDSA(
354 const Alias &privateKeyAlias,
355 const Alias &publicKeyAlias,
356 const Policy &policyPrivateKey,
357 const Policy &policyPublicKey)
360 int my_counter = m_counter;
361 return try_catch([&] {
363 MessageBuffer send, recv;
364 Serialization::Serialize(send, static_cast<int>(LogicCommand::CREATE_KEY_PAIR_ECDSA));
365 Serialization::Serialize(send, my_counter);
366 Serialization::Serialize(send, static_cast<unsigned int>(type));
367 Serialization::Serialize(send, PolicySerializable(policyPrivateKey));
368 Serialization::Serialize(send, PolicySerializable(policyPublicKey));
369 Serialization::Serialize(send, privateKeyAlias);
370 Serialization::Serialize(send, publicKeyAlias);
373 int retCode = sendToServer(
374 SERVICE_SOCKET_CKM_STORAGE,
378 if (KEY_MANAGER_API_SUCCESS != retCode) {
385 Deserialization::Deserialize(recv, command);
386 Deserialization::Deserialize(recv, counter);
387 Deserialization::Deserialize(recv, retCode);
389 if (counter != my_counter) {
390 return KEY_MANAGER_API_ERROR_UNKNOWN;