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 "asy_key_params.h"
17
18 #include <stdio.h>
19 #include <string.h>
20 #include <securec.h>
21
22 #include "big_integer.h"
23 #include "detailed_dsa_key_params.h"
24 #include "detailed_ecc_key_params.h"
25 #include "detailed_rsa_key_params.h"
26 #include "memory.h"
27 #include "log.h"
28
29 #define ALG_NAME_DSA "DSA"
30 #define ALG_NAME_ECC "ECC"
31 #define ALG_NAME_RSA "RSA"
32
FreeDsaCommParamsSpec(HcfDsaCommParamsSpec * spec)33 void FreeDsaCommParamsSpec(HcfDsaCommParamsSpec *spec)
34 {
35 if (spec == NULL) {
36 return;
37 }
38 HcfFree(spec->base.algName);
39 spec->base.algName = NULL;
40 HcfFree(spec->p.data);
41 spec->p.data = NULL;
42 HcfFree(spec->q.data);
43 spec->q.data = NULL;
44 HcfFree(spec->g.data);
45 spec->g.data = NULL;
46 }
47
DestroyDsaCommParamsSpec(HcfDsaCommParamsSpec * spec)48 static void DestroyDsaCommParamsSpec(HcfDsaCommParamsSpec *spec)
49 {
50 FreeDsaCommParamsSpec(spec);
51 HcfFree(spec);
52 }
53
DestroyDsaPubKeySpec(HcfDsaPubKeyParamsSpec * spec)54 void DestroyDsaPubKeySpec(HcfDsaPubKeyParamsSpec *spec)
55 {
56 if (spec == NULL) {
57 return;
58 }
59 FreeDsaCommParamsSpec(&(spec->base));
60 HcfFree(spec->pk.data);
61 spec->pk.data = NULL;
62 HcfFree(spec);
63 }
64
DestroyDsaKeyPairSpec(HcfDsaKeyPairParamsSpec * spec)65 void DestroyDsaKeyPairSpec(HcfDsaKeyPairParamsSpec *spec)
66 {
67 if (spec == NULL) {
68 return;
69 }
70 FreeDsaCommParamsSpec(&(spec->base));
71 HcfFree(spec->pk.data);
72 spec->pk.data = NULL;
73 (void)memset_s(spec->sk.data, spec->sk.len, 0, spec->sk.len);
74 HcfFree(spec->sk.data);
75 spec->sk.data = NULL;
76 HcfFree(spec);
77 }
78
FreeEcFieldMem(HcfECField ** field)79 static void FreeEcFieldMem(HcfECField **field)
80 {
81 HcfFree((*field)->fieldType);
82 (*field)->fieldType = NULL;
83 HcfFree(((HcfECFieldFp *)(*field))->p.data);
84 ((HcfECFieldFp *)(*field))->p.data = NULL;
85 HcfFree(*field);
86 *field = NULL;
87 }
88
FreeEcPointMem(HcfPoint * point)89 static void FreeEcPointMem(HcfPoint *point)
90 {
91 HcfFree(point->x.data);
92 point->x.data = NULL;
93 HcfFree(point->y.data);
94 point->y.data = NULL;
95 }
96
FreeEccCommParamsSpec(HcfEccCommParamsSpec * spec)97 void FreeEccCommParamsSpec(HcfEccCommParamsSpec *spec)
98 {
99 if (spec == NULL) {
100 return;
101 }
102 HcfFree(spec->base.algName);
103 spec->base.algName = NULL;
104 HcfFree(spec->a.data);
105 spec->a.data = NULL;
106 HcfFree(spec->b.data);
107 spec->b.data = NULL;
108 HcfFree(spec->n.data);
109 spec->n.data = NULL;
110 FreeEcFieldMem(&(spec->field));
111 spec->field = NULL;
112 FreeEcPointMem(&(spec->g));
113 }
114
DestroyEccCommParamsSpec(HcfEccCommParamsSpec * spec)115 static void DestroyEccCommParamsSpec(HcfEccCommParamsSpec *spec)
116 {
117 FreeEccCommParamsSpec(spec);
118 HcfFree(spec);
119 }
120
DestroyEccPubKeySpec(HcfEccPubKeyParamsSpec * spec)121 void DestroyEccPubKeySpec(HcfEccPubKeyParamsSpec *spec)
122 {
123 if (spec == NULL) {
124 return;
125 }
126 FreeEccCommParamsSpec(&(spec->base));
127 FreeEcPointMem(&(spec->pk));
128 HcfFree(spec);
129 }
130
DestroyEccPriKeySpec(HcfEccPriKeyParamsSpec * spec)131 void DestroyEccPriKeySpec(HcfEccPriKeyParamsSpec *spec)
132 {
133 if (spec == NULL) {
134 return;
135 }
136 FreeEccCommParamsSpec(&(spec->base));
137 (void)memset_s(spec->sk.data, spec->sk.len, 0, spec->sk.len);
138 HcfFree(spec->sk.data);
139 spec->sk.data = NULL;
140 HcfFree(spec);
141 }
142
DestroyEccKeyPairSpec(HcfEccKeyPairParamsSpec * spec)143 void DestroyEccKeyPairSpec(HcfEccKeyPairParamsSpec *spec)
144 {
145 if (spec == NULL) {
146 return;
147 }
148 FreeEccCommParamsSpec(&(spec->base));
149 FreeEcPointMem(&(spec->pk));
150 (void)memset_s(spec->sk.data, spec->sk.len, 0, spec->sk.len);
151 HcfFree(spec->sk.data);
152 spec->sk.data = NULL;
153 HcfFree(spec);
154 }
155
FreeRsaCommParamsSpec(HcfRsaCommParamsSpec * spec)156 void FreeRsaCommParamsSpec(HcfRsaCommParamsSpec *spec)
157 {
158 if (spec == NULL) {
159 return;
160 }
161 HcfFree(spec->base.algName);
162 spec->base.algName = NULL;
163 HcfFree(spec->n.data);
164 spec->n.data = NULL;
165 }
166
DestroyRsaCommParamsSpec(HcfRsaCommParamsSpec * spec)167 static void DestroyRsaCommParamsSpec(HcfRsaCommParamsSpec *spec)
168 {
169 FreeRsaCommParamsSpec(spec);
170 HcfFree(spec);
171 }
172
DestroyRsaPubKeySpec(HcfRsaPubKeyParamsSpec * spec)173 void DestroyRsaPubKeySpec(HcfRsaPubKeyParamsSpec *spec)
174 {
175 if (spec == NULL) {
176 return;
177 }
178 FreeRsaCommParamsSpec(&(spec->base));
179 HcfFree(spec->pk.data);
180 spec->pk.data = NULL;
181 HcfFree(spec);
182 }
183
DestroyRsaKeyPairSpec(HcfRsaKeyPairParamsSpec * spec)184 void DestroyRsaKeyPairSpec(HcfRsaKeyPairParamsSpec *spec)
185 {
186 if (spec == NULL) {
187 return;
188 }
189 FreeRsaCommParamsSpec(&(spec->base));
190 HcfFree(spec->pk.data);
191 spec->pk.data = NULL;
192 (void)memset_s(spec->sk.data, spec->sk.len, 0, spec->sk.len);
193 HcfFree(spec->sk.data);
194 spec->sk.data = NULL;
195 HcfFree(spec);
196 }
197
DestroyDsaParamsSpec(HcfAsyKeyParamsSpec * spec)198 static void DestroyDsaParamsSpec(HcfAsyKeyParamsSpec *spec)
199 {
200 switch (spec->specType) {
201 case HCF_COMMON_PARAMS_SPEC:
202 DestroyDsaCommParamsSpec((HcfDsaCommParamsSpec *)spec);
203 break;
204 case HCF_PUBLIC_KEY_SPEC:
205 DestroyDsaPubKeySpec((HcfDsaPubKeyParamsSpec *)spec);
206 break;
207 case HCF_KEY_PAIR_SPEC:
208 DestroyDsaKeyPairSpec((HcfDsaKeyPairParamsSpec *)spec);
209 break;
210 default:
211 LOGE("No matching DSA key params spec type.");
212 break;
213 }
214 }
215
DestroyEccParamsSpec(HcfAsyKeyParamsSpec * spec)216 static void DestroyEccParamsSpec(HcfAsyKeyParamsSpec *spec)
217 {
218 switch (spec->specType) {
219 case HCF_COMMON_PARAMS_SPEC:
220 DestroyEccCommParamsSpec((HcfEccCommParamsSpec *)spec);
221 break;
222 case HCF_PRIVATE_KEY_SPEC:
223 DestroyEccPriKeySpec((HcfEccPriKeyParamsSpec *)spec);
224 break;
225 case HCF_PUBLIC_KEY_SPEC:
226 DestroyEccPubKeySpec((HcfEccPubKeyParamsSpec *)spec);
227 break;
228 case HCF_KEY_PAIR_SPEC:
229 DestroyEccKeyPairSpec((HcfEccKeyPairParamsSpec *)spec);
230 break;
231 default:
232 LOGE("No matching ECC key params spec type.");
233 break;
234 }
235 }
236
DestroyRsaParamsSpec(HcfAsyKeyParamsSpec * spec)237 static void DestroyRsaParamsSpec(HcfAsyKeyParamsSpec *spec)
238 {
239 switch (spec->specType) {
240 case HCF_COMMON_PARAMS_SPEC:
241 DestroyRsaCommParamsSpec((HcfRsaCommParamsSpec *)spec);
242 break;
243 case HCF_PUBLIC_KEY_SPEC:
244 DestroyRsaPubKeySpec((HcfRsaPubKeyParamsSpec *)spec);
245 break;
246 case HCF_KEY_PAIR_SPEC:
247 DestroyRsaKeyPairSpec((HcfRsaKeyPairParamsSpec *)spec);
248 break;
249 default:
250 LOGE("No matching RSA key params spec type.");
251 break;
252 }
253 }
254
FreeAsyKeySpec(HcfAsyKeyParamsSpec * spec)255 void FreeAsyKeySpec(HcfAsyKeyParamsSpec *spec)
256 {
257 if (spec == NULL || spec->algName == NULL) {
258 return;
259 }
260 if (strcmp(spec->algName, ALG_NAME_DSA) == 0) {
261 return DestroyDsaParamsSpec(spec);
262 } else if (strcmp(spec->algName, ALG_NAME_ECC) == 0) {
263 return DestroyEccParamsSpec(spec);
264 } else if (strcmp(spec->algName, ALG_NAME_RSA) == 0) {
265 return DestroyRsaParamsSpec(spec);
266 } else {
267 LOGE("No matching key params spec alg name.");
268 }
269 }