• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * This file is part of the openHiTLS project.
3  *
4  * openHiTLS is licensed under the Mulan PSL v2.
5  * You can use this software according to the terms and conditions of the Mulan PSL v2.
6  * You may obtain a copy of Mulan PSL v2 at:
7  *
8  *     http://license.coscl.org.cn/MulanPSL2
9  *
10  * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
11  * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
12  * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
13  * See the Mulan PSL v2 for more details.
14  */
15 
16 #include "hitls_build.h"
17 #if defined(HITLS_CRYPTO_EAL) && defined(HITLS_CRYPTO_PKEY)
18 
19 #include <stdlib.h>
20 #include <stdbool.h>
21 #include "securec.h"
22 #include "eal_pkey_local.h"
23 #include "crypt_eal_pkey.h"
24 #include "crypt_errno.h"
25 #include "crypt_algid.h"
26 #include "crypt_local_types.h"
27 #include "crypt_types.h"
28 #include "bsl_sal.h"
29 #include "bsl_err_internal.h"
30 #include "crypt_utils.h"
31 #include "eal_md_local.h"
32 #include "eal_common.h"
33 #include "crypt_eal_implprovider.h"
34 #include "crypt_ealinit.h"
35 #include "bsl_err_internal.h"
36 #include "crypt_provider.h"
37 #include "bsl_params.h"
38 #include "crypt_params_key.h"
39 #include "eal_pkey.h"
40 
EalPkeyCopyMethod(const EAL_PkeyMethod * method,EAL_PkeyUnitaryMethod * dest)41 static void EalPkeyCopyMethod(const EAL_PkeyMethod *method, EAL_PkeyUnitaryMethod *dest)
42 {
43     dest->newCtx = method->newCtx;
44     dest->dupCtx = method->dupCtx;
45     dest->freeCtx = method->freeCtx;
46     dest->setPara = method->setPara;
47     dest->getPara = method->getPara;
48     dest->gen = method->gen;
49     dest->ctrl = method->ctrl;
50     dest->setPub = method->setPub;
51     dest->setPrv = method->setPrv;
52     dest->getPub = method->getPub;
53     dest->getPrv = method->getPrv;
54     dest->sign = method->sign;
55     dest->signData = method->signData;
56     dest->verify = method->verify;
57     dest->verifyData = method->verifyData;
58     dest->recover = method->recover;
59     dest->computeShareKey = method->computeShareKey;
60     dest->encrypt = method->encrypt;
61     dest->decrypt = method->decrypt;
62     dest->check = method->check;
63     dest->cmp = method->cmp;
64     dest->encaps = method->encaps;
65     dest->decaps = method->decaps;
66     dest->blind = method->blind;
67     dest->unBlind = method->unBlind;
68 }
69 
PkeyNewDefaultCtx(CRYPT_PKEY_AlgId id)70 CRYPT_EAL_PkeyCtx *PkeyNewDefaultCtx(CRYPT_PKEY_AlgId id)
71 {
72     /* Obtain the method based on the algorithm ID. */
73     const EAL_PkeyMethod *method = CRYPT_EAL_PkeyFindMethod(id);
74     if (method == NULL) {
75         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, id, CRYPT_EAL_ERR_ALGID);
76         return NULL;
77     }
78     EAL_PkeyUnitaryMethod *temp = BSL_SAL_Calloc(1, sizeof(EAL_PkeyUnitaryMethod));
79     if (temp == NULL) {
80         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, id, CRYPT_MEM_ALLOC_FAIL);
81         return NULL;
82     }
83     EalPkeyCopyMethod(method, temp);
84     /* Resource application and initialization */
85     CRYPT_EAL_PkeyCtx *pkey = BSL_SAL_Calloc(1, sizeof(CRYPT_EAL_PkeyCtx));
86     if (pkey == NULL) {
87         BSL_SAL_FREE(temp);
88         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, id, CRYPT_MEM_ALLOC_FAIL);
89         return NULL;
90     }
91     pkey->key = method->newCtx();
92     if (pkey->key == NULL) {
93         BSL_SAL_FREE(temp);
94         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, id, CRYPT_MEM_ALLOC_FAIL);
95         goto ERR;
96     }
97     pkey->method = temp;
98     pkey->id = id;
99     BSL_SAL_ReferencesInit(&(pkey->references));
100     return pkey;
101 ERR:
102     CRYPT_EAL_PkeyFreeCtx(pkey);
103     return NULL;
104 }
105 
CRYPT_EAL_PkeyNewCtx(CRYPT_PKEY_AlgId id)106 CRYPT_EAL_PkeyCtx *CRYPT_EAL_PkeyNewCtx(CRYPT_PKEY_AlgId id)
107 {
108 #ifdef HITLS_CRYPTO_ASM_CHECK
109     if (CRYPT_ASMCAP_Pkey(id) != CRYPT_SUCCESS) {
110         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, id, CRYPT_EAL_ALG_ASM_NOT_SUPPORT);
111         return NULL;
112     }
113 #endif
114     return PkeyNewDefaultCtx(id);
115 }
116 
117 
PkeyCopyCtx(CRYPT_EAL_PkeyCtx * to,const CRYPT_EAL_PkeyCtx * from)118 static int32_t PkeyCopyCtx(CRYPT_EAL_PkeyCtx *to, const CRYPT_EAL_PkeyCtx *from)
119 {
120     if (from->method == NULL || from->method->dupCtx == NULL) {
121         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, from->id, CRYPT_EAL_ALG_NOT_SUPPORT);
122         return CRYPT_EAL_ALG_NOT_SUPPORT;
123     }
124     EAL_PkeyUnitaryMethod *temp = to->method;
125     (void)memcpy_s(to, sizeof(CRYPT_EAL_PkeyCtx), from, sizeof(CRYPT_EAL_PkeyCtx));
126     to->key = from->method->dupCtx(from->key);
127     if (to->key == NULL) {
128         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, from->id, CRYPT_EAL_PKEY_DUP_ERROR);
129         return CRYPT_EAL_PKEY_DUP_ERROR;
130     }
131     if (temp == NULL) {
132         temp = BSL_SAL_Calloc(1, sizeof(EAL_PkeyUnitaryMethod));
133         if (temp == NULL) {
134             from->method->freeCtx(to->key);
135             to->key = NULL;
136             EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, from->id, CRYPT_MEM_ALLOC_FAIL);
137             return CRYPT_MEM_ALLOC_FAIL;
138         }
139     }
140     to->method = temp;
141     *(EAL_PkeyUnitaryMethod *)(uintptr_t)to->method = *from->method;
142     BSL_SAL_ReferencesInit(&(to->references));
143     return CRYPT_SUCCESS;
144 }
145 
CRYPT_EAL_PkeyCopyCtx(CRYPT_EAL_PkeyCtx * to,const CRYPT_EAL_PkeyCtx * from)146 int32_t CRYPT_EAL_PkeyCopyCtx(CRYPT_EAL_PkeyCtx *to, const CRYPT_EAL_PkeyCtx *from)
147 {
148     if (to == NULL || from == NULL) {
149         BSL_ERR_PUSH_ERROR(CRYPT_NULL_INPUT);
150         return CRYPT_NULL_INPUT;
151     }
152     if (to->key != NULL) {
153         if (to->method->freeCtx == NULL) {
154             BSL_ERR_PUSH_ERROR(CRYPT_INVALID_ARG);
155             return CRYPT_INVALID_ARG;
156         }
157         to->method->freeCtx(to->key);
158         to->key = NULL;
159     }
160     BSL_SAL_ReferencesFree(&(to->references));
161     return PkeyCopyCtx(to, from);
162 }
163 
CRYPT_EAL_PkeyDupCtx(const CRYPT_EAL_PkeyCtx * pkey)164 CRYPT_EAL_PkeyCtx *CRYPT_EAL_PkeyDupCtx(const CRYPT_EAL_PkeyCtx *pkey)
165 {
166     if (pkey == NULL) {
167         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, CRYPT_PKEY_MAX, CRYPT_NULL_INPUT);
168         return NULL;
169     }
170 
171     CRYPT_EAL_PkeyCtx *newPkey = BSL_SAL_Calloc(1, sizeof(CRYPT_EAL_PkeyCtx));
172     if (newPkey == NULL) {
173         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, pkey->id, CRYPT_MEM_ALLOC_FAIL);
174         return NULL;
175     }
176 
177     if (PkeyCopyCtx(newPkey, pkey) != CRYPT_SUCCESS) {
178         BSL_SAL_FREE(newPkey);
179         return NULL;
180     }
181     return newPkey;
182 }
183 
CRYPT_EAL_PkeyFreeCtx(CRYPT_EAL_PkeyCtx * pkey)184 void CRYPT_EAL_PkeyFreeCtx(CRYPT_EAL_PkeyCtx *pkey)
185 {
186     if (pkey == NULL) {
187         return;
188     }
189     if (pkey->method == NULL || pkey->method->freeCtx == NULL) {
190         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, pkey->id, CRYPT_EAL_ALG_NOT_SUPPORT);
191         BSL_SAL_ReferencesFree(&(pkey->references));
192         BSL_SAL_FREE(pkey->method);
193         BSL_SAL_FREE(pkey);
194         return;
195     }
196     int ref = 0;
197     BSL_SAL_AtomicDownReferences(&(pkey->references), &ref);
198     if (ref > 0) {
199         return;
200     }
201     EAL_EventReport(CRYPT_EVENT_ZERO, CRYPT_ALGO_PKEY, pkey->id, CRYPT_SUCCESS);
202     BSL_SAL_ReferencesFree(&(pkey->references));
203     pkey->method->freeCtx(pkey->key);
204     BSL_SAL_FREE(pkey->method);
205     BSL_SAL_FREE(pkey);
206     return;
207 }
208 
ParaIsVaild(const CRYPT_EAL_PkeyCtx * pkey,const CRYPT_EAL_PkeyPara * para)209 static int32_t ParaIsVaild(const CRYPT_EAL_PkeyCtx *pkey, const CRYPT_EAL_PkeyPara *para)
210 {
211     bool isInputValid = (pkey == NULL) || (para == NULL);
212     if (isInputValid) {
213         BSL_ERR_PUSH_ERROR(CRYPT_NULL_INPUT);
214         return CRYPT_NULL_INPUT;
215     }
216 
217     if (pkey->id != para->id) {
218         BSL_ERR_PUSH_ERROR(CRYPT_EAL_ERR_ALGID);
219         return CRYPT_EAL_ERR_ALGID;
220     }
221     return CRYPT_SUCCESS;
222 }
223 
SetDsaParams(CRYPT_EAL_PkeyCtx * pkey,const CRYPT_DsaPara * dsaPara)224 static int32_t SetDsaParams(CRYPT_EAL_PkeyCtx *pkey, const CRYPT_DsaPara *dsaPara)
225 {
226     BSL_Param param[4] = {
227         {CRYPT_PARAM_DSA_P, BSL_PARAM_TYPE_OCTETS, dsaPara->p, dsaPara->pLen, 0},
228         {CRYPT_PARAM_DSA_Q, BSL_PARAM_TYPE_OCTETS, dsaPara->q, dsaPara->qLen, 0},
229         {CRYPT_PARAM_DSA_G, BSL_PARAM_TYPE_OCTETS, dsaPara->g, dsaPara->gLen, 0},
230         BSL_PARAM_END
231     };
232     return pkey->method->setPara(pkey->key, param);
233 }
234 
SetRsaParams(CRYPT_EAL_PkeyCtx * pkey,const CRYPT_RsaPara * rsaPara)235 static int32_t SetRsaParams(CRYPT_EAL_PkeyCtx *pkey, const CRYPT_RsaPara *rsaPara)
236 {
237     uint32_t bits = rsaPara->bits;
238     BSL_Param param[3] = {
239         {CRYPT_PARAM_RSA_E, BSL_PARAM_TYPE_OCTETS, rsaPara->e, rsaPara->eLen, 0},
240         {CRYPT_PARAM_RSA_BITS, BSL_PARAM_TYPE_UINT32, &bits, sizeof(bits), 0},
241         BSL_PARAM_END
242     };
243     return pkey->method->setPara(pkey->key, param);
244 }
245 
SetDhParams(CRYPT_EAL_PkeyCtx * pkey,const CRYPT_DhPara * dhPara)246 static int32_t SetDhParams(CRYPT_EAL_PkeyCtx *pkey, const CRYPT_DhPara *dhPara)
247 {
248     BSL_Param param[4] = {
249         {CRYPT_PARAM_DH_P, BSL_PARAM_TYPE_OCTETS, dhPara->p, dhPara->pLen, 0},
250         {CRYPT_PARAM_DH_Q, BSL_PARAM_TYPE_OCTETS, dhPara->q, dhPara->qLen, 0},
251         {CRYPT_PARAM_DH_G, BSL_PARAM_TYPE_OCTETS, dhPara->g, dhPara->gLen, 0},
252         BSL_PARAM_END
253     };
254     return pkey->method->setPara(pkey->key, param);
255 }
256 
SetEccParams(CRYPT_EAL_PkeyCtx * pkey,const CRYPT_EccPara * eccPara)257 static int32_t SetEccParams(CRYPT_EAL_PkeyCtx *pkey, const CRYPT_EccPara *eccPara)
258 {
259     BSL_Param param[8] = {
260         {CRYPT_PARAM_EC_P, BSL_PARAM_TYPE_OCTETS, eccPara->p, eccPara->pLen, 0},
261         {CRYPT_PARAM_EC_A, BSL_PARAM_TYPE_OCTETS, eccPara->a, eccPara->aLen, 0},
262         {CRYPT_PARAM_EC_B, BSL_PARAM_TYPE_OCTETS, eccPara->b, eccPara->bLen, 0},
263         {CRYPT_PARAM_EC_N, BSL_PARAM_TYPE_OCTETS, eccPara->n, eccPara->nLen, 0},
264         {CRYPT_PARAM_EC_H, BSL_PARAM_TYPE_OCTETS, eccPara->h, eccPara->hLen, 0},
265         {CRYPT_PARAM_EC_X, BSL_PARAM_TYPE_OCTETS, eccPara->x, eccPara->xLen, 0},
266         {CRYPT_PARAM_EC_Y, BSL_PARAM_TYPE_OCTETS, eccPara->y, eccPara->yLen, 0},
267         BSL_PARAM_END
268     };
269     return pkey->method->setPara(pkey->key, param);
270 }
271 
SetPaillierParams(CRYPT_EAL_PkeyCtx * pkey,const CRYPT_PaillierPara * paillierPara)272 static int32_t SetPaillierParams(CRYPT_EAL_PkeyCtx *pkey, const CRYPT_PaillierPara *paillierPara)
273 {
274     uint32_t bits = paillierPara->bits;
275     BSL_Param param[4] = {
276         {CRYPT_PARAM_PAILLIER_P, BSL_PARAM_TYPE_OCTETS, paillierPara->p, paillierPara->pLen, 0},
277         {CRYPT_PARAM_PAILLIER_Q, BSL_PARAM_TYPE_OCTETS, paillierPara->q, paillierPara->qLen, 0},
278         {CRYPT_PARAM_PAILLIER_BITS, BSL_PARAM_TYPE_UINT32, &bits, sizeof(bits), 0},
279         BSL_PARAM_END
280     };
281     return pkey->method->setPara(pkey->key, param);
282 }
283 
SetElGamalParams(CRYPT_EAL_PkeyCtx * pkey,const CRYPT_ElGamalPara * elgamalPara)284 static int32_t SetElGamalParams(CRYPT_EAL_PkeyCtx *pkey, const CRYPT_ElGamalPara *elgamalPara)
285 {
286     uint32_t bits = elgamalPara->bits;
287     uint32_t k_bits = elgamalPara->k_bits;
288     BSL_Param param[4] = {
289         {CRYPT_PARAM_ELGAMAL_Q, BSL_PARAM_TYPE_OCTETS, elgamalPara->q, elgamalPara->qLen, 0},
290         {CRYPT_PARAM_ELGAMAL_BITS, BSL_PARAM_TYPE_UINT32, &bits, sizeof(bits), 0},
291         {CRYPT_PARAM_ELGAMAL_KBITS, BSL_PARAM_TYPE_UINT32, &k_bits, sizeof(k_bits), 0},
292         BSL_PARAM_END
293     };
294     return pkey->method->setPara(pkey->key, param);
295 }
296 
GetDsaParams(const CRYPT_EAL_PkeyCtx * pkey,CRYPT_DsaPara * dsaPara)297 static int32_t GetDsaParams(const CRYPT_EAL_PkeyCtx *pkey, CRYPT_DsaPara *dsaPara)
298 {
299     BSL_Param param[4] = {
300         {CRYPT_PARAM_DSA_P, BSL_PARAM_TYPE_OCTETS, dsaPara->p, dsaPara->pLen, 0},
301         {CRYPT_PARAM_DSA_Q, BSL_PARAM_TYPE_OCTETS, dsaPara->q, dsaPara->qLen, 0},
302         {CRYPT_PARAM_DSA_G, BSL_PARAM_TYPE_OCTETS, dsaPara->g, dsaPara->gLen, 0},
303         BSL_PARAM_END
304     };
305     int32_t ret = pkey->method->getPara(pkey->key, param);
306     if (ret == CRYPT_SUCCESS) {
307         dsaPara->pLen = param[0].useLen;
308         dsaPara->qLen = param[1].useLen;
309         dsaPara->gLen = param[2].useLen;
310     }
311     return ret;
312 }
313 
GetDhParams(const CRYPT_EAL_PkeyCtx * pkey,CRYPT_DhPara * dhPara)314 static int32_t GetDhParams(const CRYPT_EAL_PkeyCtx *pkey, CRYPT_DhPara *dhPara)
315 {
316     BSL_Param param[4] = {
317         {CRYPT_PARAM_DH_P, BSL_PARAM_TYPE_OCTETS, dhPara->p, dhPara->pLen, 0},
318         {CRYPT_PARAM_DH_Q, BSL_PARAM_TYPE_OCTETS, dhPara->q, dhPara->qLen, 0},
319         {CRYPT_PARAM_DH_G, BSL_PARAM_TYPE_OCTETS, dhPara->g, dhPara->gLen, 0},
320         BSL_PARAM_END
321     };
322     int32_t ret = pkey->method->getPara(pkey->key, param);
323     if (ret == CRYPT_SUCCESS) {
324         dhPara->pLen = param[0].useLen;
325         dhPara->qLen = param[1].useLen;
326         dhPara->gLen = param[2].useLen;
327     }
328     return ret;
329 }
330 
GetEccParams(const CRYPT_EAL_PkeyCtx * pkey,CRYPT_EccPara * eccPara)331 static int32_t GetEccParams(const CRYPT_EAL_PkeyCtx *pkey, CRYPT_EccPara *eccPara)
332 {
333     BSL_Param param[8] = {
334         {CRYPT_PARAM_EC_P, BSL_PARAM_TYPE_OCTETS, eccPara->p, eccPara->pLen, 0},
335         {CRYPT_PARAM_EC_A, BSL_PARAM_TYPE_OCTETS, eccPara->a, eccPara->aLen, 0},
336         {CRYPT_PARAM_EC_B, BSL_PARAM_TYPE_OCTETS, eccPara->b, eccPara->bLen, 0},
337         {CRYPT_PARAM_EC_N, BSL_PARAM_TYPE_OCTETS, eccPara->n, eccPara->nLen, 0},
338         {CRYPT_PARAM_EC_H, BSL_PARAM_TYPE_OCTETS, eccPara->h, eccPara->hLen, 0},
339         {CRYPT_PARAM_EC_X, BSL_PARAM_TYPE_OCTETS, eccPara->x, eccPara->xLen, 0},
340         {CRYPT_PARAM_EC_Y, BSL_PARAM_TYPE_OCTETS, eccPara->y, eccPara->yLen, 0},
341         BSL_PARAM_END
342     };
343     int32_t ret = pkey->method->getPara(pkey->key, param);
344     if (ret == CRYPT_SUCCESS) {
345         eccPara->pLen = param[0].useLen;
346         eccPara->aLen = param[1].useLen;
347         eccPara->bLen = param[2].useLen;
348         eccPara->nLen = param[3].useLen;
349         eccPara->hLen = param[4].useLen;
350         eccPara->xLen = param[5].useLen;
351         eccPara->yLen = param[6].useLen;
352     }
353     return ret;
354 }
355 
CvtBslParamAndSetParams(CRYPT_EAL_PkeyCtx * pkey,const CRYPT_EAL_PkeyPara * para)356 static int32_t CvtBslParamAndSetParams(CRYPT_EAL_PkeyCtx *pkey, const CRYPT_EAL_PkeyPara *para)
357 {
358     int32_t ret = CRYPT_NOT_SUPPORT;
359     switch (pkey->id) {
360         case CRYPT_PKEY_DSA:
361             ret = SetDsaParams(pkey, &para->para.dsaPara);
362             break;
363         case CRYPT_PKEY_RSA:
364             ret = SetRsaParams(pkey, &para->para.rsaPara);
365             break;
366         case CRYPT_PKEY_DH:
367             ret = SetDhParams(pkey, &para->para.dhPara);
368             break;
369         case CRYPT_PKEY_ECDSA:
370         case CRYPT_PKEY_ECDH:
371             ret =  SetEccParams(pkey, &para->para.eccPara);
372             break;
373         case CRYPT_PKEY_PAILLIER:
374             ret = SetPaillierParams(pkey, &para->para.paillierPara);
375             break;
376          case CRYPT_PKEY_ELGAMAL:
377             ret = SetElGamalParams(pkey, &para->para.elgamalPara);
378             break;
379         case CRYPT_PKEY_ED25519:
380         case CRYPT_PKEY_X25519:
381         case CRYPT_PKEY_SM2:
382         default:
383             return CRYPT_NOT_SUPPORT;
384     }
385     if (ret != CRYPT_SUCCESS) {
386         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, pkey->id, ret);
387     }
388     return ret;
389 }
390 
CvtBslParamAndGetParams(const CRYPT_EAL_PkeyCtx * pkey,CRYPT_EAL_PkeyPara * para)391 static int32_t CvtBslParamAndGetParams(const CRYPT_EAL_PkeyCtx *pkey, CRYPT_EAL_PkeyPara *para)
392 {
393     int32_t ret = CRYPT_NOT_SUPPORT;
394     switch (pkey->id) {
395         case CRYPT_PKEY_DSA:
396             ret =  GetDsaParams(pkey, &para->para.dsaPara);
397             break;
398         case CRYPT_PKEY_DH:
399             ret =  GetDhParams(pkey, &para->para.dhPara);
400             break;
401         case CRYPT_PKEY_ECDSA:
402         case CRYPT_PKEY_ECDH:
403             ret =  GetEccParams(pkey, &para->para.eccPara);
404             break;
405         case CRYPT_PKEY_PAILLIER:
406         case CRYPT_PKEY_ELGAMAL:
407         case CRYPT_PKEY_RSA:
408         case CRYPT_PKEY_ED25519:
409         case CRYPT_PKEY_X25519:
410         case CRYPT_PKEY_SM2:
411         default:
412             return CRYPT_NOT_SUPPORT;
413     }
414     if (ret != CRYPT_SUCCESS) {
415         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, pkey->id, ret);
416     }
417     return ret;
418 }
419 
CRYPT_EAL_PkeySetPara(CRYPT_EAL_PkeyCtx * pkey,const CRYPT_EAL_PkeyPara * para)420 int32_t CRYPT_EAL_PkeySetPara(CRYPT_EAL_PkeyCtx *pkey, const CRYPT_EAL_PkeyPara *para)
421 {
422     int32_t ret;
423     ret = ParaIsVaild(pkey, para);
424     if (ret != CRYPT_SUCCESS) {
425         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, CRYPT_PKEY_MAX, ret);
426         return ret;
427     }
428 
429     if (pkey->method == NULL || pkey->method->setPara == NULL) {
430         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, pkey->id, CRYPT_EAL_ALG_NOT_SUPPORT);
431         return CRYPT_EAL_ALG_NOT_SUPPORT;
432     }
433     ret = CvtBslParamAndSetParams(pkey, para);
434     if (ret != CRYPT_SUCCESS) {
435         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, pkey->id, ret);
436     }
437     return ret;
438 }
439 
CRYPT_EAL_PkeyGetPara(const CRYPT_EAL_PkeyCtx * pkey,CRYPT_EAL_PkeyPara * para)440 int32_t CRYPT_EAL_PkeyGetPara(const CRYPT_EAL_PkeyCtx *pkey, CRYPT_EAL_PkeyPara *para)
441 {
442     int32_t ret;
443     ret = ParaIsVaild(pkey, para);
444     if (ret != CRYPT_SUCCESS) {
445         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, CRYPT_PKEY_MAX, ret);
446         return ret;
447     }
448 
449     if (pkey->method == NULL || pkey->method->getPara == NULL) {
450         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, pkey->id, CRYPT_EAL_ALG_NOT_SUPPORT);
451         return CRYPT_EAL_ALG_NOT_SUPPORT;
452     }
453     ret = CvtBslParamAndGetParams(pkey, para);
454     if (ret != CRYPT_SUCCESS) {
455         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, pkey->id, ret);
456     }
457     return ret;
458 }
459 
CRYPT_EAL_PkeyCtrl(CRYPT_EAL_PkeyCtx * pkey,int32_t opt,void * val,uint32_t len)460 int32_t CRYPT_EAL_PkeyCtrl(CRYPT_EAL_PkeyCtx *pkey, int32_t opt, void *val, uint32_t len)
461 {
462     if (pkey == NULL) {
463         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, CRYPT_PKEY_MAX, CRYPT_NULL_INPUT);
464         return CRYPT_NULL_INPUT;
465     }
466     if (pkey->method == NULL || pkey->method->ctrl == NULL) {
467         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, pkey->id, CRYPT_EAL_ALG_NOT_SUPPORT);
468         return CRYPT_EAL_ALG_NOT_SUPPORT;
469     }
470 
471     int32_t ret = pkey->method->ctrl(pkey->key, opt, val, len);
472     if (ret != CRYPT_SUCCESS) {
473         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, pkey->id, ret);
474     }
475     return ret;
476 }
477 
CRYPT_EAL_PkeySetParaById(CRYPT_EAL_PkeyCtx * pkey,CRYPT_PKEY_ParaId id)478 int32_t CRYPT_EAL_PkeySetParaById(CRYPT_EAL_PkeyCtx *pkey, CRYPT_PKEY_ParaId id)
479 {
480     return CRYPT_EAL_PkeyCtrl(pkey, CRYPT_CTRL_SET_PARA_BY_ID, &id, sizeof(id));
481 }
482 
CRYPT_EAL_PkeyGen(CRYPT_EAL_PkeyCtx * pkey)483 int32_t CRYPT_EAL_PkeyGen(CRYPT_EAL_PkeyCtx *pkey)
484 {
485     int32_t ret;
486     if (pkey == NULL) {
487         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, CRYPT_PKEY_MAX, CRYPT_NULL_INPUT);
488         return CRYPT_NULL_INPUT;
489     }
490 
491     if (pkey->method == NULL || pkey->method->gen == NULL) {
492         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, pkey->id, CRYPT_EAL_ALG_NOT_SUPPORT);
493         return CRYPT_EAL_ALG_NOT_SUPPORT;
494     }
495     /* Invoke the algorithm entity to generate a key pair. */
496     ret = pkey->method->gen(pkey->key);
497     if (ret != CRYPT_SUCCESS) {
498         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, pkey->id, ret);
499         return ret;
500     }
501 
502     EAL_EventReport(CRYPT_EVENT_GEN, CRYPT_ALGO_PKEY, pkey->id, CRYPT_SUCCESS);
503     return CRYPT_SUCCESS;
504 }
505 
PriAndPubParamIsValid(const CRYPT_EAL_PkeyCtx * pkey,const void * key,bool isPriKey)506 static int32_t PriAndPubParamIsValid(const CRYPT_EAL_PkeyCtx *pkey, const void *key, bool isPriKey)
507 {
508     bool isInputValid = (pkey == NULL) || (key == NULL);
509     if (isInputValid) {
510         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, CRYPT_PKEY_MAX, CRYPT_NULL_INPUT);
511         return CRYPT_NULL_INPUT;
512     }
513 
514     // false indicates the public key path, and true indicates the private key path
515     if (isPriKey == false) {
516         CRYPT_EAL_PkeyPub *keyParam = (CRYPT_EAL_PkeyPub *)(uintptr_t)key;
517         if (keyParam->id != pkey->id) {
518             EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, pkey->id, CRYPT_EAL_ERR_ALGID);
519             return CRYPT_EAL_ERR_ALGID;
520         }
521     } else {
522         CRYPT_EAL_PkeyPrv *keyParam = (CRYPT_EAL_PkeyPrv *)(uintptr_t)key;
523         if (keyParam->id != pkey->id) {
524             EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, pkey->id, CRYPT_EAL_ERR_ALGID);
525             return CRYPT_EAL_ERR_ALGID;
526         }
527     }
528 
529     return CRYPT_SUCCESS;
530 }
531 
CRYPT_EAL_PkeySetPub(CRYPT_EAL_PkeyCtx * pkey,const CRYPT_EAL_PkeyPub * key)532 int32_t CRYPT_EAL_PkeySetPub(CRYPT_EAL_PkeyCtx *pkey, const CRYPT_EAL_PkeyPub *key)
533 {
534     int32_t ret = PriAndPubParamIsValid(pkey, key, false);
535     if (ret != CRYPT_SUCCESS) {
536         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, (pkey == NULL) ? CRYPT_PKEY_MAX : pkey->id, ret);
537         return ret;
538     }
539     if (pkey->method == NULL || pkey->method->setPub == NULL) {
540         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, pkey->id, CRYPT_EAL_ALG_NOT_SUPPORT);
541         return CRYPT_EAL_ALG_NOT_SUPPORT;
542     }
543 
544     switch (key->id) {
545         case CRYPT_PKEY_RSA: {
546             BSL_Param rsa[3] = {{CRYPT_PARAM_RSA_E, BSL_PARAM_TYPE_OCTETS, key->key.rsaPub.e, key->key.rsaPub.eLen, 0},
547                 {CRYPT_PARAM_RSA_N, BSL_PARAM_TYPE_OCTETS, key->key.rsaPub.n, key->key.rsaPub.nLen, 0}, BSL_PARAM_END};
548             ret = pkey->method->setPub(pkey->key, &rsa);
549             break;
550         }
551         case CRYPT_PKEY_DSA: {
552             BSL_Param dsa[2] = {{CRYPT_PARAM_DSA_PUBKEY, BSL_PARAM_TYPE_OCTETS, key->key.dsaPub.data,
553                 key->key.dsaPub.len, 0}, BSL_PARAM_END};
554             ret = pkey->method->setPub(pkey->key, &dsa);
555             break;
556         }
557         case CRYPT_PKEY_ED25519:
558         case CRYPT_PKEY_X25519: {
559             BSL_Param para[2] = {{CRYPT_PARAM_CURVE25519_PUBKEY, BSL_PARAM_TYPE_OCTETS, key->key.curve25519Pub.data,
560                 key->key.curve25519Pub.len, 0}, BSL_PARAM_END};
561             ret = pkey->method->setPub(pkey->key, &para);
562             break;
563         }
564         case CRYPT_PKEY_DH: {
565             BSL_Param dhParam[2] = {{CRYPT_PARAM_DH_PUBKEY, BSL_PARAM_TYPE_OCTETS, key->key.dhPub.data,
566                 key->key.dhPub.len, 0}, BSL_PARAM_END};
567             ret = pkey->method->setPub(pkey->key, &dhParam);
568             break;
569         }
570         case CRYPT_PKEY_ECDH:
571         case CRYPT_PKEY_ECDSA:
572         case CRYPT_PKEY_SM2: {
573             BSL_Param ecParam[2] = {{CRYPT_PARAM_EC_PUBKEY, BSL_PARAM_TYPE_OCTETS, key->key.eccPub.data,
574                 key->key.eccPub.len, 0}, BSL_PARAM_END};
575             ret = pkey->method->setPub(pkey->key, &ecParam);
576             break;
577         }
578         case CRYPT_PKEY_PAILLIER: {
579             BSL_Param paParam[4] = {{CRYPT_PARAM_PAILLIER_N, BSL_PARAM_TYPE_OCTETS, key->key.paillierPub.n,
580                 key->key.paillierPub.nLen, 0},
581                 {CRYPT_PARAM_PAILLIER_G, BSL_PARAM_TYPE_OCTETS, key->key.paillierPub.g, key->key.paillierPub.gLen, 0},
582                 {CRYPT_PARAM_PAILLIER_N2, BSL_PARAM_TYPE_OCTETS, key->key.paillierPub.n2, key->key.paillierPub.n2Len,
583                     0},
584                  BSL_PARAM_END};
585             ret = pkey->method->setPub(pkey->key, &paParam);
586             break;
587         }
588         case CRYPT_PKEY_ML_KEM: {
589             BSL_Param paParam[2] = {{CRYPT_PARAM_ML_KEM_PUBKEY, BSL_PARAM_TYPE_OCTETS, key->key.kemEk.data,
590                 key->key.kemEk.len, 0},
591                 BSL_PARAM_END};
592             ret = pkey->method->setPub(pkey->key, &paParam);
593             break;
594         }
595         case CRYPT_PKEY_ML_DSA: {
596             BSL_Param paParam[2] = {{CRYPT_PARAM_ML_DSA_PUBKEY, BSL_PARAM_TYPE_OCTETS, key->key.mldsaPub.data,
597                 key->key.mldsaPub.len, 0},
598                 BSL_PARAM_END};
599             ret = pkey->method->setPub(pkey->key, &paParam);
600             break;
601         }
602         case CRYPT_PKEY_ELGAMAL: {
603             BSL_Param paParam[5] = {{CRYPT_PARAM_ELGAMAL_P, BSL_PARAM_TYPE_OCTETS, key->key.elgamalPub.p,
604                 key->key.elgamalPub.pLen, 0},
605                 {CRYPT_PARAM_ELGAMAL_G, BSL_PARAM_TYPE_OCTETS, key->key.elgamalPub.g, key->key.elgamalPub.gLen, 0},
606                 {CRYPT_PARAM_ELGAMAL_Y, BSL_PARAM_TYPE_OCTETS, key->key.elgamalPub.y, key->key.elgamalPub.pLen,
607                     0},
608                 {CRYPT_PARAM_ELGAMAL_Q, BSL_PARAM_TYPE_OCTETS, key->key.elgamalPub.q, key->key.elgamalPub.qLen,
609                 0},
610                  BSL_PARAM_END};
611             ret = pkey->method->setPub(pkey->key, &paParam);
612             break;
613         }
614         case CRYPT_PKEY_SLH_DSA: {
615             BSL_Param slhDsaPub[3] = {{CRYPT_PARAM_SLH_DSA_PUB_SEED, BSL_PARAM_TYPE_OCTETS, key->key.slhDsaPub.seed,
616                 key->key.slhDsaPub.len, 0},
617                 {CRYPT_PARAM_SLH_DSA_PUB_ROOT, BSL_PARAM_TYPE_OCTETS, key->key.slhDsaPub.root, key->key.slhDsaPub.len,
618                     0},
619                 BSL_PARAM_END};
620             ret = pkey->method->setPub(pkey->key, &slhDsaPub);
621             break;
622         }
623 		case CRYPT_PKEY_HYBRID_KEM: {
624             BSL_Param paParam[2] = {{CRYPT_PARAM_HYBRID_PUBKEY, BSL_PARAM_TYPE_OCTETS, key->key.kemEk.data,
625                 key->key.kemEk.len, 0},
626                 BSL_PARAM_END};
627             ret = pkey->method->setPub(pkey->key, &paParam);
628             break;
629         }
630         default:
631             ret = CRYPT_EAL_ALG_NOT_SUPPORT;
632     }
633 
634     EAL_EventReport((ret == CRYPT_SUCCESS) ? CRYPT_EVENT_SETSSP : CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, pkey->id, ret);
635     return ret;
636 }
637 
CRYPT_EAL_PkeySetPrv(CRYPT_EAL_PkeyCtx * pkey,const CRYPT_EAL_PkeyPrv * key)638 int32_t CRYPT_EAL_PkeySetPrv(CRYPT_EAL_PkeyCtx *pkey, const CRYPT_EAL_PkeyPrv *key)
639 {
640     int32_t ret = PriAndPubParamIsValid(pkey, key, true);
641     if (ret != CRYPT_SUCCESS) {
642         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, (pkey == NULL) ? CRYPT_PKEY_MAX : pkey->id, ret);
643         return ret;
644     }
645     if (pkey->method == NULL || pkey->method->setPrv == NULL) {
646         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, pkey->id, CRYPT_EAL_ALG_NOT_SUPPORT);
647         return CRYPT_EAL_ALG_NOT_SUPPORT;
648     }
649     switch(key->id) {
650         case CRYPT_PKEY_RSA: {
651             BSL_Param rsaParam[] = {{CRYPT_PARAM_RSA_D, BSL_PARAM_TYPE_OCTETS, key->key.rsaPrv.d,
652                     key->key.rsaPrv.dLen, 0},
653                 {CRYPT_PARAM_RSA_N, BSL_PARAM_TYPE_OCTETS, key->key.rsaPrv.n, key->key.rsaPrv.nLen, 0},
654                 {CRYPT_PARAM_RSA_P, BSL_PARAM_TYPE_OCTETS, key->key.rsaPrv.p, key->key.rsaPrv.pLen, 0},
655                 {CRYPT_PARAM_RSA_Q, BSL_PARAM_TYPE_OCTETS, key->key.rsaPrv.q, key->key.rsaPrv.qLen, 0},
656                 {CRYPT_PARAM_RSA_DP, BSL_PARAM_TYPE_OCTETS, key->key.rsaPrv.dP, key->key.rsaPrv.dPLen, 0},
657                 {CRYPT_PARAM_RSA_DQ, BSL_PARAM_TYPE_OCTETS, key->key.rsaPrv.dQ, key->key.rsaPrv.dQLen, 0},
658                 {CRYPT_PARAM_RSA_QINV, BSL_PARAM_TYPE_OCTETS, key->key.rsaPrv.qInv, key->key.rsaPrv.qInvLen, 0},
659                 {CRYPT_PARAM_RSA_E, BSL_PARAM_TYPE_OCTETS, key->key.rsaPrv.e, key->key.rsaPrv.eLen, 0},
660                 BSL_PARAM_END};
661             ret = pkey->method->setPrv(pkey->key, &rsaParam);
662             break;
663         }
664         case CRYPT_PKEY_DSA: {
665             BSL_Param dsaParam[2] = {{CRYPT_PARAM_DSA_PRVKEY, BSL_PARAM_TYPE_OCTETS, key->key.dsaPrv.data,
666                 key->key.dsaPrv.len, 0}, BSL_PARAM_END};
667             ret = pkey->method->setPrv(pkey->key, &dsaParam);
668             break;
669         }
670         case CRYPT_PKEY_ED25519:
671         case CRYPT_PKEY_X25519: {
672             BSL_Param para[2] = {{CRYPT_PARAM_CURVE25519_PRVKEY, BSL_PARAM_TYPE_OCTETS, key->key.curve25519Prv.data,
673                 key->key.curve25519Prv.len, 0}, BSL_PARAM_END};
674             ret = pkey->method->setPrv(pkey->key, &para);
675             break;
676         }
677         case CRYPT_PKEY_DH: {
678             BSL_Param dhParam[2] = {{CRYPT_PARAM_DH_PRVKEY, BSL_PARAM_TYPE_OCTETS, key->key.dhPrv.data,
679                 key->key.dhPrv.len, 0}, BSL_PARAM_END};
680             ret = pkey->method->setPrv(pkey->key, &dhParam);
681             break;
682         }
683         case CRYPT_PKEY_ECDH:
684         case CRYPT_PKEY_ECDSA:
685         case CRYPT_PKEY_SM2: {
686             BSL_Param ecParam[2] = {{CRYPT_PARAM_EC_PRVKEY, BSL_PARAM_TYPE_OCTETS, key->key.eccPrv.data,
687                 key->key.eccPrv.len, 0}, BSL_PARAM_END};
688             ret = pkey->method->setPrv(pkey->key, &ecParam);
689             break;
690         }
691         case CRYPT_PKEY_PAILLIER: {
692             BSL_Param paParam[5] = {{CRYPT_PARAM_PAILLIER_N, BSL_PARAM_TYPE_OCTETS, key->key.paillierPrv.n,
693                     key->key.paillierPrv.nLen, 0},
694                 {CRYPT_PARAM_PAILLIER_LAMBDA, BSL_PARAM_TYPE_OCTETS, key->key.paillierPrv.lambda,
695                     key->key.paillierPrv.lambdaLen, 0},
696                 {CRYPT_PARAM_PAILLIER_MU, BSL_PARAM_TYPE_OCTETS, key->key.paillierPrv.mu, key->key.paillierPrv.muLen,
697                     0},
698                 {CRYPT_PARAM_PAILLIER_N2, BSL_PARAM_TYPE_OCTETS, key->key.paillierPrv.n2, key->key.paillierPrv.n2Len,
699                     0},
700                  BSL_PARAM_END};
701             ret = pkey->method->setPrv(pkey->key, &paParam);
702             break;
703         }
704         case CRYPT_PKEY_SLH_DSA: {
705             BSL_Param slhDsaParam[5] = {{CRYPT_PARAM_SLH_DSA_PRV_SEED, BSL_PARAM_TYPE_OCTETS, key->key.slhDsaPrv.seed,
706                 key->key.slhDsaPrv.pub.len, 0},
707                 {CRYPT_PARAM_SLH_DSA_PRV_PRF, BSL_PARAM_TYPE_OCTETS, key->key.slhDsaPrv.prf, key->key.slhDsaPrv.pub.len,
708                     0},
709                 {CRYPT_PARAM_SLH_DSA_PUB_SEED, BSL_PARAM_TYPE_OCTETS, key->key.slhDsaPrv.pub.seed, key->key.slhDsaPrv.pub.len,
710                     0},
711                 {CRYPT_PARAM_SLH_DSA_PUB_ROOT, BSL_PARAM_TYPE_OCTETS, key->key.slhDsaPrv.pub.root, key->key.slhDsaPrv.pub.len,
712                     0},
713                 BSL_PARAM_END};
714             ret = pkey->method->setPrv(pkey->key, &slhDsaParam);
715             break;
716         }
717         case CRYPT_PKEY_ELGAMAL: {
718             BSL_Param paParam[4] = {
719                 {CRYPT_PARAM_ELGAMAL_P, BSL_PARAM_TYPE_OCTETS, key->key.elgamalPrv.p, key->key.elgamalPrv.pLen, 0},
720                 {CRYPT_PARAM_ELGAMAL_G, BSL_PARAM_TYPE_OCTETS, key->key.elgamalPrv.g, key->key.elgamalPrv.gLen, 0},
721                 {CRYPT_PARAM_ELGAMAL_X, BSL_PARAM_TYPE_OCTETS, key->key.elgamalPrv.x, key->key.elgamalPrv.xLen, 0},
722                 BSL_PARAM_END};
723             ret = pkey->method->setPrv(pkey->key, &paParam);
724             break;
725         }
726 		case CRYPT_PKEY_ML_KEM: {
727             BSL_Param paParam[2] = {{CRYPT_PARAM_ML_KEM_PRVKEY, BSL_PARAM_TYPE_OCTETS, key->key.kemDk.data,
728                 key->key.kemDk.len, 0},
729                 BSL_PARAM_END};
730             ret = pkey->method->setPrv(pkey->key, &paParam);
731             break;
732         }
733         case CRYPT_PKEY_ML_DSA: {
734             BSL_Param paParam[2] = {{CRYPT_PARAM_ML_DSA_PRVKEY, BSL_PARAM_TYPE_OCTETS, key->key.mldsaPrv.data,
735                 key->key.mldsaPrv.len, 0},
736                 BSL_PARAM_END};
737             ret = pkey->method->setPrv(pkey->key, &paParam);
738             break;
739         }
740         case CRYPT_PKEY_HYBRID_KEM: {
741             BSL_Param paParam[2] = {{CRYPT_PARAM_HYBRID_PRVKEY, BSL_PARAM_TYPE_OCTETS, key->key.kemDk.data,
742                 key->key.kemDk.len, 0},
743                 BSL_PARAM_END};
744             ret = pkey->method->setPrv(pkey->key, &paParam);
745             break;
746         }
747         default:
748             ret = CRYPT_EAL_ALG_NOT_SUPPORT;
749     }
750 
751     EAL_EventReport((ret == CRYPT_SUCCESS) ? CRYPT_EVENT_SETSSP : CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, pkey->id, ret);
752     return ret;
753 }
754 
GetRSAPub(const CRYPT_EAL_PkeyCtx * pkey,CRYPT_RsaPub * pub)755 static int32_t GetRSAPub(const CRYPT_EAL_PkeyCtx *pkey, CRYPT_RsaPub *pub)
756 {
757     BSL_Param param[3] = {{CRYPT_PARAM_RSA_E, BSL_PARAM_TYPE_OCTETS, pub->e, pub->eLen, 0},
758         {CRYPT_PARAM_RSA_N, BSL_PARAM_TYPE_OCTETS, pub->n, pub->nLen, 0}, BSL_PARAM_END};
759     int32_t ret = pkey->method->getPub(pkey->key, &param);
760     if (ret != CRYPT_SUCCESS) {
761         BSL_ERR_PUSH_ERROR(ret);
762         return ret;
763     }
764     pub->eLen = param[0].useLen;
765     pub->nLen = param[1].useLen;
766     return CRYPT_SUCCESS;
767 }
768 
GetCommonPub(const CRYPT_EAL_PkeyCtx * pkey,int32_t paramKey,CRYPT_Data * pub)769 static int32_t GetCommonPub(const CRYPT_EAL_PkeyCtx *pkey, int32_t paramKey, CRYPT_Data *pub)
770 {
771     BSL_Param param[2] = {{paramKey, BSL_PARAM_TYPE_OCTETS, pub->data, pub->len, 0},
772         BSL_PARAM_END};
773     int32_t ret = pkey->method->getPub(pkey->key, &param);
774     if (ret != CRYPT_SUCCESS) {
775         BSL_ERR_PUSH_ERROR(ret);
776         return ret;
777     }
778     pub->len = param[0].useLen;
779     return CRYPT_SUCCESS;
780 }
781 
GetPaillierPub(const CRYPT_EAL_PkeyCtx * pkey,CRYPT_PaillierPub * pub)782 static int32_t GetPaillierPub(const CRYPT_EAL_PkeyCtx *pkey, CRYPT_PaillierPub *pub)
783 {
784      BSL_Param param[4] = {{CRYPT_PARAM_PAILLIER_N, BSL_PARAM_TYPE_OCTETS, pub->n, pub->nLen, 0},
785         {CRYPT_PARAM_PAILLIER_G, BSL_PARAM_TYPE_OCTETS, pub->g, pub->gLen, 0},
786         {CRYPT_PARAM_PAILLIER_N2, BSL_PARAM_TYPE_OCTETS, pub->n2, pub->n2Len, 0},
787         BSL_PARAM_END};
788     int32_t ret = pkey->method->getPub(pkey->key, &param);
789     if (ret != CRYPT_SUCCESS) {
790         BSL_ERR_PUSH_ERROR(ret);
791         return ret;
792     }
793     pub->nLen = param[0].useLen;
794     pub->gLen = param[1].useLen;
795     pub->n2Len = param[2].useLen;
796     return CRYPT_SUCCESS;
797 }
798 
GetElGamalPub(const CRYPT_EAL_PkeyCtx * pkey,CRYPT_ElGamalPub * pub)799 static int32_t GetElGamalPub(const CRYPT_EAL_PkeyCtx *pkey, CRYPT_ElGamalPub *pub)
800 {
801      BSL_Param param[5] = {{CRYPT_PARAM_ELGAMAL_P, BSL_PARAM_TYPE_OCTETS, pub->p, pub->pLen, 0},
802         {CRYPT_PARAM_ELGAMAL_G, BSL_PARAM_TYPE_OCTETS, pub->g, pub->gLen, 0},
803         {CRYPT_PARAM_ELGAMAL_Y, BSL_PARAM_TYPE_OCTETS, pub->y, pub->yLen, 0},
804         {CRYPT_PARAM_ELGAMAL_Q, BSL_PARAM_TYPE_OCTETS, pub->q, pub->qLen, 0},
805         BSL_PARAM_END};
806     int32_t ret = pkey->method->getPub(pkey->key, &param);
807     if (ret != CRYPT_SUCCESS) {
808         BSL_ERR_PUSH_ERROR(ret);
809         return ret;
810     }
811     pub->pLen = param[0].useLen;
812     pub->gLen = param[1].useLen;
813     pub->yLen = param[2].useLen;
814     return CRYPT_SUCCESS;
815 }
816 
CRYPT_EAL_PkeyGetPubEx(const CRYPT_EAL_PkeyCtx * pkey,BSL_Param * param)817 int32_t CRYPT_EAL_PkeyGetPubEx(const CRYPT_EAL_PkeyCtx *pkey, BSL_Param *param)
818 {
819     if (pkey == NULL || param == NULL) {
820         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, CRYPT_PKEY_MAX, CRYPT_NULL_INPUT);
821         return CRYPT_NULL_INPUT;
822     }
823 
824     if (pkey->method == NULL || pkey->method->getPub == NULL) {
825         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, pkey->id, CRYPT_EAL_ALG_NOT_SUPPORT);
826         return CRYPT_EAL_ALG_NOT_SUPPORT;
827     }
828 
829     int32_t ret = pkey->method->getPub(pkey->key, param);
830     if (ret != CRYPT_SUCCESS) {
831         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, pkey->id, ret);
832     }
833     return ret;
834 }
835 
CRYPT_EAL_PkeySetPubEx(CRYPT_EAL_PkeyCtx * pkey,const BSL_Param * param)836 int32_t CRYPT_EAL_PkeySetPubEx(CRYPT_EAL_PkeyCtx *pkey, const BSL_Param *param)
837 {
838     if (pkey == NULL || param == NULL) {
839         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, CRYPT_PKEY_MAX, CRYPT_NULL_INPUT);
840         return CRYPT_NULL_INPUT;
841     }
842 
843     if (pkey->method == NULL || pkey->method->setPub == NULL) {
844         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, pkey->id, CRYPT_EAL_ALG_NOT_SUPPORT);
845         return CRYPT_EAL_ALG_NOT_SUPPORT;
846     }
847 
848     int32_t ret = pkey->method->setPub(pkey->key, param);
849     if (ret != CRYPT_SUCCESS) {
850         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, pkey->id, ret);
851     }
852     return ret;
853 }
854 
CRYPT_EAL_PkeyGetPrvEx(const CRYPT_EAL_PkeyCtx * pkey,BSL_Param * param)855 int32_t CRYPT_EAL_PkeyGetPrvEx(const CRYPT_EAL_PkeyCtx *pkey, BSL_Param *param)
856 {
857     if (pkey == NULL || param == NULL) {
858         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, CRYPT_PKEY_MAX, CRYPT_NULL_INPUT);
859         return CRYPT_NULL_INPUT;
860     }
861 
862     if (pkey->method == NULL || pkey->method->getPrv == NULL) {
863         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, pkey->id, CRYPT_EAL_ALG_NOT_SUPPORT);
864         return CRYPT_EAL_ALG_NOT_SUPPORT;
865     }
866 
867     int32_t ret = pkey->method->getPrv(pkey->key, param);
868     if (ret != CRYPT_SUCCESS) {
869         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, pkey->id, ret);
870     }
871     return ret;
872 }
873 
CRYPT_EAL_PkeySetPrvEx(CRYPT_EAL_PkeyCtx * pkey,const BSL_Param * param)874 int32_t CRYPT_EAL_PkeySetPrvEx(CRYPT_EAL_PkeyCtx *pkey, const BSL_Param *param)
875 {
876     if (pkey == NULL || param == NULL) {
877         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, CRYPT_PKEY_MAX, CRYPT_NULL_INPUT);
878         return CRYPT_NULL_INPUT;
879     }
880 
881     if (pkey->method == NULL || pkey->method->setPrv == NULL) {
882         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, pkey->id, CRYPT_EAL_ALG_NOT_SUPPORT);
883         return CRYPT_EAL_ALG_NOT_SUPPORT;
884     }
885 
886     int32_t ret = pkey->method->setPrv(pkey->key, param);
887     if (ret != CRYPT_SUCCESS) {
888         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, pkey->id, ret);
889     }
890     return ret;
891 }
892 
GetMlkemPub(const CRYPT_EAL_PkeyCtx * pkey,CRYPT_KemEncapsKey * kemEk)893 static int32_t GetMlkemPub(const CRYPT_EAL_PkeyCtx *pkey, CRYPT_KemEncapsKey *kemEk)
894 {
895     BSL_Param param[2] = {{CRYPT_PARAM_ML_KEM_PUBKEY, BSL_PARAM_TYPE_OCTETS, kemEk->data,
896         kemEk->len, 0},
897         BSL_PARAM_END};
898     int32_t ret = pkey->method->getPub(pkey->key, &param);
899     if (ret != CRYPT_SUCCESS) {
900         BSL_ERR_PUSH_ERROR(ret);
901         return ret;
902     }
903     kemEk->len = param[0].useLen;
904     return CRYPT_SUCCESS;
905 }
906 
GetMldsaPub(const CRYPT_EAL_PkeyCtx * pkey,CRYPT_MlDsaPub * dsaPub)907 static int32_t GetMldsaPub(const CRYPT_EAL_PkeyCtx *pkey, CRYPT_MlDsaPub *dsaPub)
908 {
909     BSL_Param param[2] = {{CRYPT_PARAM_ML_DSA_PUBKEY, BSL_PARAM_TYPE_OCTETS, dsaPub->data,
910         dsaPub->len, 0},
911         BSL_PARAM_END};
912     int32_t ret = pkey->method->getPub(pkey->key, &param);
913     if (ret != CRYPT_SUCCESS) {
914         BSL_ERR_PUSH_ERROR(ret);
915         return ret;
916     }
917     dsaPub->len = param[0].useLen;
918     return CRYPT_SUCCESS;
919 }
920 
GetHybridkemPub(const CRYPT_EAL_PkeyCtx * pkey,CRYPT_KemEncapsKey * kemEk)921 static int32_t GetHybridkemPub(const CRYPT_EAL_PkeyCtx *pkey, CRYPT_KemEncapsKey *kemEk)
922 {
923     BSL_Param param[2] = {{CRYPT_PARAM_HYBRID_PUBKEY, BSL_PARAM_TYPE_OCTETS, kemEk->data,
924         kemEk->len, 0},
925         BSL_PARAM_END};
926     int32_t ret = pkey->method->getPub(pkey->key, &param);
927     if (ret != CRYPT_SUCCESS) {
928         BSL_ERR_PUSH_ERROR(ret);
929         return ret;
930     }
931     kemEk->len = param[0].useLen;
932     return CRYPT_SUCCESS;
933 }
934 
935 
GetSlhDsaPub(const CRYPT_EAL_PkeyCtx * pkey,CRYPT_SlhDsaPub * pub)936 static int32_t GetSlhDsaPub(const CRYPT_EAL_PkeyCtx *pkey, CRYPT_SlhDsaPub *pub)
937 {
938     BSL_Param param[3] = {{CRYPT_PARAM_SLH_DSA_PUB_SEED, BSL_PARAM_TYPE_OCTETS, pub->seed, pub->len, 0},
939         {CRYPT_PARAM_SLH_DSA_PUB_ROOT, BSL_PARAM_TYPE_OCTETS, pub->root, pub->len, 0},
940         BSL_PARAM_END};
941     int32_t ret = pkey->method->getPub(pkey->key, &param);
942     if (ret != CRYPT_SUCCESS) {
943         BSL_ERR_PUSH_ERROR(ret);
944         return ret;
945     }
946     pub->len = param[0].useLen;
947     return CRYPT_SUCCESS;
948 }
949 
CRYPT_EAL_PkeyGetPub(const CRYPT_EAL_PkeyCtx * pkey,CRYPT_EAL_PkeyPub * key)950 int32_t CRYPT_EAL_PkeyGetPub(const CRYPT_EAL_PkeyCtx *pkey, CRYPT_EAL_PkeyPub *key)
951 {
952     int32_t ret = PriAndPubParamIsValid(pkey, key, false);
953     if (ret != CRYPT_SUCCESS) {
954         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, (pkey == NULL) ? CRYPT_PKEY_MAX : pkey->id, ret);
955         return ret;
956     }
957     if (pkey->method == NULL || pkey->method->getPub == NULL) {
958         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, pkey->id, CRYPT_EAL_ALG_NOT_SUPPORT);
959         return CRYPT_EAL_ALG_NOT_SUPPORT;
960     }
961 
962     switch (key->id) {
963         case CRYPT_PKEY_RSA:
964             ret = GetRSAPub(pkey, &key->key.rsaPub);
965             break;
966         case CRYPT_PKEY_DSA:
967             ret = GetCommonPub(pkey, CRYPT_PARAM_DSA_PUBKEY, &key->key.dsaPub);
968             break;
969         case CRYPT_PKEY_ED25519:
970         case CRYPT_PKEY_X25519:
971             ret = GetCommonPub(pkey, CRYPT_PARAM_CURVE25519_PUBKEY, &key->key.curve25519Pub);
972             break;
973         case CRYPT_PKEY_DH:
974             ret = GetCommonPub(pkey, CRYPT_PARAM_DH_PUBKEY, &key->key.dhPub);
975             break;
976         case CRYPT_PKEY_ECDH:
977         case CRYPT_PKEY_ECDSA:
978         case CRYPT_PKEY_SM2:
979             ret = GetCommonPub(pkey, CRYPT_PARAM_EC_PUBKEY, &key->key.eccPub);
980             break;
981         case CRYPT_PKEY_PAILLIER:
982             ret = GetPaillierPub(pkey, &key->key.paillierPub);
983             break;
984         case CRYPT_PKEY_ELGAMAL:
985             ret = GetElGamalPub(pkey, &key->key.elgamalPub);
986             break;
987 		case CRYPT_PKEY_ML_KEM:
988             ret = GetMlkemPub(pkey, &key->key.kemEk);
989             break;
990         case CRYPT_PKEY_ML_DSA:
991             ret = GetMldsaPub(pkey, &key->key.mldsaPub);
992             break;
993         case CRYPT_PKEY_HYBRID_KEM:
994             ret = GetHybridkemPub(pkey, &key->key.kemEk);
995             break;
996         case CRYPT_PKEY_SLH_DSA:
997             ret = GetSlhDsaPub(pkey, &key->key.slhDsaPub);
998             break;
999         default:
1000             ret = CRYPT_EAL_ALG_NOT_SUPPORT;
1001     }
1002 
1003     EAL_EventReport((ret == CRYPT_SUCCESS) ? CRYPT_EVENT_GETSSP : CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, pkey->id, ret);
1004     return ret;
1005 }
1006 
GetRSAPrv(const CRYPT_EAL_PkeyCtx * pkey,CRYPT_RsaPrv * prv)1007 static int32_t GetRSAPrv(const CRYPT_EAL_PkeyCtx *pkey, CRYPT_RsaPrv *prv)
1008 {
1009     BSL_Param param[] = {{CRYPT_PARAM_RSA_D, BSL_PARAM_TYPE_OCTETS, prv->d, prv->dLen, 0},
1010         {CRYPT_PARAM_RSA_N, BSL_PARAM_TYPE_OCTETS, prv->n, prv->nLen, 0},
1011         {CRYPT_PARAM_RSA_P, BSL_PARAM_TYPE_OCTETS, prv->p, prv->pLen, 0},
1012         {CRYPT_PARAM_RSA_Q, BSL_PARAM_TYPE_OCTETS, prv->q, prv->qLen, 0},
1013         {CRYPT_PARAM_RSA_DP, BSL_PARAM_TYPE_OCTETS, prv->dP, prv->dPLen, 0},
1014         {CRYPT_PARAM_RSA_DQ, BSL_PARAM_TYPE_OCTETS, prv->dQ, prv->dQLen, 0},
1015         {CRYPT_PARAM_RSA_QINV, BSL_PARAM_TYPE_OCTETS, prv->qInv, prv->qInvLen, 0},
1016         {CRYPT_PARAM_RSA_E, BSL_PARAM_TYPE_OCTETS, prv->e, prv->eLen, 0},
1017         BSL_PARAM_END};
1018     int32_t ret = pkey->method->getPrv(pkey->key, &param);
1019     if (ret != CRYPT_SUCCESS) {
1020         BSL_ERR_PUSH_ERROR(ret);
1021         return ret;
1022     }
1023     prv->dLen = param[0].useLen;
1024     prv->nLen = param[1].useLen;
1025     prv->pLen = param[2].useLen;
1026     prv->qLen = param[3].useLen;
1027     prv->dPLen = param[4].useLen;
1028     prv->dQLen = param[5].useLen;
1029     prv->qInvLen = param[6].useLen;
1030     prv->eLen = param[7].useLen;
1031     return CRYPT_SUCCESS;
1032 }
1033 
GetCommonPrv(const CRYPT_EAL_PkeyCtx * pkey,int32_t paramKey,CRYPT_Data * prv)1034 static int32_t GetCommonPrv(const CRYPT_EAL_PkeyCtx *pkey, int32_t paramKey, CRYPT_Data *prv)
1035 {
1036     BSL_Param param[2] = {{paramKey, BSL_PARAM_TYPE_OCTETS, prv->data, prv->len, 0},
1037         BSL_PARAM_END};
1038     int32_t ret = pkey->method->getPrv(pkey->key, &param);
1039     if (ret != CRYPT_SUCCESS) {
1040         BSL_ERR_PUSH_ERROR(ret);
1041         return ret;
1042     }
1043     prv->len = param[0].useLen;
1044     return CRYPT_SUCCESS;
1045 }
1046 
GetPaillierPrv(const CRYPT_EAL_PkeyCtx * pkey,CRYPT_PaillierPrv * prv)1047 static int32_t GetPaillierPrv(const CRYPT_EAL_PkeyCtx *pkey, CRYPT_PaillierPrv *prv)
1048 {
1049     BSL_Param param[5] = {{CRYPT_PARAM_PAILLIER_N, BSL_PARAM_TYPE_OCTETS, prv->n, prv->nLen, 0},
1050         {CRYPT_PARAM_PAILLIER_LAMBDA, BSL_PARAM_TYPE_OCTETS, prv->lambda, prv->lambdaLen, 0},
1051         {CRYPT_PARAM_PAILLIER_MU, BSL_PARAM_TYPE_OCTETS, prv->mu, prv->muLen, 0},
1052         {CRYPT_PARAM_PAILLIER_N2, BSL_PARAM_TYPE_OCTETS, prv->n2, prv->n2Len, 0},
1053         BSL_PARAM_END};
1054     int32_t ret = pkey->method->getPrv(pkey->key, &param);
1055     if (ret != CRYPT_SUCCESS) {
1056         BSL_ERR_PUSH_ERROR(ret);
1057         return ret;
1058     }
1059     prv->nLen = param[0].useLen;
1060     prv->lambdaLen = param[1].useLen;
1061     prv->muLen = param[2].useLen;
1062     prv->n2Len = param[3].useLen;
1063     return CRYPT_SUCCESS;
1064 }
1065 
GetElGamalPrv(const CRYPT_EAL_PkeyCtx * pkey,CRYPT_ElGamalPrv * prv)1066 static int32_t GetElGamalPrv(const CRYPT_EAL_PkeyCtx *pkey, CRYPT_ElGamalPrv *prv)
1067 {
1068     BSL_Param param[5] = {{CRYPT_PARAM_ELGAMAL_P, BSL_PARAM_TYPE_OCTETS, prv->p, prv->pLen, 0},
1069         {CRYPT_PARAM_ELGAMAL_G, BSL_PARAM_TYPE_OCTETS, prv->g, prv->gLen, 0},
1070         {CRYPT_PARAM_ELGAMAL_X, BSL_PARAM_TYPE_OCTETS, prv->x, prv->xLen, 0},
1071         BSL_PARAM_END};
1072     int32_t ret = pkey->method->getPrv(pkey->key, &param);
1073     if (ret != CRYPT_SUCCESS) {
1074         BSL_ERR_PUSH_ERROR(ret);
1075         return ret;
1076     }
1077     prv->pLen = param[0].useLen;
1078     prv->gLen = param[1].useLen;
1079     prv->xLen = param[2].useLen;
1080     return CRYPT_SUCCESS;
1081 }
1082 
GetMlkemPrv(const CRYPT_EAL_PkeyCtx * pkey,CRYPT_KemDecapsKey * kemDk)1083 static int32_t GetMlkemPrv(const CRYPT_EAL_PkeyCtx *pkey, CRYPT_KemDecapsKey *kemDk)
1084 {
1085     BSL_Param param[2] = {{CRYPT_PARAM_ML_KEM_PRVKEY, BSL_PARAM_TYPE_OCTETS, kemDk->data,
1086         kemDk->len, 0},
1087         BSL_PARAM_END};
1088     int32_t ret = pkey->method->getPrv(pkey->key, &param);
1089     if (ret != CRYPT_SUCCESS) {
1090         BSL_ERR_PUSH_ERROR(ret);
1091         return ret;
1092     }
1093     kemDk->len = param[0].useLen;
1094     return CRYPT_SUCCESS;
1095 }
1096 
GetMldsaPrv(const CRYPT_EAL_PkeyCtx * pkey,CRYPT_MlDsaPrv * dsaPrv)1097 static int32_t GetMldsaPrv(const CRYPT_EAL_PkeyCtx *pkey, CRYPT_MlDsaPrv *dsaPrv)
1098 {
1099     BSL_Param param[2] = {{CRYPT_PARAM_ML_DSA_PRVKEY, BSL_PARAM_TYPE_OCTETS, dsaPrv->data,
1100         dsaPrv->len, 0},
1101         BSL_PARAM_END};
1102     int32_t ret = pkey->method->getPrv(pkey->key, &param);
1103     if (ret != CRYPT_SUCCESS) {
1104         BSL_ERR_PUSH_ERROR(ret);
1105         return ret;
1106     }
1107     dsaPrv->len = param[0].useLen;
1108     return CRYPT_SUCCESS;
1109 }
1110 
GetHybridkemPrv(const CRYPT_EAL_PkeyCtx * pkey,CRYPT_KemDecapsKey * kemDk)1111 static int32_t GetHybridkemPrv(const CRYPT_EAL_PkeyCtx *pkey, CRYPT_KemDecapsKey *kemDk)
1112 {
1113     BSL_Param param[2] = {{CRYPT_PARAM_HYBRID_PRVKEY, BSL_PARAM_TYPE_OCTETS, kemDk->data,
1114         kemDk->len, 0},
1115         BSL_PARAM_END};
1116     int32_t ret = pkey->method->getPrv(pkey->key, &param);
1117     if (ret != CRYPT_SUCCESS) {
1118         BSL_ERR_PUSH_ERROR(ret);
1119         return ret;
1120     }
1121     kemDk->len = param[0].useLen;
1122     return CRYPT_SUCCESS;
1123 }
1124 
GetSlhDsaPrv(const CRYPT_EAL_PkeyCtx * pkey,CRYPT_SlhDsaPrv * prv)1125 static int32_t GetSlhDsaPrv(const CRYPT_EAL_PkeyCtx *pkey, CRYPT_SlhDsaPrv *prv)
1126 {
1127     BSL_Param param[5] = {{CRYPT_PARAM_SLH_DSA_PRV_SEED, BSL_PARAM_TYPE_OCTETS, prv->seed, prv->pub.len, 0},
1128         {CRYPT_PARAM_SLH_DSA_PRV_PRF, BSL_PARAM_TYPE_OCTETS, prv->prf, prv->pub.len, 0},
1129         {CRYPT_PARAM_SLH_DSA_PUB_SEED, BSL_PARAM_TYPE_OCTETS, prv->pub.seed, prv->pub.len, 0},
1130         {CRYPT_PARAM_SLH_DSA_PUB_ROOT, BSL_PARAM_TYPE_OCTETS, prv->pub.root, prv->pub.len, 0},
1131         BSL_PARAM_END};
1132     int32_t ret = pkey->method->getPrv(pkey->key, &param);
1133     if (ret != CRYPT_SUCCESS) {
1134         BSL_ERR_PUSH_ERROR(ret);
1135         return ret;
1136     }
1137     prv->pub.len = param[0].useLen;
1138     return CRYPT_SUCCESS;
1139 }
1140 
1141 
CRYPT_EAL_PkeyGetPrv(const CRYPT_EAL_PkeyCtx * pkey,CRYPT_EAL_PkeyPrv * key)1142 int32_t CRYPT_EAL_PkeyGetPrv(const CRYPT_EAL_PkeyCtx *pkey, CRYPT_EAL_PkeyPrv *key)
1143 {
1144     int32_t ret = PriAndPubParamIsValid(pkey, key, true);
1145     if (ret != CRYPT_SUCCESS) {
1146         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, (pkey == NULL) ? CRYPT_PKEY_MAX : pkey->id, ret);
1147         return ret;
1148     }
1149     if (pkey->method == NULL || pkey->method->getPrv == NULL) {
1150         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, pkey->id, CRYPT_EAL_ALG_NOT_SUPPORT);
1151         return CRYPT_EAL_ALG_NOT_SUPPORT;
1152     }
1153     switch(key->id) {
1154         case CRYPT_PKEY_RSA:
1155             ret = GetRSAPrv(pkey, &key->key.rsaPrv);
1156             break;
1157         case CRYPT_PKEY_DSA:
1158             ret = GetCommonPrv(pkey, CRYPT_PARAM_DSA_PRVKEY, &key->key.dsaPrv);
1159             break;
1160         case CRYPT_PKEY_ED25519:
1161         case CRYPT_PKEY_X25519:
1162             ret = GetCommonPrv(pkey, CRYPT_PARAM_CURVE25519_PRVKEY, &key->key.curve25519Prv);
1163             break;
1164         case CRYPT_PKEY_DH:
1165             ret = GetCommonPrv(pkey, CRYPT_PARAM_DH_PRVKEY, &key->key.dhPrv);
1166             break;
1167         case CRYPT_PKEY_ECDH:
1168         case CRYPT_PKEY_ECDSA:
1169         case CRYPT_PKEY_SM2:
1170             ret = GetCommonPrv(pkey, CRYPT_PARAM_EC_PRVKEY, &key->key.eccPrv);
1171             break;
1172         case CRYPT_PKEY_PAILLIER:
1173             ret = GetPaillierPrv(pkey, &key->key.paillierPrv);
1174             break;
1175         case CRYPT_PKEY_ELGAMAL:
1176             ret = GetElGamalPrv(pkey, &key->key.elgamalPrv);
1177             break;
1178 		case CRYPT_PKEY_ML_KEM:
1179             ret = GetMlkemPrv(pkey, &key->key.kemDk);
1180             break;
1181         case CRYPT_PKEY_ML_DSA:
1182             ret = GetMldsaPrv(pkey, &key->key.mldsaPrv);
1183             break;
1184         case CRYPT_PKEY_SLH_DSA:
1185             ret = GetSlhDsaPrv(pkey, &key->key.slhDsaPrv);
1186             break;
1187 		case CRYPT_PKEY_HYBRID_KEM:
1188             ret = GetHybridkemPrv(pkey, &key->key.kemDk);
1189             break;
1190         default:
1191             ret = CRYPT_EAL_ALG_NOT_SUPPORT;
1192     }
1193 
1194     EAL_EventReport((ret == CRYPT_SUCCESS) ? CRYPT_EVENT_GETSSP : CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, pkey->id, ret);
1195     return ret;
1196 }
1197 
CRYPT_EAL_PkeyGetSignLen(const CRYPT_EAL_PkeyCtx * pkey)1198 uint32_t CRYPT_EAL_PkeyGetSignLen(const CRYPT_EAL_PkeyCtx *pkey)
1199 {
1200     int32_t result = 0;
1201     int32_t ret = CRYPT_EAL_PkeyCtrl((CRYPT_EAL_PkeyCtx *)(uintptr_t)pkey,
1202         CRYPT_CTRL_GET_SIGNLEN, &result, sizeof(result));
1203     return ret == CRYPT_SUCCESS ? result : 0;
1204 }
1205 
CRYPT_EAL_PkeyGetKeyLen(const CRYPT_EAL_PkeyCtx * pkey)1206 uint32_t CRYPT_EAL_PkeyGetKeyLen(const CRYPT_EAL_PkeyCtx *pkey)
1207 {
1208     int32_t result = 0;
1209     int32_t ret = CRYPT_EAL_PkeyCtrl((CRYPT_EAL_PkeyCtx *)(uintptr_t)pkey,
1210         CRYPT_CTRL_GET_BITS, &result, sizeof(result));
1211     return ret == CRYPT_SUCCESS ? ((result + 7) >> 3) : 0; // bytes = (bits + 7) >> 3
1212 }
1213 
CRYPT_EAL_PkeyGetKeyBits(const CRYPT_EAL_PkeyCtx * pkey)1214 uint32_t CRYPT_EAL_PkeyGetKeyBits(const CRYPT_EAL_PkeyCtx *pkey)
1215 {
1216     int32_t result = 0;
1217     int32_t ret = CRYPT_EAL_PkeyCtrl((CRYPT_EAL_PkeyCtx *)(uintptr_t)pkey,
1218         CRYPT_CTRL_GET_BITS, &result, sizeof(result));
1219     return ret  == CRYPT_SUCCESS ? result : 0;
1220 }
1221 
CRYPT_EAL_PkeyGetSecurityBits(const CRYPT_EAL_PkeyCtx * pkey)1222 uint32_t CRYPT_EAL_PkeyGetSecurityBits(const CRYPT_EAL_PkeyCtx *pkey)
1223 {
1224     int32_t result = 0;
1225     int32_t ret = CRYPT_EAL_PkeyCtrl((CRYPT_EAL_PkeyCtx *)(uintptr_t)pkey,
1226         CRYPT_CTRL_GET_SECBITS, &result, sizeof(result));
1227     return ret  == CRYPT_SUCCESS ? result : 0;
1228 }
1229 
CRYPT_EAL_PkeyGetId(const CRYPT_EAL_PkeyCtx * pkey)1230 CRYPT_PKEY_AlgId CRYPT_EAL_PkeyGetId(const CRYPT_EAL_PkeyCtx *pkey)
1231 {
1232     if (pkey == NULL) {
1233         return CRYPT_PKEY_MAX;
1234     }
1235     return pkey->id;
1236 }
1237 
CRYPT_EAL_PkeyGetParaId(const CRYPT_EAL_PkeyCtx * pkey)1238 CRYPT_PKEY_ParaId CRYPT_EAL_PkeyGetParaId(const CRYPT_EAL_PkeyCtx *pkey)
1239 {
1240     int32_t result = 0;
1241     int32_t ret = CRYPT_EAL_PkeyCtrl((CRYPT_EAL_PkeyCtx *)(uintptr_t)pkey, CRYPT_CTRL_GET_PARAID,
1242         &result, sizeof(result));
1243     return ret  == CRYPT_SUCCESS ? result : CRYPT_PKEY_PARAID_MAX;
1244 }
1245 
1246 
CRYPT_EAL_PkeyCmp(const CRYPT_EAL_PkeyCtx * a,const CRYPT_EAL_PkeyCtx * b)1247 int32_t CRYPT_EAL_PkeyCmp(const CRYPT_EAL_PkeyCtx *a, const CRYPT_EAL_PkeyCtx *b)
1248 {
1249     if (a == NULL || b == NULL) {
1250         if (a == b) {
1251             return CRYPT_SUCCESS;
1252         }
1253         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, CRYPT_PKEY_MAX, CRYPT_NULL_INPUT);
1254         return CRYPT_NULL_INPUT;
1255     }
1256     if (a->id != b->id) {
1257         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, CRYPT_PKEY_MAX, CRYPT_EAL_PKEY_CMP_DIFF_KEY_TYPE);
1258         return CRYPT_EAL_PKEY_CMP_DIFF_KEY_TYPE;
1259     }
1260     if (a->method == NULL || b->method == NULL) {
1261         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, CRYPT_PKEY_MAX, CRYPT_NULL_INPUT);
1262         return CRYPT_NULL_INPUT;
1263     }
1264     if (a->method->cmp == NULL) {
1265         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, a->id, CRYPT_EAL_ALG_NOT_SUPPORT);
1266         return CRYPT_EAL_ALG_NOT_SUPPORT;
1267     }
1268     return a->method->cmp(a->key, b->key);
1269 }
1270 
1271 // Set the user's personal data. The life cycle is processed by the user. The value of data can be NULL,
1272 // which is used to release the personal data and is set NULL.
CRYPT_EAL_PkeySetExtData(CRYPT_EAL_PkeyCtx * pkey,void * data)1273 int32_t CRYPT_EAL_PkeySetExtData(CRYPT_EAL_PkeyCtx *pkey, void *data)
1274 {
1275     if (pkey == NULL) {
1276         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, CRYPT_PKEY_MAX, CRYPT_NULL_INPUT);
1277         return CRYPT_NULL_INPUT;
1278     }
1279     pkey->extData = data;
1280     return CRYPT_SUCCESS;
1281 }
1282 
1283 // Obtain user's personal data.
CRYPT_EAL_PkeyGetExtData(const CRYPT_EAL_PkeyCtx * pkey)1284 void *CRYPT_EAL_PkeyGetExtData(const CRYPT_EAL_PkeyCtx *pkey)
1285 {
1286     if (pkey == NULL) {
1287         return NULL;
1288     }
1289     return pkey->extData;
1290 }
1291 
CRYPT_EAL_PkeyIsValidAlgId(CRYPT_PKEY_AlgId id)1292 bool CRYPT_EAL_PkeyIsValidAlgId(CRYPT_PKEY_AlgId id)
1293 {
1294     return CRYPT_EAL_PkeyFindMethod(id) != NULL;
1295 }
1296 
CRYPT_EAL_PkeyUpRef(CRYPT_EAL_PkeyCtx * pkey)1297 int32_t CRYPT_EAL_PkeyUpRef(CRYPT_EAL_PkeyCtx *pkey)
1298 {
1299     int i = 0;
1300     if (pkey == NULL) {
1301         return CRYPT_NULL_INPUT;
1302     }
1303     return BSL_SAL_AtomicUpReferences(&(pkey->references), &i);
1304 }
1305 
1306 #ifdef HITLS_CRYPTO_PROVIDER
CRYPT_EAL_SetKeyMethod(const CRYPT_EAL_Func * funcsKeyMgmt,EAL_PkeyUnitaryMethod * method)1307 static int32_t CRYPT_EAL_SetKeyMethod(const CRYPT_EAL_Func *funcsKeyMgmt, EAL_PkeyUnitaryMethod *method)
1308 {
1309     int32_t index = 0;
1310     if (funcsKeyMgmt != NULL) {
1311         while (funcsKeyMgmt[index].id != 0) {
1312             switch (funcsKeyMgmt[index].id) {
1313                 case CRYPT_EAL_IMPLPKEYMGMT_NEWCTX:
1314                     method->provNewCtx = funcsKeyMgmt[index].func;
1315                     break;
1316                 case CRYPT_EAL_IMPLPKEYMGMT_SETPARAM:
1317                     method->setPara = funcsKeyMgmt[index].func;
1318                     break;
1319                 case CRYPT_EAL_IMPLPKEYMGMT_GETPARAM:
1320                     method->getPara = funcsKeyMgmt[index].func;
1321                     break;
1322                 case CRYPT_EAL_IMPLPKEYMGMT_GENKEY:
1323                     method->gen = funcsKeyMgmt[index].func;
1324                     break;
1325                 case CRYPT_EAL_IMPLPKEYMGMT_SETPRV:
1326                     method->setPrv = funcsKeyMgmt[index].func;
1327                     break;
1328                 case CRYPT_EAL_IMPLPKEYMGMT_SETPUB:
1329                     method->setPub = funcsKeyMgmt[index].func;
1330                     break;
1331                 case CRYPT_EAL_IMPLPKEYMGMT_GETPRV:
1332                     method->getPrv = funcsKeyMgmt[index].func;
1333                     break;
1334                 case CRYPT_EAL_IMPLPKEYMGMT_GETPUB:
1335                     method->getPub = funcsKeyMgmt[index].func;
1336                     break;
1337                 case CRYPT_EAL_IMPLPKEYMGMT_DUPCTX:
1338                     method->dupCtx = funcsKeyMgmt[index].func;
1339                     break;
1340                 case CRYPT_EAL_IMPLPKEYMGMT_CHECK:
1341                     method->check = funcsKeyMgmt[index].func;
1342                     break;
1343                 case CRYPT_EAL_IMPLPKEYMGMT_COMPARE:
1344                     method->cmp = funcsKeyMgmt[index].func;
1345                     break;
1346                 case CRYPT_EAL_IMPLPKEYMGMT_CTRL:
1347                     method->ctrl = funcsKeyMgmt[index].func;
1348                     break;
1349                 case CRYPT_EAL_IMPLPKEYMGMT_FREECTX:
1350                     method->freeCtx = funcsKeyMgmt[index].func;
1351                     break;
1352                 case CRYPT_EAL_IMPLPKEYMGMT_IMPORT:
1353                     method->import = funcsKeyMgmt[index].func;
1354                     break;
1355                 case CRYPT_EAL_IMPLPKEYMGMT_EXPORT:
1356                     method->export = funcsKeyMgmt[index].func;
1357                     break;
1358                 default:
1359                     BSL_ERR_PUSH_ERROR(CRYPT_PROVIDER_ERR_UNEXPECTED_IMPL);
1360                     return CRYPT_PROVIDER_ERR_UNEXPECTED_IMPL;
1361         }
1362         index++;
1363         }
1364     }
1365     return CRYPT_SUCCESS;
1366 }
1367 
CRYPT_EAL_SetCipherMethod(const CRYPT_EAL_Func * funcsAsyCipher,EAL_PkeyUnitaryMethod * method)1368 static int32_t CRYPT_EAL_SetCipherMethod(const CRYPT_EAL_Func *funcsAsyCipher, EAL_PkeyUnitaryMethod *method)
1369 {
1370     int32_t index = 0;
1371     if (funcsAsyCipher != NULL) {
1372         while (funcsAsyCipher[index].id != 0) {
1373             switch (funcsAsyCipher[index].id) {
1374                 case CRYPT_EAL_IMPLPKEYCIPHER_ENCRYPT:
1375                     method->encrypt = funcsAsyCipher[index].func;
1376                     break;
1377                 case CRYPT_EAL_IMPLPKEYCIPHER_DECRYPT:
1378                     method->decrypt = funcsAsyCipher[index].func;
1379                     break;
1380                 default:
1381                     BSL_ERR_PUSH_ERROR(CRYPT_PROVIDER_ERR_UNEXPECTED_IMPL);
1382                     return CRYPT_PROVIDER_ERR_UNEXPECTED_IMPL;
1383             }
1384         index++;
1385         }
1386     }
1387     return CRYPT_SUCCESS;
1388 }
1389 
CRYPT_EAL_SetExchMethod(const CRYPT_EAL_Func * funcsExch,EAL_PkeyUnitaryMethod * method)1390 static int32_t CRYPT_EAL_SetExchMethod(const CRYPT_EAL_Func *funcsExch, EAL_PkeyUnitaryMethod *method)
1391 {
1392     int32_t index = 0;
1393     if (funcsExch != NULL) {
1394         while (funcsExch[index].id != 0) {
1395             switch (funcsExch[index].id) {
1396                 case CRYPT_EAL_IMPLPKEYEXCH_EXCH:
1397                     method->computeShareKey = funcsExch[index].func;
1398                     break;
1399                 default:
1400                     BSL_ERR_PUSH_ERROR(CRYPT_PROVIDER_ERR_UNEXPECTED_IMPL);
1401                     return CRYPT_PROVIDER_ERR_UNEXPECTED_IMPL;
1402             }
1403         index++;
1404         }
1405     }
1406     return CRYPT_SUCCESS;
1407 }
1408 
CRYPT_EAL_SetSignMethod(const CRYPT_EAL_Func * funcSign,EAL_PkeyUnitaryMethod * method)1409 static int32_t CRYPT_EAL_SetSignMethod(const CRYPT_EAL_Func *funcSign, EAL_PkeyUnitaryMethod *method)
1410 {
1411     int32_t index = 0;
1412     if (funcSign != NULL) {
1413         while (funcSign[index].id != 0) {
1414             switch (funcSign[index].id) {
1415                 case CRYPT_EAL_IMPLPKEYSIGN_SIGN:
1416                     method->sign = funcSign[index].func;
1417                     break;
1418                 case CRYPT_EAL_IMPLPKEYSIGN_SIGNDATA:
1419                     method->signData = funcSign[index].func;
1420                     break;
1421                 case CRYPT_EAL_IMPLPKEYSIGN_VERIFY:
1422                     method->verify = funcSign[index].func;
1423                     break;
1424                 case CRYPT_EAL_IMPLPKEYSIGN_VERIFYDATA:
1425                     method->verifyData = funcSign[index].func;
1426                     break;
1427                 case CRYPT_EAL_IMPLPKEYSIGN_BLIND:
1428                     method->blind = funcSign[index].func;
1429                     break;
1430                 case CRYPT_EAL_IMPLPKEYSIGN_UNBLIND:
1431                     method->unBlind = funcSign[index].func;
1432                     break;
1433                 case CRYPT_EAL_IMPLPKEYSIGN_RECOVER:
1434                     method->recover = funcSign[index].func;
1435                     break;
1436                 default:
1437                     BSL_ERR_PUSH_ERROR(CRYPT_PROVIDER_ERR_UNEXPECTED_IMPL);
1438                     return CRYPT_PROVIDER_ERR_UNEXPECTED_IMPL;
1439             }
1440         index++;
1441         }
1442     }
1443     return CRYPT_SUCCESS;
1444 }
1445 
CRYPT_EAL_SetKemMethod(const CRYPT_EAL_Func * funcKem,EAL_PkeyUnitaryMethod * method)1446 static int32_t CRYPT_EAL_SetKemMethod(const CRYPT_EAL_Func *funcKem, EAL_PkeyUnitaryMethod *method)
1447 {
1448     int32_t index = 0;
1449     if (funcKem != NULL) {
1450         while (funcKem[index].id != 0) {
1451             switch (funcKem[index].id) {
1452                 case CRYPT_EAL_IMPLPKEYKEM_ENCAPSULATE_INIT:
1453                     method->encapsInit = funcKem[index].func;
1454                     break;
1455                 case CRYPT_EAL_IMPLPKEYKEM_DECAPSULATE_INIT:
1456                     method->decapsInit = funcKem[index].func;
1457                     break;
1458                 case CRYPT_EAL_IMPLPKEYKEM_ENCAPSULATE:
1459                     method->encaps = funcKem[index].func;
1460                     break;
1461                 case CRYPT_EAL_IMPLPKEYKEM_DECAPSULATE:
1462                     method->decaps = funcKem[index].func;
1463                     break;
1464                 default:
1465                     BSL_ERR_PUSH_ERROR(CRYPT_PROVIDER_ERR_UNEXPECTED_IMPL);
1466                     return CRYPT_PROVIDER_ERR_UNEXPECTED_IMPL;
1467             }
1468         index++;
1469         }
1470     }
1471     return CRYPT_SUCCESS;
1472 }
1473 
CRYPT_EAL_SetPkeyMethod(EAL_PkeyUnitaryMethod ** pkeyMethod,const CRYPT_EAL_Func * funcsKeyMgmt,const CRYPT_EAL_Func * funcsAsyCipher,const CRYPT_EAL_Func * funcsExch,const CRYPT_EAL_Func * funcSign,const CRYPT_EAL_Func * funcKem)1474 int32_t CRYPT_EAL_SetPkeyMethod(EAL_PkeyUnitaryMethod **pkeyMethod, const CRYPT_EAL_Func *funcsKeyMgmt,
1475     const CRYPT_EAL_Func *funcsAsyCipher, const CRYPT_EAL_Func *funcsExch, const CRYPT_EAL_Func *funcSign,
1476     const CRYPT_EAL_Func *funcKem)
1477 {
1478     int32_t ret;
1479     EAL_PkeyUnitaryMethod *method = BSL_SAL_Calloc(1, sizeof(EAL_PkeyUnitaryMethod));
1480     if (method == NULL) {
1481         BSL_ERR_PUSH_ERROR(CRYPT_PROVIDER_ERR_UNEXPECTED_IMPL);
1482         return BSL_MALLOC_FAIL;
1483     }
1484 
1485     ret = CRYPT_EAL_SetKeyMethod(funcsKeyMgmt, method);
1486     if (ret != CRYPT_SUCCESS) {
1487         BSL_SAL_FREE(method);
1488         return ret;
1489     }
1490 
1491     ret = CRYPT_EAL_SetCipherMethod(funcsAsyCipher, method);
1492     if (ret != CRYPT_SUCCESS) {
1493         BSL_SAL_FREE(method);
1494         return ret;
1495     }
1496 
1497     ret = CRYPT_EAL_SetExchMethod(funcsExch, method);
1498     if (ret != CRYPT_SUCCESS) {
1499         BSL_SAL_FREE(method);
1500         return ret;
1501     }
1502 
1503     ret = CRYPT_EAL_SetSignMethod(funcSign, method);
1504     if (ret != CRYPT_SUCCESS) {
1505         BSL_SAL_FREE(method);
1506         return ret;
1507     }
1508     ret = CRYPT_EAL_SetKemMethod(funcKem, method);
1509     if (ret != CRYPT_SUCCESS) {
1510         BSL_SAL_FREE(method);
1511         return ret;
1512     }
1513     *pkeyMethod = method;
1514     return CRYPT_SUCCESS;
1515 }
1516 
ProviderGetTargetFuncs(CRYPT_EAL_LibCtx * libCtx,int32_t operaId,int32_t algId,const char * attrName,const CRYPT_EAL_Func ** funcs,CRYPT_EAL_ProvMgrCtx ** mgrCtx)1517 static int32_t ProviderGetTargetFuncs(CRYPT_EAL_LibCtx *libCtx, int32_t operaId, int32_t algId,
1518     const char *attrName, const CRYPT_EAL_Func **funcs, CRYPT_EAL_ProvMgrCtx **mgrCtx)
1519 {
1520     int32_t ret = CRYPT_EAL_ProviderGetFuncsAndMgrCtx(libCtx, operaId, algId, attrName, funcs, mgrCtx);
1521     return ret == CRYPT_NOT_SUPPORT ? CRYPT_SUCCESS : ret;
1522 }
1523 
CRYPT_EAL_ProviderGetAsyAlgFuncs(CRYPT_EAL_LibCtx * libCtx,int32_t algId,uint32_t pkeyOperType,const char * attrName,CRYPT_EAL_AsyAlgFuncsInfo * funcs)1524 int32_t CRYPT_EAL_ProviderGetAsyAlgFuncs(CRYPT_EAL_LibCtx *libCtx, int32_t algId, uint32_t pkeyOperType,
1525     const char *attrName, CRYPT_EAL_AsyAlgFuncsInfo *funcs)
1526 {
1527     int32_t ret = CRYPT_PROVIDER_NOT_SUPPORT;
1528     if (pkeyOperType == CRYPT_EAL_PKEY_UNKNOWN_OPERATE) {
1529         RETURN_RET_IF_ERR(ProviderGetTargetFuncs(libCtx, CRYPT_EAL_OPERAID_ASYMCIPHER, algId,
1530             attrName, &funcs->funcsAsyCipher, &funcs->mgrCtx), ret);
1531         RETURN_RET_IF_ERR(ProviderGetTargetFuncs(libCtx, CRYPT_EAL_OPERAID_KEYEXCH, algId,
1532             attrName, &funcs->funcsExch, &funcs->mgrCtx), ret);
1533         RETURN_RET_IF_ERR(ProviderGetTargetFuncs(libCtx, CRYPT_EAL_OPERAID_SIGN, algId,
1534             attrName, &funcs->funcSign, &funcs->mgrCtx), ret);
1535         RETURN_RET_IF_ERR(ProviderGetTargetFuncs(libCtx, CRYPT_EAL_OPERAID_KEM, algId,
1536             attrName, &funcs->funcKem, &funcs->mgrCtx), ret);
1537     }
1538     if ((pkeyOperType & CRYPT_EAL_PKEY_CIPHER_OPERATE) == CRYPT_EAL_PKEY_CIPHER_OPERATE) {
1539         ret = CRYPT_EAL_ProviderGetFuncsAndMgrCtx(libCtx, CRYPT_EAL_OPERAID_ASYMCIPHER, algId, attrName,
1540             &funcs->funcsAsyCipher, &funcs->mgrCtx);
1541         if (ret != CRYPT_SUCCESS) {
1542             BSL_ERR_PUSH_ERROR(ret);
1543             return ret;
1544         }
1545     }
1546     if ((pkeyOperType & CRYPT_EAL_PKEY_EXCH_OPERATE) == CRYPT_EAL_PKEY_EXCH_OPERATE) {
1547         ret = CRYPT_EAL_ProviderGetFuncsAndMgrCtx(libCtx, CRYPT_EAL_OPERAID_KEYEXCH, algId, attrName,
1548             &funcs->funcsExch, &funcs->mgrCtx);
1549         if (ret != CRYPT_SUCCESS) {
1550             BSL_ERR_PUSH_ERROR(ret);
1551             return ret;
1552         }
1553     }
1554     if ((pkeyOperType & CRYPT_EAL_PKEY_SIGN_OPERATE) == CRYPT_EAL_PKEY_SIGN_OPERATE) {
1555         ret = CRYPT_EAL_ProviderGetFuncsAndMgrCtx(libCtx, CRYPT_EAL_OPERAID_SIGN, algId, attrName,
1556             &funcs->funcSign, &funcs->mgrCtx);
1557         if (ret != CRYPT_SUCCESS) {
1558             BSL_ERR_PUSH_ERROR(ret);
1559             return ret;
1560         }
1561     }
1562     if ((pkeyOperType & CRYPT_EAL_PKEY_KEM_OPERATE) == CRYPT_EAL_PKEY_KEM_OPERATE) {
1563         ret = CRYPT_EAL_ProviderGetFuncsAndMgrCtx(libCtx, CRYPT_EAL_OPERAID_KEM, algId, attrName,
1564             &funcs->funcKem, &funcs->mgrCtx);
1565         if (ret != CRYPT_SUCCESS) {
1566             BSL_ERR_PUSH_ERROR(ret);
1567             return ret;
1568         }
1569     }
1570     ret = CRYPT_EAL_ProviderGetFuncsAndMgrCtx(libCtx, CRYPT_EAL_OPERAID_KEYMGMT, algId, attrName,
1571         &funcs->funcsKeyMgmt, &funcs->mgrCtx);
1572     if (ret != CRYPT_SUCCESS) {
1573         BSL_ERR_PUSH_ERROR(ret);
1574     }
1575     return ret;
1576 }
1577 
CRYPT_EAL_ProviderPkeyNewCtxInner(CRYPT_EAL_LibCtx * libCtx,int32_t algId,uint32_t pkeyOperType,const char * attrName)1578 CRYPT_EAL_PkeyCtx *CRYPT_EAL_ProviderPkeyNewCtxInner(CRYPT_EAL_LibCtx *libCtx, int32_t algId, uint32_t pkeyOperType,
1579     const char *attrName)
1580 {
1581     void *provCtx = NULL;
1582     CRYPT_EAL_AsyAlgFuncsInfo funcInfo = {NULL, NULL, NULL, NULL, NULL, NULL};
1583     int32_t ret = CRYPT_EAL_ProviderGetAsyAlgFuncs(libCtx, algId, pkeyOperType, attrName, &funcInfo);
1584     if (ret != CRYPT_SUCCESS) {
1585         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, algId, ret);
1586         return NULL;
1587     }
1588     ret = CRYPT_EAL_ProviderCtrl(funcInfo.mgrCtx, CRYPT_PROVIDER_GET_USER_CTX, &provCtx, sizeof(provCtx));
1589     if (ret != CRYPT_SUCCESS) {
1590         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, algId, ret);
1591         return NULL;
1592     }
1593     CRYPT_EAL_PkeyCtx *ctx = BSL_SAL_Calloc(1u, sizeof(CRYPT_EAL_PkeyCtx));
1594     if (ctx == NULL) {
1595         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, algId, CRYPT_MEM_ALLOC_FAIL);
1596         return NULL;
1597     }
1598     ret = CRYPT_EAL_SetPkeyMethod(&(ctx->method), funcInfo.funcsKeyMgmt, funcInfo.funcsAsyCipher, funcInfo.funcsExch,
1599         funcInfo.funcSign, funcInfo.funcKem);
1600     if (ret != BSL_SUCCESS) {
1601         BSL_SAL_FREE(ctx);
1602         return NULL;
1603     }
1604     if (ctx->method->provNewCtx == NULL) {
1605         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, algId, CRYPT_PROVIDER_ERR_IMPL_NULL);
1606         BSL_SAL_FREE(ctx->method);
1607         BSL_SAL_FREE(ctx);
1608         return NULL;
1609     }
1610 
1611     ctx->key = ctx->method->provNewCtx(provCtx, algId);
1612     if (ctx->key == NULL) {
1613         EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_PKEY, algId, CRYPT_MEM_ALLOC_FAIL);
1614         BSL_SAL_FREE(ctx->method);
1615         BSL_SAL_FREE(ctx);
1616         return NULL;
1617     }
1618     ctx->isProvider = true;
1619     ctx->id = algId;
1620     BSL_SAL_ReferencesInit(&(ctx->references));
1621     return ctx;
1622 }
1623 #endif // HITLS_CRYPTO_PROVIDER
1624 
CRYPT_EAL_ProviderPkeyNewCtx(CRYPT_EAL_LibCtx * libCtx,int32_t algId,uint32_t pkeyOperType,const char * attrName)1625 CRYPT_EAL_PkeyCtx *CRYPT_EAL_ProviderPkeyNewCtx(CRYPT_EAL_LibCtx *libCtx, int32_t algId, uint32_t pkeyOperType,
1626     const char *attrName)
1627 {
1628 #ifdef HITLS_CRYPTO_PROVIDER
1629     return CRYPT_EAL_ProviderPkeyNewCtxInner(libCtx, algId, pkeyOperType, attrName);
1630 #else
1631     (void)libCtx;
1632     (void)pkeyOperType;
1633     (void)attrName;
1634     return CRYPT_EAL_PkeyNewCtx(algId);
1635 #endif
1636 }
1637 
1638 #endif
1639