Change error code names.
[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 #include <dpl/log/log.h>
23
24 #include <client-manager-impl.h>
25 #include <client-common.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 CKM_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 (CKM_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 CKM_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     if (key.empty())
78         return CKM_API_ERROR_INPUT_PARAM;
79     return saveBinaryData(alias, toDBDataType(key.getType()), key.getDER(), policy);
80 }
81
82 int Manager::ManagerImpl::saveCertificate(
83     const Alias &alias,
84     const Certificate &cert,
85     const Policy &policy)
86 {
87     return saveBinaryData(alias, DBDataType::CERTIFICATE, cert.getDER(), policy);
88 }
89
90 int Manager::ManagerImpl::saveData(const Alias &alias, const RawBuffer &rawData, const Policy &policy) {
91     if (!policy.extractable)
92         return CKM_API_ERROR_INPUT_PARAM;
93     return saveBinaryData(alias, DBDataType::BINARY_DATA, rawData, policy);
94 }
95
96 int Manager::ManagerImpl::removeBinaryData(const Alias &alias, DBDataType dataType)
97 {
98     return try_catch([&] {
99         if (alias.empty())
100             return CKM_API_ERROR_INPUT_PARAM;
101
102         MessageBuffer send, recv;
103         Serialization::Serialize(send, static_cast<int>(LogicCommand::REMOVE));
104         Serialization::Serialize(send, m_counter);
105         Serialization::Serialize(send, static_cast<int>(dataType));
106         Serialization::Serialize(send, alias);
107
108         int retCode = sendToServer(
109             SERVICE_SOCKET_CKM_STORAGE,
110             send.Pop(),
111             recv);
112
113         if (CKM_API_SUCCESS != retCode) {
114             return retCode;
115         }
116
117         int command;
118         int counter;
119         int opType;
120         Deserialization::Deserialize(recv, command);
121         Deserialization::Deserialize(recv, counter);
122         Deserialization::Deserialize(recv, retCode);
123         Deserialization::Deserialize(recv, opType);
124
125         if (counter != m_counter) {
126             return CKM_API_ERROR_UNKNOWN;
127         }
128
129         return retCode;
130     });
131 }
132
133 int Manager::ManagerImpl::removeKey(const Alias &alias) {
134     return removeBinaryData(alias, DBDataType::KEY_RSA_PUBLIC);
135 }
136
137 int Manager::ManagerImpl::removeCertificate(const Alias &alias) {
138     return removeBinaryData(alias, DBDataType::CERTIFICATE);
139 }
140
141 int Manager::ManagerImpl::removeData(const Alias &alias) {
142     return removeBinaryData(alias, DBDataType::BINARY_DATA);
143 }
144
145 int Manager::ManagerImpl::getBinaryData(
146     const Alias &alias,
147     DBDataType sendDataType,
148     const std::string &password,
149     DBDataType &recvDataType,
150     RawBuffer &rawData)
151 {
152     return try_catch([&] {
153         if (alias.empty())
154             return CKM_API_ERROR_INPUT_PARAM;
155
156         MessageBuffer send, recv;
157         Serialization::Serialize(send, static_cast<int>(LogicCommand::GET));
158         Serialization::Serialize(send, m_counter);
159         Serialization::Serialize(send, static_cast<int>(sendDataType));
160         Serialization::Serialize(send, alias);
161         Serialization::Serialize(send, password);
162
163         int retCode = sendToServer(
164             SERVICE_SOCKET_CKM_STORAGE,
165             send.Pop(),
166             recv);
167
168         if (CKM_API_SUCCESS != retCode) {
169             return retCode;
170         }
171
172         int command;
173         int counter;
174         int tmpDataType;
175         Deserialization::Deserialize(recv, command);
176         Deserialization::Deserialize(recv, counter);
177         Deserialization::Deserialize(recv, retCode);
178         Deserialization::Deserialize(recv, tmpDataType);
179         Deserialization::Deserialize(recv, rawData);
180         recvDataType = static_cast<DBDataType>(tmpDataType);
181
182         if (counter != m_counter) {
183             return CKM_API_ERROR_UNKNOWN;
184         }
185
186         return retCode;
187     });
188 }
189
190 int Manager::ManagerImpl::getKey(const Alias &alias, const std::string &password, Key &key) {
191     DBDataType recvDataType;
192     RawBuffer rawData;
193
194     int retCode = getBinaryData(
195         alias,
196         DBDataType::KEY_RSA_PUBLIC,
197         password,
198         recvDataType,
199         rawData);
200
201     if (retCode != CKM_API_SUCCESS)
202         return retCode;
203
204     Key keyParsed(rawData);
205
206     if (keyParsed.empty()) {
207         LogDebug("Key empty - failed to parse!");
208         return CKM_API_ERROR_BAD_RESPONSE;
209     }
210
211     key = keyParsed;
212
213     return CKM_API_SUCCESS;
214 }
215
216 int Manager::ManagerImpl::getCertificate(const Alias &alias, const std::string &password, Certificate &cert)
217 {
218     DBDataType recvDataType;
219     RawBuffer rawData;
220
221     int retCode = getBinaryData(
222         alias,
223         DBDataType::CERTIFICATE,
224         password,
225         recvDataType,
226         rawData);
227
228     if (retCode != CKM_API_SUCCESS)
229         return retCode;
230
231     if (recvDataType != DBDataType::CERTIFICATE)
232         return CKM_API_ERROR_BAD_RESPONSE;
233
234     Certificate certParsed(rawData, DataFormat::FORM_DER);
235
236     if (certParsed.empty())
237         return CKM_API_ERROR_BAD_RESPONSE;
238
239     cert = certParsed;
240
241     return CKM_API_SUCCESS;
242 }
243
244 int Manager::ManagerImpl::getData(const Alias &alias, const std::string &password, RawBuffer &rawData)
245 {
246     DBDataType recvDataType;
247
248     int retCode = getBinaryData(
249         alias,
250         DBDataType::BINARY_DATA,
251         password,
252         recvDataType,
253         rawData);
254
255     if (retCode != CKM_API_SUCCESS)
256         return retCode;
257
258     if (recvDataType != DBDataType::BINARY_DATA)
259         return CKM_API_ERROR_BAD_RESPONSE;
260
261     return CKM_API_SUCCESS;
262 }
263
264 int Manager::ManagerImpl::getBinaryDataAliasVector(DBDataType dataType, AliasVector &aliasVector)
265 {
266     return try_catch([&] {
267
268         MessageBuffer send, recv;
269         Serialization::Serialize(send, static_cast<int>(LogicCommand::GET_LIST));
270         Serialization::Serialize(send, m_counter);
271         Serialization::Serialize(send, static_cast<int>(dataType));
272
273         int retCode = sendToServer(
274             SERVICE_SOCKET_CKM_STORAGE,
275             send.Pop(),
276             recv);
277
278         if (CKM_API_SUCCESS != retCode) {
279             return retCode;
280         }
281
282         int command;
283         int counter;
284         int tmpDataType;
285
286         Deserialization::Deserialize(recv, command);
287         Deserialization::Deserialize(recv, counter);
288         Deserialization::Deserialize(recv, retCode);
289         Deserialization::Deserialize(recv, tmpDataType);
290         Deserialization::Deserialize(recv, aliasVector);
291
292         if (counter != m_counter) {
293             return CKM_API_ERROR_UNKNOWN;
294         }
295
296         return retCode;
297     });
298 }
299
300 int Manager::ManagerImpl::getKeyAliasVector(AliasVector &aliasVector) {
301     return getBinaryDataAliasVector(DBDataType::KEY_RSA_PUBLIC, aliasVector);
302 }
303
304 int Manager::ManagerImpl::getCertificateAliasVector(AliasVector &aliasVector) {
305     return getBinaryDataAliasVector(DBDataType::CERTIFICATE, aliasVector);
306 }
307
308 int Manager::ManagerImpl::getDataAliasVector(AliasVector &aliasVector) {
309     return getBinaryDataAliasVector(DBDataType::BINARY_DATA, aliasVector);
310 }
311
312 int Manager::ManagerImpl::createKeyPairRSA(
313     const int size,              // size in bits [1024, 2048, 4096]
314     const Alias &privateKeyAlias,
315     const Alias &publicKeyAlias,
316     const Policy &policyPrivateKey,
317     const Policy &policyPublicKey) 
318 {
319     m_counter++;
320     int my_counter = m_counter;
321     return try_catch([&] {
322
323         MessageBuffer send, recv;
324         Serialization::Serialize(send, static_cast<int>(LogicCommand::CREATE_KEY_PAIR_RSA));
325         Serialization::Serialize(send, my_counter);
326         Serialization::Serialize(send, static_cast<int>(size));
327         Serialization::Serialize(send, PolicySerializable(policyPrivateKey));
328         Serialization::Serialize(send, PolicySerializable(policyPublicKey));
329         Serialization::Serialize(send, privateKeyAlias);
330         Serialization::Serialize(send, publicKeyAlias);
331         
332         
333
334         int retCode = sendToServer(
335             SERVICE_SOCKET_CKM_STORAGE,
336             send.Pop(),
337             recv);
338
339         if (CKM_API_SUCCESS != retCode) {
340             return retCode;
341         }
342
343         int command;
344         int counter;
345        
346
347         Deserialization::Deserialize(recv, command);
348         Deserialization::Deserialize(recv, counter);
349         Deserialization::Deserialize(recv, retCode);
350         
351         if (counter != my_counter) {
352             return CKM_API_ERROR_UNKNOWN;
353         }
354
355         return retCode;
356     });
357 }
358
359 int Manager::ManagerImpl::createKeyPairECDSA(
360     ElipticCurve type,
361     const Alias &privateKeyAlias,
362     const Alias &publicKeyAlias,
363     const Policy &policyPrivateKey,
364     const Policy &policyPublicKey) 
365 {
366     m_counter++;
367     int my_counter = m_counter;
368     return try_catch([&] {
369
370         MessageBuffer send, recv;
371         Serialization::Serialize(send, static_cast<int>(LogicCommand::CREATE_KEY_PAIR_ECDSA));
372         Serialization::Serialize(send, my_counter);
373         Serialization::Serialize(send, static_cast<unsigned int>(type));
374         Serialization::Serialize(send, PolicySerializable(policyPrivateKey));
375         Serialization::Serialize(send, PolicySerializable(policyPublicKey));
376         Serialization::Serialize(send, privateKeyAlias);
377         Serialization::Serialize(send, publicKeyAlias);
378         
379
380         int retCode = sendToServer(
381             SERVICE_SOCKET_CKM_STORAGE,
382             send.Pop(),
383             recv);
384
385         if (CKM_API_SUCCESS != retCode) {
386             return retCode;
387         }
388
389         int command;
390         int counter;
391
392         Deserialization::Deserialize(recv, command);
393         Deserialization::Deserialize(recv, counter);
394         Deserialization::Deserialize(recv, retCode);
395         
396         if (counter != my_counter) {
397             return CKM_API_ERROR_UNKNOWN;
398         }
399
400         return retCode;
401     });
402 }
403 } // namespace CKM
404