2 * Copyright (c) 2000 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License
18 * @author Bartlomiej Grzelewski (b.grzelewski@samsung.com)
20 * @brief Sample service implementation.
22 #include <dpl/serialization.h>
24 #include <ckm/ckm-error.h>
25 #include <ckm/ckm-type.h>
26 #include <key-provider.h>
27 #include <file-system.h>
29 #include <ckm-logic.h>
32 CKMLogic::CKMLogic(){}
33 CKMLogic::~CKMLogic(){}
35 RawBuffer CKMLogic::unlockUserKey(uid_t user, const std::string &password) {
36 // TODO try catch for all errors that should be supported by error code
37 int retCode = KEY_MANAGER_API_SUCCESS;
39 UserData &handle = m_userDataMap[user];
41 if (!(handle.keyProvider.isInitialized())) {
42 auto &handle = m_userDataMap[user];
45 auto wrappedDomainKEK = fs.getDomainKEK();
47 if (wrappedDomainKEK.empty()) {
48 wrappedDomainKEK = KeyProvider::generateDomainKEK(std::to_string(user), password);
49 fs.saveDomainKEK(wrappedDomainKEK);
52 handle.keyProvider = KeyProvider(wrappedDomainKEK, password);
54 // TODO Now create database!
57 MessageBuffer response;
58 Serialization::Serialize(response, retCode);
59 return response.Pop();
62 RawBuffer CKMLogic::lockUserKey(uid_t user) {
63 // TODO try catch for all errors that should be supported by error code
64 m_userDataMap.erase(user);
66 MessageBuffer response;
67 Serialization::Serialize(response, static_cast<int>(KEY_MANAGER_API_SUCCESS));
68 return response.Pop();
71 RawBuffer CKMLogic::removeUserData(uid_t user) {
72 // TODO try catch for all errors that should be supported by error code
73 m_userDataMap.erase(user);
76 // fs.removeUserData(); // remove DB also
78 MessageBuffer response;
79 Serialization::Serialize(response, static_cast<int>(KEY_MANAGER_API_SUCCESS));
80 return response.Pop();
83 RawBuffer CKMLogic::changeUserPassword(
85 const std::string &oldPassword,
86 const std::string &newPassword)
88 int retCode = KEY_MANAGER_API_SUCCESS;
91 auto wrappedDomainKEK = fs.getDomainKEK();
92 if (wrappedDomainKEK.empty()) {
93 retCode = KEY_MANAGER_API_ERROR_BAD_REQUEST;
95 wrappedDomainKEK = KeyProvider::reencrypt(wrappedDomainKEK, oldPassword, newPassword);
96 fs.saveDomainKEK(wrappedDomainKEK);
98 MessageBuffer response;
99 Serialization::Serialize(response, retCode);
100 return response.Pop();
103 RawBuffer CKMLogic::resetUserPassword(
105 const std::string &newPassword)
107 int retCode = KEY_MANAGER_API_SUCCESS;
109 if (m_userDataMap.count(user) <= 0) {
110 retCode = KEY_MANAGER_API_ERROR_BAD_REQUEST;
112 auto &handler = m_userDataMap[user];
113 auto wrappedDomainKEK = handler.keyProvider.getDomainKEK(newPassword);
115 fs.saveDomainKEK(wrappedDomainKEK);
118 MessageBuffer response;
119 Serialization::Serialize(response, retCode);
120 return response.Pop();
123 RawBuffer CKMLogic::saveData(
128 const RawBuffer &key,
129 const PolicySerializable &policy)
136 MessageBuffer response;
137 Serialization::Serialize(response, static_cast<int>(LogicCommand::SAVE));
138 Serialization::Serialize(response, commandId);
139 Serialization::Serialize(response, static_cast<int>(KEY_MANAGER_API_SUCCESS));
140 Serialization::Serialize(response, static_cast<int>(dataType));
142 return response.Pop();
145 RawBuffer CKMLogic::removeData(
154 MessageBuffer response;
155 Serialization::Serialize(response, static_cast<int>(LogicCommand::REMOVE));
156 Serialization::Serialize(response, commandId);
157 Serialization::Serialize(response, static_cast<int>(KEY_MANAGER_API_SUCCESS));
158 Serialization::Serialize(response, static_cast<int>(dataType));
160 return response.Pop();
163 RawBuffer CKMLogic::getData(
168 const std::string &password)
174 MessageBuffer response;
175 Serialization::Serialize(response, static_cast<int>(LogicCommand::GET));
176 Serialization::Serialize(response, commandId);
177 Serialization::Serialize(response, static_cast<int>(KEY_MANAGER_API_SUCCESS));
178 Serialization::Serialize(response, static_cast<int>(dataType));
179 Serialization::Serialize(response, RawBuffer());
180 return response.Pop();
183 RawBuffer CKMLogic::getDataList(
190 MessageBuffer response;
191 Serialization::Serialize(response, static_cast<int>(LogicCommand::GET_LIST));
192 Serialization::Serialize(response, commandId);
193 Serialization::Serialize(response, static_cast<int>(KEY_MANAGER_API_SUCCESS));
194 Serialization::Serialize(response, static_cast<int>(dataType));
195 Serialization::Serialize(response, AliasVector());
196 return response.Pop();
199 RawBuffer CKMLogic::createKeyPairRSA(
203 const Alias &privateKeyAlias,
204 const Alias &publicKeyAlias,
205 PolicySerializable policyPrivateKey,
206 PolicySerializable policyPublicKey)
210 (void)privateKeyAlias;
211 (void)publicKeyAlias,
212 (void)policyPrivateKey;
213 (void)policyPublicKey;
214 MessageBuffer response;
215 Serialization::Serialize(response, static_cast<int>(LogicCommand::CREATE_KEY_PAIR_RSA));
216 Serialization::Serialize(response, commandId);
217 Serialization::Serialize(response, static_cast<int>(KEY_MANAGER_API_SUCCESS));
219 return response.Pop();
222 RawBuffer CKMLogic::createKeyPairECDSA(
226 const Alias &privateKeyAlias,
227 const Alias &publicKeyAlias,
228 PolicySerializable policyPrivateKey,
229 PolicySerializable policyPublicKey)
233 (void)privateKeyAlias;
234 (void)publicKeyAlias,
235 (void)policyPrivateKey;
236 (void)policyPublicKey;
238 MessageBuffer response;
239 Serialization::Serialize(response, static_cast<int>(LogicCommand::CREATE_KEY_PAIR_RSA));
240 Serialization::Serialize(response, commandId);
241 Serialization::Serialize(response, static_cast<int>(KEY_MANAGER_API_SUCCESS));
243 return response.Pop();