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.dsaPara);
362 break;
363 case CRYPT_PKEY_RSA:
364 ret = SetRsaParams(pkey, ¶->para.rsaPara);
365 break;
366 case CRYPT_PKEY_DH:
367 ret = SetDhParams(pkey, ¶->para.dhPara);
368 break;
369 case CRYPT_PKEY_ECDSA:
370 case CRYPT_PKEY_ECDH:
371 ret = SetEccParams(pkey, ¶->para.eccPara);
372 break;
373 case CRYPT_PKEY_PAILLIER:
374 ret = SetPaillierParams(pkey, ¶->para.paillierPara);
375 break;
376 case CRYPT_PKEY_ELGAMAL:
377 ret = SetElGamalParams(pkey, ¶->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.dsaPara);
397 break;
398 case CRYPT_PKEY_DH:
399 ret = GetDhParams(pkey, ¶->para.dhPara);
400 break;
401 case CRYPT_PKEY_ECDSA:
402 case CRYPT_PKEY_ECDH:
403 ret = GetEccParams(pkey, ¶->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, ¶);
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, ¶);
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, ¶m);
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, ¶m);
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, ¶m);
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, ¶m);
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, ¶m);
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, ¶m);
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, ¶m);
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, ¶m);
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, ¶m);
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, ¶m);
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, ¶m);
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, ¶m);
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, ¶m);
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, ¶m);
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, ¶m);
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, ¶m);
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