8e25fbe9f491a48fb2f915cedbe90ac658f87d24
[platform/core/test/security-tests.git] / src / ckm / privileged / main.cpp
1 /*
2  *  Copyright (c) 2016 - 2020 Samsung Electronics Co., Ltd All Rights Reserved
3  *
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
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
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
15  */
16 #include <unistd.h>
17 #include <sys/types.h>
18
19 #include <fstream>
20 #include <iostream>
21
22 #include <netdb.h>
23
24 #include <dpl/test/test_runner.h>
25 #include <dpl/test/test_runner_child.h>
26
27 #include <tests_common.h>
28 #include <test-certs.h>
29 #include <scoped-app-context.h>
30 #include <ckm-common.h>
31 #include <ckm-privileged-common.h>
32 #include <ckm_helpers.h>
33
34 #include <ckm/ckm-manager.h>
35 #include <ckm/ckm-control.h>
36 #include <ckm/ckm-password.h>
37 #include <ckm/ckm-type.h>
38 #include <ckm/ckm-pkcs12.h>
39
40 #include <openssl/x509.h>
41 #include <openssl/x509v3.h>
42
43 namespace {
44 const int USER_APP = 5000;
45 const int GROUP_APP = 5000;
46
47 const int USER_APP_2 = 5020;
48 const int USER_APP_3 = 5030;
49
50 const char * const APP_PASS  = "user-pass";
51 const int USER_TEST = 5001;
52
53 const CKM::CertificateShPtrVector EMPTY_CERT_VECTOR;
54 const CKM::AliasVector EMPTY_ALIAS_VECTOR;
55 } // namespace anonymous
56
57 /*
58  *  How to numerate tests:
59  *  TABCD_NAME
60  *  T - test case (always T)
61  *  AB - number of test group (always two digits)
62  *  C - test number in group (all tests with same TABC must be run in the same time).
63  *  D - subtest.
64  */
65
66 RUNNER_TEST_GROUP_INIT(T151_CKM_STORAGE_PERNAMENT_TESTS);
67
68 RUNNER_TEST(T1510_init_unlock_key)
69 {
70     reset_user_data(USER_TEST, APP_PASS);
71 }
72
73 RUNNER_TEST(T1511_insert_data)
74 {
75     auto certee = TestData::getTestCertificate(TestData::OCSP_AVAILABLE_LEAF);
76     auto certim = TestData::getTestCertificate(TestData::OCSP_AVAILABLE_IM);
77     CKM::Alias certeeAlias("CertEE");
78     CKM::Alias certimAlias("CertIM");
79     {
80         ScopedDBUnlock unlock(USER_TEST, APP_PASS);
81         ScopedAppContext ctx(TEST_LABEL, USER_TEST, GROUP_APP);
82
83         auto manager = CKM::Manager::create();
84         RUNNER_ASSERT(CKM_API_SUCCESS == manager->saveCertificate(certeeAlias, certee, CKM::Policy()));
85         RUNNER_ASSERT(CKM_API_SUCCESS == manager->saveCertificate(certimAlias, certim, CKM::Policy()));
86     }
87
88     // restart CKM
89     stop_service(MANAGER);
90     start_service(MANAGER);
91
92     // actual test
93     {
94         ScopedDBUnlock unlock(USER_TEST, APP_PASS);
95         ScopedAppContext ctx(TEST_LABEL, USER_TEST, GROUP_APP);
96
97         auto manager = CKM::Manager::create();
98         int status1 = manager->saveCertificate(certeeAlias, certee, CKM::Policy());
99         int status2 = manager->saveCertificate(certimAlias, certim, CKM::Policy());
100         RUNNER_ASSERT_MSG(
101             CKM_API_ERROR_DB_ALIAS_EXISTS == status1,
102             "Certificate should be in database already. Error=" << CKM::APICodeToString(status1));
103         RUNNER_ASSERT_MSG(
104             CKM_API_ERROR_DB_ALIAS_EXISTS == status2,
105             "Certificate should be in database already. Error=" << CKM::APICodeToString(status2));
106     }
107 }
108
109 RUNNER_TEST(T1519_deinit)
110 {
111     remove_user_data(USER_TEST);
112 }
113
114 RUNNER_TEST_GROUP_INIT(T170_CKM_STORAGE_PERNAMENT_TESTS);
115
116 RUNNER_TEST(T1701_init_unlock_key)
117 {
118     unlock_user_data(USER_TEST+1, "t170-special-password");
119
120     ScopedAppContext ctx(TEST_LABEL, USER_TEST+1, GROUP_APP);
121 }
122
123 RUNNER_CHILD_TEST(T1702_insert_data)
124 {
125     int temp;
126     ScopedAppContext ctx(TEST_LABEL, USER_TEST+1, GROUP_APP);
127
128     auto certee = TestData::getTestCertificate(TestData::THIRD_PARTY_LEAF);
129
130     auto manager = CKM::Manager::create();
131     size_t current_aliases_num = count_aliases(ALIAS_CERT);
132     int status1 = manager->saveCertificate(CKM::Alias("CertEEE"), certee, CKM::Policy());
133
134     RUNNER_ASSERT_MSG(
135         CKM_API_SUCCESS == status1,
136         "Could not put certificate in datbase. Error=" << CKM::APICodeToString(status1));
137
138     CKM::AliasVector av;
139     RUNNER_ASSERT_MSG(
140         CKM_API_SUCCESS == (temp = manager->getCertificateAliasVector(av)),
141         "Error=" << CKM::APICodeToString(temp));
142     RUNNER_ASSERT_MSG(
143         (current_aliases_num+1) == static_cast<size_t>(temp = av.size()),
144         "Vector size: " << temp << ". Expected: " << (current_aliases_num+1));
145 }
146
147 RUNNER_TEST(T1703_removeApplicationData)
148 {
149     int tmp;
150     auto control = CKM::Control::create();
151     RUNNER_ASSERT_MSG(
152         CKM_API_SUCCESS == (tmp = control->removeApplicationData(TEST_LABEL)),
153         "Error=" << CKM::APICodeToString(tmp));
154 }
155
156 RUNNER_CHILD_TEST(T1704_data_test)
157 {
158     int temp;
159     ScopedAppContext ctx(TEST_LABEL, USER_TEST+1, GROUP_APP);
160
161     CKM::AliasVector av;
162     auto manager = CKM::Manager::create();
163
164     RUNNER_ASSERT_MSG(
165         CKM_API_SUCCESS == (temp = manager->getCertificateAliasVector(av)),
166         "Error=" << CKM::APICodeToString(temp));
167     RUNNER_ASSERT_MSG(
168         0 == (temp = av.size()),
169         "Vector size: " << temp << ". Expected: 0");
170 }
171
172 RUNNER_TEST(T1705_deinit)
173 {
174     remove_user_data(USER_TEST+1);
175 }
176
177 RUNNER_TEST(T17101_init)
178 {
179     int tmp;
180
181     auto control = CKM::Control::create();
182     RUNNER_ASSERT_MSG(
183         CKM_API_SUCCESS == (tmp = control->lockUserKey(USER_TEST+2)),
184         "Error=" << CKM::APICodeToString(tmp));
185     RUNNER_ASSERT_MSG(
186         CKM_API_SUCCESS == (tmp = control->removeUserData(USER_TEST+2)),
187         "Error=" << CKM::APICodeToString(tmp));
188     RUNNER_ASSERT_MSG(
189         CKM_API_SUCCESS == (tmp = control->unlockUserKey(USER_TEST+2, "t1706-special-password")),
190         "Error=" << CKM::APICodeToString(tmp));
191
192     RUNNER_ASSERT_MSG(
193         CKM_API_SUCCESS == (tmp = control->lockUserKey(USER_TEST+3)),
194         "Error=" << CKM::APICodeToString(tmp));
195     RUNNER_ASSERT_MSG(
196         CKM_API_SUCCESS == (tmp = control->removeUserData(USER_TEST+3)),
197         "Error=" << CKM::APICodeToString(tmp));
198     RUNNER_ASSERT_MSG(
199          CKM_API_SUCCESS == (tmp = control->unlockUserKey(USER_TEST+3, "t1706-special-password")),
200          "Error=" << CKM::APICodeToString(tmp));
201 }
202
203 RUNNER_CHILD_TEST(T17102_prep_data_01)
204 {
205     int temp;
206     ScopedAppContext ctx(TEST_LABEL, USER_TEST+2, GROUP_APP);
207
208     CKM::AliasVector av;
209     auto manager = CKM::Manager::create();
210
211     std::string data = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2b1bXDa+S8/MGWnMkru4";
212
213     CKM::RawBuffer buffer(data.begin(), data.end());
214     CKM::Policy exportable(CKM::Password(), true);
215
216     RUNNER_ASSERT_MSG(
217         CKM_API_SUCCESS == (temp = manager->saveData("data1", buffer, exportable)),
218         "Error=" << CKM::APICodeToString(temp));
219 }
220
221 RUNNER_CHILD_TEST(T17103_prep_data_02)
222 {
223     int temp;
224     ScopedAppContext ctx(TEST_LABEL_2, USER_TEST+2, GROUP_APP);
225
226     CKM::AliasVector av;
227     auto manager = CKM::Manager::create();
228
229     std::string data = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2b1bXDa+S8/MGWnMkru4";
230
231     CKM::RawBuffer buffer(data.begin(), data.end());
232     CKM::Policy exportable(CKM::Password(), true);
233
234     RUNNER_ASSERT_MSG(
235         CKM_API_SUCCESS == (temp = manager->saveData("data2", buffer, exportable)),
236         "Error=" << CKM::APICodeToString(temp));
237 }
238
239 RUNNER_CHILD_TEST(T17104_prep_data_03)
240 {
241     int temp;
242     ScopedAppContext ctx(TEST_LABEL, USER_TEST+3, GROUP_APP);
243
244     CKM::AliasVector av;
245     auto manager = CKM::Manager::create();
246
247     std::string data = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2b1bXDa+S8/MGWnMkru4";
248
249     CKM::RawBuffer buffer(data.begin(), data.end());
250     CKM::Policy exportable(CKM::Password(), true);
251
252     RUNNER_ASSERT_MSG(
253         CKM_API_SUCCESS == (temp = manager->saveData("data3", buffer, exportable)),
254         "Error=" << CKM::APICodeToString(temp));
255 }
256
257 RUNNER_CHILD_TEST(T17105_prep_data_04)
258 {
259     int temp;
260     ScopedAppContext ctx(TEST_LABEL_2, USER_TEST+3, GROUP_APP);
261
262     CKM::AliasVector av;
263     auto manager = CKM::Manager::create();
264
265     std::string data = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2b1bXDa+S8/MGWnMkru4";
266
267     CKM::RawBuffer buffer(data.begin(), data.end());
268     CKM::Policy exportable(CKM::Password(), true);
269
270     RUNNER_ASSERT_MSG(
271         CKM_API_SUCCESS == (temp = manager->saveData("data4", buffer, exportable)),
272         "Error=" << CKM::APICodeToString(temp));
273 }
274
275 RUNNER_TEST(T17106_remove_application)
276 {
277     int tmp;
278
279     auto control = CKM::Control::create();
280     RUNNER_ASSERT_MSG(
281         CKM_API_SUCCESS == (tmp = control->lockUserKey(USER_TEST+3)),
282         "Error=" << CKM::APICodeToString(tmp));
283     RUNNER_ASSERT_MSG(
284         CKM_API_SUCCESS == (tmp = control->removeApplicationData(TEST_LABEL)),
285         "Error=" << CKM::APICodeToString(tmp));
286 }
287
288 RUNNER_CHILD_TEST(T17107_check_data_01)
289 {
290     int temp;
291     ScopedAppContext ctx(TEST_LABEL, USER_TEST+2, GROUP_APP);
292
293     CKM::AliasVector av;
294     auto manager = CKM::Manager::create();
295
296     RUNNER_ASSERT_MSG(
297         CKM_API_SUCCESS == (temp = manager->getDataAliasVector(av)),
298         "Error=" << CKM::APICodeToString(temp));
299     RUNNER_ASSERT_MSG(
300         0 == (temp = av.size()),
301         "Vector size: " << temp << ". Expected: 0");
302 }
303
304 RUNNER_CHILD_TEST(T17108_check_data_02)
305 {
306     int temp;
307     ScopedAppContext ctx(TEST_LABEL_2, USER_TEST+2, GROUP_APP);
308
309     CKM::AliasVector av;
310     auto manager = CKM::Manager::create();
311
312     RUNNER_ASSERT_MSG(
313         CKM_API_SUCCESS == (temp = manager->getDataAliasVector(av)),
314         "Error=" << CKM::APICodeToString(temp));
315     RUNNER_ASSERT_MSG(
316         1 == (temp = av.size()),
317         "Vector size: " << temp << ". Expected: 1");
318 }
319
320 RUNNER_TEST(T17109_unlock_user2)
321 {
322     int tmp;
323
324     auto control = CKM::Control::create();
325     RUNNER_ASSERT_MSG(
326          CKM_API_SUCCESS == (tmp = control->unlockUserKey(USER_TEST+3, "t1706-special-password")),
327          "Error=" << CKM::APICodeToString(tmp));
328 }
329
330 RUNNER_CHILD_TEST(T17110_check_data_03)
331 {
332     int temp;
333     ScopedAppContext ctx(TEST_LABEL, USER_TEST+3, GROUP_APP);
334
335     CKM::AliasVector av;
336     auto manager = CKM::Manager::create();
337
338     RUNNER_ASSERT_MSG(
339         CKM_API_SUCCESS == (temp = manager->getDataAliasVector(av)),
340         "Error=" << CKM::APICodeToString(temp));
341     RUNNER_ASSERT_MSG(
342         0 == (temp = av.size()),
343         "Vector size: " << temp << ". Expected: 0");
344 }
345
346 RUNNER_CHILD_TEST(T17111_check_data_04)
347 {
348     int temp;
349     ScopedAppContext ctx(TEST_LABEL_2, USER_TEST+3, GROUP_APP);
350
351     CKM::AliasVector av;
352     auto manager = CKM::Manager::create();
353
354     RUNNER_ASSERT_MSG(
355         CKM_API_SUCCESS == (temp = manager->getDataAliasVector(av)),
356         "Error=" << CKM::APICodeToString(temp));
357     RUNNER_ASSERT_MSG(
358         1 == (temp = av.size()),
359         "Vector size: " << temp << ". Expected: 1");
360 }
361
362 RUNNER_TEST(T17112_deinit)
363 {
364     remove_user_data(USER_TEST+2);
365     remove_user_data(USER_TEST+3);
366 }
367
368 int main(int argc, char *argv[])
369 {
370     if (geteuid() != 0)
371     {
372         std::cerr << argv[0] << " should be executed as root. Aborting" << std::endl;
373         return -1;
374     }
375     int exitCode = DPL::Test::TestRunnerSingleton::Instance().ExecTestRunner(argc, argv);
376
377     detectCkmBugTrustzoneLeak();
378
379     return exitCode;
380 }