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_signverify_rsa_test_common.h"
17
18 #include <gtest/gtest.h>
19
20 using namespace testing::ext;
21 namespace Unittest::RsaSignVerify
22 {
HksTestSignVerify(struct OH_Huks_Blob * keyAlias,struct OH_Huks_ParamSet * paramSet,const struct OH_Huks_Blob * inData,struct OH_Huks_Blob * outData,bool isSign)23 OH_Huks_Result HksTestSignVerify(struct OH_Huks_Blob *keyAlias, struct OH_Huks_ParamSet *paramSet,
24 const struct OH_Huks_Blob *inData, struct OH_Huks_Blob *outData, bool isSign)
25 {
26 uint8_t tmpHandle[sizeof(uint64_t)] = {0};
27 struct OH_Huks_Blob handle = {sizeof(uint64_t), tmpHandle};
28 OH_Huks_Result ret = OH_Huks_InitSession(keyAlias, paramSet, &handle, nullptr);
29 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "Init failed.";
30 if (ret.errorCode != (int32_t)OH_HUKS_SUCCESS) {
31 return ret;
32 }
33
34 struct OH_Huks_Param *tmpParam = NULL;
35 ret = OH_Huks_GetParam(paramSet, OH_HUKS_TAG_PURPOSE, &tmpParam);
36 if (ret.errorCode != (int32_t)OH_HUKS_SUCCESS) {
37 return ret;
38 }
39
40 ret = TestUpdateFinish(&handle, paramSet, tmpParam->uint32Param, inData, outData);
41 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "TestUpdateFinish failed.";
42 if (ret.errorCode != (int32_t)OH_HUKS_SUCCESS) {
43 return ret;
44 }
45
46 return ret;
47 }
48
HksRsaSignVerifyTestNormalCase(struct OH_Huks_Blob keyAlias,struct OH_Huks_ParamSet * genParamSet,struct OH_Huks_ParamSet * signParamSet,struct OH_Huks_ParamSet * verifyParamSet)49 OH_Huks_Result HksRsaSignVerifyTestNormalCase(struct OH_Huks_Blob keyAlias, struct OH_Huks_ParamSet *genParamSet,
50 struct OH_Huks_ParamSet *signParamSet,
51 struct OH_Huks_ParamSet *verifyParamSet)
52 {
53 struct OH_Huks_Blob inData = {g_inData.length(), (uint8_t *)g_inData.c_str()};
54 uint8_t tmpIn[] = "tempIn";
55 struct OH_Huks_Blob finishInData = {0, tmpIn};
56
57 /* 1. Generate Key */
58 // Generate Key
59 OH_Huks_Result ret = OH_Huks_GenerateKeyItem(&keyAlias, genParamSet, nullptr);
60 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "GenerateKey failed.";
61
62 /* 2. Sign Three Stage */
63 // Init
64 uint8_t handleS[sizeof(uint64_t)] = {0};
65 struct OH_Huks_Blob handleSign = {sizeof(uint64_t), handleS};
66 ret = OH_Huks_InitSession(&keyAlias, signParamSet, &handleSign, nullptr);
67 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "Init failed.";
68 // Update loop
69 ret = HksTestUpdate(&handleSign, signParamSet, &inData);
70 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "Update failed.";
71 // Finish
72 uint8_t outDataS[RSA_COMMON_SIZE] = {0};
73 struct OH_Huks_Blob outDataSign = {RSA_COMMON_SIZE, outDataS};
74 ret = OH_Huks_FinishSession(&handleSign, signParamSet, &finishInData, &outDataSign);
75 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "Finish failed.";
76
77 /* 3. Export Public Key */
78 uint8_t pubKey[OH_HUKS_RSA_KEY_SIZE_1024] = {0};
79 struct OH_Huks_Blob publicKey = {OH_HUKS_RSA_KEY_SIZE_1024, pubKey};
80 ret = OH_Huks_ExportPublicKeyItem(&keyAlias, genParamSet, &publicKey);
81 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "ExportPublicKey failed.";
82
83 /* 4. Import Key */
84 char newKey[] = "RSA_Sign_Verify_Import_KeyAlias";
85 struct OH_Huks_Blob newKeyAlias = {.size = strlen(newKey), .data = (uint8_t *)newKey};
86 ret = OH_Huks_ImportKeyItem(&newKeyAlias, verifyParamSet, &publicKey);
87 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "ImportKey failed";
88
89 /* 5. Verify Three Stage */
90 // Init
91 uint8_t handleV[sizeof(uint64_t)] = {0};
92 struct OH_Huks_Blob handleVerify = {sizeof(uint64_t), handleV};
93 ret = OH_Huks_InitSession(&newKeyAlias, verifyParamSet, &handleVerify, nullptr);
94 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "Init failed.";
95 // Update loop
96 ret = HksTestUpdate(&handleVerify, verifyParamSet, &inData);
97 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "Update failed.";
98 // Finish
99 uint8_t temp[] = "out";
100 struct OH_Huks_Blob verifyOut = {sizeof(temp), temp};
101 ret = OH_Huks_FinishSession(&handleVerify, verifyParamSet, &outDataSign, &verifyOut);
102 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "Finish failed.";
103
104 /* 6. Delete New Key */
105 ret = OH_Huks_DeleteKeyItem(&newKeyAlias, verifyParamSet);
106 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "Delete ImportKey failed.";
107
108 return ret;
109 }
110
HksRSASignVerifyTestAbnormalCase(struct OH_Huks_Blob keyAlias,struct OH_Huks_ParamSet * genParamSet,struct OH_Huks_ParamSet * signParamSet,struct OH_Huks_ParamSet * verifyParamSet)111 OH_Huks_Result HksRSASignVerifyTestAbnormalCase(struct OH_Huks_Blob keyAlias, struct OH_Huks_ParamSet *genParamSet,
112 struct OH_Huks_ParamSet *signParamSet,
113 struct OH_Huks_ParamSet *verifyParamSet)
114 {
115 struct OH_Huks_Blob inData = {g_inData.length(), (uint8_t *)g_inData.c_str()};
116 struct OH_Huks_Blob finishInData = {0, NULL};
117
118 /* 1. Generate Key */
119 // Generate Key
120 OH_Huks_Result ret = OH_Huks_GenerateKeyItem(&keyAlias, genParamSet, nullptr);
121 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "GenerateKey failed.";
122
123 /* 2. Sign Three Stage */
124 // Init
125 uint8_t handleS[sizeof(uint64_t)] = {0};
126 struct OH_Huks_Blob handleSign = {sizeof(uint64_t), handleS};
127 ret = OH_Huks_InitSession(&keyAlias, signParamSet, &handleSign, nullptr);
128 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "Init failed.";
129 // Update loop
130 ret = HksTestUpdate(&handleSign, signParamSet, &inData);
131 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "Update failed.";
132 // Finish
133 uint8_t outDataS[RSA_COMMON_SIZE] = {0};
134 struct OH_Huks_Blob outDataSign = {RSA_COMMON_SIZE, outDataS};
135 ret = OH_Huks_FinishSession(&handleSign, signParamSet, &finishInData, &outDataSign);
136 EXPECT_NE(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "Finish failed.";
137 ret = OH_Huks_AbortSession(&handleSign, signParamSet);
138 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "Abort failed.";
139
140 /* 3. Export Public Key */
141 uint8_t pubKey[OH_HUKS_RSA_KEY_SIZE_1024] = {0};
142 struct OH_Huks_Blob publicKey = {OH_HUKS_RSA_KEY_SIZE_1024, pubKey};
143 ret = OH_Huks_ExportPublicKeyItem(&keyAlias, genParamSet, &publicKey);
144 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "ExportPublicKey failed.";
145
146 /* 4. Import Key */
147 char newKey[] = "RSA_Sign_Verify_Import_KeyAlias";
148 struct OH_Huks_Blob newKeyAlias = {.size = strlen(newKey), .data = (uint8_t *)newKey};
149 ret = OH_Huks_ImportKeyItem(&newKeyAlias, verifyParamSet, &publicKey);
150 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "ImportKey failed";
151
152 /* 5. Verify Three Stage */
153 // Init
154 uint8_t handleV[sizeof(uint64_t)] = {0};
155 struct OH_Huks_Blob handleVerify = {sizeof(uint64_t), handleV};
156 ret = OH_Huks_InitSession(&newKeyAlias, verifyParamSet, &handleVerify, nullptr);
157 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "Init failed.";
158 // Update loop
159 ret = HksTestUpdate(&handleVerify, verifyParamSet, &inData);
160 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "Update failed.";
161 // Finish
162 uint8_t temp[] = "out";
163 struct OH_Huks_Blob verifyOut = {sizeof(temp), temp};
164 ret = OH_Huks_FinishSession(&handleVerify, verifyParamSet, &outDataSign, &verifyOut);
165 EXPECT_NE(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "Finish failed.";
166 ret = OH_Huks_AbortSession(&handleVerify, verifyParamSet);
167 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "Abort failed.";
168
169 /* 6. Delete New Key */
170 ret = OH_Huks_DeleteKeyItem(&newKeyAlias, verifyParamSet);
171 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "Delete ImportKey failed.";
172
173 return ret;
174 }
175 } // namespace Unittest::RsaSignVerify