Replace RawData with RawBuffer.
[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 <client-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 RawBuffer &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         Deserialization::Deserialize(recv, command);
171         Deserialization::Deserialize(recv, counter);
172         Deserialization::Deserialize(recv, retCode);
173
174         if (retCode == KEY_MANAGER_API_SUCCESS) {
175             int tmpDataType;
176             Deserialization::Deserialize(recv, tmpDataType);
177             Deserialization::Deserialize(recv, rawData);
178             recvDataType = static_cast<DBDataType>(tmpDataType);
179         }
180
181         if (counter != m_counter) {
182             return KEY_MANAGER_API_ERROR_UNKNOWN;
183         }
184
185         return retCode;
186     });
187 }
188
189 int Manager::ManagerImpl::getKey(const Alias &alias, const RawBuffer &password, Key &key) {
190     DBDataType recvDataType;
191     RawBuffer rawData;
192
193     int retCode = getBinaryData(
194         alias,
195         DBDataType::KEY_RSA_PUBLIC,
196         password,
197         recvDataType,
198         rawData);
199
200     if (retCode != KEY_MANAGER_API_SUCCESS)
201         return retCode;
202
203     Key keyParsed(rawData, toKeyType(recvDataType));
204
205     if (keyParsed.empty())
206         return KEY_MANAGER_API_ERROR_BAD_RESPONSE;
207
208     key = keyParsed;
209
210     return KEY_MANAGER_API_SUCCESS;
211 }
212
213 int Manager::ManagerImpl::getCertificate(const Alias &alias, const RawBuffer &password, Certificate &cert)
214 {
215     DBDataType recvDataType;
216     RawBuffer rawData;
217
218     int retCode = getBinaryData(
219         alias,
220         DBDataType::CERTIFICATE,
221         password,
222         recvDataType,
223         rawData);
224
225     if (retCode != KEY_MANAGER_API_SUCCESS)
226         return retCode;
227
228     if (recvDataType != DBDataType::CERTIFICATE)
229         return KEY_MANAGER_API_ERROR_BAD_RESPONSE;
230
231     Certificate certParsed(rawData, Certificate::Format::FORM_DER);
232
233     if (certParsed.empty())
234         return KEY_MANAGER_API_ERROR_BAD_RESPONSE;
235
236     cert = certParsed;
237
238     return KEY_MANAGER_API_SUCCESS;
239 }
240
241 int Manager::ManagerImpl::getData(const Alias &alias, const RawBuffer &password, RawBuffer &rawData)
242 {
243     DBDataType recvDataType;
244
245     int retCode = getBinaryData(
246         alias,
247         DBDataType::CERTIFICATE,
248         password,
249         recvDataType,
250         rawData);
251
252     if (retCode != KEY_MANAGER_API_SUCCESS)
253         return retCode;
254
255     if (recvDataType != DBDataType::BINARY_DATA)
256         return KEY_MANAGER_API_ERROR_BAD_RESPONSE;
257
258     return KEY_MANAGER_API_SUCCESS;
259 }
260
261 } // namespace CKM
262