Implementation of CKMLogic::getDataList function.
[platform/core/security/key-manager.git] / src / manager / client / client-manager-impl.cpp
1 /* Copyright (c) 2000 - 2013 Samsung Electronics Co., Ltd All Rights Reserved
2  *
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
6  *
7  *      http://www.apache.org/licenses/LICENSE-2.0
8  *
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
14  *
15  *
16  * @file        client-manager-impl.cpp
17  * @author      Bartlomiej Grzelewski (b.grzelewski@samsung.com)
18  * @version     1.0
19  * @brief       Manager implementation.
20  */
21 #include <dpl/serialization.h>
22
23 #include <client-manager-impl.h>
24 #include <client-common.h>
25 #include <key-impl.h>
26 #include <message-buffer.h>
27 #include <protocols.h>
28
29 namespace CKM {
30
31 int Manager::ManagerImpl::saveBinaryData(
32     const Alias &alias,
33     DBDataType dataType,
34     const RawBuffer &rawData,
35     const Policy &policy)
36 {
37     m_counter++;
38
39     return try_catch([&] {
40         if (alias.empty() || rawData.empty())
41             return KEY_MANAGER_API_ERROR_INPUT_PARAM;
42
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));
50
51         int retCode = sendToServer(
52             SERVICE_SOCKET_CKM_STORAGE,
53             send.Pop(),
54             recv);
55
56         if (KEY_MANAGER_API_SUCCESS != retCode) {
57             return retCode;
58         }
59
60         int command;
61         int counter;
62         int opType;
63         Deserialization::Deserialize(recv, command);
64         Deserialization::Deserialize(recv, counter);
65         Deserialization::Deserialize(recv, retCode);
66         Deserialization::Deserialize(recv, opType);
67
68         if (counter != m_counter) {
69             return KEY_MANAGER_API_ERROR_UNKNOWN;
70         }
71
72         return retCode;
73     });
74 }
75
76 int Manager::ManagerImpl::saveKey(const Alias &alias, const Key &key, const Policy &policy) {
77     return saveBinaryData(alias, toDBDataType(key.getType()), key.getKey(), policy);
78 }
79
80 int Manager::ManagerImpl::saveCertificate(
81     const Alias &alias,
82     const Certificate &cert,
83     const Policy &policy)
84 {
85     return saveBinaryData(alias, DBDataType::CERTIFICATE, cert.getDER(), policy);
86 }
87
88 int Manager::ManagerImpl::saveData(const Alias &alias, const RawBuffer &rawData, const Policy &policy) {
89     return saveBinaryData(alias, DBDataType::BINARY_DATA, rawData, policy);
90 }
91
92 int Manager::ManagerImpl::removeBinaryData(const Alias &alias, DBDataType dataType)
93 {
94     return try_catch([&] {
95         if (alias.empty())
96             return KEY_MANAGER_API_ERROR_INPUT_PARAM;
97
98         MessageBuffer send, recv;
99         Serialization::Serialize(send, static_cast<int>(LogicCommand::REMOVE));
100         Serialization::Serialize(send, m_counter);
101         Serialization::Serialize(send, static_cast<int>(dataType));
102         Serialization::Serialize(send, alias);
103
104         int retCode = sendToServer(
105             SERVICE_SOCKET_CKM_STORAGE,
106             send.Pop(),
107             recv);
108
109         if (KEY_MANAGER_API_SUCCESS != retCode) {
110             return retCode;
111         }
112
113         int command;
114         int counter;
115         int opType;
116         Deserialization::Deserialize(recv, command);
117         Deserialization::Deserialize(recv, counter);
118         Deserialization::Deserialize(recv, retCode);
119         Deserialization::Deserialize(recv, opType);
120
121         if (counter != m_counter) {
122             return KEY_MANAGER_API_ERROR_UNKNOWN;
123         }
124
125         return retCode;
126     });
127 }
128
129 int Manager::ManagerImpl::removeKey(const Alias &alias) {
130     return removeBinaryData(alias, DBDataType::KEY_RSA_PUBLIC);
131 }
132
133 int Manager::ManagerImpl::removeCertificate(const Alias &alias) {
134     return removeBinaryData(alias, DBDataType::CERTIFICATE);
135 }
136
137 int Manager::ManagerImpl::removeData(const Alias &alias) {
138     return removeBinaryData(alias, DBDataType::BINARY_DATA);
139 }
140
141 int Manager::ManagerImpl::getBinaryData(
142     const Alias &alias,
143     DBDataType sendDataType,
144     const std::string &password,
145     DBDataType &recvDataType,
146     RawBuffer &rawData)
147 {
148     return try_catch([&] {
149         if (alias.empty())
150             return KEY_MANAGER_API_ERROR_INPUT_PARAM;
151
152         MessageBuffer send, recv;
153         Serialization::Serialize(send, static_cast<int>(LogicCommand::GET));
154         Serialization::Serialize(send, m_counter);
155         Serialization::Serialize(send, static_cast<int>(sendDataType));
156         Serialization::Serialize(send, alias);
157         Serialization::Serialize(send, password);
158
159         int retCode = sendToServer(
160             SERVICE_SOCKET_CKM_STORAGE,
161             send.Pop(),
162             recv);
163
164         if (KEY_MANAGER_API_SUCCESS != retCode) {
165             return retCode;
166         }
167
168         int command;
169         int counter;
170         int tmpDataType;
171         Deserialization::Deserialize(recv, command);
172         Deserialization::Deserialize(recv, counter);
173         Deserialization::Deserialize(recv, retCode);
174         Deserialization::Deserialize(recv, tmpDataType);
175         Deserialization::Deserialize(recv, rawData);
176         recvDataType = static_cast<DBDataType>(tmpDataType);
177
178         if (counter != m_counter) {
179             return KEY_MANAGER_API_ERROR_UNKNOWN;
180         }
181
182         return retCode;
183     });
184 }
185
186 int Manager::ManagerImpl::getKey(const Alias &alias, const std::string &password, Key &key) {
187     DBDataType recvDataType;
188     RawBuffer rawData;
189
190     int retCode = getBinaryData(
191         alias,
192         DBDataType::KEY_RSA_PUBLIC,
193         password,
194         recvDataType,
195         rawData);
196
197     if (retCode != KEY_MANAGER_API_SUCCESS)
198         return retCode;
199
200     Key keyParsed(rawData, toKeyType(recvDataType));
201
202     if (keyParsed.empty())
203         return KEY_MANAGER_API_ERROR_BAD_RESPONSE;
204
205     key = keyParsed;
206
207     return KEY_MANAGER_API_SUCCESS;
208 }
209
210 int Manager::ManagerImpl::getCertificate(const Alias &alias, const std::string &password, Certificate &cert)
211 {
212     DBDataType recvDataType;
213     RawBuffer rawData;
214
215     int retCode = getBinaryData(
216         alias,
217         DBDataType::CERTIFICATE,
218         password,
219         recvDataType,
220         rawData);
221
222     if (retCode != KEY_MANAGER_API_SUCCESS)
223         return retCode;
224
225     if (recvDataType != DBDataType::CERTIFICATE)
226         return KEY_MANAGER_API_ERROR_BAD_RESPONSE;
227
228     Certificate certParsed(rawData, DataFormat::FORM_DER);
229
230     if (certParsed.empty())
231         return KEY_MANAGER_API_ERROR_BAD_RESPONSE;
232
233     cert = certParsed;
234
235     return KEY_MANAGER_API_SUCCESS;
236 }
237
238 int Manager::ManagerImpl::getData(const Alias &alias, const std::string &password, RawBuffer &rawData)
239 {
240     DBDataType recvDataType;
241
242     int retCode = getBinaryData(
243         alias,
244         DBDataType::BINARY_DATA,
245         password,
246         recvDataType,
247         rawData);
248
249     if (retCode != KEY_MANAGER_API_SUCCESS)
250         return retCode;
251
252     if (recvDataType != DBDataType::BINARY_DATA)
253         return KEY_MANAGER_API_ERROR_BAD_RESPONSE;
254
255     return KEY_MANAGER_API_SUCCESS;
256 }
257
258 int Manager::ManagerImpl::getBinaryDataAliasVector(DBDataType dataType, AliasVector &aliasVector)
259 {
260     return try_catch([&] {
261
262         MessageBuffer send, recv;
263         Serialization::Serialize(send, static_cast<int>(LogicCommand::GET_LIST));
264         Serialization::Serialize(send, m_counter);
265         Serialization::Serialize(send, static_cast<int>(dataType));
266
267         int retCode = sendToServer(
268             SERVICE_SOCKET_CKM_STORAGE,
269             send.Pop(),
270             recv);
271
272         if (KEY_MANAGER_API_SUCCESS != retCode) {
273             return retCode;
274         }
275
276         int command;
277         int counter;
278         int tmpDataType;
279
280         Deserialization::Deserialize(recv, command);
281         Deserialization::Deserialize(recv, counter);
282         Deserialization::Deserialize(recv, retCode);
283         Deserialization::Deserialize(recv, tmpDataType);
284         Deserialization::Deserialize(recv, aliasVector);
285
286         if (counter != m_counter) {
287             return KEY_MANAGER_API_ERROR_UNKNOWN;
288         }
289
290         return retCode;
291     });
292 }
293
294 int Manager::ManagerImpl::getKeyAliasVector(AliasVector &aliasVector) {
295     return getBinaryDataAliasVector(DBDataType::KEY_RSA_PUBLIC, aliasVector);
296 }
297
298 int Manager::ManagerImpl::getCertificateAliasVector(AliasVector &aliasVector) {
299     return getBinaryDataAliasVector(DBDataType::CERTIFICATE, aliasVector);
300 }
301
302 int Manager::ManagerImpl::getDataAliasVector(AliasVector &aliasVector) {
303     return getBinaryDataAliasVector(DBDataType::BINARY_DATA, aliasVector);
304 }
305
306 int Manager::ManagerImpl::createKeyPairRSA(
307     const int size,              // size in bits [1024, 2048, 4096]
308     const Alias &privateKeyAlias,
309     const Alias &publicKeyAlias,
310     const Policy &policyPrivateKey,
311     const Policy &policyPublicKey) 
312 {
313     m_counter++;
314     int my_counter = m_counter;
315     return try_catch([&] {
316
317         MessageBuffer send, recv;
318         Serialization::Serialize(send, static_cast<int>(LogicCommand::CREATE_KEY_PAIR_RSA));
319         Serialization::Serialize(send, my_counter);
320         Serialization::Serialize(send, static_cast<int>(size));
321         Serialization::Serialize(send, PolicySerializable(policyPrivateKey));
322         Serialization::Serialize(send, PolicySerializable(policyPublicKey));
323         Serialization::Serialize(send, privateKeyAlias);
324         Serialization::Serialize(send, publicKeyAlias);
325         
326         
327
328         int retCode = sendToServer(
329             SERVICE_SOCKET_CKM_STORAGE,
330             send.Pop(),
331             recv);
332
333         if (KEY_MANAGER_API_SUCCESS != retCode) {
334             return retCode;
335         }
336
337         int command;
338         int counter;
339        
340
341         Deserialization::Deserialize(recv, command);
342         Deserialization::Deserialize(recv, counter);
343         Deserialization::Deserialize(recv, retCode);
344         
345         if (counter != my_counter) {
346             return KEY_MANAGER_API_ERROR_UNKNOWN;
347         }
348
349         return retCode;
350     });
351 }
352
353 int Manager::ManagerImpl::createKeyPairECDSA(
354     ElipticCurve type,
355     const Alias &privateKeyAlias,
356     const Alias &publicKeyAlias,
357     const Policy &policyPrivateKey,
358     const Policy &policyPublicKey) 
359 {
360     m_counter++;
361     int my_counter = m_counter;
362     return try_catch([&] {
363
364         MessageBuffer send, recv;
365         Serialization::Serialize(send, static_cast<int>(LogicCommand::CREATE_KEY_PAIR_ECDSA));
366         Serialization::Serialize(send, my_counter);
367         Serialization::Serialize(send, static_cast<unsigned int>(type));
368         Serialization::Serialize(send, PolicySerializable(policyPrivateKey));
369         Serialization::Serialize(send, PolicySerializable(policyPublicKey));
370         Serialization::Serialize(send, privateKeyAlias);
371         Serialization::Serialize(send, publicKeyAlias);
372         
373
374         int retCode = sendToServer(
375             SERVICE_SOCKET_CKM_STORAGE,
376             send.Pop(),
377             recv);
378
379         if (KEY_MANAGER_API_SUCCESS != retCode) {
380             return retCode;
381         }
382
383         int command;
384         int counter;
385
386         Deserialization::Deserialize(recv, command);
387         Deserialization::Deserialize(recv, counter);
388         Deserialization::Deserialize(recv, retCode);
389         
390         if (counter != my_counter) {
391             return KEY_MANAGER_API_ERROR_UNKNOWN;
392         }
393
394         return retCode;
395     });
396 }
397 } // namespace CKM
398