• 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 "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 }