1 /*
2 * Copyright (c) 2022 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_agree_dh_test.h"
17
18 #include <gtest/gtest.h>
19
20 using namespace testing::ext;
21 namespace Unittest::DhAgree
22 {
23 class HuksAgreeDHTest : public testing::Test
24 {
25 public:
26 static void SetUpTestCase(void);
27
28 static void TearDownTestCase(void);
29
30 void SetUp();
31
32 void TearDown();
33 };
34
SetUpTestCase(void)35 void HuksAgreeDHTest::SetUpTestCase(void) {}
36
TearDownTestCase(void)37 void HuksAgreeDHTest::TearDownTestCase(void) {}
38
SetUp()39 void HuksAgreeDHTest::SetUp() {}
40
TearDown()41 void HuksAgreeDHTest::TearDown() {}
42
HksDhAgreeFinish(const struct OH_Huks_Blob * keyAlias,const struct OH_Huks_Blob * publicKey,const struct OH_Huks_ParamSet * initParamSet,const struct OH_Huks_ParamSet * finishParamSet,struct OH_Huks_Blob * outData)43 OH_Huks_Result HksDhAgreeFinish(const struct OH_Huks_Blob *keyAlias, const struct OH_Huks_Blob *publicKey,
44 const struct OH_Huks_ParamSet *initParamSet,
45 const struct OH_Huks_ParamSet *finishParamSet, struct OH_Huks_Blob *outData)
46 {
47 struct OH_Huks_Blob inData = {g_inData.length(), (uint8_t *)g_inData.c_str()};
48
49 uint8_t handleU[sizeof(uint64_t)] = {0};
50 struct OH_Huks_Blob handle = {sizeof(uint64_t), handleU};
51 OH_Huks_Result ret = OH_Huks_InitSession(keyAlias, initParamSet, &handle, nullptr);
52 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "Init failed.";
53 if (ret.errorCode != (int32_t)OH_HUKS_SUCCESS) {
54 return ret;
55 }
56
57 uint8_t outDataU[DH_COMMON_SIZE] = {0};
58 struct OH_Huks_Blob outDataUpdate = {DH_COMMON_SIZE, outDataU};
59 ret = OH_Huks_UpdateSession(&handle, initParamSet, publicKey, &outDataUpdate);
60 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "Update failed.";
61 if (ret.errorCode != (int32_t)OH_HUKS_SUCCESS) {
62 return ret;
63 }
64
65 ret = OH_Huks_FinishSession(&handle, finishParamSet, &inData, outData);
66 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "Finish failed.";
67 if (ret.errorCode != (int32_t)OH_HUKS_SUCCESS) {
68 return ret;
69 }
70 return ret;
71 }
72
HksDhAgreeAbort(const struct OH_Huks_Blob * keyAlias,const struct OH_Huks_Blob * publicKey,const struct OH_Huks_ParamSet * initParamSet)73 OH_Huks_Result HksDhAgreeAbort(const struct OH_Huks_Blob *keyAlias, const struct OH_Huks_Blob *publicKey,
74 const struct OH_Huks_ParamSet *initParamSet)
75 {
76 uint8_t handleU[sizeof(uint64_t)] = {0};
77 struct OH_Huks_Blob handle = {sizeof(uint64_t), handleU};
78 OH_Huks_Result ret = OH_Huks_InitSession(keyAlias, initParamSet, &handle, nullptr);
79 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "Init failed.";
80 if (ret.errorCode != (int32_t)OH_HUKS_SUCCESS) {
81 return ret;
82 }
83
84 uint8_t outDataU[DH_COMMON_SIZE] = {0};
85 struct OH_Huks_Blob outDataUpdate = {DH_COMMON_SIZE, outDataU};
86 ret = OH_Huks_UpdateSession(&handle, initParamSet, publicKey, &outDataUpdate);
87 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "Update failed.";
88 if (ret.errorCode != (int32_t)OH_HUKS_SUCCESS) {
89 return ret;
90 }
91
92 ret = OH_Huks_AbortSession(&handle, initParamSet);
93 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "Finish failed.";
94 if (ret.errorCode != (int32_t)OH_HUKS_SUCCESS) {
95 return ret;
96 }
97 return ret;
98 }
99
HksDhAgreeExport(const struct OH_Huks_Blob * keyAlias1,const struct OH_Huks_Blob * keyAlias2,struct OH_Huks_Blob * publicKey1,struct OH_Huks_Blob * publicKey2,const struct OH_Huks_ParamSet * genParamSet)100 OH_Huks_Result HksDhAgreeExport(const struct OH_Huks_Blob *keyAlias1, const struct OH_Huks_Blob *keyAlias2,
101 struct OH_Huks_Blob *publicKey1, struct OH_Huks_Blob *publicKey2,
102 const struct OH_Huks_ParamSet *genParamSet)
103 {
104 OH_Huks_Result ret = OH_Huks_ExportPublicKeyItem(keyAlias1, genParamSet, publicKey1);
105 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "ExportPublicKey01 failed.";
106 if (ret.errorCode != (int32_t)OH_HUKS_SUCCESS) {
107 return ret;
108 }
109 ret = OH_Huks_ExportPublicKeyItem(keyAlias2, genParamSet, publicKey2);
110 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "ExportPublicKey02 failed.";
111 if (ret.errorCode != (int32_t)OH_HUKS_SUCCESS) {
112 return ret;
113 }
114 return ret;
115 }
116
HksDhAgreeFreeParamSet(struct OH_Huks_ParamSet * paramSet1,struct OH_Huks_ParamSet * paramSet2,struct OH_Huks_ParamSet * paramSet3)117 void HksDhAgreeFreeParamSet(struct OH_Huks_ParamSet *paramSet1, struct OH_Huks_ParamSet *paramSet2,
118 struct OH_Huks_ParamSet *paramSet3)
119 {
120 OH_Huks_FreeParamSet(¶mSet1);
121 OH_Huks_FreeParamSet(¶mSet2);
122 OH_Huks_FreeParamSet(¶mSet3);
123 }
124
HksDhAgreeFreeParamSet(struct OH_Huks_ParamSet * paramSet1,struct OH_Huks_ParamSet * paramSet2,struct OH_Huks_ParamSet * paramSet3,struct OH_Huks_ParamSet * paramSet4,struct OH_Huks_ParamSet * paramSet5)125 void HksDhAgreeFreeParamSet(struct OH_Huks_ParamSet *paramSet1, struct OH_Huks_ParamSet *paramSet2,
126 struct OH_Huks_ParamSet *paramSet3, struct OH_Huks_ParamSet *paramSet4,
127 struct OH_Huks_ParamSet *paramSet5)
128 {
129 OH_Huks_FreeParamSet(¶mSet1);
130 OH_Huks_FreeParamSet(¶mSet2);
131 OH_Huks_FreeParamSet(¶mSet3);
132 OH_Huks_FreeParamSet(¶mSet4);
133 OH_Huks_FreeParamSet(¶mSet5);
134 }
135
HksDhAgreeFreeBlob(struct OH_Huks_Blob * blob1,struct OH_Huks_Blob * blob2)136 void HksDhAgreeFreeBlob(struct OH_Huks_Blob *blob1, struct OH_Huks_Blob *blob2)
137 {
138 HksFree(blob1->data);
139 HksFree(blob2->data);
140 }
141
HksDhAgreeFreeBlob(struct OH_Huks_Blob * blob1,struct OH_Huks_Blob * blob2,struct OH_Huks_Blob * blob3,struct OH_Huks_Blob * blob4)142 void HksDhAgreeFreeBlob(struct OH_Huks_Blob *blob1, struct OH_Huks_Blob *blob2, struct OH_Huks_Blob *blob3,
143 struct OH_Huks_Blob *blob4)
144 {
145 HksFree(blob1->data);
146 HksFree(blob2->data);
147 HksFree(blob3->data);
148 HksFree(blob4->data);
149 }
150
151 /**
152 * @tc.name: HuksAgreeDHTest.Security_HUKS_NAPI_Agree_DH_0100
153 * @tc.desc: alg-DH, pur-AGREE
154 * @tc.type: FUNC
155 */
156 HWTEST_F(HuksAgreeDHTest, Security_HUKS_NAPI_Agree_DH_0100, TestSize.Level1)
157 {
158 struct OH_Huks_ParamSet *genParamSet = nullptr;
159 struct OH_Huks_ParamSet *initParamSet01 = nullptr;
160 struct OH_Huks_ParamSet *finishParamSet01 = nullptr;
161 struct OH_Huks_ParamSet *initParamSet02 = nullptr;
162 struct OH_Huks_ParamSet *finishParamSet02 = nullptr;
163 OH_Huks_Result ret = InitParamSet(&genParamSet, g_genParams001, sizeof(g_genParams001) / sizeof(OH_Huks_Param));
164 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "InitParamSet(gen) failed.";
165 ret = InitParamSet(&initParamSet01, g_agreeParams01Init001, sizeof(g_agreeParams01Init001) / sizeof(OH_Huks_Param));
166 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "InitParamSet(init & update)01 failed.";
167 ret = InitParamSet(&finishParamSet01, g_agreeParams01Finish001,
168 sizeof(g_agreeParams01Finish001) / sizeof(OH_Huks_Param));
169 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "InitParamSet(finish)01 failed.";
170 ret = InitParamSet(&initParamSet02, g_agreeParams02Init001, sizeof(g_agreeParams02Init001) / sizeof(OH_Huks_Param));
171 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "InitParamSet(init & update)02 failed.";
172 ret = InitParamSet(&finishParamSet02, g_agreeParams02Finish001,
173 sizeof(g_agreeParams02Finish001) / sizeof(OH_Huks_Param));
174 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "InitParamSet(finish)02 failed.";
175
176 OH_Huks_Result ret1 = OH_Huks_GenerateKeyItem(&g_keyAlias01001, genParamSet, nullptr);
177 EXPECT_EQ(ret1.errorCode, (int32_t)OH_HUKS_SUCCESS) << "GenerateKey01 failed.";
178 ret1 = OH_Huks_GenerateKeyItem(&g_keyAlias02001, genParamSet, nullptr);
179 EXPECT_EQ(ret1.errorCode, (int32_t)OH_HUKS_SUCCESS) << "GenerateKey02 failed.";
180
181 struct OH_Huks_Blob publicKey01 = {.size = OH_HUKS_DH_KEY_SIZE_4096, .data = nullptr};
182 struct OH_Huks_Blob publicKey02 = {.size = OH_HUKS_DH_KEY_SIZE_4096, .data = nullptr};
183 ret = MallocAndCheckBlobData(&publicKey01, publicKey01.size);
184 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "Malloc publicKey01 failed.";
185 ret = MallocAndCheckBlobData(&publicKey02, publicKey02.size);
186 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "Malloc publicKey02 failed.";
187 ret = HksDhAgreeExport(&g_keyAlias01001, &g_keyAlias02001, &publicKey01, &publicKey02, genParamSet);
188 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "ExportKey failed.";
189
190 struct OH_Huks_Blob outData01 = {.size = DH_COMMON_SIZE, .data = nullptr};
191 struct OH_Huks_Blob outData02 = {.size = DH_COMMON_SIZE, .data = nullptr};
192 ret = MallocAndCheckBlobData(&outData01, outData01.size);
193 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "Malloc outData01 failed.";
194 ret = MallocAndCheckBlobData(&outData02, outData02.size);
195 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "Malloc outData02 failed.";
196 ret = HksDhAgreeFinish(&g_keyAlias01001, &publicKey02, initParamSet01, finishParamSet01, &outData01);
197 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "HksDhAgreeFinish01 failed.";
198 ret = HksDhAgreeFinish(&g_keyAlias02001, &publicKey01, initParamSet02, finishParamSet02, &outData02);
199 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "HksDhAgreeFinish02 failed.";
200
201 OH_Huks_DeleteKeyItem(&g_keyAlias01001, genParamSet);
202 OH_Huks_DeleteKeyItem(&g_keyAlias02001, genParamSet);
203 OH_Huks_DeleteKeyItem(&g_keyAliasFinal1001, finishParamSet01);
204 OH_Huks_DeleteKeyItem(&g_keyAliasFinal2001, finishParamSet01);
205 HksDhAgreeFreeParamSet(genParamSet, initParamSet01, finishParamSet01, initParamSet02, finishParamSet02);
206 HksDhAgreeFreeBlob(&publicKey01, &publicKey02, &outData01, &outData02);
207 }
208 } // namespace Unittest::DhAgree