• 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 ((!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 }