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 <client-key-impl.h>
26 #include <message-buffer.h>
27 #include <protocols.h>
31 int Manager::ManagerImpl::saveBinaryData(
34 const RawData &rawData,
39 return try_catch([&] {
40 if (alias.empty() || rawData.empty())
41 return KEY_MANAGER_API_ERROR_INPUT_PARAM;
43 MessageBuffer send, recv;
44 Serialization::Serialize(send, static_cast<int>(LogicCommand::SAVE));
45 Serialization::Serialize(send, m_counter);
46 Serialization::Serialize(send, static_cast<int>(dataType));
47 Serialization::Serialize(send, alias);
48 Serialization::Serialize(send, rawData);
49 Serialization::Serialize(send, PolicySerializable(policy));
51 int retCode = sendToServer(
52 SERVICE_SOCKET_CKM_STORAGE,
56 if (KEY_MANAGER_API_SUCCESS != retCode) {
63 Deserialization::Deserialize(recv, command);
64 Deserialization::Deserialize(recv, counter);
65 Deserialization::Deserialize(recv, opType);
66 Deserialization::Deserialize(recv, retCode);
68 if (counter != m_counter) {
69 return KEY_MANAGER_API_ERROR_UNKNOWN;
76 int Manager::ManagerImpl::saveKey(const Alias &alias, const Key &key, const Policy &policy) {
77 return saveBinaryData(alias, toDBDataType(key.getType()), key.getKey(), policy);
80 int Manager::ManagerImpl::saveCertificate(
82 const Certificate &cert,
85 return saveBinaryData(alias, DBDataType::CERTIFICATE, cert.getDER(), policy);
88 int Manager::ManagerImpl::removeBinaryData(const Alias &alias, DBDataType dataType)
90 return try_catch([&] {
92 return KEY_MANAGER_API_ERROR_INPUT_PARAM;
94 MessageBuffer send, recv;
95 Serialization::Serialize(send, static_cast<int>(LogicCommand::REMOVE));
96 Serialization::Serialize(send, m_counter);
97 Serialization::Serialize(send, static_cast<int>(dataType));
98 Serialization::Serialize(send, alias);
100 int retCode = sendToServer(
101 SERVICE_SOCKET_CKM_STORAGE,
105 if (KEY_MANAGER_API_SUCCESS != retCode) {
112 Deserialization::Deserialize(recv, command);
113 Deserialization::Deserialize(recv, counter);
114 Deserialization::Deserialize(recv, opType);
115 Deserialization::Deserialize(recv, retCode);
117 if (counter != m_counter) {
118 return KEY_MANAGER_API_ERROR_UNKNOWN;
125 int Manager::ManagerImpl::removeKey(const Alias &alias) {
126 return removeBinaryData(alias, DBDataType::KEY_RSA_PUBLIC);
129 int Manager::ManagerImpl::removeCertificate(const Alias &alias) {
130 return removeBinaryData(alias, DBDataType::CERTIFICATE);
133 int Manager::ManagerImpl::getBinaryData(
135 DBDataType sendDataType,
136 const RawData &password,
137 DBDataType &recvDataType,
140 return try_catch([&] {
142 return KEY_MANAGER_API_ERROR_INPUT_PARAM;
144 MessageBuffer send, recv;
145 Serialization::Serialize(send, static_cast<int>(LogicCommand::GET));
146 Serialization::Serialize(send, m_counter);
147 Serialization::Serialize(send, static_cast<int>(sendDataType));
148 Serialization::Serialize(send, alias);
149 Serialization::Serialize(send, password);
151 int retCode = sendToServer(
152 SERVICE_SOCKET_CKM_STORAGE,
156 if (KEY_MANAGER_API_SUCCESS != retCode) {
163 Deserialization::Deserialize(recv, command);
164 Deserialization::Deserialize(recv, counter);
165 Deserialization::Deserialize(recv, opType);
166 Deserialization::Deserialize(recv, retCode);
168 if (retCode == KEY_MANAGER_API_SUCCESS) {
170 Deserialization::Deserialize(recv, tmpDataType);
171 Deserialization::Deserialize(recv, rawData);
172 recvDataType = static_cast<DBDataType>(tmpDataType);
175 if (counter != m_counter) {
176 return KEY_MANAGER_API_ERROR_UNKNOWN;
183 int Manager::ManagerImpl::getKey(const Alias &alias, const RawData &password, Key &key) {
184 DBDataType recvDataType;
187 int retCode = getBinaryData(
189 DBDataType::KEY_RSA_PUBLIC,
194 if (retCode != KEY_MANAGER_API_SUCCESS)
197 Key keyParsed(rawData, toKeyType(recvDataType));
199 if (keyParsed.empty())
200 return KEY_MANAGER_API_ERROR_BAD_RESPONSE;
204 return KEY_MANAGER_API_SUCCESS;
207 int Manager::ManagerImpl::getCertificate(const Alias &alias, const RawData &password, Certificate &cert)
209 DBDataType recvDataType;
212 int retCode = getBinaryData(
214 DBDataType::CERTIFICATE,
219 if (retCode != KEY_MANAGER_API_SUCCESS)
222 Certificate certParsed(rawData, Certificate::Format::FORM_DER);
224 if (certParsed.empty())
225 return KEY_MANAGER_API_ERROR_BAD_RESPONSE;
229 return KEY_MANAGER_API_SUCCESS;