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 ((!IsClassMatch((HcfObjectBase *)self, GetDsaSignClass())) ||
71 (!IsClassMatch((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 ((!IsClassMatch((HcfObjectBase *)self, GetDsaVerifyClass())) ||
89 (!IsClassMatch((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 (!IsClassMatch((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) || (!IsBlobValid(signatureData))) {
115 LOGE("Invalid input parameter.");
116 return false;
117 }
118 if (!IsClassMatch((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 (!IsClassMatch(self, GetDsaSignClass())) {
131 return;
132 }
133 HcfSignSpiDsaOpensslImpl *impl = (HcfSignSpiDsaOpensslImpl *)self;
134 if (impl->mdCtx != NULL) {
135 Openssl_EVP_MD_CTX_free(impl->mdCtx);
136 impl->mdCtx = NULL;
137 }
138 if (impl->pkeyCtx != NULL) {
139 Openssl_EVP_PKEY_CTX_free(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 (!IsClassMatch(self, GetDsaVerifyClass())) {
151 return;
152 }
153 HcfVerifySpiDsaOpensslImpl *impl = (HcfVerifySpiDsaOpensslImpl *)self;
154 if (impl->mdCtx != NULL) {
155 Openssl_EVP_MD_CTX_free(impl->mdCtx);
156 impl->mdCtx = NULL;
157 }
158 if (impl->pkeyCtx != NULL) {
159 Openssl_EVP_PKEY_CTX_free(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 = Openssl_EVP_PKEY_new();
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 (Openssl_EVP_PKEY_set1_DSA(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 (Openssl_EVP_DigestSignInit(impl->mdCtx, NULL, impl->digestAlg, NULL, pKey) != HCF_OPENSSL_SUCCESS) {
201 HcfPrintOpensslError();
202 Openssl_EVP_PKEY_free(pKey);
203 return HCF_ERR_CRYPTO_OPERATION;
204 }
205
206 Openssl_EVP_PKEY_free(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 = Openssl_EVP_PKEY_CTX_new(pKey, NULL);
225 if (impl->pkeyCtx == NULL) {
226 HcfPrintOpensslError();
227 Openssl_EVP_PKEY_free(pKey);
228 return HCF_ERR_CRYPTO_OPERATION;
229 }
230 if (Openssl_EVP_PKEY_sign_init(impl->pkeyCtx) != HCF_OPENSSL_SUCCESS) {
231 HcfPrintOpensslError();
232 Openssl_EVP_PKEY_free(pKey);
233 Openssl_EVP_PKEY_CTX_free(impl->pkeyCtx);
234 impl->pkeyCtx = NULL;
235 return HCF_ERR_CRYPTO_OPERATION;
236 }
237 Openssl_EVP_PKEY_free(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 (Openssl_EVP_DigestVerifyInit(impl->mdCtx, NULL, impl->digestAlg, NULL, pKey) != HCF_OPENSSL_SUCCESS) {
255 HcfPrintOpensslError();
256 Openssl_EVP_PKEY_free(pKey);
257 return HCF_ERR_CRYPTO_OPERATION;
258 }
259
260 Openssl_EVP_PKEY_free(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 = Openssl_EVP_PKEY_CTX_new(pKey, NULL);
278 if (impl->pkeyCtx == NULL) {
279 HcfPrintOpensslError();
280 Openssl_EVP_PKEY_free(pKey);
281 return HCF_ERR_CRYPTO_OPERATION;
282 }
283 if (Openssl_EVP_PKEY_verify_init(impl->pkeyCtx) != HCF_OPENSSL_SUCCESS) {
284 HcfPrintOpensslError();
285 Openssl_EVP_PKEY_free(pKey);
286 Openssl_EVP_PKEY_CTX_free(impl->pkeyCtx);
287 impl->pkeyCtx = NULL;
288 return HCF_ERR_CRYPTO_OPERATION;
289 }
290 Openssl_EVP_PKEY_free(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) || (!IsBlobValid(data))) {
298 LOGE("Invalid input parameter.");
299 return HCF_INVALID_PARAMS;
300 }
301 if (!IsClassMatch((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 (Openssl_EVP_DigestSignUpdate(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_SUCCESS;
322 }
323
EngineDsaVerifyUpdate(HcfVerifySpi * self,HcfBlob * data)324 static HcfResult EngineDsaVerifyUpdate(HcfVerifySpi *self, HcfBlob *data)
325 {
326 if ((self == NULL) || (!IsBlobValid(data))) {
327 LOGE("Invalid input parameter.");
328 return HCF_INVALID_PARAMS;
329 }
330 if (!IsClassMatch((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 (Openssl_EVP_DigestVerifyUpdate(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_SUCCESS;
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 (IsBlobValid(data)) {
361 if (Openssl_EVP_DigestSignUpdate(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 (Openssl_EVP_DigestSignFinal(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 size_t actualLen = maxLen;
382 if (Openssl_EVP_DigestSignFinal(impl->mdCtx, signatureData, &actualLen) != HCF_OPENSSL_SUCCESS) {
383 HcfPrintOpensslError();
384 HcfFree(signatureData);
385 return HCF_ERR_CRYPTO_OPERATION;
386 }
387 if (actualLen > maxLen) {
388 LOGD("[error] Signature data too long.");
389 HcfFree(signatureData);
390 return HCF_ERR_CRYPTO_OPERATION;
391 }
392
393 returnSignatureData->data = signatureData;
394 returnSignatureData->len = (uint32_t)actualLen;
395 return HCF_SUCCESS;
396 }
397
EngineDsaSignWithoutDigestDoFinal(HcfSignSpi * self,HcfBlob * data,HcfBlob * returnSignatureData)398 static HcfResult EngineDsaSignWithoutDigestDoFinal(HcfSignSpi *self, HcfBlob *data, HcfBlob *returnSignatureData)
399 {
400 if (!IsSignDoFinalInputValid(self, returnSignatureData)) {
401 return HCF_INVALID_PARAMS;
402 }
403 if (!IsBlobValid(data)) {
404 LOGE("Src data is invalid.");
405 return HCF_INVALID_PARAMS;
406 }
407 HcfSignSpiDsaOpensslImpl *impl = (HcfSignSpiDsaOpensslImpl *)self;
408 if (impl->status != READY) {
409 LOGE("Not init yet.");
410 return HCF_INVALID_PARAMS;
411 }
412 size_t maxLen;
413 if (Openssl_EVP_PKEY_sign(impl->pkeyCtx, NULL, &maxLen,
414 (const unsigned char *)data->data, data->len) != HCF_OPENSSL_SUCCESS) {
415 HcfPrintOpensslError();
416 return HCF_ERR_CRYPTO_OPERATION;
417 }
418 uint8_t *signatureData = (uint8_t *)HcfMalloc(maxLen, 0);
419 if (signatureData == NULL) {
420 LOGE("Failed to allocate signatureData memory!");
421 return HCF_ERR_MALLOC;
422 }
423 size_t actualLen = maxLen;
424 if (Openssl_EVP_PKEY_sign(impl->pkeyCtx, signatureData, &actualLen,
425 (const unsigned char *)data->data, data->len) != HCF_OPENSSL_SUCCESS) {
426 HcfPrintOpensslError();
427 HcfFree(signatureData);
428 return HCF_ERR_CRYPTO_OPERATION;
429 }
430 if (actualLen > maxLen) {
431 LOGD("[error] Signature data too long.");
432 HcfFree(signatureData);
433 return HCF_ERR_CRYPTO_OPERATION;
434 }
435
436 returnSignatureData->data = signatureData;
437 returnSignatureData->len = (uint32_t)actualLen;
438 return HCF_SUCCESS;
439 }
440
EngineDsaVerifyDoFinal(HcfVerifySpi * self,HcfBlob * data,HcfBlob * signatureData)441 static bool EngineDsaVerifyDoFinal(HcfVerifySpi *self, HcfBlob *data, HcfBlob *signatureData)
442 {
443 if (!IsVerifyDoFinalInputValid(self, signatureData)) {
444 return false;
445 }
446
447 HcfVerifySpiDsaOpensslImpl *impl = (HcfVerifySpiDsaOpensslImpl *)self;
448 if (IsBlobValid(data)) {
449 if (Openssl_EVP_DigestVerifyUpdate(impl->mdCtx, data->data, data->len) != HCF_OPENSSL_SUCCESS) {
450 LOGD("[error] Openssl update failed.");
451 HcfPrintOpensslError();
452 return false;
453 }
454 impl->status = READY;
455 }
456 if (impl->status != READY) {
457 LOGE("The message has not been transferred.");
458 return false;
459 }
460
461 if (Openssl_EVP_DigestVerifyFinal(impl->mdCtx, signatureData->data, signatureData->len) != HCF_OPENSSL_SUCCESS) {
462 HcfPrintOpensslError();
463 return false;
464 }
465 return true;
466 }
467
EngineDsaVerifyWithoutDigestDoFinal(HcfVerifySpi * self,HcfBlob * data,HcfBlob * signatureData)468 static bool EngineDsaVerifyWithoutDigestDoFinal(HcfVerifySpi *self, HcfBlob *data, HcfBlob *signatureData)
469 {
470 if (!IsVerifyDoFinalInputValid(self, signatureData)) {
471 return false;
472 }
473 if (!IsBlobValid(data)) {
474 LOGE("Src data is invalid.");
475 return false;
476 }
477 HcfVerifySpiDsaOpensslImpl *impl = (HcfVerifySpiDsaOpensslImpl *)self;
478 if (impl->status != READY) {
479 LOGE("Not init yet.");
480 return false;
481 }
482
483 if (Openssl_EVP_PKEY_verify(impl->pkeyCtx, signatureData->data,
484 signatureData->len, data->data, data->len) != HCF_OPENSSL_SUCCESS) {
485 HcfPrintOpensslError();
486 return false;
487 }
488 return true;
489 }
490
EngineSetSignDsaSpecInt(HcfSignSpi * self,SignSpecItem item,int32_t saltLen)491 static HcfResult EngineSetSignDsaSpecInt(HcfSignSpi *self, SignSpecItem item, int32_t saltLen)
492 {
493 (void)self;
494 (void)item;
495 (void)saltLen;
496 return HCF_NOT_SUPPORT;
497 }
498
EngineSetVerifyDsaSpecInt(HcfVerifySpi * self,SignSpecItem item,int32_t saltLen)499 static HcfResult EngineSetVerifyDsaSpecInt(HcfVerifySpi *self, SignSpecItem item, int32_t saltLen)
500 {
501 (void)self;
502 (void)item;
503 (void)saltLen;
504 return HCF_NOT_SUPPORT;
505 }
506
EngineGetSignDsaSpecInt(HcfSignSpi * self,SignSpecItem item,int32_t * returnInt)507 static HcfResult EngineGetSignDsaSpecInt(HcfSignSpi *self, SignSpecItem item, int32_t *returnInt)
508 {
509 (void)self;
510 (void)item;
511 (void)returnInt;
512 return HCF_NOT_SUPPORT;
513 }
514
EngineGetVerifyDsaSpecInt(HcfVerifySpi * self,SignSpecItem item,int32_t * returnInt)515 static HcfResult EngineGetVerifyDsaSpecInt(HcfVerifySpi *self, SignSpecItem item, int32_t *returnInt)
516 {
517 (void)self;
518 (void)item;
519 (void)returnInt;
520 return HCF_NOT_SUPPORT;
521 }
522
EngineGetSignDsaSpecString(HcfSignSpi * self,SignSpecItem item,char ** returnString)523 static HcfResult EngineGetSignDsaSpecString(HcfSignSpi *self, SignSpecItem item, char **returnString)
524 {
525 (void)self;
526 (void)item;
527 (void)returnString;
528 return HCF_NOT_SUPPORT;
529 }
530
EngineSetSignDsaSpecUint8Array(HcfSignSpi * self,SignSpecItem item,HcfBlob blob)531 static HcfResult EngineSetSignDsaSpecUint8Array(HcfSignSpi *self, SignSpecItem item, HcfBlob blob)
532 {
533 (void)self;
534 (void)item;
535 (void)blob;
536 return HCF_NOT_SUPPORT;
537 }
538
EngineGetVerifyDsaSpecString(HcfVerifySpi * self,SignSpecItem item,char ** returnString)539 static HcfResult EngineGetVerifyDsaSpecString(HcfVerifySpi *self, SignSpecItem item, char **returnString)
540 {
541 (void)self;
542 (void)item;
543 (void)returnString;
544 return HCF_NOT_SUPPORT;
545 }
546
EngineSetVerifyDsaSpecUint8Array(HcfVerifySpi * self,SignSpecItem item,HcfBlob blob)547 static HcfResult EngineSetVerifyDsaSpecUint8Array(HcfVerifySpi *self, SignSpecItem item, HcfBlob blob)
548 {
549 (void)self;
550 (void)item;
551 (void)blob;
552 return HCF_NOT_SUPPORT;
553 }
554
HcfSignSpiDsaCreate(HcfSignatureParams * params,HcfSignSpi ** returnObj)555 HcfResult HcfSignSpiDsaCreate(HcfSignatureParams *params, HcfSignSpi **returnObj)
556 {
557 if ((params == NULL) || (returnObj == NULL)) {
558 LOGE("Invalid input parameter.");
559 return HCF_INVALID_PARAMS;
560 }
561
562 HcfSignSpiDsaOpensslImpl *impl = (HcfSignSpiDsaOpensslImpl *)HcfMalloc(sizeof(HcfSignSpiDsaOpensslImpl), 0);
563 if (impl == NULL) {
564 LOGE("Failed to allocate impl memroy!");
565 return HCF_ERR_MALLOC;
566 }
567
568 EVP_MD *digestAlg = NULL;
569
570 if (params->md == HCF_OPENSSL_DIGEST_NONE) {
571 impl->base.engineInit = EngineDsaSignWithoutDigestInit;
572 impl->base.engineUpdate = EngineDsaSignWithoutDigestUpdate;
573 impl->base.engineSign = EngineDsaSignWithoutDigestDoFinal;
574 } else {
575 HcfResult ret = GetOpensslDigestAlg(params->md, &digestAlg);
576 if (ret != HCF_SUCCESS) {
577 HcfFree(impl);
578 return HCF_INVALID_PARAMS;
579 }
580 impl->base.engineInit = EngineDsaSignInit;
581 impl->base.engineUpdate = EngineDsaSignUpdate;
582 impl->base.engineSign = EngineDsaSignDoFinal;
583 impl->mdCtx = Openssl_EVP_MD_CTX_new();
584 if (impl->mdCtx == NULL) {
585 LOGE("Failed to allocate ctx memory!");
586 HcfFree(impl);
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 return HCF_INVALID_PARAMS;
624 }
625 impl->base.engineInit = EngineDsaVerifyInit;
626 impl->base.engineUpdate = EngineDsaVerifyUpdate;
627 impl->base.engineVerify = EngineDsaVerifyDoFinal;
628 impl->mdCtx = Openssl_EVP_MD_CTX_new();
629 if (impl->mdCtx == NULL) {
630 LOGE("Failed to allocate ctx memory!");
631 HcfFree(impl);
632 return HCF_ERR_MALLOC;
633 }
634 }
635 impl->base.base.getClass = GetDsaVerifyClass;
636 impl->base.base.destroy = DestroyDsaVerify;
637 impl->base.engineSetVerifySpecInt = EngineSetVerifyDsaSpecInt;
638 impl->base.engineGetVerifySpecInt = EngineGetVerifyDsaSpecInt;
639 impl->base.engineGetVerifySpecString = EngineGetVerifyDsaSpecString;
640 impl->base.engineSetVerifySpecUint8Array = EngineSetVerifyDsaSpecUint8Array;
641 impl->digestAlg = digestAlg;
642 impl->status = UNINITIALIZED;
643
644 *returnObj = (HcfVerifySpi *)impl;
645 return HCF_SUCCESS;
646 }