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 }