e9ce359f5db11475211409bf2b04fc0c8eb422bd
[platform/core/test/security-tests.git] / src / ckm / privileged / system-db.cpp
1 /*
2  *  Copyright (c) 2000 - 2020 Samsung Electronics Co.
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  * @file       system-db.cpp
17  * @author     Maciej Karpiuk (m.karpiuk2@samsung.com)
18  * @version    1.0
19  */
20 #include <dpl/test/test_runner.h>
21 #include <tests_common.h>
22 #include <ckm-common.h>
23 #include <ckm-privileged-common.h>
24 #include <ckm/ckm-control.h>
25 #include <ckmc/ckmc-manager.h>
26 #include <ckmc/ckmc-type.h>
27 #include <scoped-app-context.h>
28 #include <unistd.h>
29 #include <sys/types.h>
30
31 namespace
32 {
33 const uid_t USER_SERVICE        = 0;
34 const uid_t USER_SERVICE_2      = 1234;
35 const uid_t GROUP_SERVICE_2     = 1234;
36 const uid_t USER_SERVICE_MAX    = 4999;
37 const uid_t GROUP_SERVICE_MAX   = 4999;
38 const uid_t USER_SERVICE_FAIL   = 5000;
39 const uid_t GROUP_SERVICE_FAIL  = 5000;
40 const uid_t USER_APP            = 5050;
41 const uid_t GROUP_APP           = 5050;
42 const char* APP_PASS            = "user-pass";
43
44 const char* TEST_ALIAS          = "test-alias";
45 const char* INVALID_LABEL       = "coco-jumbo";
46 const char* TEST_PASSWORD       = "ckm-password";
47 std::string TEST_SYSTEM_ALIAS   = sharedDatabase(TEST_ALIAS);
48 std::string TEST_SYSTEM_ALIAS_2 = sharedDatabase("test-alias-2");
49
50 const char* TEST_DATA =
51         "Lorem Ipsum. At vero eos et accusamus et iusto odio dignissimos ducimus "
52         "qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores "
53         "et quas molestias excepturi sint occaecati cupiditate non provident, "
54         "similique sunt in culpa qui officia deserunt mollitia animi, id est "
55         "laborum et dolorum fuga. ";
56 }
57
58
59 RUNNER_TEST_GROUP_INIT(T50_SYSTEM_DB);
60
61 RUNNER_TEST(T5010_CLIENT_APP_LOCKED_PRIVATE_DB)
62 {
63     RUNNER_IGNORED_MSG("This test is turn off because fix "
64         "from tizen 2.4 that unlock db with empty password");
65     // [prepare]
66     // start as system service
67     // add resource to the system DB
68     // add permission to the resource to a user app
69     // [test]
70     // switch to user app, leave DB locked
71     // try to access system DB item - expect success
72
73     // [prepare]
74     remove_user_data(USER_APP);
75     save_data(TEST_SYSTEM_ALIAS.c_str(), TEST_DATA);
76     allow_access(TEST_SYSTEM_ALIAS.c_str(), TEST_LABEL, CKMC_PERMISSION_READ);
77
78     // [test]
79     {
80         ScopedAppContext ctx(TEST_LABEL, USER_APP, GROUP_APP);
81
82         check_read(TEST_ALIAS, SYSTEM_LABEL, TEST_DATA, CKMC_ERROR_DB_LOCKED);
83     }
84 }
85
86 RUNNER_TEST(T5020_CLIENT_APP_ADD_TO_PRIVATE_DB)
87 {
88     // [test]
89     // switch to user app, unlock DB
90     // when accessing private DB - owner==me
91     // try to write to private DB - expect success
92     // try to get item from private DB - expect success
93
94     // [test]
95     {
96         remove_user_data(USER_APP);
97         ScopedDBUnlock unlock(USER_APP, APP_PASS);
98         ScopedAppContext ctx(TEST_LABEL, USER_APP, GROUP_APP);
99
100         ScopedSaveData ssd(TEST_ALIAS, TEST_DATA);
101         check_read(TEST_ALIAS, TEST_LABEL, TEST_DATA);
102     }
103 }
104
105 RUNNER_TEST(T5030_CLIENT_APP_TRY_ADDING_SYSTEM_ITEM, RemoveDataEnv<0, USER_APP>)
106 {
107     // [test]
108     // switch to user app, unlock DB
109     // try to add item to system DB  - expect fail
110
111     // [test]
112     {
113         ScopedDBUnlock unlock(USER_APP, APP_PASS);
114         ScopedAppContext ctx(TEST_LABEL, USER_APP, GROUP_APP);
115
116         save_data(aliasWithLabel(SYSTEM_LABEL, TEST_ALIAS).c_str(), TEST_DATA, CKMC_ERROR_PERMISSION_DENIED);
117         check_read(TEST_ALIAS, SYSTEM_LABEL, TEST_DATA, CKMC_ERROR_DB_ALIAS_UNKNOWN);
118     }
119 }
120
121 RUNNER_TEST(T5031_CLIENT_APP_ACCESS_WITH_PERMISSION, RemoveDataEnv<0, USER_APP>)
122 {
123     // [prepare]
124     // start as system service
125     // add resource to the system DB
126     // add permission to the resource to a user app
127     // [test]
128     // switch to user app, unlock DB
129     // try to access the system item - expect success
130
131     save_data(TEST_SYSTEM_ALIAS.c_str(), TEST_DATA);
132     allow_access(TEST_SYSTEM_ALIAS.c_str(), TEST_LABEL, CKMC_PERMISSION_READ);
133
134     // [test]
135     {
136         ScopedDBUnlock unlock(USER_APP, APP_PASS);
137         ScopedAppContext ctx(TEST_LABEL, USER_APP, GROUP_APP);
138
139         check_read(TEST_ALIAS, SYSTEM_LABEL, TEST_DATA);
140     }
141 }
142
143 RUNNER_TEST(T5032_CLIENT_APP_ACCESS_NO_PERMISSION, RemoveDataEnv<0, USER_APP>)
144 {
145     // [prepare]
146     // start as system service
147     // add resource to the system DB
148     // [test]
149     // switch to user app, unlock DB
150     // try to access the system item - expect fail
151
152     // [prepare]
153     save_data(TEST_SYSTEM_ALIAS.c_str(), TEST_DATA);
154
155     // [test]
156     {
157         ScopedDBUnlock unlock(USER_APP, APP_PASS);
158         ScopedAppContext ctx(TEST_LABEL, USER_APP, GROUP_APP);
159
160         check_read(TEST_ALIAS, SYSTEM_LABEL, TEST_DATA, CKMC_ERROR_DB_ALIAS_UNKNOWN);
161     }
162 }
163
164 RUNNER_TEST(T5033_CLIENT_APP_PERMISSION_REMOVAL, RemoveDataEnv<0, USER_APP>)
165 {
166     // [prepare]
167     // start as system service
168     // add resource to the system DB
169     // add permission to the resource to a user app
170     // [test]
171     // switch to user app, unlock DB
172     // try to access the system item - expect success
173     // [prepare2]
174     // as system service, remove the item (expecting to remove permission)
175     // add item again, do not add permission
176     // [test2]
177     // switch to user app, unlock DB
178     // try to access the system item - expect fail
179
180     // [prepare]
181     save_data(TEST_SYSTEM_ALIAS.c_str(), TEST_DATA);
182     allow_access(TEST_SYSTEM_ALIAS.c_str(), TEST_LABEL, CKMC_PERMISSION_READ);
183
184     // [test]
185     {
186         ScopedDBUnlock unlock(USER_APP, APP_PASS);
187         ScopedAppContext ctx(TEST_LABEL, USER_APP, GROUP_APP);
188
189         check_read(TEST_ALIAS, SYSTEM_LABEL, TEST_DATA);
190     }
191
192     // [prepare2]
193     check_remove_allowed(TEST_SYSTEM_ALIAS.c_str());
194
195     // [test2]
196     {
197         ScopedDBUnlock unlock(USER_APP, APP_PASS);
198         ScopedAppContext ctx(TEST_LABEL, USER_APP, GROUP_APP);
199
200         check_read(TEST_ALIAS, SYSTEM_LABEL, TEST_DATA, CKMC_ERROR_DB_ALIAS_UNKNOWN);
201     }
202 }
203
204 RUNNER_TEST(T5034_CLIENT_APP_SET_READ_ACCESS, RemoveDataEnv<0, USER_APP>)
205 {
206     // [test]
207     // switch to user app, unlock DB
208     // try to write to private DB - expect success
209     // try to write to system DB  - expect fail
210
211     // [test]
212     {
213         ScopedDBUnlock unlock(USER_APP, APP_PASS);
214         ScopedAppContext ctx(TEST_LABEL, USER_APP, GROUP_APP);
215
216         ScopedSaveData ssdsystem_user(TEST_ALIAS, TEST_DATA);
217         ScopedSaveData ssdsystem_system(TEST_SYSTEM_ALIAS.c_str(), TEST_DATA, CKMC_ERROR_PERMISSION_DENIED);
218         check_read(TEST_ALIAS, SYSTEM_LABEL, TEST_DATA, CKMC_ERROR_DB_ALIAS_UNKNOWN);
219     }
220 }
221
222 RUNNER_TEST(T5035_CLIENT_APP_TRY_REMOVING_SYSTEM_ITEM, RemoveDataEnv<0, USER_APP>)
223 {
224     // [prepare]
225     // start as system service
226     // add resource to the system DB
227     // add permission to the resource to a user app
228     // [test]
229     // switch to user app, unlock DB
230     // try to remove item from system DB  - expect fail
231
232     // [prepare]
233     save_data(TEST_SYSTEM_ALIAS.c_str(), TEST_DATA);
234     allow_access(TEST_SYSTEM_ALIAS.c_str(), TEST_LABEL, CKMC_PERMISSION_READ);
235
236     // [test]
237     {
238         ScopedDBUnlock unlock(USER_APP, APP_PASS);
239         ScopedAppContext ctx(TEST_LABEL, USER_APP, GROUP_APP);
240
241         check_remove_denied(TEST_SYSTEM_ALIAS.c_str());
242     }
243 }
244
245 RUNNER_TEST(T5036_CLIENT_LIST_ACCESSIBLE_ITEMS, RemoveDataEnv<0, USER_APP>)
246 {
247     // [prepare]
248     // start as system service
249     // add data A to the system DB
250     // add data B to the system DB
251     // add permission to data A to a user app
252     // [test]
253     // system service list items - expect both items to appear
254     // [test2]
255     // switch to user app, unlock DB
256     // add data as user
257     // user lists items - expect system item A and private item
258
259     // [prepare]
260     save_data(TEST_SYSTEM_ALIAS.c_str(), TEST_DATA);
261     save_data(TEST_SYSTEM_ALIAS_2.c_str(), TEST_DATA);
262     allow_access(TEST_SYSTEM_ALIAS.c_str(), TEST_LABEL, CKMC_PERMISSION_READ);
263
264     // [test]
265     check_alias_list({TEST_SYSTEM_ALIAS.c_str(), TEST_SYSTEM_ALIAS_2.c_str()});
266
267     // [test2]
268     {
269         ScopedDBUnlock unlock(USER_APP, APP_PASS);
270         ScopedAppContext ctx(TEST_LABEL, USER_APP, GROUP_APP);
271         ScopedSaveData user_data(TEST_ALIAS, TEST_DATA);
272
273         check_alias_list({TEST_SYSTEM_ALIAS.c_str(),
274                           aliasWithLabel(TEST_LABEL, TEST_ALIAS)});
275     }
276 }
277
278 RUNNER_TEST(T5037_CLIENT_APP_TRY_GENERATE_KEY_IN_SYSTEM_DB, RemoveDataEnv<USER_APP>)
279 {
280     // [test]
281     // switch to user app, unlock DB
282     // try to generate a key in system DB  - expect fail
283
284     // [test]
285     {
286         ScopedDBUnlock unlock(USER_APP, APP_PASS);
287         ScopedAppContext ctx(TEST_LABEL, USER_APP, GROUP_APP);
288
289         std::string private_key_alias = aliasWithLabel(SYSTEM_LABEL, "sys-db-priv");
290         std::string public_key_alias = aliasWithLabel(SYSTEM_LABEL, "sys-db-pub");
291         ckmc_policy_s policy_private_key;
292         ckmc_policy_s policy_public_key;
293         policy_private_key.password = NULL;
294         policy_private_key.extractable = 1;
295         policy_public_key.password = NULL;
296         policy_public_key.extractable = 1;
297         int temp;
298         RUNNER_ASSERT_MSG(
299                  CKMC_ERROR_PERMISSION_DENIED ==
300                         (temp = ckmc_create_key_pair_rsa(1024,
301                                                          private_key_alias.c_str(),
302                                                          public_key_alias.c_str(),
303                                                          policy_private_key,
304                                                          policy_public_key)),
305                  CKMCReadableError(temp));
306     }
307 }
308
309 RUNNER_TEST(T5038_CLIENT_SERVER_CREATE_VERIFY_SYSTEM_DB, RemoveDataEnv<0,USER_APP>)
310 {
311     // [prepare]
312     // start as system service
313     // generate RSA key in system DB
314     // [test]
315     // try to create and verify signature in system DB  - expect success
316     // [test2]
317     // switch to user app, unlock DB
318     // try to create signature in system DB  - expect fail
319
320     // [prepare]
321     std::string private_key_alias = aliasWithLabel(SYSTEM_LABEL, "sys-db-priv");
322     std::string public_key_alias = aliasWithLabel(SYSTEM_LABEL, "sys-db-pub");
323     ckmc_policy_s policy_private_key;
324     ckmc_policy_s policy_public_key;
325     policy_private_key.password = NULL;
326     policy_private_key.extractable = 1;
327     policy_public_key.password = NULL;
328     policy_public_key.extractable = 1;
329     int temp;
330     RUNNER_ASSERT_MSG(
331             CKMC_ERROR_NONE ==
332                     (temp = ckmc_create_key_pair_rsa(1024,
333                                                      private_key_alias.c_str(),
334                                                      public_key_alias.c_str(),
335                                                      policy_private_key,
336                                                      policy_public_key)),
337              CKMCReadableError(temp));
338
339     // [test]
340     {
341         ckmc_hash_algo_e hash_algo = CKMC_HASH_SHA256;
342         ckmc_rsa_padding_algo_e pad_algo = CKMC_PKCS1_PADDING;
343         ckmc_raw_buffer_s *signature;
344         ckmc_raw_buffer_s msg_buff = prepare_message_buffer("message test");
345
346         RUNNER_ASSERT_MSG(
347                 CKMC_ERROR_NONE == (temp = ckmc_create_signature(
348                         private_key_alias.c_str(),
349                         NULL,
350                         msg_buff,
351                         hash_algo,
352                         pad_algo,
353                         &signature)),
354                 CKMCReadableError(temp));
355
356         RUNNER_ASSERT_MSG(
357                 CKMC_ERROR_NONE == (temp = ckmc_verify_signature(
358                         public_key_alias.c_str(),
359                         NULL,
360                         msg_buff,
361                         *signature,
362                         hash_algo,
363                         pad_algo)),
364                 CKMCReadableError(temp));
365     }
366
367     // [test2]
368     {
369         ScopedDBUnlock unlock(USER_APP, APP_PASS);
370         ScopedAppContext ctx(TEST_LABEL, USER_APP, GROUP_APP);
371
372         ckmc_hash_algo_e hash_algo = CKMC_HASH_SHA256;
373         ckmc_rsa_padding_algo_e pad_algo = CKMC_PKCS1_PADDING;
374         ckmc_raw_buffer_s *signature;
375         ckmc_raw_buffer_s msg_buff = prepare_message_buffer("message test");
376
377         RUNNER_ASSERT_MSG(
378                 CKMC_ERROR_DB_ALIAS_UNKNOWN == (temp = ckmc_create_signature(
379                         private_key_alias.c_str(),
380                         NULL,
381                         msg_buff,
382                         hash_algo,
383                         pad_algo,
384                         &signature)),
385                 CKMCReadableError(temp));
386     }
387 }
388
389 RUNNER_TEST(T5039_SYSTEM_APP_SET_REMOVE_ACCESS, RemoveDataEnv<0>)
390 {
391     // [prepare]
392     // start as system service
393     // add resource to the system DB
394     // [test]
395     // add remove permission to a user app - expect fail
396
397     // [prepare]
398     save_data(TEST_SYSTEM_ALIAS.c_str(), TEST_DATA);
399
400     // [test]
401     allow_access_negative(TEST_SYSTEM_ALIAS.c_str(), TEST_LABEL, CKMC_PERMISSION_REMOVE, CKMC_ERROR_INVALID_PARAMETER);
402 }
403
404 RUNNER_TEST(T5040_SYSTEM_SVC_ACCESS_DB, RemoveDataEnv<0>)
405 {
406     // [prepare]
407     // start as system service
408     // add resource to the system DB
409     // [test]
410     // try to access the item - expect success
411
412     // [prepare]
413     save_data(TEST_SYSTEM_ALIAS.c_str(), TEST_DATA);
414
415     // [test]
416     check_read(TEST_ALIAS, SYSTEM_LABEL, TEST_DATA);
417 }
418
419 RUNNER_TEST(T5041_SYSTEM_SVC_1234_ACCESS_DB, RemoveDataEnv<0>)
420 {
421     // [prepare]
422     // start as system service
423     // add resource to the system DB
424     // [test]
425     // switch to another system service
426     // try to access the item - expect success
427
428     // [prepare]
429     save_data(TEST_SYSTEM_ALIAS.c_str(), TEST_DATA);
430
431     // [test]
432     {
433         ScopedAppContext ctx(TEST_LABEL_2, USER_SERVICE_2, GROUP_SERVICE_2);
434
435         check_read(TEST_ALIAS, SYSTEM_LABEL, TEST_DATA);
436     }
437 }
438
439 RUNNER_TEST(T5042_SYSTEM_SVC_1234_ADD_ITEM_TO_DB)
440 {
441     // [prepare]
442     // start as system service 1234
443     // add resource to the system DB
444     // [test]
445     // switch to another system service
446     // try to access the item - expect success
447
448     // [prepare]
449     {
450         ScopedAppContext ctx(TEST_LABEL_2, USER_SERVICE_2, GROUP_SERVICE_2);
451
452         // [test]
453         ScopedSaveData ssd(TEST_SYSTEM_ALIAS.c_str(), TEST_DATA);
454         check_read(TEST_ALIAS, SYSTEM_LABEL, TEST_DATA);
455     }
456 }
457
458 RUNNER_TEST(T5043_SYSTEM_SVC_4999_ACCESS_DB, RemoveDataEnv<0>)
459 {
460     // [prepare]
461     // start as system service
462     // add resource to the system DB
463     // [test]
464     // switch to system service having uid maximum for system svcs
465     // try to access the item - expect success
466
467     // [prepare]
468     save_data(TEST_SYSTEM_ALIAS.c_str(), TEST_DATA);
469
470     // [test]
471     {
472         ScopedAppContext ctx(TEST_LABEL_2, USER_SERVICE_MAX, GROUP_SERVICE_MAX);
473
474         check_read(TEST_ALIAS, SYSTEM_LABEL, TEST_DATA);
475     }
476 }
477
478 RUNNER_TEST(T5044_SYSTEM_SVC_5000_ACCESS_DB, RemoveDataEnv<0>)
479 {
480     RUNNER_IGNORED_MSG("This test is turn off because fix "
481         "from tizen 2.4 that unlock db with empty password");
482     // [prepare]
483     // start as system service
484     // add resource to the system DB
485     // [test]
486     // switch to another, faulty system service with user-land uid==5000
487     // try to access the item - expect fail (no system service)
488
489     // [prepare]
490     save_data(TEST_SYSTEM_ALIAS.c_str(), TEST_DATA);
491
492     // [test]
493     {
494         ScopedAppContext ctx(TEST_LABEL_2, USER_SERVICE_FAIL, GROUP_SERVICE_FAIL);
495
496         check_read(TEST_ALIAS, SYSTEM_LABEL, TEST_DATA, CKMC_ERROR_DB_LOCKED);
497     }
498 }
499
500 RUNNER_TEST(T5045_SYSTEM_DB_ADD_WITH_INVALID_LABEL, RemoveDataEnv<0>)
501 {
502     // [prepare]
503     // start as system service
504     // [test]
505     // try to add item to system DB using wrong label - expect fail
506     // try to add item using explicit system label - expect success
507
508     // [test]
509     save_data(aliasWithLabel(INVALID_LABEL, TEST_ALIAS).c_str(), TEST_DATA, CKMC_ERROR_INVALID_PARAMETER);
510     check_read(TEST_ALIAS, INVALID_LABEL, TEST_DATA, CKMC_ERROR_DB_ALIAS_UNKNOWN);
511
512     save_data(aliasWithLabel(SYSTEM_LABEL, TEST_ALIAS).c_str(), TEST_DATA);
513     check_read(TEST_ALIAS, SYSTEM_LABEL, TEST_DATA);
514 }
515
516 RUNNER_TEST(T5046_CLIENT_GET_ALIAS_STATUS_NO_PASSWORD, RemoveDataEnv<0>)
517 {
518     // [prepare]
519     // start as system service
520     // add data A to the system DB
521     // add data B to the system DB
522     // [test]
523     // system service list alias status - expect both items to have no password protection
524
525     // [prepare]
526     save_data(TEST_SYSTEM_ALIAS.c_str(), TEST_DATA);
527     save_data(TEST_SYSTEM_ALIAS_2.c_str(), TEST_DATA);
528
529     // [test]
530     CKM::AliasInfoVector aliasInfoVector;
531     aliasInfoVector.push_back(make_alias_info(TEST_SYSTEM_ALIAS.c_str(), false));
532     aliasInfoVector.push_back(make_alias_info(TEST_SYSTEM_ALIAS_2.c_str(), false));
533
534     check_alias_info_list(aliasInfoVector);
535 }
536
537 RUNNER_TEST(T5047_CLIENT_GET_ALIAS_STATUS_PASSWORD_PROTECTED, RemoveDataEnv<0>)
538 {
539     // [prepare]
540     // start as system service
541     // add data A to the system DB
542     // add data B with password protection to the system DB
543     // add data C with password protection to the system DB
544     // [test]
545     // system service list alias status - expect: first alias - no password protection, second, third -
546     // protected with password
547
548     // [prepare]
549     save_data(TEST_SYSTEM_ALIAS.c_str(), TEST_DATA);
550     save_data(TEST_SYSTEM_ALIAS_2.c_str(), TEST_DATA, strlen(TEST_DATA), TEST_PASSWORD);
551     save_data((TEST_SYSTEM_ALIAS_2 + "1").c_str(), TEST_DATA, strlen(TEST_DATA), TEST_PASSWORD);
552
553     // [test]
554     CKM::AliasInfoVector aliasInfoVector;
555     aliasInfoVector.push_back(make_alias_info(TEST_SYSTEM_ALIAS.c_str(), false));
556     aliasInfoVector.push_back(make_alias_info(TEST_SYSTEM_ALIAS_2.c_str(), true));
557     aliasInfoVector.push_back(make_alias_info((TEST_SYSTEM_ALIAS_2 + "1").c_str(),true));
558
559     check_alias_info_list(aliasInfoVector);
560 }