CAPI changes (set permission, remove alias): tests adjusted.
[platform/core/test/security-tests.git] / tests / ckm / capi-access_control.cpp
index a1ff285..14fccff 100644 (file)
@@ -6,6 +6,7 @@
 
 #include <tests_common.h>
 #include <ckm-common.h>
+#include <access_provider2.h>
 
 #include <ckmc/ckmc-manager.h>
 #include <ckmc/ckmc-control.h>
@@ -29,15 +30,16 @@ const char* TEST_ALIAS3 = "test-alias3";
 
 const char* TEST_LABEL = "test-label";
 const char* TEST_LABEL2 = "test-label2";
+const char* TEST_LABEL3 = "test-label3";
+const char* TEST_LABEL4 = "test-label4";
 
 const char* TEST_DATA = "dsflsdkghkslhglrtghierhgilrehgidsafasdffsgfdgdgfdgfdgfdgfdggf";
 
-
-void save_data(const char* alias)
+void save_data(const char* alias, const char *data)
 {
     ckmc_raw_buffer_s buffer;
-    buffer.data = reinterpret_cast<unsigned char*>(const_cast<char*>(TEST_DATA));
-    buffer.size = strlen(TEST_DATA);
+    buffer.data = reinterpret_cast<unsigned char*>(const_cast<char*>(data));
+    buffer.size = strlen(data);
     ckmc_policy_s policy;
     policy.password = NULL;
     policy.extractable = true;
@@ -46,9 +48,14 @@ void save_data(const char* alias)
     RUNNER_ASSERT_MSG(CKMC_ERROR_NONE == ret, "Saving data failed. Error: " << ret);
 }
 
+void save_data(const char* alias)
+{
+    save_data(alias, TEST_DATA);
+}
+
 void check_remove_allowed(const char* alias)
 {
-    int ret = ckmc_remove_data(alias);
+    int ret = ckmc_remove_alias(alias);
     // remove, but ignore non existing
     RUNNER_ASSERT_MSG(CKMC_ERROR_NONE == ret || CKMC_ERROR_DB_ALIAS_UNKNOWN,
                          "Removing data failed: " << ret);
@@ -56,66 +63,111 @@ void check_remove_allowed(const char* alias)
 
 void check_remove_denied(const char* alias)
 {
-    int ret = ckmc_remove_data(alias);
+    int ret = ckmc_remove_alias(alias);
     RUNNER_ASSERT_MSG(
             CKMC_ERROR_PERMISSION_DENIED == ret,
             "App with different label shouldn't have rights to remove this data. Error: " << ret);
 }
 
-void check_read_allowed(const char* alias)
+void check_remove_not_visible(const char* alias)
+{
+    int ret = ckmc_remove_alias(alias);
+    RUNNER_ASSERT_MSG(
+            CKMC_ERROR_DB_ALIAS_UNKNOWN == ret,
+            "App with different label shouldn't have rights to see this data. Error: " << ret);
+}
+
+void check_read(const char* alias, const char *label, const char *test_data, int expected_code = CKMC_ERROR_NONE)
 {
-    // try to read previously saved data
     ckmc_raw_buffer_s* buffer = NULL;
-    int ret = ckmc_get_data(alias, NULL, &buffer);
-    RUNNER_ASSERT_MSG(CKMC_ERROR_NONE == ret, "Getting data failed. Error: " << ret);
+    int ret = ckmc_get_data(aliasWithLabel(label, alias).c_str(), NULL, &buffer);
+    RUNNER_ASSERT_MSG(expected_code == ret, "Getting data failed. Expected code: " << expected_code << ", while result code: " << ret);
 
-    // compare data with expected
-    RUNNER_ASSERT_MSG(
-            buffer->size == strlen(TEST_DATA),
-            "Extracted data length do not match expected data length (encrypted?).");
+    if(expected_code == CKMC_ERROR_NONE)
+    {
+        // compare data with expected
+        RUNNER_ASSERT_MSG(
+                buffer->size == strlen(test_data),
+                "Extracted data length do not match expected data length (encrypted?).");
 
-    RUNNER_ASSERT_MSG(
-            memcmp(const_cast<const char*>(reinterpret_cast<char*>(buffer->data)), TEST_DATA, buffer->size) == 0,
-            "Extracted data do not match expected data (encrypted?).");
-    ckmc_buffer_free(buffer);
+        RUNNER_ASSERT_MSG(
+                memcmp(const_cast<const char*>(reinterpret_cast<char*>(buffer->data)), test_data, buffer->size) == 0,
+                "Extracted data do not match expected data (encrypted?).");
+
+        ckmc_buffer_free(buffer);
+    }
+}
+
+void check_read_allowed(const char* alias, const char *data)
+{
+    // try to read previously saved data - label taken implicitly
+    check_read(alias, 0, data);
+}
+void check_read_allowed(const char* alias)
+{
+    check_read_allowed(alias, TEST_DATA);
 }
 
 void check_read_denied(const char* alias)
 {
-    // try to read previously saved data
-    ckmc_raw_buffer_s* buffer = NULL;
-    int ret = ckmc_get_data(alias, NULL, &buffer);
-    RUNNER_ASSERT_MSG(CKMC_ERROR_PERMISSION_DENIED == ret,
-                         "App with different label shouldn't have rights to read this data. Error: "
-                         << ret);
-    ckmc_buffer_free(buffer);
+    // try to read previously saved data - label taken implicitly
+    {
+        ckmc_raw_buffer_s* buffer = NULL;
+        int ret = ckmc_get_data(alias, NULL, &buffer);
+        RUNNER_ASSERT_MSG(CKMC_ERROR_PERMISSION_DENIED == ret,
+                            "App with different label shouldn't have rights to read this data. Error: " << ret);
+        ckmc_buffer_free(buffer);
+    }
 }
 
-void allow_access(const char* alias, const char* accessor, ckmc_access_right_e rights)
+void check_read_not_visible(const char* alias)
+{
+    // try to read previously saved data - label taken implicitly
+    {
+        ckmc_raw_buffer_s* buffer = NULL;
+        int ret = ckmc_get_data(alias, NULL, &buffer);
+        RUNNER_ASSERT_MSG(CKMC_ERROR_DB_ALIAS_UNKNOWN == ret,
+                            "App with different label shouldn't have rights to see this data. Error: " << ret);
+        ckmc_buffer_free(buffer);
+    }
+}
+
+void allow_access(const char* alias, const char* accessor, int permissionMask)
 {
     // data removal should revoke this access
-    int ret = ckmc_allow_access(alias, accessor, rights);
+    int ret = ckmc_set_permission(alias, accessor, permissionMask);
     RUNNER_ASSERT_MSG(CKMC_ERROR_NONE == ret, "Trying to allow access returned: " << ret);
 }
 
+void allow_access_negative(const char* alias, const char* accessor, int permissionMask, int expectedCode)
+{
+    // data removal should revoke this access
+    int ret = ckmc_set_permission(alias, accessor, permissionMask);
+    RUNNER_ASSERT_MSG(expectedCode == ret, "Trying to allow access returned: " << ret << ", while expected: " << expectedCode);
+}
+
 void deny_access(const char* alias, const char* accessor)
 {
     int ret = ckmc_deny_access(alias, accessor);
     RUNNER_ASSERT_MSG(CKMC_ERROR_NONE == ret, "Denying access failed. Error: " << ret);
 }
 
-void allow_access_by_adm(const char* alias, const char* accessor, ckmc_access_right_e rights)
+void deny_access_negative(const char* alias, const char* accessor, int expectedCode)
+{
+    int ret = ckmc_set_permission(alias, accessor, CKMC_PERMISSION_NONE);
+    RUNNER_ASSERT_MSG(expectedCode == ret, "Denying access failed. Error: " << ret << ", while expected: " << expectedCode);
+}
+
+void allow_access_by_adm(const char* alias, const char* accessor, int permissionMask)
 {
     // data removal should revoke this access
-    CharPtr label = get_label();
-    int ret = ckmc_allow_access_by_adm(USER_ROOT, label.get(), alias, accessor, rights);
+    int ret = ckmc_set_permission_by_adm(USER_ROOT, aliasWithLabel(get_label().get(), alias).c_str(), accessor, permissionMask);
     RUNNER_ASSERT_MSG(CKMC_ERROR_NONE == ret, "Trying to allow access returned: " << ret);
 }
 
 void deny_access_by_adm(const char* alias, const char* accessor)
 {
-    CharPtr label = get_label();
-    int ret = ckmc_deny_access_by_adm(USER_ROOT, label.get(), alias, accessor);
+    int ret = ckmc_set_permission_by_adm(USER_ROOT, aliasWithLabel(get_label().get(), alias).c_str(), accessor, CKMC_PERMISSION_NONE);
     RUNNER_ASSERT_MSG(CKMC_ERROR_NONE == ret, "Denying access failed. Error: " << ret);
 }
 
@@ -153,6 +205,10 @@ public:
     {
         save_data(alias);
     }
+    ScopedSaveData(const char* alias, const char *data) : m_alias(alias)
+    {
+        save_data(alias, data);
+    }
 
     ~ScopedSaveData()
     {
@@ -190,25 +246,25 @@ RUNNER_TEST(T3000_init)
 // invalid arguments check
 RUNNER_TEST(T3001_manager_allow_access_invalid)
 {
-    RUNNER_ASSERT_BT(
-            CKMC_ERROR_INVALID_PARAMETER == ckmc_allow_access(NULL, "accessor", CKMC_AR_READ));
-    RUNNER_ASSERT_BT(
-            CKMC_ERROR_INVALID_PARAMETER == ckmc_allow_access("alias", NULL, CKMC_AR_READ));
+    RUNNER_ASSERT(
+            CKMC_ERROR_INVALID_PARAMETER == ckmc_set_permission(NULL, "accessor", CKMC_PERMISSION_READ));
+    RUNNER_ASSERT(
+            CKMC_ERROR_INVALID_PARAMETER == ckmc_set_permission("alias", NULL, CKMC_PERMISSION_READ));
 }
 
 // invalid arguments check
 RUNNER_TEST(T3002_manager_deny_access_invalid)
 {
-    RUNNER_ASSERT_BT(CKMC_ERROR_INVALID_PARAMETER == ckmc_deny_access(NULL, "accessor"));
-    RUNNER_ASSERT_BT(CKMC_ERROR_INVALID_PARAMETER == ckmc_deny_access("alias", NULL));
+    RUNNER_ASSERT(CKMC_ERROR_INVALID_PARAMETER == ckmc_set_permission(NULL, "accessor", CKMC_PERMISSION_NONE));
+    RUNNER_ASSERT(CKMC_ERROR_INVALID_PARAMETER == ckmc_set_permission("alias", NULL, CKMC_PERMISSION_NONE));
 }
 
 // tries to allow access for non existing alias
 RUNNER_CHILD_TEST(T3003_manager_allow_access_non_existing)
 {
-    switch_to_app(TEST_LABEL);
+    switch_to_storage_user(TEST_LABEL);
 
-    int ret = ckmc_allow_access(NO_ALIAS, "label", CKMC_AR_READ);
+    int ret = ckmc_set_permission(NO_ALIAS, "label", CKMC_PERMISSION_READ);
     RUNNER_ASSERT_MSG(CKMC_ERROR_DB_ALIAS_UNKNOWN == ret,
                          "Allowing access for non existing alias returned " << ret);
 }
@@ -216,9 +272,9 @@ RUNNER_CHILD_TEST(T3003_manager_allow_access_non_existing)
 // tries to deny access for non existing alias
 RUNNER_CHILD_TEST(T3004_manager_deny_access_non_existing)
 {
-    switch_to_app(TEST_LABEL);
+    switch_to_storage_user(TEST_LABEL);
 
-    int ret = ckmc_deny_access(NO_ALIAS, "label");
+    int ret = ckmc_set_permission(NO_ALIAS, "label", CKMC_PERMISSION_NONE);
     RUNNER_ASSERT_MSG(CKMC_ERROR_DB_ALIAS_UNKNOWN == ret,
                          "Denying access for non existing alias returned " << ret);
 }
@@ -226,12 +282,12 @@ RUNNER_CHILD_TEST(T3004_manager_deny_access_non_existing)
 // tries to deny access that does not exist in database
 RUNNER_CHILD_TEST(T3005_manager_deny_access_non_existing_access)
 {
-    switch_to_app(TEST_LABEL);
+    switch_to_storage_user(TEST_LABEL);
 
     ScopedSaveData ssd(TEST_ALIAS);
 
     // deny non existing access to existing alias
-    int ret = ckmc_deny_access(TEST_ALIAS, "label");
+    int ret = ckmc_set_permission(TEST_ALIAS, "label", CKMC_PERMISSION_NONE);
     RUNNER_ASSERT_MSG(CKMC_ERROR_INVALID_PARAMETER == ret,
                          "Denying non existing access returned: " << ret);
 }
@@ -239,125 +295,221 @@ RUNNER_CHILD_TEST(T3005_manager_deny_access_non_existing_access)
 // tries to allow access to application own data
 RUNNER_CHILD_TEST(T3006_manager_allow_access_to_myself)
 {
-    switch_to_app(TEST_LABEL);
+    switch_to_storage_user(TEST_LABEL);
 
     ScopedSaveData ssd(TEST_ALIAS);
 
     CharPtr label = get_label();
-    int ret = ckmc_allow_access(TEST_ALIAS, label.get(), CKMC_AR_READ);
+    int ret = ckmc_set_permission(TEST_ALIAS, label.get(), CKMC_PERMISSION_READ);
     RUNNER_ASSERT_MSG(CKMC_ERROR_INVALID_PARAMETER == ret,
                          "Trying to allow myself returned: " << ret);
 }
 
+// verifies that alias can not contain forbidden characters
+RUNNER_CHILD_TEST(T3007_manager_check_alias_valid)
+{
+    switch_to_storage_user(TEST_LABEL);
+    ScopedSaveData ssd(TEST_ALIAS);
+
+    std::string test_alias_playground = std::string("AAA BBB CCC");
+    check_read(test_alias_playground.c_str(), 0, TEST_DATA, CKMC_ERROR_INVALID_PARAMETER);
+
+    // control: expect success
+    check_read(TEST_ALIAS, 0, TEST_DATA);
+    check_read(TEST_ALIAS, TEST_LABEL, TEST_DATA);
+}
+
+// verifies that label can not contain forbidden characters
+RUNNER_CHILD_TEST(T3008_manager_check_label_valid)
+{
+    switch_to_storage_user(TEST_LABEL);
+    ScopedSaveData ssd(TEST_ALIAS);
+
+    // basic test
+    std::string test_label_playground = std::string("AAA BBB CCC");
+    check_read(TEST_ALIAS, test_label_playground.c_str(), TEST_DATA, CKMC_ERROR_INVALID_PARAMETER);
+
+    // insert part of the separator in the middle
+    test_label_playground = std::string(TEST_LABEL);
+    test_label_playground.insert(test_label_playground.size()/2, ckmc_label_name_separator);
+    check_read(TEST_ALIAS, test_label_playground.c_str(), TEST_DATA, CKMC_ERROR_INVALID_PARAMETER);
+
+    // prepend separator
+    test_label_playground = std::string(TEST_LABEL);
+    test_label_playground.insert(0, ckmc_label_name_separator);
+    check_read(TEST_ALIAS, test_label_playground.c_str(), TEST_DATA, CKMC_ERROR_INVALID_PARAMETER);
+
+    // append separator
+    test_label_playground = std::string(TEST_LABEL);
+    test_label_playground.append(ckmc_label_name_separator);
+    check_read(TEST_ALIAS, test_label_playground.c_str(), TEST_DATA, CKMC_ERROR_INVALID_PARAMETER);
+
+    // control: expect success
+    check_read(TEST_ALIAS, TEST_LABEL, TEST_DATA);
+}
+
 // tries to access other application data without permission
 RUNNER_TEST(T3020_manager_access_not_allowed)
 {
+    CharPtr top_label = get_label();
+
     ScopedSaveData ssd(TEST_ALIAS);
     {
         ScopedLabel sl(TEST_LABEL2);
 
-        check_read_denied(TEST_ALIAS);
-
-        check_remove_denied(TEST_ALIAS);
+        std::string TEST_ALIAS_adr = aliasWithLabel(top_label.get(), TEST_ALIAS);
+        check_read_not_visible(TEST_ALIAS_adr.c_str());
+        check_remove_not_visible(TEST_ALIAS_adr.c_str());
     }
 }
 
 // tries to access other application data with permission
 RUNNER_TEST(T3021_manager_access_allowed)
 {
+    CharPtr top_label = get_label();
     ScopedSaveData ssd(TEST_ALIAS);
 
-    allow_access(TEST_ALIAS, TEST_LABEL2, CKMC_AR_READ);
+    allow_access(TEST_ALIAS, TEST_LABEL2, CKMC_PERMISSION_READ);
     {
         ScopedLabel sl(TEST_LABEL2);
 
-        check_read_allowed(TEST_ALIAS);
+        check_read_allowed(aliasWithLabel(top_label.get(), TEST_ALIAS).c_str());
     }
 }
 
 // tries to read other application data with permission for read/remove
 RUNNER_TEST(T3022_manager_access_allowed_with_remove)
 {
+    CharPtr top_label = get_label();
     ScopedSaveData ssd(TEST_ALIAS);
 
-    allow_access(TEST_ALIAS, TEST_LABEL2, CKMC_AR_READ_REMOVE);
+    allow_access(TEST_ALIAS, TEST_LABEL2, CKMC_PERMISSION_READ | CKMC_PERMISSION_REMOVE);
     {
         ScopedLabel sl(TEST_LABEL2);
 
-        check_read_allowed(TEST_ALIAS);
+        check_read_allowed(aliasWithLabel(top_label.get(), TEST_ALIAS).c_str());
     }
 }
 
 // tries to remove other application data with permission for reading only
 RUNNER_TEST(T3023_manager_access_allowed_remove_denied)
 {
+    CharPtr top_label = get_label();
     ScopedSaveData ssd(TEST_ALIAS);
 
-    allow_access(TEST_ALIAS, TEST_LABEL2, CKMC_AR_READ);
+    allow_access(TEST_ALIAS, TEST_LABEL2, CKMC_PERMISSION_READ);
     {
         ScopedLabel sl(TEST_LABEL2);
 
-        check_remove_denied(TEST_ALIAS);
-
-        check_read_allowed(TEST_ALIAS);
+        std::string TEST_ALIAS_adr = aliasWithLabel(top_label.get(), TEST_ALIAS);
+        check_remove_denied(TEST_ALIAS_adr.c_str());
+        check_read_allowed(TEST_ALIAS_adr.c_str());
     }
 }
 
 // tries to remove other application data with permission
 RUNNER_TEST(T3025_manager_remove_allowed)
 {
+    CharPtr top_label = get_label();
     ScopedSaveData ssd(TEST_ALIAS);
 
-    allow_access(TEST_ALIAS, TEST_LABEL2, CKMC_AR_READ_REMOVE);
+    allow_access(TEST_ALIAS, TEST_LABEL2, CKMC_PERMISSION_READ | CKMC_PERMISSION_REMOVE);
     {
         ScopedLabel sl(TEST_LABEL2);
 
-        check_remove_allowed(TEST_ALIAS);
+        check_remove_allowed(aliasWithLabel(top_label.get(), TEST_ALIAS).c_str());
     }
 }
 
-// tries to access other application data after allow funciton was called twice with different
+// tries to access other application data after allow function was called twice with different
 // rights
 RUNNER_TEST(T3026_manager_double_allow)
 {
+    CharPtr top_label = get_label();
     ScopedSaveData ssd(TEST_ALIAS);
 
     // access should be overwritten
-    allow_access(TEST_ALIAS, TEST_LABEL2, CKMC_AR_READ_REMOVE);
-    allow_access(TEST_ALIAS, TEST_LABEL2, CKMC_AR_READ);
+    allow_access(TEST_ALIAS, TEST_LABEL2, CKMC_PERMISSION_READ | CKMC_PERMISSION_REMOVE);
+    allow_access(TEST_ALIAS, TEST_LABEL2, CKMC_PERMISSION_READ);
     {
         ScopedLabel sl(TEST_LABEL2);
 
-        check_remove_denied(TEST_ALIAS);
-
-        check_read_allowed(TEST_ALIAS);
+        std::string TEST_ALIAS_adr = aliasWithLabel(top_label.get(), TEST_ALIAS);
+        check_remove_denied(TEST_ALIAS_adr.c_str());
+        check_read_allowed(TEST_ALIAS_adr.c_str());
     }
 }
 
 // tries to access application data with permission and after permission has been revoked
 RUNNER_TEST(T3027_manager_allow_deny)
 {
+    CharPtr top_label = get_label();
     ScopedSaveData ssd(TEST_ALIAS);
 
-    allow_access(TEST_ALIAS, TEST_LABEL2, CKMC_AR_READ);
+    std::string TEST_ALIAS_adr = aliasWithLabel(top_label.get(), TEST_ALIAS);
+
+    allow_access(TEST_ALIAS, TEST_LABEL2, CKMC_PERMISSION_READ);
     {
         ScopedLabel sl(TEST_LABEL2);
 
-        check_remove_denied(TEST_ALIAS);
-
-        check_read_allowed(TEST_ALIAS);
+        check_remove_denied(TEST_ALIAS_adr.c_str());
+        check_read_allowed(TEST_ALIAS_adr.c_str());
     }
 
     deny_access(TEST_ALIAS, TEST_LABEL2);
     {
         ScopedLabel sl(TEST_LABEL2);
 
-        check_remove_denied(TEST_ALIAS);
+        check_remove_not_visible(TEST_ALIAS_adr.c_str());
+        check_read_not_visible(TEST_ALIAS_adr.c_str());
+    }
+}
+
+RUNNER_TEST(T3028_manager_access_by_label)
+{
+    CharPtr top_label = get_label();
+    const char *additional_data = "label-2-data";
+    ScopedSaveData ssd(TEST_ALIAS);
+
+    allow_access(TEST_ALIAS, TEST_LABEL2, CKMC_PERMISSION_READ);
+    {
+        ScopedLabel sl(TEST_LABEL2);
+        ScopedSaveData ssd(TEST_ALIAS, additional_data);
+        allow_access(TEST_ALIAS, top_label.get(), CKMC_PERMISSION_READ);
+
+        // test if accessing valid alias (of label2 domain)
+        check_read_allowed(TEST_ALIAS, additional_data);
 
-        check_read_denied(TEST_ALIAS);
+        // this has to be done here - in the scope, otherwise
+        // scope destructor will remove the TEST_LABEL2::TEST_ALIAS
+        {
+            ScopedLabel sl(top_label.get());
+
+            // test if can access label2 alias from label1 domain - should succeed
+            check_read_allowed(aliasWithLabel(TEST_LABEL2, TEST_ALIAS).c_str(), additional_data);
+        }
     }
+
+    // test if accessing valid alias (of label1 domain)
+    check_read_allowed(TEST_ALIAS);
+
+    // access should not be possible - already left the LABEL2 scope, object should be removed
+    check_read_not_visible(aliasWithLabel(TEST_LABEL2, TEST_ALIAS).c_str());
 }
 
+// tries to modify another label's permission
+RUNNER_TEST(T3029_manager_access_modification_by_foreign_label)
+{
+    ScopedLabel sl(TEST_LABEL);
+    ScopedSaveData ssd(TEST_ALIAS);
+    allow_access(TEST_ALIAS, TEST_LABEL3, CKMC_PERMISSION_READ | CKMC_PERMISSION_REMOVE);
+    {
+        ScopedLabel sl(TEST_LABEL2);
+
+        allow_access_negative(aliasWithLabel(TEST_LABEL, TEST_ALIAS).c_str(), TEST_LABEL4, CKMC_PERMISSION_READ | CKMC_PERMISSION_REMOVE, CKMC_ERROR_PERMISSION_DENIED);
+        deny_access_negative (aliasWithLabel(TEST_LABEL, TEST_ALIAS).c_str(), TEST_LABEL4, CKMC_ERROR_PERMISSION_DENIED);
+    }
+}
 
 // checks if only aliases readable by given app are returned
 RUNNER_TEST(T3030_manager_get_all_aliases)
@@ -367,7 +519,7 @@ RUNNER_TEST(T3030_manager_get_all_aliases)
 
     int count = count_aliases();
 
-    allow_access(TEST_ALIAS, TEST_LABEL2, CKMC_AR_READ);
+    allow_access(TEST_ALIAS, TEST_LABEL2, CKMC_PERMISSION_READ);
     {
         ScopedLabel sl(TEST_LABEL2);
 
@@ -389,6 +541,28 @@ RUNNER_TEST(T3030_manager_get_all_aliases)
     }
 }
 
+RUNNER_TEST(T3031_manager_test_decrypt_from_another_label)
+{
+    int temp;
+    CharPtr top_label = get_label();
+    ScopedSaveData ssd(TEST_ALIAS);
+
+    allow_access(TEST_ALIAS, TEST_LABEL2, CKMC_PERMISSION_READ);
+    {
+        ScopedLabel sl(TEST_LABEL2);
+
+        check_read_allowed(aliasWithLabel(top_label.get(), TEST_ALIAS).c_str());
+
+        // remove the DKEK key - so that on read it must be added again
+        RUNNER_ASSERT_MSG(CKMC_ERROR_NONE == (temp = ckmc_lock_user_key(0)),
+                             "Error=" << temp);
+
+        // on this read, DKEK key will be added again
+        check_read_allowed(aliasWithLabel(top_label.get(), TEST_ALIAS).c_str());
+    }
+}
+
+
 /////////////////////////////////////////////////////////////////////////////
 // Control
 
@@ -396,29 +570,35 @@ RUNNER_TEST(T3030_manager_get_all_aliases)
 RUNNER_TEST(T3101_control_allow_access_invalid)
 {
     int ret;
-    ret = ckmc_allow_access_by_adm(USER_ROOT, NULL, "alias", "accessor", CKMC_AR_READ);
-    RUNNER_ASSERT_BT(CKMC_ERROR_INVALID_PARAMETER == ret);
-    ret = ckmc_allow_access_by_adm(USER_ROOT, "owner", NULL, "accessor", CKMC_AR_READ);
-    RUNNER_ASSERT_BT(CKMC_ERROR_INVALID_PARAMETER == ret);
-    ret = ckmc_allow_access_by_adm(USER_ROOT, "owner", "alias", NULL, CKMC_AR_READ);
-    RUNNER_ASSERT_BT(CKMC_ERROR_INVALID_PARAMETER == ret);
+    ret = ckmc_set_permission_by_adm(USER_ROOT, "alias", "accessor", CKMC_PERMISSION_READ);
+    RUNNER_ASSERT(CKMC_ERROR_INVALID_PARAMETER == ret);
+    ret = ckmc_set_permission_by_adm(USER_ROOT, "owner alias", NULL, CKMC_PERMISSION_READ);
+    RUNNER_ASSERT(CKMC_ERROR_INVALID_PARAMETER == ret);
+
+    // double owner
+    std::string aliasLabel = aliasWithLabel(get_label().get(), TEST_ALIAS);
+    ret = ckmc_set_permission_by_adm(USER_ROOT, aliasWithLabel("another-owner", aliasLabel.c_str()).c_str(), TEST_LABEL, CKMC_PERMISSION_READ);
+    RUNNER_ASSERT(CKMC_ERROR_INVALID_PARAMETER == ret);
 }
 
 // invalid argument check
 RUNNER_TEST(T3102_control_deny_access_invalid)
 {
-    RUNNER_ASSERT_BT(CKMC_ERROR_INVALID_PARAMETER ==
-            ckmc_deny_access_by_adm(USER_ROOT, NULL, "alias", "accessor"));
-    RUNNER_ASSERT_BT(CKMC_ERROR_INVALID_PARAMETER ==
-            ckmc_deny_access_by_adm(USER_ROOT, "owner", NULL, "accessor"));
-    RUNNER_ASSERT_BT(CKMC_ERROR_INVALID_PARAMETER ==
-            ckmc_deny_access_by_adm(USER_ROOT, "owner", "alias", NULL));
+    RUNNER_ASSERT(CKMC_ERROR_INVALID_PARAMETER ==
+            ckmc_set_permission_by_adm(USER_ROOT, aliasWithLabel(NULL, "alias").c_str(), "accessor", CKMC_PERMISSION_NONE));
+    RUNNER_ASSERT(CKMC_ERROR_INVALID_PARAMETER ==
+            ckmc_set_permission_by_adm(USER_ROOT, aliasWithLabel("owner", "alias").c_str(), NULL, CKMC_PERMISSION_NONE));
+
+    // double owner
+    std::string aliasLabel = aliasWithLabel(get_label().get(), TEST_ALIAS);
+    RUNNER_ASSERT(CKMC_ERROR_INVALID_PARAMETER ==
+            ckmc_set_permission_by_adm(USER_ROOT, aliasWithLabel("another-owner", aliasLabel.c_str()).c_str(), TEST_LABEL, CKMC_PERMISSION_NONE));
 }
 
 // tries to allow access for non existing alias
 RUNNER_TEST(T3103_control_allow_access_non_existing)
 {
-    int ret = ckmc_allow_access_by_adm(USER_ROOT, NO_OWNER, NO_ALIAS, "label", CKMC_AR_READ);
+    int ret = ckmc_set_permission_by_adm(USER_ROOT, aliasWithLabel(NO_OWNER, NO_ALIAS).c_str(), "label", CKMC_PERMISSION_READ);
     RUNNER_ASSERT_MSG(CKMC_ERROR_DB_ALIAS_UNKNOWN == ret,
                          "Allowing access for non existing alias returned " << ret);
 }
@@ -426,7 +606,7 @@ RUNNER_TEST(T3103_control_allow_access_non_existing)
 // tries to deny access for non existing alias
 RUNNER_TEST(T3104_control_deny_access_non_existing)
 {
-    int ret = ckmc_deny_access_by_adm(USER_ROOT, NO_OWNER, NO_ALIAS, "label");
+    int ret = ckmc_set_permission_by_adm(USER_ROOT, aliasWithLabel(NO_OWNER, NO_ALIAS).c_str(), "label", CKMC_PERMISSION_NONE);
     RUNNER_ASSERT_MSG(CKMC_ERROR_DB_ALIAS_UNKNOWN == ret,
                          "Denying access for non existing alias returned " << ret);
 }
@@ -439,7 +619,7 @@ RUNNER_TEST(T3105_control_deny_access_non_existing_access)
     CharPtr label = get_label();
 
     // deny non existing access to existing alias
-    int ret = ckmc_deny_access_by_adm(USER_ROOT, label.get(), TEST_ALIAS, "label");
+    int ret = ckmc_set_permission_by_adm(USER_ROOT, aliasWithLabel(get_label().get(), TEST_ALIAS).c_str(), "label", CKMC_PERMISSION_NONE);
     RUNNER_ASSERT_MSG(CKMC_ERROR_INVALID_PARAMETER == ret,
                          "Denying non existing access returned: " << ret);
 }
@@ -450,7 +630,7 @@ RUNNER_TEST(T3106_control_allow_access_to_myself)
     ScopedSaveData ssd(TEST_ALIAS);
 
     CharPtr label = get_label();
-    int ret = ckmc_allow_access(TEST_ALIAS, label.get(), CKMC_AR_READ);
+    int ret = ckmc_set_permission(TEST_ALIAS, label.get(), CKMC_PERMISSION_READ);
     RUNNER_ASSERT_MSG(CKMC_ERROR_INVALID_PARAMETER == ret,
                          "Trying to allow myself returned: " << ret);
 }
@@ -458,8 +638,8 @@ RUNNER_TEST(T3106_control_allow_access_to_myself)
 // tries to use admin API as a user
 RUNNER_CHILD_TEST(T3110_control_allow_access_as_user)
 {
-    switch_to_app(TEST_LABEL);
-    int ret = ckmc_allow_access_by_adm(USER_ROOT, "owner", "alias", "accessor", CKMC_AR_READ);
+    switch_to_storage_user(TEST_LABEL);
+    int ret = ckmc_set_permission_by_adm(USER_ROOT, aliasWithLabel("owner", "alias").c_str(), "accessor", CKMC_PERMISSION_READ);
     RUNNER_ASSERT_MSG(CKMC_ERROR_PERMISSION_DENIED == ret,
                          "Ordinary user should not be able to use control API. Error " << ret);
 }
@@ -467,8 +647,8 @@ RUNNER_CHILD_TEST(T3110_control_allow_access_as_user)
 // tries to use admin API as a user
 RUNNER_CHILD_TEST(T3111_control_allow_access_as_user)
 {
-    switch_to_app(TEST_LABEL);
-    int ret = ckmc_deny_access_by_adm(USER_ROOT, "owner", "alias", "accessor");
+    switch_to_storage_user(TEST_LABEL);
+    int ret = ckmc_set_permission_by_adm(USER_ROOT, aliasWithLabel("owner", "alias").c_str(), "accessor", CKMC_PERMISSION_NONE);
     RUNNER_ASSERT_MSG(CKMC_ERROR_PERMISSION_DENIED == ret,
                          "Ordinary user should not be able to use control API. Error " << ret);
 }
@@ -476,52 +656,56 @@ RUNNER_CHILD_TEST(T3111_control_allow_access_as_user)
 // tries to read other application data with permission
 RUNNER_TEST(T3121_control_access_allowed)
 {
+    CharPtr top_label = get_label();
     ScopedSaveData ssd(TEST_ALIAS);
 
-    allow_access_by_adm(TEST_ALIAS, TEST_LABEL2, CKMC_AR_READ);
+    allow_access_by_adm(TEST_ALIAS, TEST_LABEL2, CKMC_PERMISSION_READ);
     {
         ScopedLabel sl(TEST_LABEL2);
 
-        check_read_allowed(TEST_ALIAS);
+        check_read_allowed(aliasWithLabel(top_label.get(), TEST_ALIAS).c_str());
     }
 }
 
 // tries to read other application data with permission to read/remove
 RUNNER_TEST(T3122_control_access_allowed_with_remove)
 {
+    CharPtr top_label = get_label();
     ScopedSaveData ssd(TEST_ALIAS);
 
-    allow_access_by_adm(TEST_ALIAS, TEST_LABEL2, CKMC_AR_READ_REMOVE);
+    allow_access_by_adm(TEST_ALIAS, TEST_LABEL2, CKMC_PERMISSION_READ | CKMC_PERMISSION_REMOVE);
     {
         ScopedLabel sl(TEST_LABEL2);
 
-        check_read_allowed(TEST_ALIAS);
+        check_read_allowed(aliasWithLabel(top_label.get(), TEST_ALIAS).c_str());
     }
 }
 
 // tries to remove other application data with permission to read
 RUNNER_TEST(T3122_control_access_allowed_remove_denied)
 {
+    CharPtr top_label = get_label();
     ScopedSaveData ssd(TEST_ALIAS);
 
-    allow_access_by_adm(TEST_ALIAS, TEST_LABEL2, CKMC_AR_READ);
+    allow_access_by_adm(TEST_ALIAS, TEST_LABEL2, CKMC_PERMISSION_READ);
     {
         ScopedLabel sl(TEST_LABEL2);
 
-        check_remove_denied(TEST_ALIAS);
+        check_remove_denied(aliasWithLabel(top_label.get(), TEST_ALIAS).c_str());
     }
 }
 
 // tries to remove other application data with permission
 RUNNER_TEST(T3125_control_remove_allowed)
 {
+    CharPtr top_label = get_label();
     ScopedSaveData ssd(TEST_ALIAS);
 
-    allow_access_by_adm(TEST_ALIAS, TEST_LABEL2, CKMC_AR_READ_REMOVE);
+    allow_access_by_adm(TEST_ALIAS, TEST_LABEL2, CKMC_PERMISSION_READ | CKMC_PERMISSION_REMOVE);
     {
         ScopedLabel sl(TEST_LABEL2);
 
-        check_remove_allowed(TEST_ALIAS);
+        check_remove_allowed(aliasWithLabel(top_label.get(), TEST_ALIAS).c_str());
     }
 }
 
@@ -529,41 +713,43 @@ RUNNER_TEST(T3125_control_remove_allowed)
 // rights
 RUNNER_TEST(T3126_control_double_allow)
 {
+    CharPtr top_label = get_label();
     ScopedSaveData ssd(TEST_ALIAS);
 
     // access should be overwritten
-    allow_access_by_adm(TEST_ALIAS, TEST_LABEL2, CKMC_AR_READ_REMOVE);
-    allow_access_by_adm(TEST_ALIAS, TEST_LABEL2, CKMC_AR_READ);
+    allow_access_by_adm(TEST_ALIAS, TEST_LABEL2, CKMC_PERMISSION_READ | CKMC_PERMISSION_REMOVE);
+    allow_access_by_adm(TEST_ALIAS, TEST_LABEL2, CKMC_PERMISSION_READ);
     {
         ScopedLabel sl(TEST_LABEL2);
 
-        check_remove_denied(TEST_ALIAS);
-
-        check_read_allowed(TEST_ALIAS);
+        std::string TEST_ALIAS_adr = aliasWithLabel(top_label.get(), TEST_ALIAS);
+        check_remove_denied(TEST_ALIAS_adr.c_str());
+        check_read_allowed(TEST_ALIAS_adr.c_str());
     }
 }
 
 // tries to access other application data with permission and after permission has been revoked
 RUNNER_TEST(T3127_control_allow_deny)
 {
+    CharPtr top_label = get_label();
     ScopedSaveData ssd(TEST_ALIAS);
 
-    allow_access_by_adm(TEST_ALIAS, TEST_LABEL2, CKMC_AR_READ);
+    std::string TEST_ALIAS_adr = aliasWithLabel(top_label.get(), TEST_ALIAS);
+
+    allow_access_by_adm(TEST_ALIAS, TEST_LABEL2, CKMC_PERMISSION_READ);
     {
         ScopedLabel sl(TEST_LABEL2);
 
-        check_remove_denied(TEST_ALIAS);
-
-        check_read_allowed(TEST_ALIAS);
+        check_remove_denied(TEST_ALIAS_adr.c_str());
+        check_read_allowed(TEST_ALIAS_adr.c_str());
     }
     CharPtr label = get_label();
     deny_access_by_adm(TEST_ALIAS, TEST_LABEL2);
     {
         ScopedLabel sl(TEST_LABEL2);
 
-        check_remove_denied(TEST_ALIAS);
-
-        check_read_denied(TEST_ALIAS);
+        check_remove_not_visible(TEST_ALIAS_adr.c_str());
+        check_read_not_visible(TEST_ALIAS_adr.c_str());
     }
 }
 
@@ -575,7 +761,7 @@ RUNNER_TEST(T3130_control_get_all_aliases)
 
     int count = count_aliases();
 
-    allow_access_by_adm(TEST_ALIAS, TEST_LABEL2, CKMC_AR_READ);
+    allow_access_by_adm(TEST_ALIAS, TEST_LABEL2, CKMC_PERMISSION_READ);
     {
         ScopedLabel sl(TEST_LABEL2);
 
@@ -602,9 +788,8 @@ RUNNER_TEST(T3140_control_allow_invalid_user)
 {
     ScopedSaveData ssd(TEST_ALIAS);
 
-    CharPtr label = get_label();
-    int ret = ckmc_allow_access_by_adm(
-            APP_UID, label.get(), TEST_ALIAS, TEST_LABEL2, CKMC_AR_READ_REMOVE);
+    int ret = ckmc_set_permission_by_adm(
+            APP_UID, aliasWithLabel(get_label().get(), TEST_ALIAS).c_str(), TEST_LABEL2, CKMC_PERMISSION_READ | CKMC_PERMISSION_REMOVE);
     RUNNER_ASSERT_MSG(CKMC_ERROR_DB_ALIAS_UNKNOWN == ret,
                          "Trying to allow access to invalid user returned: " << ret);
 }
@@ -614,8 +799,7 @@ RUNNER_TEST(T3141_control_deny_invalid_user)
 {
     ScopedSaveData ssd(TEST_ALIAS);
 
-    CharPtr label = get_label();
-    int ret = ckmc_deny_access_by_adm(APP_UID, label.get(), TEST_ALIAS, TEST_LABEL2);
+    int ret = ckmc_set_permission_by_adm(APP_UID, aliasWithLabel(get_label().get(), TEST_ALIAS).c_str(), TEST_LABEL2, CKMC_PERMISSION_NONE);
     RUNNER_ASSERT_MSG(CKMC_ERROR_DB_ALIAS_UNKNOWN == ret,
                          "Trying to deny access to invalid user returned: " << ret);
 }