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 {
HksTestSignVerify(struct OH_Huks_Blob * keyAlias,struct OH_Huks_ParamSet * paramSet,const struct OH_Huks_Blob * inData,struct OH_Huks_Blob * outData,bool isSign)22 OH_Huks_Result HksTestSignVerify(struct OH_Huks_Blob *keyAlias, struct OH_Huks_ParamSet *paramSet,
23 const struct OH_Huks_Blob *inData, struct OH_Huks_Blob *outData, bool isSign)
24 {
25 uint8_t tmpHandle[sizeof(uint64_t)] = {0};
26 struct OH_Huks_Blob handle = { sizeof(uint64_t), tmpHandle };
27 OH_Huks_Result ret = OH_Huks_InitSession(keyAlias, paramSet, &handle, nullptr);
28 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "Init failed.";
29 if (ret.errorCode != (int32_t)OH_HUKS_SUCCESS) {
30 return ret;
31 }
32
33 struct OH_Huks_Param *tmpParam = NULL;
34 ret = OH_Huks_GetParam(paramSet, OH_HUKS_TAG_PURPOSE, &tmpParam);
35 if (ret.errorCode != (int32_t)OH_HUKS_SUCCESS) {
36 return ret;
37 }
38
39 ret = TestUpdateFinish(&handle, paramSet, tmpParam->uint32Param, inData, outData);
40 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "TestUpdateFinish failed.";
41 if (ret.errorCode != (int32_t)OH_HUKS_SUCCESS) {
42 return ret;
43 }
44
45 return ret;
46 }
47
HksRsaSignVerifyTestNormalCase(struct OH_Huks_Blob keyAlias,struct OH_Huks_ParamSet * genParamSet,struct OH_Huks_ParamSet * signParamSet,struct OH_Huks_ParamSet * verifyParamSet)48 OH_Huks_Result HksRsaSignVerifyTestNormalCase(struct OH_Huks_Blob keyAlias,
49 struct OH_Huks_ParamSet *genParamSet, struct OH_Huks_ParamSet *signParamSet, struct OH_Huks_ParamSet *verifyParamSet)
50 {
51 struct OH_Huks_Blob inData = { g_inData.length(), (uint8_t *)g_inData.c_str() };
52 uint8_t tmpIn[] = "tempIn";
53 struct OH_Huks_Blob finishInData = { 0, tmpIn };
54
55 /* 1. Generate Key */
56 // Generate Key
57 OH_Huks_Result ret = OH_Huks_GenerateKeyItem(&keyAlias, genParamSet, nullptr);
58 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "GenerateKey failed.";
59
60 /* 2. Sign Three Stage */
61 // Init
62 uint8_t handleS[sizeof(uint64_t)] = {0};
63 struct OH_Huks_Blob handleSign = { sizeof(uint64_t), handleS };
64 ret = OH_Huks_InitSession(&keyAlias, signParamSet, &handleSign, nullptr);
65 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "Init failed.";
66 // Update loop
67 ret = HksTestUpdate(&handleSign, signParamSet, &inData);
68 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "Update failed.";
69 // Finish
70 uint8_t outDataS[RSA_COMMON_SIZE] = {0};
71 struct OH_Huks_Blob outDataSign = { RSA_COMMON_SIZE, outDataS };
72 ret = OH_Huks_FinishSession(&handleSign, signParamSet, &finishInData, &outDataSign);
73 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "Finish failed.";
74
75 /* 3. Export Public Key */
76 uint8_t pubKey[OH_HUKS_RSA_KEY_SIZE_1024] = {0};
77 struct OH_Huks_Blob publicKey = { OH_HUKS_RSA_KEY_SIZE_1024, pubKey };
78 ret = OH_Huks_ExportPublicKeyItem(&keyAlias, genParamSet, &publicKey);
79 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "ExportPublicKey failed.";
80
81 /* 4. Import Key */
82 char newKey[] = "RSA_Sign_Verify_Import_KeyAlias";
83 struct OH_Huks_Blob newKeyAlias = { .size = strlen(newKey), .data = (uint8_t *)newKey };
84 ret = OH_Huks_ImportKeyItem(&newKeyAlias, verifyParamSet, &publicKey);
85 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "ImportKey failed";
86
87 /* 5. Verify Three Stage */
88 // Init
89 uint8_t handleV[sizeof(uint64_t)] = {0};
90 struct OH_Huks_Blob handleVerify = { sizeof(uint64_t), handleV };
91 ret = OH_Huks_InitSession(&newKeyAlias, verifyParamSet, &handleVerify, nullptr);
92 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "Init failed.";
93 // Update loop
94 ret = HksTestUpdate(&handleVerify, verifyParamSet, &inData);
95 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "Update failed.";
96 // Finish
97 uint8_t temp[] = "out";
98 struct OH_Huks_Blob verifyOut = { sizeof(temp), temp };
99 ret = OH_Huks_FinishSession(&handleVerify, verifyParamSet, &outDataSign, &verifyOut);
100 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "Finish failed.";
101
102 /* 6. Delete New Key */
103 ret = OH_Huks_DeleteKeyItem(&newKeyAlias, verifyParamSet);
104 EXPECT_EQ(ret.errorCode, (int32_t)OH_HUKS_SUCCESS) << "Delete ImportKey failed.";
105
106 return ret;
107 }
108
HksRSASignVerifyTestAbnormalCase(struct OH_Huks_Blob keyAlias,struct OH_Huks_ParamSet * genParamSet,struct OH_Huks_ParamSet * signParamSet,struct OH_Huks_ParamSet * verifyParamSet)109 OH_Huks_Result HksRSASignVerifyTestAbnormalCase(struct OH_Huks_Blob keyAlias,
110 struct OH_Huks_ParamSet *genParamSet, struct OH_Huks_ParamSet *signParamSet, struct OH_Huks_ParamSet *verifyParamSet)
111 {
112 struct OH_Huks_Blob inData = {
113 g_inData.length(),
114 (uint8_t *)g_inData.c_str()
115 };
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 }