• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }