1 /*
2 * Copyright (C) 2023-2024 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 "dsa_asy_key_generator_openssl.h"
17
18 #include <openssl/dsa.h>
19 #include <openssl/evp.h>
20 #include <string.h>
21
22 #include "detailed_dsa_key_params.h"
23 #include "log.h"
24 #include "memory.h"
25 #include "openssl_adapter.h"
26 #include "openssl_class.h"
27 #include "openssl_common.h"
28 #include "utils.h"
29
30 #define OPENSSL_DSA_GENERATOR_CLASS "OPENSSL.DSA.KEYGENERATOR"
31 #define OPENSSL_DSA_PUBKEY_FORMAT "X.509"
32 #define OPENSSL_DSA_PRIKEY_FORMAT "PKCS#8"
33 #define ALGORITHM_NAME_DSA "DSA"
34
35 typedef struct {
36 HcfAsyKeyGeneratorSpi base;
37
38 int32_t bits;
39 } HcfAsyKeyGeneratorSpiDsaOpensslImpl;
40
FreeCtx(EVP_PKEY_CTX * paramsCtx,EVP_PKEY * paramsPkey,EVP_PKEY_CTX * pkeyCtx)41 static void FreeCtx(EVP_PKEY_CTX *paramsCtx, EVP_PKEY *paramsPkey, EVP_PKEY_CTX *pkeyCtx)
42 {
43 if (paramsCtx != NULL) {
44 OpensslEvpPkeyCtxFree(paramsCtx);
45 }
46 if (paramsPkey != NULL) {
47 OpensslEvpPkeyFree(paramsPkey);
48 }
49 if (pkeyCtx != NULL) {
50 OpensslEvpPkeyCtxFree(pkeyCtx);
51 }
52 }
53
FreeCommSpecBn(BIGNUM * p,BIGNUM * q,BIGNUM * g)54 static void FreeCommSpecBn(BIGNUM *p, BIGNUM *q, BIGNUM *g)
55 {
56 if (p != NULL) {
57 OpensslBnFree(p);
58 }
59 if (q != NULL) {
60 OpensslBnFree(q);
61 }
62 if (g != NULL) {
63 OpensslBnFree(g);
64 }
65 }
66
GetDsaKeyGeneratorSpiClass(void)67 static const char *GetDsaKeyGeneratorSpiClass(void)
68 {
69 return OPENSSL_DSA_GENERATOR_CLASS;
70 }
71
GetDsaKeyPairClass(void)72 static const char *GetDsaKeyPairClass(void)
73 {
74 return OPENSSL_DSA_KEYPAIR_CLASS;
75 }
76
GetDsaPubKeyClass(void)77 static const char *GetDsaPubKeyClass(void)
78 {
79 return OPENSSL_DSA_PUBKEY_CLASS;
80 }
81
GetDsaPriKeyClass(void)82 static const char *GetDsaPriKeyClass(void)
83 {
84 return OPENSSL_DSA_PRIKEY_CLASS;
85 }
86
DestroyDsaKeyGeneratorSpiImpl(HcfObjectBase * self)87 static void DestroyDsaKeyGeneratorSpiImpl(HcfObjectBase *self)
88 {
89 if (self == NULL) {
90 return;
91 }
92 if (!HcfIsClassMatch(self, GetDsaKeyGeneratorSpiClass())) {
93 return;
94 }
95 HcfFree(self);
96 }
97
DestroyDsaPubKey(HcfObjectBase * self)98 static void DestroyDsaPubKey(HcfObjectBase *self)
99 {
100 if (self == NULL) {
101 return;
102 }
103 if (!HcfIsClassMatch(self, GetDsaPubKeyClass())) {
104 return;
105 }
106 HcfOpensslDsaPubKey *impl = (HcfOpensslDsaPubKey *)self;
107 OpensslDsaFree(impl->pk);
108 impl->pk = NULL;
109 HcfFree(impl);
110 }
111
DestroyDsaPriKey(HcfObjectBase * self)112 static void DestroyDsaPriKey(HcfObjectBase *self)
113 {
114 if (self == NULL) {
115 return;
116 }
117 if (!HcfIsClassMatch(self, GetDsaPriKeyClass())) {
118 return;
119 }
120 HcfOpensslDsaPriKey *impl = (HcfOpensslDsaPriKey *)self;
121 OpensslDsaFree(impl->sk);
122 impl->sk = NULL;
123 HcfFree(impl);
124 }
125
DestroyDsaKeyPair(HcfObjectBase * self)126 static void DestroyDsaKeyPair(HcfObjectBase *self)
127 {
128 if (self == NULL) {
129 return;
130 }
131 if (!HcfIsClassMatch(self, GetDsaKeyPairClass())) {
132 return;
133 }
134 HcfOpensslDsaKeyPair *impl = (HcfOpensslDsaKeyPair *)self;
135 DestroyDsaPubKey((HcfObjectBase *)impl->base.pubKey);
136 impl->base.pubKey = NULL;
137 DestroyDsaPriKey((HcfObjectBase *)impl->base.priKey);
138 impl->base.priKey = NULL;
139 HcfFree(self);
140 }
141
GetDsaPubKeyAlgorithm(HcfKey * self)142 static const char *GetDsaPubKeyAlgorithm(HcfKey *self)
143 {
144 if (self == NULL) {
145 LOGE("Invalid input parameter.");
146 return NULL;
147 }
148 if (!HcfIsClassMatch((HcfObjectBase *)self, GetDsaPubKeyClass())) {
149 return NULL;
150 }
151 return ALGORITHM_NAME_DSA;
152 }
153
GetDsaPriKeyAlgorithm(HcfKey * self)154 static const char *GetDsaPriKeyAlgorithm(HcfKey *self)
155 {
156 if (self == NULL) {
157 LOGE("Invalid input parameter.");
158 return NULL;
159 }
160 if (!HcfIsClassMatch((HcfObjectBase *)self, GetDsaPriKeyClass())) {
161 return NULL;
162 }
163 return ALGORITHM_NAME_DSA;
164 }
165
GetDsaPubKeyEncoded(HcfKey * self,HcfBlob * returnBlob)166 static HcfResult GetDsaPubKeyEncoded(HcfKey *self, HcfBlob *returnBlob)
167 {
168 if ((self == NULL) || (returnBlob == NULL)) {
169 LOGE("Invalid input parameter.");
170 return HCF_INVALID_PARAMS;
171 }
172 if (!HcfIsClassMatch((HcfObjectBase *)self, GetDsaPubKeyClass())) {
173 return HCF_INVALID_PARAMS;
174 }
175 HcfOpensslDsaPubKey *impl = (HcfOpensslDsaPubKey *)self;
176 unsigned char *returnData = NULL;
177 int len = OpensslI2dDsaPubkey(impl->pk, &returnData);
178 if (len <= 0) {
179 LOGD("[error] Call i2d_DSA_PUBKEY failed");
180 HcfPrintOpensslError();
181 return HCF_ERR_CRYPTO_OPERATION;
182 }
183 returnBlob->data = returnData;
184 returnBlob->len = len;
185 return HCF_SUCCESS;
186 }
187
GetDsaPubKeyEncodedPem(HcfKey * self,const char * format,char ** returnString)188 static HcfResult GetDsaPubKeyEncodedPem(HcfKey *self, const char *format, char **returnString)
189 {
190 (void)self;
191 (void)format;
192 (void)returnString;
193 return HCF_INVALID_PARAMS;
194 }
195
GetDsaPriKeyEncoded(HcfKey * self,HcfBlob * returnBlob)196 static HcfResult GetDsaPriKeyEncoded(HcfKey *self, HcfBlob *returnBlob)
197 {
198 if ((self == NULL) || (returnBlob == NULL)) {
199 LOGE("Invalid input parameter.");
200 return HCF_INVALID_PARAMS;
201 }
202 if (!HcfIsClassMatch((HcfObjectBase *)self, GetDsaPriKeyClass())) {
203 return HCF_INVALID_PARAMS;
204 }
205 HcfOpensslDsaPriKey *impl = (HcfOpensslDsaPriKey *)self;
206 unsigned char *returnData = NULL;
207 int len = OpensslI2dDsaPrivateKey(impl->sk, &returnData);
208 if (len <= 0) {
209 LOGD("[error] Call i2d_DSAPrivateKey failed.");
210 HcfPrintOpensslError();
211 return HCF_ERR_CRYPTO_OPERATION;
212 }
213 returnBlob->data = returnData;
214 returnBlob->len = len;
215 return HCF_SUCCESS;
216 }
217
GetDsaPriKeyEncodedPem(const HcfPriKey * self,HcfParamsSpec * paramsSpec,const char * format,char ** returnString)218 static HcfResult GetDsaPriKeyEncodedPem(const HcfPriKey *self, HcfParamsSpec *paramsSpec, const char *format,
219 char **returnString)
220 {
221 (void)self;
222 (void)paramsSpec;
223 (void)format;
224 (void)returnString;
225 return HCF_INVALID_PARAMS;
226 }
227
GetDsaPubKeyFormat(HcfKey * self)228 static const char *GetDsaPubKeyFormat(HcfKey *self)
229 {
230 if (self == NULL) {
231 LOGE("Invalid input parameter.");
232 return NULL;
233 }
234 if (!HcfIsClassMatch((HcfObjectBase *)self, GetDsaPubKeyClass())) {
235 return NULL;
236 }
237 return OPENSSL_DSA_PUBKEY_FORMAT;
238 }
239
GetDsaPriKeyFormat(HcfKey * self)240 static const char *GetDsaPriKeyFormat(HcfKey *self)
241 {
242 if (self == NULL) {
243 LOGE("Invalid input parameter.");
244 return NULL;
245 }
246 if (!HcfIsClassMatch((HcfObjectBase *)self, GetDsaPriKeyClass())) {
247 return NULL;
248 }
249 return OPENSSL_DSA_PRIKEY_FORMAT;
250 }
251
GetBigIntegerSpecFromDsaPubKey(const HcfPubKey * self,const AsyKeySpecItem item,HcfBigInteger * returnBigInteger)252 static HcfResult GetBigIntegerSpecFromDsaPubKey(const HcfPubKey *self, const AsyKeySpecItem item,
253 HcfBigInteger *returnBigInteger)
254 {
255 if (self == NULL || returnBigInteger == NULL) {
256 LOGE("Invalid input parameter.");
257 return HCF_INVALID_PARAMS;
258 }
259 if (!HcfIsClassMatch((HcfObjectBase *)self, GetDsaPubKeyClass())) {
260 LOGE("Invalid class of self.");
261 return HCF_INVALID_PARAMS;
262 }
263 HcfResult ret = HCF_SUCCESS;
264 HcfOpensslDsaPubKey *impl = (HcfOpensslDsaPubKey *)self;
265 DSA *dsaPk = impl->pk;
266 if (dsaPk == NULL) {
267 return HCF_INVALID_PARAMS;
268 }
269 switch (item) {
270 case DSA_P_BN:
271 ret = BigNumToBigInteger(OpensslDsaGet0P(dsaPk), returnBigInteger);
272 break;
273 case DSA_Q_BN:
274 ret = BigNumToBigInteger(OpensslDsaGet0Q(dsaPk), returnBigInteger);
275 break;
276 case DSA_G_BN:
277 ret = BigNumToBigInteger(OpensslDsaGet0G(dsaPk), returnBigInteger);
278 break;
279 case DSA_PK_BN:
280 ret = BigNumToBigInteger(OpensslDsaGet0PubKey(dsaPk), returnBigInteger);
281 break;
282 default:
283 LOGE("Input item is invalid");
284 ret = HCF_INVALID_PARAMS;
285 break;
286 }
287 return ret;
288 }
289
GetBigIntegerSpecFromDsaPriKey(const HcfPriKey * self,const AsyKeySpecItem item,HcfBigInteger * returnBigInteger)290 static HcfResult GetBigIntegerSpecFromDsaPriKey(const HcfPriKey *self, const AsyKeySpecItem item,
291 HcfBigInteger *returnBigInteger)
292 {
293 if (self == NULL || returnBigInteger == NULL) {
294 LOGE("Invalid input parameter.");
295 return HCF_INVALID_PARAMS;
296 }
297 if (!HcfIsClassMatch((HcfObjectBase *)self, GetDsaPriKeyClass())) {
298 LOGE("Invalid class of self.");
299 return HCF_INVALID_PARAMS;
300 }
301 HcfResult ret = HCF_SUCCESS;
302 HcfOpensslDsaPriKey *impl = (HcfOpensslDsaPriKey *)self;
303 DSA *dsaSk = impl->sk;
304 if (dsaSk == NULL) {
305 return HCF_INVALID_PARAMS;
306 }
307 switch (item) {
308 case DSA_P_BN:
309 ret = BigNumToBigInteger(OpensslDsaGet0P(dsaSk), returnBigInteger);
310 break;
311 case DSA_Q_BN:
312 ret = BigNumToBigInteger(OpensslDsaGet0Q(dsaSk), returnBigInteger);
313 break;
314 case DSA_G_BN:
315 ret = BigNumToBigInteger(OpensslDsaGet0G(dsaSk), returnBigInteger);
316 break;
317 case DSA_SK_BN:
318 ret = BigNumToBigInteger(OpensslDsaGet0PrivKey(dsaSk), returnBigInteger);
319 break;
320 default:
321 LOGE("Input item is invalid");
322 ret = HCF_INVALID_PARAMS;
323 break;
324 }
325 return ret;
326 }
327
GetIntSpecFromDsaPubKey(const HcfPubKey * self,const AsyKeySpecItem item,int * returnInt)328 static HcfResult GetIntSpecFromDsaPubKey(const HcfPubKey *self, const AsyKeySpecItem item, int *returnInt)
329 {
330 (void)self;
331 (void)returnInt;
332 return HCF_NOT_SUPPORT;
333 }
334
GetIntSpecFromDsaPriKey(const HcfPriKey * self,const AsyKeySpecItem item,int * returnInt)335 static HcfResult GetIntSpecFromDsaPriKey(const HcfPriKey *self, const AsyKeySpecItem item, int *returnInt)
336 {
337 (void)self;
338 (void)returnInt;
339 return HCF_NOT_SUPPORT;
340 }
341
GetStrSpecFromDsaPubKey(const HcfPubKey * self,const AsyKeySpecItem item,char ** returnString)342 static HcfResult GetStrSpecFromDsaPubKey(const HcfPubKey *self, const AsyKeySpecItem item, char **returnString)
343 {
344 (void)self;
345 (void)returnString;
346 return HCF_NOT_SUPPORT;
347 }
348
GetStrSpecFromDsaPriKey(const HcfPriKey * self,const AsyKeySpecItem item,char ** returnString)349 static HcfResult GetStrSpecFromDsaPriKey(const HcfPriKey *self, const AsyKeySpecItem item, char **returnString)
350 {
351 (void)self;
352 (void)returnString;
353 return HCF_NOT_SUPPORT;
354 }
355
ClearDsaPriKeyMem(HcfPriKey * self)356 static void ClearDsaPriKeyMem(HcfPriKey *self)
357 {
358 if (self == NULL) {
359 return;
360 }
361 if (!HcfIsClassMatch((HcfObjectBase *)self, GetDsaPriKeyClass())) {
362 return;
363 }
364 HcfOpensslDsaPriKey *impl = (HcfOpensslDsaPriKey *)self;
365 OpensslDsaFree(impl->sk);
366 impl->sk = NULL;
367 }
368
GetDsaPriKeyEncodedDer(const HcfPriKey * self,const char * format,HcfBlob * returnBlob)369 static HcfResult GetDsaPriKeyEncodedDer(const HcfPriKey *self, const char *format, HcfBlob *returnBlob)
370 {
371 (void)self;
372 (void)format;
373 (void)returnBlob;
374 return HCF_INVALID_PARAMS;
375 }
376
GenerateDsaEvpKey(int32_t keyLen,EVP_PKEY ** ppkey)377 static HcfResult GenerateDsaEvpKey(int32_t keyLen, EVP_PKEY **ppkey)
378 {
379 EVP_PKEY_CTX *paramsCtx = NULL;
380 EVP_PKEY *paramsPkey = NULL;
381 EVP_PKEY_CTX *pkeyCtx = NULL;
382 HcfResult ret = HCF_SUCCESS;
383 do {
384 paramsCtx = OpensslEvpPkeyCtxNewId(EVP_PKEY_DSA, NULL);
385 if (paramsCtx == NULL) {
386 LOGE("Create params ctx failed.");
387 ret = HCF_ERR_MALLOC;
388 break;
389 }
390 if (OpensslEvpPkeyParamGenInit(paramsCtx) != HCF_OPENSSL_SUCCESS) {
391 LOGD("[error] Params ctx generate init failed.");
392 ret = HCF_ERR_CRYPTO_OPERATION;
393 break;
394 }
395 if (OpensslEvpPkeyCtxSetDsaParamgenBits(paramsCtx, keyLen) <= 0) {
396 LOGD("[error] Set length of bits to params ctx failed.");
397 ret = HCF_ERR_CRYPTO_OPERATION;
398 break;
399 }
400 if (OpensslEvpPkeyParamGen(paramsCtx, ¶msPkey) != HCF_OPENSSL_SUCCESS) {
401 LOGD("[error] Generate params pkey failed.");
402 ret = HCF_ERR_CRYPTO_OPERATION;
403 break;
404 }
405 pkeyCtx = OpensslEvpPkeyCtxNew(paramsPkey, NULL);
406 if (pkeyCtx == NULL) {
407 LOGD("[error] Create pkey ctx failed.");
408 ret = HCF_ERR_CRYPTO_OPERATION;
409 break;
410 }
411 if (OpensslEvpPkeyKeyGenInit(pkeyCtx) != HCF_OPENSSL_SUCCESS) {
412 LOGD("[error] Key ctx generate init failed.");
413 ret = HCF_ERR_CRYPTO_OPERATION;
414 break;
415 }
416 if (OpensslEvpPkeyKeyGen(pkeyCtx, ppkey) != HCF_OPENSSL_SUCCESS) {
417 LOGD("[error] Generate pkey failed.");
418 ret = HCF_ERR_CRYPTO_OPERATION;
419 break;
420 }
421 } while (0);
422 FreeCtx(paramsCtx, paramsPkey, pkeyCtx);
423 return ret;
424 }
425
GetDsaPubKeyEncodedDer(const HcfPubKey * self,const char * format,HcfBlob * returnBlob)426 static HcfResult GetDsaPubKeyEncodedDer(const HcfPubKey *self, const char *format, HcfBlob *returnBlob)
427 {
428 (void)self;
429 (void)format;
430 (void)returnBlob;
431 return HCF_INVALID_PARAMS;
432 }
433
FillOpensslDsaPubKeyFunc(HcfOpensslDsaPubKey * pk)434 static void FillOpensslDsaPubKeyFunc(HcfOpensslDsaPubKey *pk)
435 {
436 pk->base.base.base.destroy = DestroyDsaPubKey;
437 pk->base.base.base.getClass = GetDsaPubKeyClass;
438 pk->base.base.getAlgorithm = GetDsaPubKeyAlgorithm;
439 pk->base.base.getEncoded = GetDsaPubKeyEncoded;
440 pk->base.base.getEncodedPem = GetDsaPubKeyEncodedPem;
441 pk->base.base.getFormat = GetDsaPubKeyFormat;
442 pk->base.getAsyKeySpecBigInteger = GetBigIntegerSpecFromDsaPubKey;
443 pk->base.getAsyKeySpecInt = GetIntSpecFromDsaPubKey;
444 pk->base.getAsyKeySpecString = GetStrSpecFromDsaPubKey;
445 pk->base.getEncodedDer = GetDsaPubKeyEncodedDer;
446 }
447
FillOpensslDsaPriKeyFunc(HcfOpensslDsaPriKey * sk)448 static void FillOpensslDsaPriKeyFunc(HcfOpensslDsaPriKey *sk)
449 {
450 sk->base.base.base.destroy = DestroyDsaPriKey;
451 sk->base.base.base.getClass = GetDsaPriKeyClass;
452 sk->base.base.getAlgorithm = GetDsaPriKeyAlgorithm;
453 sk->base.base.getEncoded = GetDsaPriKeyEncoded;
454 sk->base.getEncodedPem = GetDsaPriKeyEncodedPem;
455 sk->base.base.getFormat = GetDsaPriKeyFormat;
456 sk->base.getAsyKeySpecBigInteger = GetBigIntegerSpecFromDsaPriKey;
457 sk->base.getAsyKeySpecInt = GetIntSpecFromDsaPriKey;
458 sk->base.getAsyKeySpecString = GetStrSpecFromDsaPriKey;
459 sk->base.clearMem = ClearDsaPriKeyMem;
460 sk->base.getEncodedDer = GetDsaPriKeyEncodedDer;
461 }
462
CreateDsaPubKey(DSA * pk,HcfOpensslDsaPubKey ** returnPubKey)463 static HcfResult CreateDsaPubKey(DSA *pk, HcfOpensslDsaPubKey **returnPubKey)
464 {
465 HcfOpensslDsaPubKey *dsaPubKey = (HcfOpensslDsaPubKey *)HcfMalloc(sizeof(HcfOpensslDsaPubKey), 0);
466 if (dsaPubKey == NULL) {
467 LOGE("Failed to allocate DSA public key memory.");
468 return HCF_ERR_MALLOC;
469 }
470 FillOpensslDsaPubKeyFunc(dsaPubKey);
471 dsaPubKey->pk = pk;
472
473 *returnPubKey = dsaPubKey;
474 return HCF_SUCCESS;
475 }
476
CreateDsaPriKey(DSA * sk,HcfOpensslDsaPriKey ** returnPriKey)477 static HcfResult CreateDsaPriKey(DSA *sk, HcfOpensslDsaPriKey **returnPriKey)
478 {
479 HcfOpensslDsaPriKey *dsaPriKey = (HcfOpensslDsaPriKey *)HcfMalloc(sizeof(HcfOpensslDsaPriKey), 0);
480 if (dsaPriKey == NULL) {
481 LOGE("Failed to allocate DSA private key memory.");
482 return HCF_ERR_MALLOC;
483 }
484 FillOpensslDsaPriKeyFunc(dsaPriKey);
485 dsaPriKey->sk = sk;
486
487 *returnPriKey = dsaPriKey;
488 return HCF_SUCCESS;
489 }
490
CreateDsaKeyPair(const HcfOpensslDsaPubKey * pubKey,const HcfOpensslDsaPriKey * priKey,HcfKeyPair ** returnKeyPair)491 static HcfResult CreateDsaKeyPair(const HcfOpensslDsaPubKey *pubKey, const HcfOpensslDsaPriKey *priKey,
492 HcfKeyPair **returnKeyPair)
493 {
494 HcfOpensslDsaKeyPair *keyPair = (HcfOpensslDsaKeyPair *)HcfMalloc(sizeof(HcfOpensslDsaKeyPair), 0);
495 if (keyPair == NULL) {
496 LOGE("Failed to allocate keyPair memory.");
497 return HCF_ERR_MALLOC;
498 }
499 keyPair->base.base.getClass = GetDsaKeyPairClass;
500 keyPair->base.base.destroy = DestroyDsaKeyPair;
501 keyPair->base.pubKey = (HcfPubKey *)pubKey;
502 keyPair->base.priKey = (HcfPriKey *)priKey;
503
504 *returnKeyPair = (HcfKeyPair *)keyPair;
505 return HCF_SUCCESS;
506 }
507
GeneratePubKeyByPkey(EVP_PKEY * pkey,HcfOpensslDsaPubKey ** returnPubKey)508 static HcfResult GeneratePubKeyByPkey(EVP_PKEY *pkey, HcfOpensslDsaPubKey **returnPubKey)
509 {
510 DSA *pk = OpensslEvpPkeyGet1Dsa(pkey);
511 if (pk == NULL) {
512 LOGD("[error] Get das public key from pkey failed");
513 HcfPrintOpensslError();
514 return HCF_ERR_CRYPTO_OPERATION;
515 }
516 HcfResult ret = CreateDsaPubKey(pk, returnPubKey);
517 if (ret != HCF_SUCCESS) {
518 LOGD("[error] Create DSA public key failed");
519 OpensslDsaFree(pk);
520 }
521 return ret;
522 }
523
GeneratePriKeyByPkey(EVP_PKEY * pkey,HcfOpensslDsaPriKey ** returnPriKey)524 static HcfResult GeneratePriKeyByPkey(EVP_PKEY *pkey, HcfOpensslDsaPriKey **returnPriKey)
525 {
526 DSA *sk = OpensslEvpPkeyGet1Dsa(pkey);
527 if (sk == NULL) {
528 LOGD("[error] Get DSA private key from pkey failed");
529 HcfPrintOpensslError();
530 return HCF_ERR_CRYPTO_OPERATION;
531 }
532 HcfResult ret = CreateDsaPriKey(sk, returnPriKey);
533 if (ret != HCF_SUCCESS) {
534 LOGD("[error] Create DSA private key failed");
535 OpensslDsaFree(sk);
536 }
537 return ret;
538 }
539
GenerateDsaPubAndPriKey(int32_t keyLen,HcfOpensslDsaPubKey ** returnPubKey,HcfOpensslDsaPriKey ** returnPriKey)540 static HcfResult GenerateDsaPubAndPriKey(int32_t keyLen, HcfOpensslDsaPubKey **returnPubKey,
541 HcfOpensslDsaPriKey **returnPriKey)
542 {
543 EVP_PKEY *pkey = NULL;
544 HcfResult ret = GenerateDsaEvpKey(keyLen, &pkey);
545 if (ret != HCF_SUCCESS) {
546 LOGD("[error] Generate DSA EVP_PKEY failed.");
547 return ret;
548 }
549
550 ret = GeneratePubKeyByPkey(pkey, returnPubKey);
551 if (ret != HCF_SUCCESS) {
552 OpensslEvpPkeyFree(pkey);
553 return ret;
554 }
555
556 ret = GeneratePriKeyByPkey(pkey, returnPriKey);
557 if (ret != HCF_SUCCESS) {
558 HcfObjDestroy(*returnPubKey);
559 *returnPubKey = NULL;
560 OpensslEvpPkeyFree(pkey);
561 return HCF_ERR_CRYPTO_OPERATION;
562 }
563
564 OpensslEvpPkeyFree(pkey);
565 return ret;
566 }
567
ConvertCommSpec2Bn(const HcfDsaCommParamsSpec * paramsSpec,BIGNUM ** p,BIGNUM ** q,BIGNUM ** g)568 static HcfResult ConvertCommSpec2Bn(const HcfDsaCommParamsSpec *paramsSpec, BIGNUM **p, BIGNUM **q, BIGNUM **g)
569 {
570 if (BigIntegerToBigNum(&(paramsSpec->p), p) != HCF_SUCCESS) {
571 LOGD("[error] Get openssl BN p failed");
572 return HCF_ERR_CRYPTO_OPERATION;
573 }
574 if (BigIntegerToBigNum(&(paramsSpec->q), q) != HCF_SUCCESS) {
575 LOGD("[error] Get openssl BN q failed");
576 OpensslBnFree(*p);
577 *p = NULL;
578 return HCF_ERR_CRYPTO_OPERATION;
579 }
580 if (BigIntegerToBigNum(&(paramsSpec->g), g) != HCF_SUCCESS) {
581 LOGD("[error] Get openssl BN g failed");
582 OpensslBnFree(*p);
583 *p = NULL;
584 OpensslBnFree(*q);
585 *q = NULL;
586 return HCF_ERR_CRYPTO_OPERATION;
587 }
588 return HCF_SUCCESS;
589 }
590
CreateOpensslDsaKey(const HcfDsaCommParamsSpec * paramsSpec,BIGNUM * pk,BIGNUM * sk,DSA ** returnDsa)591 static HcfResult CreateOpensslDsaKey(const HcfDsaCommParamsSpec *paramsSpec, BIGNUM *pk, BIGNUM *sk, DSA **returnDsa)
592 {
593 BIGNUM *p = NULL;
594 BIGNUM *q = NULL;
595 BIGNUM *g = NULL;
596 if (ConvertCommSpec2Bn(paramsSpec, &p, &q, &g)!= HCF_SUCCESS) {
597 return HCF_ERR_CRYPTO_OPERATION;
598 }
599 DSA *dsa = OpensslDsaNew();
600 if (dsa == NULL) {
601 FreeCommSpecBn(p, q, g);
602 LOGD("[error] Openssl DSA new failed");
603 HcfPrintOpensslError();
604 return HCF_ERR_CRYPTO_OPERATION;
605 }
606 if (OpensslDsaSet0Pqg(dsa, p, q, g) != HCF_OPENSSL_SUCCESS) {
607 LOGD("[error] Openssl DSA set pqg failed");
608 FreeCommSpecBn(p, q, g);
609 HcfPrintOpensslError();
610 OpensslDsaFree(dsa);
611 return HCF_ERR_CRYPTO_OPERATION;
612 }
613 if ((pk == NULL) && (sk == NULL)) {
614 *returnDsa = dsa;
615 return HCF_SUCCESS;
616 }
617 if (OpensslDsaSet0Key(dsa, pk, sk) != HCF_OPENSSL_SUCCESS) {
618 LOGD("[error] Openssl DSA set pqg failed");
619 HcfPrintOpensslError();
620 OpensslDsaFree(dsa);
621 return HCF_ERR_CRYPTO_OPERATION;
622 }
623 *returnDsa = dsa;
624 return HCF_SUCCESS;
625 }
626
GenerateOpensslDsaKeyByCommSpec(const HcfDsaCommParamsSpec * paramsSpec,DSA ** returnDsa)627 static HcfResult GenerateOpensslDsaKeyByCommSpec(const HcfDsaCommParamsSpec *paramsSpec, DSA **returnDsa)
628 {
629 if (CreateOpensslDsaKey(paramsSpec, NULL, NULL, returnDsa) != HCF_SUCCESS) {
630 return HCF_ERR_CRYPTO_OPERATION;
631 }
632
633 if (OpensslDsaGenerateKey(*returnDsa) != HCF_OPENSSL_SUCCESS) {
634 LOGD("[error] Openssl DSA generate key failed");
635 HcfPrintOpensslError();
636 OpensslDsaFree(*returnDsa);
637 *returnDsa = NULL;
638 return HCF_ERR_CRYPTO_OPERATION;
639 }
640 return HCF_SUCCESS;
641 }
642
GenerateOpensslDsaKeyByPubKeySpec(const HcfDsaPubKeyParamsSpec * paramsSpec,DSA ** returnDsa)643 static HcfResult GenerateOpensslDsaKeyByPubKeySpec(const HcfDsaPubKeyParamsSpec *paramsSpec, DSA **returnDsa)
644 {
645 BIGNUM *pubKey = NULL;
646 if (BigIntegerToBigNum(&(paramsSpec->pk), &pubKey) != HCF_SUCCESS) {
647 LOGD("[error] Get openssl BN pk failed");
648 return HCF_ERR_CRYPTO_OPERATION;
649 }
650
651 if (CreateOpensslDsaKey(&(paramsSpec->base), pubKey, NULL, returnDsa) != HCF_SUCCESS) {
652 OpensslBnFree(pubKey);
653 return HCF_ERR_CRYPTO_OPERATION;
654 }
655 return HCF_SUCCESS;
656 }
657
GenerateOpensslDsaKeyByKeyPairSpec(const HcfDsaKeyPairParamsSpec * paramsSpec,DSA ** returnDsa)658 static HcfResult GenerateOpensslDsaKeyByKeyPairSpec(const HcfDsaKeyPairParamsSpec *paramsSpec, DSA **returnDsa)
659 {
660 BIGNUM *pubKey = NULL;
661 BIGNUM *priKey = NULL;
662 if (BigIntegerToBigNum(&(paramsSpec->pk), &pubKey) != HCF_SUCCESS) {
663 LOGD("[error] Get openssl BN pk failed");
664 return HCF_ERR_CRYPTO_OPERATION;
665 }
666 if (BigIntegerToBigNum(&(paramsSpec->sk), &priKey) != HCF_SUCCESS) {
667 LOGD("[error] Get openssl BN sk failed");
668 OpensslBnFree(pubKey);
669 return HCF_ERR_CRYPTO_OPERATION;
670 }
671 if (CreateOpensslDsaKey(&(paramsSpec->base), pubKey, priKey, returnDsa) != HCF_SUCCESS) {
672 OpensslBnFree(pubKey);
673 OpensslBnFree(priKey);
674 return HCF_ERR_CRYPTO_OPERATION;
675 }
676 return HCF_SUCCESS;
677 }
678
CreateDsaKeyPairByCommSpec(const HcfDsaCommParamsSpec * paramsSpec,HcfKeyPair ** returnKeyPair)679 static HcfResult CreateDsaKeyPairByCommSpec(const HcfDsaCommParamsSpec *paramsSpec, HcfKeyPair **returnKeyPair)
680 {
681 DSA *dsa = NULL;
682 if (GenerateOpensslDsaKeyByCommSpec(paramsSpec, &dsa) != HCF_SUCCESS) {
683 return HCF_ERR_CRYPTO_OPERATION;
684 }
685 HcfOpensslDsaPubKey *pubKey = NULL;
686 if (CreateDsaPubKey(dsa, &pubKey) != HCF_SUCCESS) {
687 OpensslDsaFree(dsa);
688 return HCF_ERR_MALLOC;
689 }
690
691 if (OpensslDsaUpRef(dsa) != HCF_OPENSSL_SUCCESS) {
692 LOGE("Dup DSA failed.");
693 HcfPrintOpensslError();
694 HcfObjDestroy(pubKey);
695 return HCF_ERR_CRYPTO_OPERATION;
696 }
697
698 HcfOpensslDsaPriKey *priKey = NULL;
699 if (CreateDsaPriKey(dsa, &priKey) != HCF_SUCCESS) {
700 OpensslDsaFree(dsa);
701 HcfObjDestroy(pubKey);
702 return HCF_ERR_MALLOC;
703 }
704
705 if (CreateDsaKeyPair(pubKey, priKey, returnKeyPair) != HCF_SUCCESS) {
706 HcfObjDestroy(pubKey);
707 HcfObjDestroy(priKey);
708 return HCF_ERR_MALLOC;
709 }
710 return HCF_SUCCESS;
711 }
712
CreateDsaPubKeyByKeyPairSpec(const HcfDsaKeyPairParamsSpec * paramsSpec,HcfOpensslDsaPubKey ** returnPubKey)713 static HcfResult CreateDsaPubKeyByKeyPairSpec(const HcfDsaKeyPairParamsSpec *paramsSpec,
714 HcfOpensslDsaPubKey **returnPubKey)
715 {
716 DSA *dsa = NULL;
717 if (GenerateOpensslDsaKeyByKeyPairSpec(paramsSpec, &dsa) != HCF_SUCCESS) {
718 return HCF_ERR_CRYPTO_OPERATION;
719 }
720 if (CreateDsaPubKey(dsa, returnPubKey) != HCF_SUCCESS) {
721 OpensslDsaFree(dsa);
722 return HCF_ERR_MALLOC;
723 }
724 return HCF_SUCCESS;
725 }
726
CreateDsaPriKeyByKeyPairSpec(const HcfDsaKeyPairParamsSpec * paramsSpec,HcfOpensslDsaPriKey ** returnPriKey)727 static HcfResult CreateDsaPriKeyByKeyPairSpec(const HcfDsaKeyPairParamsSpec *paramsSpec,
728 HcfOpensslDsaPriKey **returnPriKey)
729 {
730 DSA *dsa = NULL;
731 if (GenerateOpensslDsaKeyByKeyPairSpec(paramsSpec, &dsa) != HCF_SUCCESS) {
732 return HCF_ERR_CRYPTO_OPERATION;
733 }
734 if (CreateDsaPriKey(dsa, returnPriKey) != HCF_SUCCESS) {
735 OpensslDsaFree(dsa);
736 return HCF_ERR_MALLOC;
737 }
738 return HCF_SUCCESS;
739 }
740
CreateDsaKeyPairByKeyPairSpec(const HcfDsaKeyPairParamsSpec * paramsSpec,HcfKeyPair ** returnKeyPair)741 static HcfResult CreateDsaKeyPairByKeyPairSpec(const HcfDsaKeyPairParamsSpec *paramsSpec, HcfKeyPair **returnKeyPair)
742 {
743 HcfOpensslDsaPubKey *pubKey = NULL;
744 HcfResult ret = CreateDsaPubKeyByKeyPairSpec(paramsSpec, &pubKey);
745 if (ret != HCF_SUCCESS) {
746 return ret;
747 }
748
749 HcfOpensslDsaPriKey *priKey = NULL;
750 ret = CreateDsaPriKeyByKeyPairSpec(paramsSpec, &priKey);
751 if (ret != HCF_SUCCESS) {
752 HcfObjDestroy(pubKey);
753 return ret;
754 }
755 ret = CreateDsaKeyPair(pubKey, priKey, returnKeyPair);
756 if (ret != HCF_SUCCESS) {
757 HcfObjDestroy(pubKey);
758 HcfObjDestroy(priKey);
759 return ret;
760 }
761 return HCF_SUCCESS;
762 }
763
CreateDsaKeyPairBySpec(const HcfAsyKeyParamsSpec * paramsSpec,HcfKeyPair ** returnKeyPair)764 static HcfResult CreateDsaKeyPairBySpec(const HcfAsyKeyParamsSpec *paramsSpec, HcfKeyPair **returnKeyPair)
765 {
766 if (paramsSpec->specType == HCF_COMMON_PARAMS_SPEC) {
767 return CreateDsaKeyPairByCommSpec((const HcfDsaCommParamsSpec *)paramsSpec, returnKeyPair);
768 } else {
769 return CreateDsaKeyPairByKeyPairSpec((const HcfDsaKeyPairParamsSpec *)paramsSpec, returnKeyPair);
770 }
771 }
772
CreateDsaPubKeyByPubKeySpec(const HcfDsaPubKeyParamsSpec * paramsSpec,HcfPubKey ** returnPubKey)773 static HcfResult CreateDsaPubKeyByPubKeySpec(const HcfDsaPubKeyParamsSpec *paramsSpec, HcfPubKey **returnPubKey)
774 {
775 DSA *dsa = NULL;
776 if (GenerateOpensslDsaKeyByPubKeySpec(paramsSpec, &dsa) != HCF_SUCCESS) {
777 return HCF_ERR_CRYPTO_OPERATION;
778 }
779
780 HcfOpensslDsaPubKey *pubKey = NULL;
781 if (CreateDsaPubKey(dsa, &pubKey) != HCF_SUCCESS) {
782 OpensslDsaFree(dsa);
783 return HCF_ERR_MALLOC;
784 }
785 *returnPubKey = (HcfPubKey *)pubKey;
786 return HCF_SUCCESS;
787 }
788
ConvertDsaPubKey(const HcfBlob * pubKeyBlob,HcfOpensslDsaPubKey ** returnPubKey)789 static HcfResult ConvertDsaPubKey(const HcfBlob *pubKeyBlob, HcfOpensslDsaPubKey **returnPubKey)
790 {
791 const unsigned char *tmpData = (const unsigned char *)(pubKeyBlob->data);
792 DSA *dsa = OpensslD2iDsaPubKey(NULL, &tmpData, pubKeyBlob->len);
793 if (dsa == NULL) {
794 LOGD("[error] D2i_DSA_PUBKEY fail.");
795 HcfPrintOpensslError();
796 return HCF_ERR_CRYPTO_OPERATION;
797 }
798 HcfResult ret = CreateDsaPubKey(dsa, returnPubKey);
799 if (ret != HCF_SUCCESS) {
800 LOGD("[error] Create DSA public key failed");
801 OpensslDsaFree(dsa);
802 }
803 return ret;
804 }
805
ConvertDsaPriKey(const HcfBlob * priKeyBlob,HcfOpensslDsaPriKey ** returnPriKey)806 static HcfResult ConvertDsaPriKey(const HcfBlob *priKeyBlob, HcfOpensslDsaPriKey **returnPriKey)
807 {
808 const unsigned char *tmpData = (const unsigned char *)(priKeyBlob->data);
809 DSA *dsa = OpensslD2iDsaPrivateKey(NULL, &tmpData, priKeyBlob->len);
810 if (dsa == NULL) {
811 LOGD("[error] D2i_DSADSAPrivateKey fail.");
812 HcfPrintOpensslError();
813 return HCF_ERR_CRYPTO_OPERATION;
814 }
815 HcfResult ret = CreateDsaPriKey(dsa, returnPriKey);
816 if (ret != HCF_SUCCESS) {
817 LOGD("[error] Create DSA private key failed");
818 OpensslDsaFree(dsa);
819 }
820 return ret;
821 }
822
ConvertDsaPubAndPriKey(const HcfBlob * pubKeyBlob,const HcfBlob * priKeyBlob,HcfOpensslDsaPubKey ** returnPubKey,HcfOpensslDsaPriKey ** returnPriKey)823 static HcfResult ConvertDsaPubAndPriKey(const HcfBlob *pubKeyBlob, const HcfBlob *priKeyBlob,
824 HcfOpensslDsaPubKey **returnPubKey, HcfOpensslDsaPriKey **returnPriKey)
825 {
826 if (pubKeyBlob != NULL) {
827 if (ConvertDsaPubKey(pubKeyBlob, returnPubKey) != HCF_SUCCESS) {
828 LOGD("[error] Convert DSA public key failed.");
829 return HCF_ERR_CRYPTO_OPERATION;
830 }
831 }
832 if (priKeyBlob != NULL) {
833 if (ConvertDsaPriKey(priKeyBlob, returnPriKey) != HCF_SUCCESS) {
834 LOGD("[error] Convert DSA private key failed.");
835 HcfObjDestroy(*returnPubKey);
836 *returnPubKey = NULL;
837 return HCF_ERR_CRYPTO_OPERATION;
838 }
839 }
840 return HCF_SUCCESS;
841 }
842
EngineGenerateDsaKeyPair(HcfAsyKeyGeneratorSpi * self,HcfKeyPair ** returnKeyPair)843 static HcfResult EngineGenerateDsaKeyPair(HcfAsyKeyGeneratorSpi *self, HcfKeyPair **returnKeyPair)
844 {
845 if (self == NULL || returnKeyPair == NULL) {
846 LOGE("Invalid params.");
847 return HCF_INVALID_PARAMS;
848 }
849 if (!HcfIsClassMatch((HcfObjectBase *)self, GetDsaKeyGeneratorSpiClass())) {
850 LOGE("Class not match.");
851 return HCF_INVALID_PARAMS;
852 }
853 HcfAsyKeyGeneratorSpiDsaOpensslImpl *impl = (HcfAsyKeyGeneratorSpiDsaOpensslImpl *)self;
854
855 HcfOpensslDsaPubKey *pubKey = NULL;
856 HcfOpensslDsaPriKey *priKey = NULL;
857 HcfResult ret = GenerateDsaPubAndPriKey(impl->bits, &pubKey, &priKey);
858 if (ret != HCF_SUCCESS) {
859 LOGE("Generate DSA pk and sk by openssl failed.");
860 return ret;
861 }
862
863 ret = CreateDsaKeyPair(pubKey, priKey, returnKeyPair);
864 if (ret != HCF_SUCCESS) {
865 HcfObjDestroy(pubKey);
866 HcfObjDestroy(priKey);
867 return ret;
868 }
869 return HCF_SUCCESS;
870 }
871
EngineConvertDsaKey(HcfAsyKeyGeneratorSpi * self,HcfParamsSpec * params,HcfBlob * pubKeyBlob,HcfBlob * priKeyBlob,HcfKeyPair ** returnKeyPair)872 static HcfResult EngineConvertDsaKey(HcfAsyKeyGeneratorSpi *self, HcfParamsSpec *params, HcfBlob *pubKeyBlob,
873 HcfBlob *priKeyBlob, HcfKeyPair **returnKeyPair)
874 {
875 (void)params;
876 if ((self == NULL) || (returnKeyPair == NULL)) {
877 LOGE("Invalid input parameter.");
878 return HCF_INVALID_PARAMS;
879 }
880 if (!HcfIsClassMatch((HcfObjectBase *)self, GetDsaKeyGeneratorSpiClass())) {
881 LOGE("Class not match.");
882 return HCF_INVALID_PARAMS;
883 }
884 bool pubKeyValid = HcfIsBlobValid(pubKeyBlob);
885 bool priKeyValid = HcfIsBlobValid(priKeyBlob);
886 if ((!pubKeyValid) && (!priKeyValid)) {
887 LOGE("The private key and public key cannot both be NULL.");
888 return HCF_INVALID_PARAMS;
889 }
890
891 HcfOpensslDsaPubKey *pubKey = NULL;
892 HcfOpensslDsaPriKey *priKey = NULL;
893 HcfBlob *inputPk = pubKeyValid ? pubKeyBlob : NULL;
894 HcfBlob *inputSk = priKeyValid ? priKeyBlob : NULL;
895 HcfResult ret = ConvertDsaPubAndPriKey(inputPk, inputSk, &pubKey, &priKey);
896 if (ret != HCF_SUCCESS) {
897 return ret;
898 }
899 ret = CreateDsaKeyPair(pubKey, priKey, returnKeyPair);
900 if (ret != HCF_SUCCESS) {
901 HcfObjDestroy(pubKey);
902 HcfObjDestroy(priKey);
903 }
904 return ret;
905 }
906
ConvertDsaPemPubKey(const char * pubKeyStr,HcfOpensslDsaPubKey ** returnPubKey)907 static HcfResult ConvertDsaPemPubKey(const char *pubKeyStr, HcfOpensslDsaPubKey **returnPubKey)
908 {
909 EVP_PKEY *pkey = NULL;
910 const char *keyType = "DSA";
911 HcfResult ret = ConvertPubPemStrToKey(&pkey, keyType, EVP_PKEY_PUBLIC_KEY, pubKeyStr);
912 if (ret != HCF_SUCCESS) {
913 LOGE("Convert dsa pem public key failed.");
914 return ret;
915 }
916
917 DSA *dsa = OpensslEvpPkeyGet1Dsa(pkey);
918 OpensslEvpPkeyFree(pkey);
919 if (dsa == NULL) {
920 LOGE("Pkey to dsa key failed.");
921 HcfPrintOpensslError();
922 return HCF_ERR_CRYPTO_OPERATION;
923 }
924
925 ret = CreateDsaPubKey(dsa, returnPubKey);
926 if (ret != HCF_SUCCESS) {
927 LOGE("Create dsa public key failed");
928 OpensslDsaFree(dsa);
929 }
930 return ret;
931 }
932
ConvertDsaPemPriKey(const char * priKeyStr,HcfOpensslDsaPriKey ** returnPriKey)933 static HcfResult ConvertDsaPemPriKey(const char *priKeyStr, HcfOpensslDsaPriKey **returnPriKey)
934 {
935 EVP_PKEY *pkey = NULL;
936 const char *keyType = "DSA";
937 HcfResult ret = ConvertPriPemStrToKey(priKeyStr, &pkey, keyType);
938 if (ret != HCF_SUCCESS) {
939 LOGE("Convert dsa pem private key failed.");
940 return ret;
941 }
942
943 DSA *dsa = OpensslEvpPkeyGet1Dsa(pkey);
944 OpensslEvpPkeyFree(pkey);
945 if (dsa == NULL) {
946 LOGE("Pkey to dsa key failed.");
947 HcfPrintOpensslError();
948 return HCF_ERR_CRYPTO_OPERATION;
949 }
950
951 ret = CreateDsaPriKey(dsa, returnPriKey);
952 if (ret != HCF_SUCCESS) {
953 LOGE("Create dsa private key failed");
954 OpensslDsaFree(dsa);
955 }
956
957 return ret;
958 }
959
ConvertDsaPemPubAndPriKey(const char * pubKeyStr,const char * priKeyStr,HcfOpensslDsaPubKey ** returnPubKey,HcfOpensslDsaPriKey ** returnPriKey)960 static HcfResult ConvertDsaPemPubAndPriKey(const char *pubKeyStr, const char *priKeyStr,
961 HcfOpensslDsaPubKey **returnPubKey, HcfOpensslDsaPriKey **returnPriKey)
962 {
963 if (pubKeyStr != NULL && strlen(pubKeyStr) != 0) {
964 if (ConvertDsaPemPubKey(pubKeyStr, returnPubKey) != HCF_SUCCESS) {
965 LOGE("Convert dsa pem public key failed.");
966 return HCF_ERR_CRYPTO_OPERATION;
967 }
968 }
969
970 if (priKeyStr != NULL && strlen(priKeyStr) != 0) {
971 if (ConvertDsaPemPriKey(priKeyStr, returnPriKey) != HCF_SUCCESS) {
972 LOGE("Convert dsa pem private key failed.");
973 HcfObjDestroy(*returnPubKey);
974 *returnPubKey = NULL;
975 return HCF_ERR_CRYPTO_OPERATION;
976 }
977 }
978 return HCF_SUCCESS;
979 }
980
EngineConvertDsaPemKey(HcfAsyKeyGeneratorSpi * self,HcfParamsSpec * params,const char * pubKeyStr,const char * priKeyStr,HcfKeyPair ** returnKeyPair)981 static HcfResult EngineConvertDsaPemKey(HcfAsyKeyGeneratorSpi *self, HcfParamsSpec *params, const char *pubKeyStr,
982 const char *priKeyStr, HcfKeyPair **returnKeyPair)
983 {
984 (void)params;
985 if ((self == NULL) || (returnKeyPair == NULL) || ((pubKeyStr == NULL) && (priKeyStr == NULL))) {
986 LOGE("Invalid input parameter.");
987 return HCF_INVALID_PARAMS;
988 }
989 if (!HcfIsClassMatch((HcfObjectBase *)self, GetDsaKeyGeneratorSpiClass())) {
990 LOGE("Class not match.");
991 return HCF_INVALID_PARAMS;
992 }
993
994 HcfOpensslDsaPubKey *pubKey = NULL;
995 HcfOpensslDsaPriKey *priKey = NULL;
996
997 HcfResult ret = ConvertDsaPemPubAndPriKey(pubKeyStr, priKeyStr, &pubKey, &priKey);
998 if (ret != HCF_SUCCESS) {
999 return ret;
1000 }
1001
1002 ret = CreateDsaKeyPair(pubKey, priKey, returnKeyPair);
1003 if (ret != HCF_SUCCESS) {
1004 HcfObjDestroy(pubKey);
1005 HcfObjDestroy(priKey);
1006 }
1007
1008 return ret;
1009 }
1010
EngineGenerateDsaKeyPairBySpec(const HcfAsyKeyGeneratorSpi * self,const HcfAsyKeyParamsSpec * paramsSpec,HcfKeyPair ** returnKeyPair)1011 static HcfResult EngineGenerateDsaKeyPairBySpec(const HcfAsyKeyGeneratorSpi *self,
1012 const HcfAsyKeyParamsSpec *paramsSpec, HcfKeyPair **returnKeyPair)
1013 {
1014 if ((self == NULL) || (paramsSpec == NULL) || (paramsSpec->algName == NULL) || (returnKeyPair == NULL)) {
1015 LOGE("Invalid input parameter.");
1016 return HCF_INVALID_PARAMS;
1017 }
1018
1019 if (!HcfIsClassMatch((HcfObjectBase *)self, GetDsaKeyGeneratorSpiClass())) {
1020 return HCF_INVALID_PARAMS;
1021 }
1022
1023 if ((strcmp(paramsSpec->algName, ALGORITHM_NAME_DSA) != 0) ||
1024 ((paramsSpec->specType != HCF_COMMON_PARAMS_SPEC) && (paramsSpec->specType != HCF_KEY_PAIR_SPEC))) {
1025 LOGE("Invalid params spec.");
1026 return HCF_INVALID_PARAMS;
1027 }
1028 HcfResult ret = CreateDsaKeyPairBySpec(paramsSpec, returnKeyPair);
1029 if (ret != HCF_SUCCESS) {
1030 LOGE("Create DSA key pair by spec failed.");
1031 }
1032 return ret;
1033 }
1034
EngineGenerateDsaPubKeyBySpec(const HcfAsyKeyGeneratorSpi * self,const HcfAsyKeyParamsSpec * paramsSpec,HcfPubKey ** returnPubKey)1035 static HcfResult EngineGenerateDsaPubKeyBySpec(const HcfAsyKeyGeneratorSpi *self,
1036 const HcfAsyKeyParamsSpec *paramsSpec, HcfPubKey **returnPubKey)
1037 {
1038 if ((self == NULL) || (paramsSpec == NULL) || (paramsSpec->algName == NULL) || (returnPubKey == NULL)) {
1039 LOGE("Invalid input parameter.");
1040 return HCF_INVALID_PARAMS;
1041 }
1042
1043 if (!HcfIsClassMatch((HcfObjectBase *)self, GetDsaKeyGeneratorSpiClass())) {
1044 return HCF_INVALID_PARAMS;
1045 }
1046
1047 if ((strcmp(paramsSpec->algName, ALGORITHM_NAME_DSA) != 0) ||
1048 ((paramsSpec->specType != HCF_PUBLIC_KEY_SPEC) && (paramsSpec->specType != HCF_KEY_PAIR_SPEC))) {
1049 LOGE("Invalid params spec.");
1050 return HCF_INVALID_PARAMS;
1051 }
1052
1053 HcfResult ret = CreateDsaPubKeyByPubKeySpec((const HcfDsaPubKeyParamsSpec *)paramsSpec, returnPubKey);
1054 if (ret != HCF_SUCCESS) {
1055 LOGE("Create DSA public key by spec failed.");
1056 }
1057 return ret;
1058 }
1059
EngineGenerateDsaPriKeyBySpec(const HcfAsyKeyGeneratorSpi * self,const HcfAsyKeyParamsSpec * paramsSpec,HcfPriKey ** returnPriKey)1060 static HcfResult EngineGenerateDsaPriKeyBySpec(const HcfAsyKeyGeneratorSpi *self,
1061 const HcfAsyKeyParamsSpec *paramsSpec, HcfPriKey **returnPriKey)
1062 {
1063 if ((self == NULL) || (paramsSpec == NULL) || (paramsSpec->algName == NULL) || (returnPriKey == NULL)) {
1064 LOGE("Invalid input parameter.");
1065 return HCF_INVALID_PARAMS;
1066 }
1067 if (!HcfIsClassMatch((HcfObjectBase *)self, GetDsaKeyGeneratorSpiClass())) {
1068 return HCF_INVALID_PARAMS;
1069 }
1070 if ((strcmp(paramsSpec->algName, ALGORITHM_NAME_DSA) != 0) || (paramsSpec->specType != HCF_KEY_PAIR_SPEC)) {
1071 LOGE("Invalid params spec.");
1072 return HCF_INVALID_PARAMS;
1073 }
1074
1075 HcfOpensslDsaPriKey *dsaSk = NULL;
1076 HcfResult ret = CreateDsaPriKeyByKeyPairSpec((const HcfDsaKeyPairParamsSpec *)paramsSpec, &dsaSk);
1077 if (ret != HCF_SUCCESS) {
1078 LOGE("Create DSA private key by spec failed.");
1079 } else {
1080 *returnPriKey = (HcfPriKey *)dsaSk;
1081 }
1082 return ret;
1083 }
1084
HcfAsyKeyGeneratorSpiDsaCreate(HcfAsyKeyGenParams * params,HcfAsyKeyGeneratorSpi ** returnObj)1085 HcfResult HcfAsyKeyGeneratorSpiDsaCreate(HcfAsyKeyGenParams *params, HcfAsyKeyGeneratorSpi **returnObj)
1086 {
1087 if (params == NULL || returnObj == NULL) {
1088 LOGE("Invalid input parameter.");
1089 return HCF_INVALID_PARAMS;
1090 }
1091 HcfAsyKeyGeneratorSpiDsaOpensslImpl *impl = (HcfAsyKeyGeneratorSpiDsaOpensslImpl *)HcfMalloc(
1092 sizeof(HcfAsyKeyGeneratorSpiDsaOpensslImpl), 0);
1093 if (impl == NULL) {
1094 LOGE("Failed to allocate generator impl memroy.");
1095 return HCF_ERR_MALLOC;
1096 }
1097 impl->bits = params->bits;
1098 impl->base.base.getClass = GetDsaKeyGeneratorSpiClass;
1099 impl->base.base.destroy = DestroyDsaKeyGeneratorSpiImpl;
1100 impl->base.engineGenerateKeyPair = EngineGenerateDsaKeyPair;
1101 impl->base.engineConvertKey = EngineConvertDsaKey;
1102 impl->base.engineConvertPemKey = EngineConvertDsaPemKey;
1103 impl->base.engineGenerateKeyPairBySpec = EngineGenerateDsaKeyPairBySpec;
1104 impl->base.engineGeneratePubKeyBySpec = EngineGenerateDsaPubKeyBySpec;
1105 impl->base.engineGeneratePriKeyBySpec = EngineGenerateDsaPriKeyBySpec;
1106
1107 *returnObj = (HcfAsyKeyGeneratorSpi *)impl;
1108 return HCF_SUCCESS;
1109 }
1110