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 <gtest/gtest.h>
17 #include <gtest/hwext/gtest-multithread.h>
18 #include <vector>
19 #include <unistd.h>
20 #include <securec.h>
21
22 #include "v1_1/ihuks.h"
23 #include "v1_1/ihuks_types.h"
24 #include "huks_sa_type.h"
25 #include "huks_hdi_test_util.h"
26
27 using namespace testing;
28 using namespace testing::ext;
29 using namespace testing::mt;
30 namespace Unittest::HuksHdiTest {
31 static struct IHuks *g_huksHdiProxy = nullptr;
32
33 const static uint8_t g_importKeyAlias[] = {
34 0x74, 0x65, 0x73, 0x74, 0x5F, 0x69, 0x6D, 0x70, 0x6F, 0x72, 0x74, 0x5F, 0x6B, 0x65, 0x79, 0x00
35 };
36
37 static uint8_t g_importParamSet[] = {
38 0x8C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
39 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
40 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
41 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
42 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
43 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x27, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00,
44 0x04, 0x00, 0x00, 0x00, 0x38, 0x3E, 0x86, 0xF7, 0x2E, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
45 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x75, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
46 0xFB, 0x60, 0x01, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
47 };
48
49 const static uint8_t g_importKey[] = {
50 0x17, 0xD6, 0x23, 0xCB, 0xA7, 0x05, 0x60, 0x22, 0xC1, 0x35, 0xCD, 0x3F, 0x30, 0x2D, 0xF6, 0x31,
51 };
52
53 const static uint8_t g_importOutKey[] = {
54 0x1C, 0x01, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
55 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
56 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
57 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
58 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
59 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x27, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00,
60 0x04, 0x00, 0x00, 0x00, 0x08, 0xA1, 0x88, 0xF7, 0x2E, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
61 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x75, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
62 0xFB, 0x60, 0x01, 0x30, 0x00, 0x00, 0x00, 0x00, 0x17, 0x27, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
63 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x27, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
64 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x27, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
65 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0x03, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
66 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x27, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00,
67 0x40, 0x00, 0x00, 0x00, 0x0C, 0xA1, 0x88, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x58, 0x14, 0xBA, 0x89,
68 0x77, 0xBB, 0x5B, 0x03, 0x70, 0x70, 0x7A, 0x17, 0x88, 0x5F, 0x69, 0xBF, 0x6A, 0xCD, 0x50, 0xCC,
69 0xE0, 0xA2, 0x8F, 0x7C, 0x0F, 0x80, 0x74, 0x8F, 0x30, 0xA5, 0x1B, 0x9C, 0x74, 0x7F, 0x87, 0x5F,
70 0x8F, 0x07, 0x5B, 0xEF, 0x83, 0x3A, 0x40, 0x21, 0x10, 0x00, 0x00, 0x00, 0x6D, 0xE9, 0x0C, 0x45,
71 0x1A, 0x10, 0xA5, 0x63, 0xF2, 0xEA, 0x05, 0x98, 0x70, 0x86, 0x4A, 0xD5,
72 };
73
74 const static uint8_t g_generateKeyAlias[] = {
75 0x48, 0x6B, 0x73, 0x41, 0x45, 0x53, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x4B, 0x65, 0x79, 0x41,
76 0x6C, 0x69, 0x61, 0x73, 0x54, 0x65, 0x73, 0x74, 0x30, 0x30, 0x31,
77 };
78
79 static uint8_t g_generateParamSet[] = {
80 0x8C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
81 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
82 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
83 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
84 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
85 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x27, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00,
86 0x04, 0x00, 0x00, 0x00, 0x28, 0x3E, 0x86, 0xF7, 0x2E, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
87 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x75, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
88 0xFB, 0x60, 0x01, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
89 };
90
91 const static uint8_t g_generateOutKey[] = {
92 0x1C, 0x01, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
93 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
94 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
95 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
96 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
97 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x27, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00,
98 0x04, 0x00, 0x00, 0x00, 0xE8, 0xA0, 0x88, 0xF7, 0x2E, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
99 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x75, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
100 0xFB, 0x60, 0x01, 0x30, 0x00, 0x00, 0x00, 0x00, 0x17, 0x27, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
101 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x27, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
102 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x27, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
103 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0x03, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
104 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x27, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00,
105 0x40, 0x00, 0x00, 0x00, 0xEC, 0xA0, 0x88, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x07, 0xB4, 0x87,
106 0xF1, 0x94, 0x9A, 0x2A, 0x8A, 0xD4, 0xFE, 0x57, 0xF0, 0x5E, 0xE6, 0x96, 0x50, 0x7C, 0x20, 0x7E,
107 0xC2, 0x5D, 0x42, 0x6E, 0x68, 0x2C, 0x9D, 0xC5, 0x79, 0x0E, 0x16, 0x72, 0x45, 0x2F, 0x1A, 0xA8,
108 0x2D, 0x18, 0x25, 0x9C, 0x86, 0xA3, 0x4C, 0x57, 0x10, 0x00, 0x00, 0x00, 0xE7, 0xF8, 0x6F, 0x32,
109 0x11, 0xEC, 0xF8, 0x66, 0x05, 0xD0, 0x1F, 0x38, 0xAD, 0xE1, 0xF3, 0x04,
110 };
111
112 static uint8_t g_initParamSet[] = {
113 0xBC, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
114 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
115 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
116 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
117 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
118 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
119 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00,
120 0x10, 0x00, 0x00, 0x00, 0x58, 0x3E, 0x86, 0xF7, 0x11, 0x27, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00,
121 0x04, 0x00, 0x00, 0x00, 0x68, 0x3E, 0x86, 0xF7, 0x2E, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
122 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x75, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
123 0xFB, 0x60, 0x01, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
124 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
125 };
126
127 const static uint8_t g_initKey[] = {
128 0x1C, 0x01, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
129 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
130 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
131 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
132 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
133 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x27, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00,
134 0x04, 0x00, 0x00, 0x00, 0xE8, 0xA0, 0x88, 0xF7, 0x2E, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
135 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x75, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
136 0xFB, 0x60, 0x01, 0x30, 0x00, 0x00, 0x00, 0x00, 0x17, 0x27, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
137 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x27, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
138 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x27, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
139 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0x03, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
140 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x27, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00,
141 0x40, 0x00, 0x00, 0x00, 0xEC, 0xA0, 0x88, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x07, 0xB4, 0x87,
142 0xF1, 0x94, 0x9A, 0x2A, 0x8A, 0xD4, 0xFE, 0x57, 0xF0, 0x5E, 0xE6, 0x96, 0x50, 0x7C, 0x20, 0x7E,
143 0xC2, 0x5D, 0x42, 0x6E, 0x68, 0x2C, 0x9D, 0xC5, 0x79, 0x0E, 0x16, 0x72, 0x45, 0x2F, 0x1A, 0xA8,
144 0x2D, 0x18, 0x25, 0x9C, 0x86, 0xA3, 0x4C, 0x57, 0x10, 0x00, 0x00, 0x00, 0xE7, 0xF8, 0x6F, 0x32,
145 0x11, 0xEC, 0xF8, 0x66, 0x05, 0xD0, 0x1F, 0x38, 0xAD, 0xE1, 0xF3, 0x04,
146 };
147
148 class HuksHdiApiTest : public testing::Test {
149 public:
150 static void SetUpTestCase(void);
151
152 static void TearDownTestCase(void);
153
154 void SetUp();
155
156 void TearDown();
157 };
158
SetUpTestCase(void)159 void HuksHdiApiTest::SetUpTestCase(void)
160 {
161 g_huksHdiProxy = IHuksGetInstance("hdi_service", true);
162 int32_t ret = g_huksHdiProxy->ModuleInit(g_huksHdiProxy);
163 HUKS_TEST_LOG_I("ModuleInit = %d", ret);
164 }
165
TearDownTestCase(void)166 void HuksHdiApiTest::TearDownTestCase(void)
167 {
168 if (g_huksHdiProxy != nullptr) {
169 IHuksReleaseInstance("hdi_service", g_huksHdiProxy, true);
170 g_huksHdiProxy = nullptr;
171 }
172 }
173
SetUp()174 void HuksHdiApiTest::SetUp()
175 {
176 }
177
TearDown()178 void HuksHdiApiTest::TearDown()
179 {
180 }
181
182 #define HKS_TAG_TYPE_MASK (0xF << 28)
183 #define HKS_TAG_TYPE_BYTES (5 << 28)
184
GetTagType(uint32_t tag)185 static uint32_t GetTagType(uint32_t tag)
186 {
187 return (tag & (uint32_t)HKS_TAG_TYPE_MASK);
188 }
189
IsAdditionOverflow(uint32_t a,uint32_t b)190 static inline bool IsAdditionOverflow(uint32_t a, uint32_t b)
191 {
192 return (UINT32_MAX - a) < b;
193 }
194
HuksFreshParamSet(struct HksParamSet * paramSet,bool isCopy)195 static int32_t HuksFreshParamSet(struct HksParamSet *paramSet, bool isCopy)
196 {
197 uint32_t size = paramSet->paramSetSize;
198 uint32_t offset = sizeof(struct HksParamSet) + sizeof(struct HksParam) * paramSet->paramsCnt;
199
200 for (uint32_t i = 0; i < paramSet->paramsCnt; i++) {
201 if (offset > size) {
202 return HUKS_FAILURE;
203 }
204 if (GetTagType(paramSet->params[i].tag) == HKS_TAG_TYPE_BYTES) {
205 if (IsAdditionOverflow(offset, paramSet->params[i].blob.size)) {
206 return HUKS_FAILURE;
207 }
208
209 if (isCopy && (memcpy_s((uint8_t *)paramSet + offset, size - offset,
210 paramSet->params[i].blob.data, paramSet->params[i].blob.size) != EOK)) {
211 return HUKS_FAILURE;
212 }
213 paramSet->params[i].blob.data = (uint8_t *)paramSet + offset;
214 offset += paramSet->params[i].blob.size;
215 }
216 }
217
218 if (paramSet->paramSetSize != offset) {
219 return HUKS_FAILURE;
220 }
221 return HUKS_SUCCESS;
222 }
223
224 /**
225 * @tc.name: HuksHdiApiTest.HdiFuncPointerTest001
226 * @tc.desc: Test hdi func pointer whether nullptr;
227 * @tc.require:issueI77AT9
228 * @tc.type: FUNC
229 */
230 HWTEST_F(HuksHdiApiTest, HdiFuncPointerTest001, TestSize.Level0)
231 {
232 ASSERT_NE(g_huksHdiProxy, nullptr);
233 ASSERT_NE(g_huksHdiProxy->ModuleInit, nullptr);
234 ASSERT_NE(g_huksHdiProxy->ModuleDestroy, nullptr);
235 ASSERT_NE(g_huksHdiProxy->GenerateKey, nullptr);
236 ASSERT_NE(g_huksHdiProxy->ImportKey, nullptr);
237 ASSERT_NE(g_huksHdiProxy->ImportWrappedKey, nullptr);
238 ASSERT_NE(g_huksHdiProxy->ExportPublicKey, nullptr);
239 ASSERT_NE(g_huksHdiProxy->Init, nullptr);
240 ASSERT_NE(g_huksHdiProxy->Update, nullptr);
241 ASSERT_NE(g_huksHdiProxy->Finish, nullptr);
242 ASSERT_NE(g_huksHdiProxy->Abort, nullptr);
243 ASSERT_NE(g_huksHdiProxy->CheckKeyValidity, nullptr);
244 ASSERT_NE(g_huksHdiProxy->AttestKey, nullptr);
245 ASSERT_NE(g_huksHdiProxy->GenerateRandom, nullptr);
246 ASSERT_NE(g_huksHdiProxy->Sign, nullptr);
247 ASSERT_NE(g_huksHdiProxy->Verify, nullptr);
248 ASSERT_NE(g_huksHdiProxy->Encrypt, nullptr);
249 ASSERT_NE(g_huksHdiProxy->Decrypt, nullptr);
250 ASSERT_NE(g_huksHdiProxy->AgreeKey, nullptr);
251 ASSERT_NE(g_huksHdiProxy->DeriveKey, nullptr);
252 ASSERT_NE(g_huksHdiProxy->Mac, nullptr);
253 ASSERT_NE(g_huksHdiProxy->UpgradeKey, nullptr);
254 ASSERT_NE(g_huksHdiProxy->GetVersion, nullptr);
255 }
256
257 /**
258 * @tc.name: HuksHdiApiTest.ApiPassthroughTest001
259 * @tc.desc: Test Generate key with current software huks driver;
260 * @tc.require:issueI77AT9
261 * @tc.type: FUNC
262 */
263 HWTEST_F(HuksHdiApiTest, ApiPassthroughTest001, TestSize.Level0)
264 {
265 ASSERT_NE(g_huksHdiProxy, nullptr);
266 ASSERT_NE(g_huksHdiProxy->GenerateKey, nullptr);
267 struct HuksBlob keyAlias = {
268 .data = (uint8_t *)g_generateKeyAlias,
269 .dataLen = sizeof(g_generateKeyAlias)
270 };
271 uint8_t keyBuff[1] = {0};
272 struct HuksBlob key = {
273 .data = keyBuff,
274 .dataLen = sizeof(keyBuff)
275 };
276 int ret = HuksFreshParamSet((struct HksParamSet *)g_generateParamSet, false);
277 ASSERT_EQ(ret, HUKS_SUCCESS);
278 struct HuksParamSet paramSet = {
279 .data = (uint8_t *)g_generateParamSet,
280 .dataLen = sizeof(g_generateParamSet)
281 };
282 uint8_t outKeyBuffer[512];
283 struct HuksBlob outKey = {
284 .data = outKeyBuffer,
285 .dataLen = sizeof(outKeyBuffer)
286 };
287 ret = g_huksHdiProxy->GenerateKey(g_huksHdiProxy, &keyAlias, ¶mSet, &key, &outKey);
288 ASSERT_EQ(ret, HUKS_SUCCESS);
289 ASSERT_EQ(outKey.dataLen, sizeof(g_generateOutKey));
290 }
291
292 /**
293 * @tc.name: HuksHdiApiTest.ApiPassthroughTest002
294 * @tc.desc: Test Import key with current software huks driver(hardcoded root key);
295 * @tc.require:issueI77AT9
296 * @tc.type: FUNC
297 */
298 HWTEST_F(HuksHdiApiTest, ApiPassthroughTest002, TestSize.Level0)
299 {
300 ASSERT_NE(g_huksHdiProxy, nullptr);
301 ASSERT_NE(g_huksHdiProxy->ImportKey, nullptr);
302 struct HuksBlob keyAlias = {
303 .data = (uint8_t *)g_importKeyAlias,
304 .dataLen = sizeof(g_importKeyAlias)
305 };
306 struct HuksBlob key = {
307 .data = (uint8_t *)g_importKey,
308 .dataLen = sizeof(g_importKey)
309 };
310
311 int ret = HuksFreshParamSet((struct HksParamSet *)g_importParamSet, false);
312 ASSERT_EQ(ret, HUKS_SUCCESS);
313 struct HuksParamSet paramSet = {
314 .data = (uint8_t *)g_importParamSet,
315 .dataLen = sizeof(g_importParamSet)
316 };
317 uint8_t outKeyBuffer[512];
318 struct HuksBlob outKey = {
319 .data = outKeyBuffer,
320 .dataLen = sizeof(outKeyBuffer)
321 };
322 ret = g_huksHdiProxy->ImportKey(g_huksHdiProxy, &keyAlias, &key, ¶mSet, &outKey);
323 ASSERT_EQ(ret, HUKS_SUCCESS);
324 ASSERT_EQ(outKey.dataLen, sizeof(g_importOutKey));
325 }
326
327 /**
328 * @tc.name: HuksHdiApiTest.ApiPassthroughTest003
329 * @tc.desc: Test init key with current software huks driver(hardcoded root key);
330 * @tc.require:issueI77AT9
331 * @tc.type: FUNC
332 */
333 HWTEST_F(HuksHdiApiTest, ApiPassthroughTest003, TestSize.Level0)
334 {
335 ASSERT_NE(g_huksHdiProxy, nullptr);
336 ASSERT_NE(g_huksHdiProxy->Init, nullptr);
337 struct HuksBlob key = {
338 .data = (uint8_t *)g_initKey,
339 .dataLen = sizeof(g_initKey)
340 };
341 int ret = HuksFreshParamSet((struct HksParamSet *)g_initParamSet, false);
342 ASSERT_EQ(ret, HUKS_SUCCESS);
343 struct HuksParamSet paramSet = {
344 .data = (uint8_t *)g_initParamSet,
345 .dataLen = sizeof(g_initParamSet)
346 };
347 uint8_t outHandleBuffer[12];
348 struct HuksBlob outHandle = {
349 .data = outHandleBuffer,
350 .dataLen = sizeof(outHandleBuffer)
351 };
352 uint8_t outHandleToken[32];
353 struct HuksBlob outToken = {
354 .data = outHandleToken,
355 .dataLen = sizeof(outHandleToken)
356 };
357 ret = g_huksHdiProxy->Init(g_huksHdiProxy, &key, ¶mSet, &outHandle, &outToken);
358 ASSERT_EQ(ret, HUKS_SUCCESS);
359 ASSERT_EQ(outHandle.dataLen, 8);
360 }
361
362 /**
363 * @tc.name: HuksHdiApiTest.MultiThreadTest001
364 * @tc.desc: Test init key with current software huks driver(hardcoded root key) in multi thread scenario;
365 * @tc.require:issueI77AT9
366 * @tc.type: FUNC
367 */
368 HWMTEST_F(HuksHdiApiTest, MultiThreadTest001, TestSize.Level0, 10)
369 {
370 std::thread::id thisId = std::this_thread::get_id();
371 std::ostringstream oss;
372 oss << thisId;
373 std::string thisIdString = oss.str();
374 long int thread_id = atol(thisIdString.c_str());
375 HUKS_TEST_LOG_I("running thread id:%ld start\n", thread_id);
376
377 ASSERT_NE(g_huksHdiProxy, nullptr);
378 ASSERT_NE(g_huksHdiProxy->Init, nullptr);
379 struct HuksBlob key = {
380 .data = (uint8_t *)g_initKey,
381 .dataLen = sizeof(g_initKey)
382 };
383 struct HuksParamSet paramSet = {
384 .data = (uint8_t *)g_initParamSet,
385 .dataLen = sizeof(g_initParamSet)
386 };
387 uint8_t outHandleBuffer[12];
388 struct HuksBlob outHandle = {
389 .data = outHandleBuffer,
390 .dataLen = sizeof(outHandleBuffer)
391 };
392 uint8_t outHandleToken[32];
393 struct HuksBlob outToken = {
394 .data = outHandleToken,
395 .dataLen = sizeof(outHandleToken)
396 };
397 int ret = g_huksHdiProxy->Init(g_huksHdiProxy, &key, ¶mSet, &outHandle, &outToken);
398 ASSERT_EQ(ret, HUKS_SUCCESS);
399 ASSERT_EQ(outHandle.dataLen, 8);
400 HUKS_TEST_LOG_I("running thread id:%ld end\n", thread_id);
401 }
402 }