1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
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 #include "huks_wrapper_test.h"
17 
18 #include <cstring>
19 #include <gtest/gtest.h>
20 
21 #include "nativetoken_kit.h"
22 #include "token_setproc.h"
23 
24 #include "asset_system_type.h"
25 #include "huks_wrapper.h"
26 
27 using namespace testing::ext;
28 namespace UnitTest::HuksWrapperTest {
GrantSelfPermission()29 int GrantSelfPermission()
30 {
31     const char *permissions[] = {
32         "ohos.permission.INTERACT_ACROSS_LOCAL_ACCOUNTS"
33     };
34     NativeTokenInfoParams info = {
35         .dcapsNum = 0,
36         .permsNum = 1,
37         .aclsNum = 0,
38         .dcaps = nullptr,
39         .perms = permissions,
40         .acls = nullptr,
41         .processName = "asset_bin_test",
42         .aplStr = "system_basic",
43     };
44     uint64_t tokenId = GetAccessTokenId(&info);
45     return SetSelfTokenID(tokenId);
46 }
47 
48 class HuksWrapperTest : public testing::Test {
49 public:
50     static void SetUpTestCase(void);
51 
52     static void TearDownTestCase(void);
53 
54     void SetUp(void);
55 
56     void TearDown(void);
57 };
58 
SetUpTestCase(void)59 void HuksWrapperTest::SetUpTestCase(void)
60 {
61     ASSERT_EQ(0, GrantSelfPermission());
62 }
63 
TearDownTestCase(void)64 void HuksWrapperTest::TearDownTestCase(void)
65 {
66 }
67 
SetUp(void)68 void HuksWrapperTest::SetUp(void)
69 {
70 }
71 
TearDown(void)72 void HuksWrapperTest::TearDown(void)
73 {
74 }
75 
76 /**
77  * @tc.name: HuksWrapperTest.HuksWrapperTest001
78  * @tc.desc: Test huks wrapper func, for secrect key generate/exists/delete
79  * @tc.type: FUNC
80  * @tc.result:0
81  */
82 HWTEST_F(HuksWrapperTest, HuksWrapperTest001, TestSize.Level0)
83 {
84     char tmpKeyAlias[] = "AESCipherKeyAlias001";
85     struct HksBlob keyAlias = { (uint32_t)strlen(tmpKeyAlias), (uint8_t *)tmpKeyAlias };
86     struct KeyId keyId = { 0, keyAlias, DEVICE_POWERED_ON };
87     ASSERT_EQ(SEC_ASSET_SUCCESS, GenerateKey(&keyId, true, false));
88     ASSERT_EQ(SEC_ASSET_SUCCESS, IsKeyExist(&keyId));
89     ASSERT_EQ(SEC_ASSET_SUCCESS, DeleteKey(&keyId));
90 }
91 
92 /**
93  * @tc.name: HuksWrapperTest.HuksWrapperTest002
94  * @tc.desc: Test huks wrapper func, for secrect encrypt&decrypt
95  * @tc.type: FUNC
96  * @tc.result:0
97  */
98 HWTEST_F(HuksWrapperTest, HuksWrapperTest002, TestSize.Level0)
99 {
100     char tmpKeyAlias[] = "AESCipherKeyAlias002";
101     struct HksBlob keyAlias = { (uint32_t)strlen(tmpKeyAlias), (uint8_t *)tmpKeyAlias };
102     struct KeyId keyId = { 0, keyAlias, DEVICE_POWERED_ON };
103     ASSERT_EQ(SEC_ASSET_SUCCESS, GenerateKey(&keyId, false, false));
104 
105     uint8_t msg[6] = { 1, 2, 3, 4, 5, 6 };
106     struct HksBlob inData = { 6, msg };
107     uint8_t plain[6 + TAG_SIZE + NONCE_SIZE] = { 0 };
108     struct HksBlob outData = { 6 + TAG_SIZE + NONCE_SIZE, plain };
109     uint8_t aad[8] = { 0 };
110     struct HksBlob aadData = { 8, aad };
111 
112     ASSERT_EQ(SEC_ASSET_SUCCESS, EncryptData(&keyId, &aadData, &inData, &outData));
113     ASSERT_EQ(SEC_ASSET_SUCCESS, DecryptData(&keyId, &aadData, &outData, &inData));
114     ASSERT_EQ(SEC_ASSET_SUCCESS, DeleteKey(&keyId));
115 }
116 
117 /**
118  * @tc.name: HuksWrapperTest.HuksWrapperTest003
119  * @tc.desc: Test huks wrapper func, for secrect InitKey&ExecCrypt&Drop
120  * @tc.type: FUNC
121  * @tc.result:0
122  */
123 HWTEST_F(HuksWrapperTest, HuksWrapperTest003, TestSize.Level0)
124 {
125     char tmpKeyAlias[] = "AESCipherKeyAlias003";
126     struct HksBlob keyAlias = { (uint32_t)strlen(tmpKeyAlias), (uint8_t *)tmpKeyAlias };
127     struct KeyId keyId = { 0, keyAlias, DEVICE_POWERED_ON };
128     ASSERT_EQ(SEC_ASSET_SUCCESS, GenerateKey(&keyId, true, false));
129 
130     uint8_t msg[6] = { 1, 2, 3, 4, 5, 6 };
131     struct HksBlob inData = { 6, msg };
132     uint8_t plain[6 + TAG_SIZE + NONCE_SIZE] = { 0 };
133     struct HksBlob outData = { 6 + TAG_SIZE + NONCE_SIZE, plain };
134     uint8_t aad[8] = { 0 };
135     struct HksBlob aadData = { 8, aad };
136     ASSERT_EQ(SEC_ASSET_SUCCESS, EncryptData(&keyId, &aadData, &inData, &outData));
137 
138     uint8_t challenge[32] = { 0 };
139     struct HksBlob challengeData = { 32, challenge };
140     uint8_t handle[8] = { 0 };
141     struct HksBlob handleData = { 8, handle };
142     ASSERT_EQ(SEC_ASSET_SUCCESS, InitKey(&keyId, 600, &challengeData, &handleData));
143 
144     uint8_t authToken[280] = { 0 };
145     struct HksBlob authTokenData = { 280, authToken };
146     /* auth token is not ok, result in update&finish fail */
147     ASSERT_EQ(SEC_ASSET_ACCESS_DENIED, ExecCrypt(&handleData, &aadData, &authTokenData, &outData, &inData));
148     ASSERT_EQ(SEC_ASSET_NOT_FOUND, Drop(&handleData));
149     ASSERT_EQ(SEC_ASSET_SUCCESS, DeleteKey(&keyId));
150 }
151 
152 /**
153  * @tc.name: HuksWrapperTest.HuksWrapperTest004
154  * @tc.desc: Test huks wrapper func, for secrect key generate/exists/delete cross user.
155  * @tc.type: FUNC
156  * @tc.result:0
157  */
158 HWTEST_F(HuksWrapperTest, HuksWrapperTest004, TestSize.Level0)
159 {
160     char tmpKeyAlias[] = "AESCipherKeyAlias004";
161     struct HksBlob keyAlias = { (uint32_t)strlen(tmpKeyAlias), (uint8_t *)tmpKeyAlias };
162     struct KeyId keyId = { 100, keyAlias, DEVICE_FIRST_UNLOCKED };
163     ASSERT_EQ(SEC_ASSET_SUCCESS, GenerateKey(&keyId, false, false));
164     ASSERT_EQ(SEC_ASSET_SUCCESS, IsKeyExist(&keyId));
165     ASSERT_EQ(SEC_ASSET_SUCCESS, DeleteKey(&keyId));
166 }
167 }