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 "dsa_openssl.h"
17
18 #include <openssl/evp.h>
19
20 #include "log.h"
21 #include "memory.h"
22 #include "openssl_adapter.h"
23 #include "openssl_common.h"
24 #include "openssl_class.h"
25 #include "utils.h"
26
27 #define OPENSSL_DSA_SIGN_CLASS "OPENSSL.DSA.SIGN"
28 #define OPENSSL_DSA_VERIFY_CLASS "OPENSSL.DSA.VERIFY"
29
30 typedef struct {
31 HcfSignSpi base;
32
33 const EVP_MD *digestAlg;
34
35 EVP_MD_CTX *mdCtx;
36
37 EVP_PKEY_CTX *pkeyCtx;
38
39 CryptoStatus status;
40 } HcfSignSpiDsaOpensslImpl;
41
42 typedef struct {
43 HcfVerifySpi base;
44
45 const EVP_MD *digestAlg;
46
47 EVP_MD_CTX *mdCtx;
48
49 EVP_PKEY_CTX *pkeyCtx;
50
51 CryptoStatus status;
52 } HcfVerifySpiDsaOpensslImpl;
53
GetDsaSignClass(void)54 static const char *GetDsaSignClass(void)
55 {
56 return OPENSSL_DSA_SIGN_CLASS;
57 }
58
GetDsaVerifyClass(void)59 static const char *GetDsaVerifyClass(void)
60 {
61 return OPENSSL_DSA_VERIFY_CLASS;
62 }
63
IsSignInitInputValid(HcfSignSpi * self,HcfPriKey * privateKey)64 static bool IsSignInitInputValid(HcfSignSpi *self, HcfPriKey *privateKey)
65 {
66 if ((self == NULL) || (privateKey == NULL)) {
67 LOGE("Invalid input parameter.");
68 return false;
69 }
70 if ((!HcfIsClassMatch((HcfObjectBase *)self, GetDsaSignClass())) ||
71 (!HcfIsClassMatch((HcfObjectBase *)privateKey, OPENSSL_DSA_PRIKEY_CLASS))) {
72 return false;
73 }
74 HcfSignSpiDsaOpensslImpl *impl = (HcfSignSpiDsaOpensslImpl *)self;
75 if (impl->status != UNINITIALIZED) {
76 LOGE("Repeated initialization is not allowed.");
77 return false;
78 }
79 return true;
80 }
81
IsVerifyInitInputValid(HcfVerifySpi * self,HcfPubKey * publicKey)82 static bool IsVerifyInitInputValid(HcfVerifySpi *self, HcfPubKey *publicKey)
83 {
84 if ((self == NULL) || (publicKey == NULL)) {
85 LOGE("Invalid input parameter.");
86 return false;
87 }
88 if ((!HcfIsClassMatch((HcfObjectBase *)self, GetDsaVerifyClass())) ||
89 (!HcfIsClassMatch((HcfObjectBase *)publicKey, OPENSSL_DSA_PUBKEY_CLASS))) {
90 return false;
91 }
92 HcfVerifySpiDsaOpensslImpl *impl = (HcfVerifySpiDsaOpensslImpl *)self;
93 if (impl->status != UNINITIALIZED) {
94 LOGE("Repeated initialization is not allowed.");
95 return false;
96 }
97 return true;
98 }
99
IsSignDoFinalInputValid(HcfSignSpi * self,HcfBlob * returnSignatureData)100 static bool IsSignDoFinalInputValid(HcfSignSpi *self, HcfBlob *returnSignatureData)
101 {
102 if ((self == NULL) || (returnSignatureData == NULL)) {
103 LOGE("Invalid input parameter.");
104 return false;
105 }
106 if (!HcfIsClassMatch((HcfObjectBase *)self, GetDsaSignClass())) {
107 return false;
108 }
109 return true;
110 }
111
IsVerifyDoFinalInputValid(HcfVerifySpi * self,HcfBlob * signatureData)112 static bool IsVerifyDoFinalInputValid(HcfVerifySpi *self, HcfBlob *signatureData)
113 {
114 if ((self == NULL) || (!HcfIsBlobValid(signatureData))) {
115 LOGE("Invalid input parameter.");
116 return false;
117 }
118 if (!HcfIsClassMatch((HcfObjectBase *)self, GetDsaVerifyClass())) {
119 return false;
120 }
121 return true;
122 }
123
DestroyDsaSign(HcfObjectBase * self)124 static void DestroyDsaSign(HcfObjectBase *self)
125 {
126 if (self == NULL) {
127 return;
128 }
129
130 if (!HcfIsClassMatch(self, GetDsaSignClass())) {
131 return;
132 }
133 HcfSignSpiDsaOpensslImpl *impl = (HcfSignSpiDsaOpensslImpl *)self;
134 if (impl->mdCtx != NULL) {
135 OpensslEvpMdCtxFree(impl->mdCtx);
136 impl->mdCtx = NULL;
137 }
138 if (impl->pkeyCtx != NULL) {
139 OpensslEvpPkeyCtxFree(impl->pkeyCtx);
140 impl->pkeyCtx = NULL;
141 }
142 HcfFree(impl);
143 }
144
DestroyDsaVerify(HcfObjectBase * self)145 static void DestroyDsaVerify(HcfObjectBase *self)
146 {
147 if (self == NULL) {
148 return;
149 }
150 if (!HcfIsClassMatch(self, GetDsaVerifyClass())) {
151 return;
152 }
153 HcfVerifySpiDsaOpensslImpl *impl = (HcfVerifySpiDsaOpensslImpl *)self;
154 if (impl->mdCtx != NULL) {
155 OpensslEvpMdCtxFree(impl->mdCtx);
156 impl->mdCtx = NULL;
157 }
158 if (impl->pkeyCtx != NULL) {
159 OpensslEvpPkeyCtxFree(impl->pkeyCtx);
160 impl->pkeyCtx = NULL;
161 }
162 HcfFree(impl);
163 }
164
CreateDsaEvpKeyByDsa(HcfKey * key,bool isSign)165 static EVP_PKEY *CreateDsaEvpKeyByDsa(HcfKey *key, bool isSign)
166 {
167 EVP_PKEY *pKey = OpensslEvpPkeyNew();
168 if (pKey == NULL) {
169 LOGD("[error] EVP_PKEY_new fail");
170 HcfPrintOpensslError();
171 return NULL;
172 }
173 DSA *dsa = isSign ? ((HcfOpensslDsaPriKey *)key)->sk : ((HcfOpensslDsaPubKey *)key)->pk;
174 if (dsa == NULL) {
175 LOGD("[error] dsa has been cleared");
176 EVP_PKEY_free(pKey);
177 return NULL;
178 }
179 if (OpensslEvpPkeySet1Dsa(pKey, dsa) != HCF_OPENSSL_SUCCESS) {
180 LOGD("[error] EVP_PKEY_set1_DSA fail");
181 HcfPrintOpensslError();
182 EVP_PKEY_free(pKey);
183 return NULL;
184 }
185 return pKey;
186 }
187
EngineDsaSignInit(HcfSignSpi * self,HcfParamsSpec * params,HcfPriKey * privateKey)188 static HcfResult EngineDsaSignInit(HcfSignSpi *self, HcfParamsSpec *params, HcfPriKey *privateKey)
189 {
190 (void)params;
191 if (!IsSignInitInputValid(self, privateKey)) {
192 return HCF_INVALID_PARAMS;
193 }
194 EVP_PKEY *pKey = CreateDsaEvpKeyByDsa((HcfKey *)privateKey, true);
195 if (pKey == NULL) {
196 LOGE("Create DSA evp key failed!");
197 return HCF_ERR_CRYPTO_OPERATION;
198 }
199 HcfSignSpiDsaOpensslImpl *impl = (HcfSignSpiDsaOpensslImpl *)self;
200 if (OpensslEvpDigestSignInit(impl->mdCtx, NULL, impl->digestAlg, NULL, pKey) != HCF_OPENSSL_SUCCESS) {
201 HcfPrintOpensslError();
202 OpensslEvpPkeyFree(pKey);
203 return HCF_ERR_CRYPTO_OPERATION;
204 }
205
206 OpensslEvpPkeyFree(pKey);
207 impl->status = INITIALIZED;
208 return HCF_SUCCESS;
209 }
210
EngineDsaSignWithoutDigestInit(HcfSignSpi * self,HcfParamsSpec * params,HcfPriKey * privateKey)211 static HcfResult EngineDsaSignWithoutDigestInit(HcfSignSpi *self, HcfParamsSpec *params, HcfPriKey *privateKey)
212 {
213 (void)params;
214 if (!IsSignInitInputValid(self, privateKey)) {
215 return HCF_INVALID_PARAMS;
216 }
217 EVP_PKEY *pKey = CreateDsaEvpKeyByDsa((HcfKey *)privateKey, true);
218 if (pKey == NULL) {
219 LOGD("[error] Create DSA evp key failed!");
220 return HCF_ERR_CRYPTO_OPERATION;
221 }
222 HcfSignSpiDsaOpensslImpl *impl = (HcfSignSpiDsaOpensslImpl *)self;
223
224 impl->pkeyCtx = OpensslEvpPkeyCtxNew(pKey, NULL);
225 if (impl->pkeyCtx == NULL) {
226 HcfPrintOpensslError();
227 OpensslEvpPkeyFree(pKey);
228 return HCF_ERR_CRYPTO_OPERATION;
229 }
230 if (OpensslEvpPkeySignInit(impl->pkeyCtx) != HCF_OPENSSL_SUCCESS) {
231 HcfPrintOpensslError();
232 OpensslEvpPkeyFree(pKey);
233 OpensslEvpPkeyCtxFree(impl->pkeyCtx);
234 impl->pkeyCtx = NULL;
235 return HCF_ERR_CRYPTO_OPERATION;
236 }
237 OpensslEvpPkeyFree(pKey);
238 impl->status = READY;
239 return HCF_SUCCESS;
240 }
241
EngineDsaVerifyInit(HcfVerifySpi * self,HcfParamsSpec * params,HcfPubKey * publicKey)242 static HcfResult EngineDsaVerifyInit(HcfVerifySpi *self, HcfParamsSpec *params, HcfPubKey *publicKey)
243 {
244 (void)params;
245 if (!IsVerifyInitInputValid(self, publicKey)) {
246 return HCF_INVALID_PARAMS;
247 }
248 HcfVerifySpiDsaOpensslImpl *impl = (HcfVerifySpiDsaOpensslImpl *)self;
249 EVP_PKEY *pKey = CreateDsaEvpKeyByDsa((HcfKey *)publicKey, false);
250 if (pKey == NULL) {
251 LOGD("[error] Create DSA evp key failed!");
252 return HCF_ERR_CRYPTO_OPERATION;
253 }
254 if (OpensslEvpDigestVerifyInit(impl->mdCtx, NULL, impl->digestAlg, NULL, pKey) != HCF_OPENSSL_SUCCESS) {
255 HcfPrintOpensslError();
256 OpensslEvpPkeyFree(pKey);
257 return HCF_ERR_CRYPTO_OPERATION;
258 }
259
260 OpensslEvpPkeyFree(pKey);
261 impl->status = INITIALIZED;
262 return HCF_SUCCESS;
263 }
264
EngineDsaVerifyWithoutDigestInit(HcfVerifySpi * self,HcfParamsSpec * params,HcfPubKey * publicKey)265 static HcfResult EngineDsaVerifyWithoutDigestInit(HcfVerifySpi *self, HcfParamsSpec *params, HcfPubKey *publicKey)
266 {
267 (void)params;
268 if (!IsVerifyInitInputValid(self, publicKey)) {
269 return HCF_INVALID_PARAMS;
270 }
271 HcfVerifySpiDsaOpensslImpl *impl = (HcfVerifySpiDsaOpensslImpl *)self;
272 EVP_PKEY *pKey = CreateDsaEvpKeyByDsa((HcfKey *)publicKey, false);
273 if (pKey == NULL) {
274 LOGD("[error] Create dsa evp key failed!");
275 return HCF_ERR_CRYPTO_OPERATION;
276 }
277 impl->pkeyCtx = OpensslEvpPkeyCtxNew(pKey, NULL);
278 if (impl->pkeyCtx == NULL) {
279 HcfPrintOpensslError();
280 OpensslEvpPkeyFree(pKey);
281 return HCF_ERR_CRYPTO_OPERATION;
282 }
283 if (OpensslEvpPkeyVerifyInit(impl->pkeyCtx) != HCF_OPENSSL_SUCCESS) {
284 HcfPrintOpensslError();
285 OpensslEvpPkeyFree(pKey);
286 OpensslEvpPkeyCtxFree(impl->pkeyCtx);
287 impl->pkeyCtx = NULL;
288 return HCF_ERR_CRYPTO_OPERATION;
289 }
290 OpensslEvpPkeyFree(pKey);
291 impl->status = READY;
292 return HCF_SUCCESS;
293 }
294
EngineDsaSignUpdate(HcfSignSpi * self,HcfBlob * data)295 static HcfResult EngineDsaSignUpdate(HcfSignSpi *self, HcfBlob *data)
296 {
297 if ((self == NULL) || (!HcfIsBlobValid(data))) {
298 LOGE("Invalid input parameter.");
299 return HCF_INVALID_PARAMS;
300 }
301 if (!HcfIsClassMatch((HcfObjectBase *)self, GetDsaSignClass())) {
302 return HCF_INVALID_PARAMS;
303 }
304 HcfSignSpiDsaOpensslImpl *impl = (HcfSignSpiDsaOpensslImpl *)self;
305 if (impl->status == UNINITIALIZED) {
306 LOGE("Sign object has not been initialized.");
307 return HCF_INVALID_PARAMS;
308 }
309 if (OpensslEvpDigestSignUpdate(impl->mdCtx, data->data, data->len) != HCF_OPENSSL_SUCCESS) {
310 HcfPrintOpensslError();
311 return HCF_ERR_CRYPTO_OPERATION;
312 }
313 impl->status = READY;
314 return HCF_SUCCESS;
315 }
316
EngineDsaSignWithoutDigestUpdate(HcfSignSpi * self,HcfBlob * data)317 static HcfResult EngineDsaSignWithoutDigestUpdate(HcfSignSpi *self, HcfBlob *data)
318 {
319 (void)self;
320 (void)data;
321 return HCF_ERR_CRYPTO_OPERATION;
322 }
323
EngineDsaVerifyUpdate(HcfVerifySpi * self,HcfBlob * data)324 static HcfResult EngineDsaVerifyUpdate(HcfVerifySpi *self, HcfBlob *data)
325 {
326 if ((self == NULL) || (!HcfIsBlobValid(data))) {
327 LOGE("Invalid input parameter.");
328 return HCF_INVALID_PARAMS;
329 }
330 if (!HcfIsClassMatch((HcfObjectBase *)self, GetDsaVerifyClass())) {
331 return HCF_INVALID_PARAMS;
332 }
333 HcfVerifySpiDsaOpensslImpl *impl = (HcfVerifySpiDsaOpensslImpl *)self;
334 if (impl->status == UNINITIALIZED) {
335 LOGE("Verify object has not been initialized.");
336 return HCF_INVALID_PARAMS;
337 }
338
339 if (OpensslEvpDigestVerifyUpdate(impl->mdCtx, data->data, data->len) != HCF_OPENSSL_SUCCESS) {
340 HcfPrintOpensslError();
341 return HCF_ERR_CRYPTO_OPERATION;
342 }
343 impl->status = READY;
344 return HCF_SUCCESS;
345 }
346
EngineDsaVerifyWithoutDigestUpdate(HcfVerifySpi * self,HcfBlob * data)347 static HcfResult EngineDsaVerifyWithoutDigestUpdate(HcfVerifySpi *self, HcfBlob *data)
348 {
349 (void)self;
350 (void)data;
351 return HCF_ERR_CRYPTO_OPERATION;
352 }
353
EngineDsaSignDoFinal(HcfSignSpi * self,HcfBlob * data,HcfBlob * returnSignatureData)354 static HcfResult EngineDsaSignDoFinal(HcfSignSpi *self, HcfBlob *data, HcfBlob *returnSignatureData)
355 {
356 if (!IsSignDoFinalInputValid(self, returnSignatureData)) {
357 return HCF_INVALID_PARAMS;
358 }
359 HcfSignSpiDsaOpensslImpl *impl = (HcfSignSpiDsaOpensslImpl *)self;
360 if (HcfIsBlobValid(data)) {
361 if (OpensslEvpDigestSignUpdate(impl->mdCtx, data->data, data->len) != HCF_OPENSSL_SUCCESS) {
362 HcfPrintOpensslError();
363 return HCF_ERR_CRYPTO_OPERATION;
364 }
365 impl->status = READY;
366 }
367 if (impl->status != READY) {
368 LOGE("The message has not been transferred.");
369 return HCF_INVALID_PARAMS;
370 }
371 size_t maxLen;
372 if (OpensslEvpDigestSignFinal(impl->mdCtx, NULL, &maxLen) != HCF_OPENSSL_SUCCESS) {
373 HcfPrintOpensslError();
374 return HCF_ERR_CRYPTO_OPERATION;
375 }
376 uint8_t *signatureData = (uint8_t *)HcfMalloc(maxLen, 0);
377 if (signatureData == NULL) {
378 LOGE("Failed to allocate signatureData memory!");
379 return HCF_ERR_MALLOC;
380 }
381
382 if (OpensslEvpDigestSignFinal(impl->mdCtx, signatureData, &maxLen) != HCF_OPENSSL_SUCCESS) {
383 HcfPrintOpensslError();
384 HcfFree(signatureData);
385 signatureData = NULL;
386 return HCF_ERR_CRYPTO_OPERATION;
387 }
388
389 returnSignatureData->data = signatureData;
390 returnSignatureData->len = (uint32_t)maxLen;
391 return HCF_SUCCESS;
392 }
393
EngineDsaSignWithoutDigestDoFinal(HcfSignSpi * self,HcfBlob * data,HcfBlob * returnSignatureData)394 static HcfResult EngineDsaSignWithoutDigestDoFinal(HcfSignSpi *self, HcfBlob *data, HcfBlob *returnSignatureData)
395 {
396 if (!IsSignDoFinalInputValid(self, returnSignatureData)) {
397 return HCF_INVALID_PARAMS;
398 }
399 if (!HcfIsBlobValid(data)) {
400 LOGE("Src data is invalid.");
401 return HCF_INVALID_PARAMS;
402 }
403 HcfSignSpiDsaOpensslImpl *impl = (HcfSignSpiDsaOpensslImpl *)self;
404 if (impl->status != READY) {
405 LOGE("Not init yet.");
406 return HCF_INVALID_PARAMS;
407 }
408 size_t maxLen;
409 if (OpensslEvpPkeySign(impl->pkeyCtx, NULL, &maxLen,
410 (const unsigned char *)data->data, data->len) != HCF_OPENSSL_SUCCESS) {
411 HcfPrintOpensslError();
412 return HCF_ERR_CRYPTO_OPERATION;
413 }
414 uint8_t *signatureData = (uint8_t *)HcfMalloc(maxLen, 0);
415 if (signatureData == NULL) {
416 LOGE("Failed to allocate signatureData memory!");
417 return HCF_ERR_MALLOC;
418 }
419 size_t actualLen = maxLen;
420 if (OpensslEvpPkeySign(impl->pkeyCtx, signatureData, &actualLen,
421 (const unsigned char *)data->data, data->len) != HCF_OPENSSL_SUCCESS) {
422 HcfPrintOpensslError();
423 HcfFree(signatureData);
424 signatureData = NULL;
425 return HCF_ERR_CRYPTO_OPERATION;
426 }
427 if (actualLen > maxLen) {
428 LOGD("[error] Signature data too long.");
429 HcfFree(signatureData);
430 signatureData = NULL;
431 return HCF_ERR_CRYPTO_OPERATION;
432 }
433
434 returnSignatureData->data = signatureData;
435 returnSignatureData->len = (uint32_t)actualLen;
436 return HCF_SUCCESS;
437 }
438
EngineDsaVerifyDoFinal(HcfVerifySpi * self,HcfBlob * data,HcfBlob * signatureData)439 static bool EngineDsaVerifyDoFinal(HcfVerifySpi *self, HcfBlob *data, HcfBlob *signatureData)
440 {
441 if (!IsVerifyDoFinalInputValid(self, signatureData)) {
442 return false;
443 }
444
445 HcfVerifySpiDsaOpensslImpl *impl = (HcfVerifySpiDsaOpensslImpl *)self;
446 if (HcfIsBlobValid(data)) {
447 if (OpensslEvpDigestVerifyUpdate(impl->mdCtx, data->data, data->len) != HCF_OPENSSL_SUCCESS) {
448 LOGD("[error] Openssl update failed.");
449 HcfPrintOpensslError();
450 return false;
451 }
452 impl->status = READY;
453 }
454 if (impl->status != READY) {
455 LOGE("The message has not been transferred.");
456 return false;
457 }
458
459 if (OpensslEvpDigestVerifyFinal(impl->mdCtx, signatureData->data, signatureData->len) != HCF_OPENSSL_SUCCESS) {
460 HcfPrintOpensslError();
461 return false;
462 }
463 return true;
464 }
465
EngineDsaVerifyWithoutDigestDoFinal(HcfVerifySpi * self,HcfBlob * data,HcfBlob * signatureData)466 static bool EngineDsaVerifyWithoutDigestDoFinal(HcfVerifySpi *self, HcfBlob *data, HcfBlob *signatureData)
467 {
468 if (!IsVerifyDoFinalInputValid(self, signatureData)) {
469 return false;
470 }
471 if (!HcfIsBlobValid(data)) {
472 LOGE("Src data is invalid.");
473 return false;
474 }
475 HcfVerifySpiDsaOpensslImpl *impl = (HcfVerifySpiDsaOpensslImpl *)self;
476 if (impl->status != READY) {
477 LOGE("Not init yet.");
478 return false;
479 }
480
481 if (OpensslEvpPkeyVerify(impl->pkeyCtx, signatureData->data,
482 signatureData->len, data->data, data->len) != HCF_OPENSSL_SUCCESS) {
483 HcfPrintOpensslError();
484 return false;
485 }
486 return true;
487 }
488
EngineSetSignDsaSpecInt(HcfSignSpi * self,SignSpecItem item,int32_t saltLen)489 static HcfResult EngineSetSignDsaSpecInt(HcfSignSpi *self, SignSpecItem item, int32_t saltLen)
490 {
491 (void)self;
492 (void)item;
493 (void)saltLen;
494 return HCF_NOT_SUPPORT;
495 }
496
EngineSetVerifyDsaSpecInt(HcfVerifySpi * self,SignSpecItem item,int32_t saltLen)497 static HcfResult EngineSetVerifyDsaSpecInt(HcfVerifySpi *self, SignSpecItem item, int32_t saltLen)
498 {
499 (void)self;
500 (void)item;
501 (void)saltLen;
502 return HCF_NOT_SUPPORT;
503 }
504
EngineGetSignDsaSpecInt(HcfSignSpi * self,SignSpecItem item,int32_t * returnInt)505 static HcfResult EngineGetSignDsaSpecInt(HcfSignSpi *self, SignSpecItem item, int32_t *returnInt)
506 {
507 (void)self;
508 (void)item;
509 (void)returnInt;
510 return HCF_NOT_SUPPORT;
511 }
512
EngineGetVerifyDsaSpecInt(HcfVerifySpi * self,SignSpecItem item,int32_t * returnInt)513 static HcfResult EngineGetVerifyDsaSpecInt(HcfVerifySpi *self, SignSpecItem item, int32_t *returnInt)
514 {
515 (void)self;
516 (void)item;
517 (void)returnInt;
518 return HCF_NOT_SUPPORT;
519 }
520
EngineGetSignDsaSpecString(HcfSignSpi * self,SignSpecItem item,char ** returnString)521 static HcfResult EngineGetSignDsaSpecString(HcfSignSpi *self, SignSpecItem item, char **returnString)
522 {
523 (void)self;
524 (void)item;
525 (void)returnString;
526 return HCF_NOT_SUPPORT;
527 }
528
EngineSetSignDsaSpecUint8Array(HcfSignSpi * self,SignSpecItem item,HcfBlob blob)529 static HcfResult EngineSetSignDsaSpecUint8Array(HcfSignSpi *self, SignSpecItem item, HcfBlob blob)
530 {
531 (void)self;
532 (void)item;
533 (void)blob;
534 return HCF_NOT_SUPPORT;
535 }
536
EngineGetVerifyDsaSpecString(HcfVerifySpi * self,SignSpecItem item,char ** returnString)537 static HcfResult EngineGetVerifyDsaSpecString(HcfVerifySpi *self, SignSpecItem item, char **returnString)
538 {
539 (void)self;
540 (void)item;
541 (void)returnString;
542 return HCF_NOT_SUPPORT;
543 }
544
EngineSetVerifyDsaSpecUint8Array(HcfVerifySpi * self,SignSpecItem item,HcfBlob blob)545 static HcfResult EngineSetVerifyDsaSpecUint8Array(HcfVerifySpi *self, SignSpecItem item, HcfBlob blob)
546 {
547 (void)self;
548 (void)item;
549 (void)blob;
550 return HCF_NOT_SUPPORT;
551 }
552
HcfSignSpiDsaCreate(HcfSignatureParams * params,HcfSignSpi ** returnObj)553 HcfResult HcfSignSpiDsaCreate(HcfSignatureParams *params, HcfSignSpi **returnObj)
554 {
555 if ((params == NULL) || (returnObj == NULL)) {
556 LOGE("Invalid input parameter.");
557 return HCF_INVALID_PARAMS;
558 }
559
560 HcfSignSpiDsaOpensslImpl *impl = (HcfSignSpiDsaOpensslImpl *)HcfMalloc(sizeof(HcfSignSpiDsaOpensslImpl), 0);
561 if (impl == NULL) {
562 LOGE("Failed to allocate impl memroy!");
563 return HCF_ERR_MALLOC;
564 }
565
566 EVP_MD *digestAlg = NULL;
567
568 if (params->md == HCF_OPENSSL_DIGEST_NONE) {
569 impl->base.engineInit = EngineDsaSignWithoutDigestInit;
570 impl->base.engineUpdate = EngineDsaSignWithoutDigestUpdate;
571 impl->base.engineSign = EngineDsaSignWithoutDigestDoFinal;
572 } else {
573 HcfResult ret = GetOpensslDigestAlg(params->md, &digestAlg);
574 if (ret != HCF_SUCCESS) {
575 HcfFree(impl);
576 impl = NULL;
577 return HCF_INVALID_PARAMS;
578 }
579 impl->base.engineInit = EngineDsaSignInit;
580 impl->base.engineUpdate = EngineDsaSignUpdate;
581 impl->base.engineSign = EngineDsaSignDoFinal;
582 impl->mdCtx = OpensslEvpMdCtxNew();
583 if (impl->mdCtx == NULL) {
584 LOGE("Failed to allocate ctx memory!");
585 HcfFree(impl);
586 impl = NULL;
587 return HCF_ERR_MALLOC;
588 }
589 }
590 impl->base.base.getClass = GetDsaSignClass;
591 impl->base.base.destroy = DestroyDsaSign;
592 impl->base.engineSetSignSpecInt = EngineSetSignDsaSpecInt;
593 impl->base.engineGetSignSpecInt = EngineGetSignDsaSpecInt;
594 impl->base.engineGetSignSpecString = EngineGetSignDsaSpecString;
595 impl->base.engineSetSignSpecUint8Array = EngineSetSignDsaSpecUint8Array;
596 impl->status = UNINITIALIZED;
597 impl->digestAlg = digestAlg;
598 *returnObj = (HcfSignSpi *)impl;
599 return HCF_SUCCESS;
600 }
601
HcfVerifySpiDsaCreate(HcfSignatureParams * params,HcfVerifySpi ** returnObj)602 HcfResult HcfVerifySpiDsaCreate(HcfSignatureParams *params, HcfVerifySpi **returnObj)
603 {
604 if ((params == NULL) || (returnObj == NULL)) {
605 LOGE("Invalid input parameter.");
606 return HCF_INVALID_PARAMS;
607 }
608
609 HcfVerifySpiDsaOpensslImpl *impl = (HcfVerifySpiDsaOpensslImpl *)HcfMalloc(sizeof(HcfVerifySpiDsaOpensslImpl), 0);
610 if (impl == NULL) {
611 LOGE("Failed to allocate impl memroy!");
612 return HCF_ERR_MALLOC;
613 }
614
615 EVP_MD *digestAlg = NULL;
616 if (params->md == HCF_OPENSSL_DIGEST_NONE) {
617 impl->base.engineInit = EngineDsaVerifyWithoutDigestInit;
618 impl->base.engineUpdate = EngineDsaVerifyWithoutDigestUpdate;
619 impl->base.engineVerify = EngineDsaVerifyWithoutDigestDoFinal;
620 } else {
621 HcfResult ret = GetOpensslDigestAlg(params->md, &digestAlg);
622 if (ret != HCF_SUCCESS) {
623 HcfFree(impl);
624 impl = NULL;
625 return HCF_INVALID_PARAMS;
626 }
627 impl->base.engineInit = EngineDsaVerifyInit;
628 impl->base.engineUpdate = EngineDsaVerifyUpdate;
629 impl->base.engineVerify = EngineDsaVerifyDoFinal;
630 impl->mdCtx = OpensslEvpMdCtxNew();
631 if (impl->mdCtx == NULL) {
632 LOGE("Failed to allocate ctx memory!");
633 HcfFree(impl);
634 impl = NULL;
635 return HCF_ERR_MALLOC;
636 }
637 }
638 impl->base.base.getClass = GetDsaVerifyClass;
639 impl->base.base.destroy = DestroyDsaVerify;
640 impl->base.engineSetVerifySpecInt = EngineSetVerifyDsaSpecInt;
641 impl->base.engineGetVerifySpecInt = EngineGetVerifyDsaSpecInt;
642 impl->base.engineGetVerifySpecString = EngineGetVerifyDsaSpecString;
643 impl->base.engineSetVerifySpecUint8Array = EngineSetVerifyDsaSpecUint8Array;
644 impl->digestAlg = digestAlg;
645 impl->status = UNINITIALIZED;
646
647 *returnObj = (HcfVerifySpi *)impl;
648 return HCF_SUCCESS;
649 }