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 "securec.h"
20 #include "crypt_local_types.h"
21 #include "crypt_algid.h"
22 #include "eal_pkey_local.h"
23 #ifdef HITLS_CRYPTO_RSA
24 #include "crypt_rsa.h"
25 #endif
26 #ifdef HITLS_CRYPTO_DSA
27 #include "crypt_dsa.h"
28 #endif
29 #ifdef HITLS_CRYPTO_CURVE25519
30 #include "crypt_curve25519.h"
31 #endif
32 #ifdef HITLS_CRYPTO_DH
33 #include "crypt_dh.h"
34 #endif
35 #ifdef HITLS_CRYPTO_ECDH
36 #include "crypt_ecdh.h"
37 #endif
38 #ifdef HITLS_CRYPTO_ECDSA
39 #include "crypt_ecdsa.h"
40 #endif
41 #ifdef HITLS_CRYPTO_SM2
42 #include "crypt_sm2.h"
43 #endif
44 #ifdef HITLS_CRYPTO_PAILLIER
45 #include "crypt_paillier.h"
46 #endif
47 #ifdef HITLS_CRYPTO_ELGAMAL
48 #include "crypt_elgamal.h"
49 #endif
50 #ifdef HITLS_CRYPTO_KEM
51 #include "crypt_mlkem.h"
52 #endif
53 #ifdef HITLS_CRYPTO_MLDSA
54 #include "crypt_mldsa.h"
55 #endif
56 #ifdef HITLS_CRYPTO_SLH_DSA
57 #include "crypt_slh_dsa.h"
58 #endif
59 #ifdef HITLS_CRYPTO_HYBRIDKEM
60 #include "crypt_hybridkem.h"
61 #endif
62 #include "bsl_err_internal.h"
63 #include "crypt_types.h"
64 #include "crypt_errno.h"
65 #include "eal_common.h"
66 #include "bsl_sal.h"
67
68 #define EAL_PKEY_METHOD_DEFINE(id, \
69 newCtx, dupCtx, freeCtx, setPara, getPara, gen, ctrl, setPub, setPrv, getPub, getPrv, sign, signData, verify, \
70 verifyData, recover, computeShareKey, encrypt, decrypt, check, cmp, copyParam, encaps, decaps, blind, unBlind) { \
71 id, (PkeyNew)(newCtx), (PkeyDup)(dupCtx), (PkeyFree)(freeCtx), \
72 (PkeySetPara)(setPara), (PkeyGetPara)(getPara), (PkeyGen)(gen), (PkeyCtrl)(ctrl), \
73 (PkeySetPub)(setPub), (PkeySetPrv)(setPrv), (PkeyGetPub)(getPub), (PkeyGetPrv)(getPrv), \
74 (PkeySign)(sign), (PkeySignData)(signData), (PkeyVerify)(verify), (PkeyVerifyData)(verifyData), \
75 (PkeyRecover)(recover), (PkeyComputeShareKey)(computeShareKey), \
76 (PkeyCrypt)(encrypt), (PkeyCrypt)(decrypt), (PkeyCheck)(check), (PkeyCmp)(cmp), (PkeyCopyParam)(copyParam), \
77 (PkeyEncapsulate)(encaps), (PkeyDecapsulate)(decaps), (PkeyBlind)(blind), (PkeyUnBlind)(unBlind)}
78
79 static const EAL_PkeyMethod METHODS[] = {
80 #ifdef HITLS_CRYPTO_DSA
81 EAL_PKEY_METHOD_DEFINE(
82 CRYPT_PKEY_DSA,
83 CRYPT_DSA_NewCtx,
84 CRYPT_DSA_DupCtx,
85 CRYPT_DSA_FreeCtx,
86 CRYPT_DSA_SetPara,
87 CRYPT_DSA_GetPara,
88 CRYPT_DSA_Gen,
89 CRYPT_DSA_Ctrl,
90 CRYPT_DSA_SetPubKey,
91 CRYPT_DSA_SetPrvKey,
92 CRYPT_DSA_GetPubKey,
93 CRYPT_DSA_GetPrvKey,
94 CRYPT_DSA_Sign,
95 CRYPT_DSA_SignData,
96 CRYPT_DSA_Verify,
97 CRYPT_DSA_VerifyData,
98 NULL, // recover
99 NULL, // computeShareKey
100 NULL, // encrypt
101 NULL, // decrypt
102 NULL, // check
103 CRYPT_DSA_Cmp,
104 NULL, // copyPara
105 NULL, // pkeyEncaps
106 NULL, // pkeyDecaps
107 NULL, // blind
108 NULL // unBlind
109 ), // CRYPT_PKEY_DSA
110 #endif
111 #ifdef HITLS_CRYPTO_ED25519
112 EAL_PKEY_METHOD_DEFINE(
113 CRYPT_PKEY_ED25519,
114 CRYPT_ED25519_NewCtx,
115 CRYPT_CURVE25519_DupCtx,
116 CRYPT_CURVE25519_FreeCtx,
117 NULL, // setPara
118 NULL, // getPara
119 CRYPT_ED25519_GenKey,
120 CRYPT_CURVE25519_Ctrl,
121 CRYPT_CURVE25519_SetPubKey,
122 CRYPT_CURVE25519_SetPrvKey,
123 CRYPT_CURVE25519_GetPubKey,
124 CRYPT_CURVE25519_GetPrvKey,
125 CRYPT_CURVE25519_Sign,
126 NULL, // signData
127 CRYPT_CURVE25519_Verify,
128 NULL, // verifyData
129 NULL, // recover
130 NULL, // computeShareKey
131 NULL, // encrypt
132 NULL, // decrypt
133 NULL, // check
134 CRYPT_CURVE25519_Cmp,
135 NULL, // copyPara
136 NULL, // pkeyEncaps
137 NULL, // pkeyDecaps
138 NULL, // blind
139 NULL // unBlind
140 ), // CRYPT_PKEY_ED25519
141 #endif
142 #ifdef HITLS_CRYPTO_X25519
143 EAL_PKEY_METHOD_DEFINE(
144 CRYPT_PKEY_X25519,
145 CRYPT_X25519_NewCtx,
146 CRYPT_CURVE25519_DupCtx,
147 CRYPT_CURVE25519_FreeCtx,
148 NULL, // setPara
149 NULL, // getPara
150 CRYPT_X25519_GenKey,
151 CRYPT_CURVE25519_Ctrl,
152 CRYPT_CURVE25519_SetPubKey,
153 CRYPT_CURVE25519_SetPrvKey,
154 CRYPT_CURVE25519_GetPubKey,
155 CRYPT_CURVE25519_GetPrvKey,
156 NULL, // sign
157 NULL, // signData
158 NULL, // verify
159 NULL, // verifyData
160 NULL, // recover
161 CRYPT_CURVE25519_ComputeSharedKey,
162 NULL, // encrypt
163 NULL, // decrypt
164 NULL, // check
165 CRYPT_CURVE25519_Cmp,
166 NULL, // copyPara
167 NULL, // pkeyEncaps
168 NULL, // pkeyDecaps
169 NULL, // blind
170 NULL // unBlind
171 ), // CRYPT_PKEY_X25519
172 #endif
173 #ifdef HITLS_CRYPTO_RSA
174 EAL_PKEY_METHOD_DEFINE(
175 CRYPT_PKEY_RSA,
176 CRYPT_RSA_NewCtx,
177 CRYPT_RSA_DupCtx,
178 CRYPT_RSA_FreeCtx,
179 CRYPT_RSA_SetPara,
180 NULL, // getPara
181 #ifdef HITLS_CRYPTO_RSA_GEN
182 CRYPT_RSA_Gen,
183 #else
184 NULL, // gen
185 #endif
186 CRYPT_RSA_Ctrl,
187 CRYPT_RSA_SetPubKey,
188 CRYPT_RSA_SetPrvKey,
189 CRYPT_RSA_GetPubKey,
190 CRYPT_RSA_GetPrvKey,
191 #ifdef HITLS_CRYPTO_RSA_SIGN
192 CRYPT_RSA_Sign,
193 CRYPT_RSA_SignData,
194 #else
195 NULL, // sign
196 NULL, // signData
197 #endif
198 #ifdef HITLS_CRYPTO_RSA_VERIFY
199 CRYPT_RSA_Verify,
200 CRYPT_RSA_VerifyData,
201 CRYPT_RSA_Recover,
202 #else
203 NULL, // verify
204 NULL, // verifyData
205 NULL, // recover
206 #endif
207 NULL, // computeShareKey
208 #ifdef HITLS_CRYPTO_RSA_ENCRYPT
209 CRYPT_RSA_Encrypt,
210 #else
211 NULL, // encrypt
212 #endif
213 #ifdef HITLS_CRYPTO_RSA_DECRYPT
214 CRYPT_RSA_Decrypt,
215 #else
216 NULL, // decrypt
217 #endif
218 NULL, // check
219 CRYPT_RSA_Cmp,
220 NULL, // copyPara
221 NULL, // pkeyEncaps
222 NULL, // pkeyDecaps
223 #ifdef HITLS_CRYPTO_RSA_BSSA
224 #ifdef HITLS_CRYPTO_RSA_SIGN
225 CRYPT_RSA_Blind, // blind
226 #else
227 NULL, // blind
228 #endif
229 #ifdef HITLS_CRYPTO_RSA_VERIFY
230 CRYPT_RSA_UnBlind // unBlind
231 #else
232 NULL // unBlind
233 #endif
234 #else
235 NULL, // blind
236 NULL // unBlind
237 #endif
238 ),
239 #endif
240 #ifdef HITLS_CRYPTO_DH
241 EAL_PKEY_METHOD_DEFINE(
242 CRYPT_PKEY_DH,
243 CRYPT_DH_NewCtx,
244 CRYPT_DH_DupCtx,
245 CRYPT_DH_FreeCtx,
246 CRYPT_DH_SetPara,
247 CRYPT_DH_GetPara,
248 CRYPT_DH_Gen,
249 CRYPT_DH_Ctrl,
250 CRYPT_DH_SetPubKey,
251 CRYPT_DH_SetPrvKey,
252 CRYPT_DH_GetPubKey,
253 CRYPT_DH_GetPrvKey,
254 NULL, // sign
255 NULL, // signData
256 NULL, // verify
257 NULL, // verifyData
258 NULL, // recover
259 CRYPT_DH_ComputeShareKey,
260 NULL, // encrypt
261 NULL, // decrypt
262 NULL,
263 CRYPT_DH_Cmp,
264 NULL,
265 NULL, // pkeyEncaps
266 NULL, // pkeyDecaps
267 NULL, // blind
268 NULL // unBlind
269 ),
270 #endif
271 #ifdef HITLS_CRYPTO_ECDSA
272 EAL_PKEY_METHOD_DEFINE(
273 CRYPT_PKEY_ECDSA,
274 CRYPT_ECDSA_NewCtx,
275 CRYPT_ECDSA_DupCtx,
276 CRYPT_ECDSA_FreeCtx,
277 CRYPT_ECDSA_SetPara,
278 CRYPT_ECDSA_GetPara,
279 CRYPT_ECDSA_Gen,
280 CRYPT_ECDSA_Ctrl,
281 CRYPT_ECDSA_SetPubKey,
282 CRYPT_ECDSA_SetPrvKey,
283 CRYPT_ECDSA_GetPubKey,
284 CRYPT_ECDSA_GetPrvKey,
285 CRYPT_ECDSA_Sign,
286 CRYPT_ECDSA_SignData,
287 CRYPT_ECDSA_Verify,
288 CRYPT_ECDSA_VerifyData,
289 NULL, // recover
290 NULL, // computeShareKey
291 NULL, // encrypt
292 NULL, // decrypt
293 NULL, // check
294 CRYPT_ECDSA_Cmp,
295 NULL, // copyPara
296 NULL, // pkeyEncaps
297 NULL, // pkeyDecaps
298 NULL, // blind
299 NULL // unBlind
300 ),
301 #endif
302 #ifdef HITLS_CRYPTO_ECDH
303 EAL_PKEY_METHOD_DEFINE(
304 CRYPT_PKEY_ECDH,
305 CRYPT_ECDH_NewCtx,
306 CRYPT_ECDH_DupCtx,
307 CRYPT_ECDH_FreeCtx,
308 CRYPT_ECDH_SetPara,
309 CRYPT_ECDH_GetPara,
310 CRYPT_ECDH_Gen,
311 CRYPT_ECDH_Ctrl,
312 CRYPT_ECDH_SetPubKey,
313 CRYPT_ECDH_SetPrvKey,
314 CRYPT_ECDH_GetPubKey,
315 CRYPT_ECDH_GetPrvKey,
316 NULL, // sign
317 NULL, // signData
318 NULL, // verify
319 NULL, // verifyData
320 NULL, // recover
321 CRYPT_ECDH_ComputeShareKey,
322 NULL, // encrypt
323 NULL, // decrypt
324 NULL, // check
325 CRYPT_ECDH_Cmp,
326 NULL, // copyPara
327 NULL, // pkeyEncaps
328 NULL, // pkeyDecaps
329 NULL, // blind
330 NULL // unBlind
331 ),
332 #endif
333 #ifdef HITLS_CRYPTO_SM2
334 EAL_PKEY_METHOD_DEFINE(
335 CRYPT_PKEY_SM2,
336 CRYPT_SM2_NewCtx,
337 CRYPT_SM2_DupCtx,
338 CRYPT_SM2_FreeCtx,
339 NULL, // setPara
340 NULL, // getPara
341 CRYPT_SM2_Gen,
342 CRYPT_SM2_Ctrl,
343 CRYPT_SM2_SetPubKey,
344 CRYPT_SM2_SetPrvKey,
345 CRYPT_SM2_GetPubKey,
346 CRYPT_SM2_GetPrvKey,
347 #ifdef HITLS_CRYPTO_SM2_SIGN
348 CRYPT_SM2_Sign,
349 NULL,
350 CRYPT_SM2_Verify,
351 NULL,
352 #else
353 NULL, // sign
354 NULL, // signData
355 NULL, // verify
356 NULL, // verifyData
357 #endif
358 NULL, // recover
359 #ifdef HITLS_CRYPTO_SM2_EXCH
360 CRYPT_SM2_KapComputeKey, // compute share key
361 #else
362 NULL, // computeShareKey
363 #endif
364 #ifdef HITLS_CRYPTO_SM2_CRYPT
365 CRYPT_SM2_Encrypt, // encrypt
366 CRYPT_SM2_Decrypt, // decrypt
367 #else
368 NULL, // encrypt
369 NULL, // decrypt
370 #endif
371 NULL,
372 CRYPT_SM2_Cmp,
373 NULL, // copyPara
374 NULL, // pkeyEncaps
375 NULL, // pkeyDecaps
376 NULL, // blind
377 NULL // unBlind
378 ), // CRYPT_PKEY_SM2
379 #endif
380 #ifdef HITLS_CRYPTO_PAILLIER
381 EAL_PKEY_METHOD_DEFINE(
382 CRYPT_PKEY_PAILLIER,
383 CRYPT_PAILLIER_NewCtx,
384 CRYPT_PAILLIER_DupCtx,
385 CRYPT_PAILLIER_FreeCtx,
386 CRYPT_PAILLIER_SetPara,
387 NULL,
388 CRYPT_PAILLIER_Gen,
389 CRYPT_PAILLIER_Ctrl,
390 CRYPT_PAILLIER_SetPubKey,
391 CRYPT_PAILLIER_SetPrvKey,
392 CRYPT_PAILLIER_GetPubKey,
393 CRYPT_PAILLIER_GetPrvKey,
394 NULL,
395 NULL,
396 NULL,
397 NULL,
398 NULL, // recover
399 NULL,
400 CRYPT_PAILLIER_Encrypt,
401 CRYPT_PAILLIER_Decrypt,
402 NULL,
403 NULL, // cmp
404 NULL, // copyPara
405 NULL, // pkeyEncaps
406 NULL, // pkeyDecaps
407 NULL, // blind
408 NULL // unBlind
409 ), // CRYPT_PKEY_PAILLIER
410 #endif
411 #ifdef HITLS_CRYPTO_ELGAMAL
412 EAL_PKEY_METHOD_DEFINE(
413 CRYPT_PKEY_ELGAMAL,
414 CRYPT_ELGAMAL_NewCtx,
415 CRYPT_ELGAMAL_DupCtx,
416 CRYPT_ELGAMAL_FreeCtx,
417 CRYPT_ELGAMAL_SetPara,
418 NULL,
419 CRYPT_ELGAMAL_Gen,
420 CRYPT_ELGAMAL_Ctrl,
421 CRYPT_ELGAMAL_SetPubKey,
422 CRYPT_ELGAMAL_SetPrvKey,
423 CRYPT_ELGAMAL_GetPubKey,
424 CRYPT_ELGAMAL_GetPrvKey,
425 NULL,
426 NULL,
427 NULL,
428 NULL,
429 NULL, // recover
430 NULL,
431 CRYPT_ELGAMAL_Encrypt,
432 CRYPT_ELGAMAL_Decrypt,
433 NULL,
434 NULL, // cmp
435 NULL, // copyPara
436 NULL, // pkeyEncaps
437 NULL, // pkeyDecaps
438 NULL, // blind
439 NULL // unBlind
440 ), // CRYPT_PKEY_ELGAMAL
441 #endif
442 #ifdef HITLS_CRYPTO_MLKEM
443 EAL_PKEY_METHOD_DEFINE(
444 CRYPT_PKEY_ML_KEM,
445 CRYPT_ML_KEM_NewCtx,
446 CRYPT_ML_KEM_DupCtx,
447 CRYPT_ML_KEM_FreeCtx,
448 NULL, // setPara
449 NULL, // getPara
450 CRYPT_ML_KEM_GenKey,
451 CRYPT_ML_KEM_Ctrl,
452 CRYPT_ML_KEM_SetEncapsKey,
453 CRYPT_ML_KEM_SetDecapsKey,
454 CRYPT_ML_KEM_GetEncapsKey,
455 CRYPT_ML_KEM_GetDecapsKey,
456 NULL, // sign
457 NULL, // signData
458 NULL, // verify
459 NULL, // verifyData
460 NULL, // recover
461 NULL, // computeShareKey
462 NULL, // encrypt
463 NULL, // decrypt
464 NULL, // check
465 CRYPT_ML_KEM_Cmp,
466 NULL, // copyPara
467 CRYPT_ML_KEM_Encaps,
468 CRYPT_ML_KEM_Decaps,
469 NULL, // blind
470 NULL // unBlind
471 ),
472 #endif
473 #ifdef HITLS_CRYPTO_MLDSA
474 EAL_PKEY_METHOD_DEFINE(
475 CRYPT_PKEY_ML_DSA,
476 CRYPT_ML_DSA_NewCtx,
477 CRYPT_ML_DSA_DupCtx,
478 CRYPT_ML_DSA_FreeCtx,
479 NULL, // setPara
480 NULL, // getPara
481 CRYPT_ML_DSA_GenKey,
482 CRYPT_ML_DSA_Ctrl,
483 CRYPT_ML_DSA_SetPubKey,
484 CRYPT_ML_DSA_SetPrvKey,
485 CRYPT_ML_DSA_GetPubKey,
486 CRYPT_ML_DSA_GetPrvKey,
487 CRYPT_ML_DSA_Sign, // sign
488 NULL, // signData
489 CRYPT_ML_DSA_Verify, // verify
490 NULL, // verifyData
491 NULL, // recover
492 NULL, // computeShareKey
493 NULL, // encrypt
494 NULL, // decrypt
495 NULL, // check
496 CRYPT_ML_DSA_Cmp,
497 NULL, // copyPara
498 NULL, // pkeyEncaps
499 NULL, // pkeyDecaps
500 NULL, // blind
501 NULL // unBlind
502 ),
503 #endif
504 #ifdef HITLS_CRYPTO_SLH_DSA
505 EAL_PKEY_METHOD_DEFINE(
506 CRYPT_PKEY_SLH_DSA,
507 CRYPT_SLH_DSA_NewCtx,
508 NULL, // dupCtx
509 CRYPT_SLH_DSA_FreeCtx,
510 NULL, // setPara
511 NULL, // getPara
512 CRYPT_SLH_DSA_Gen,
513 CRYPT_SLH_DSA_Ctrl,
514 CRYPT_SLH_DSA_SetPubKey,
515 CRYPT_SLH_DSA_SetPrvKey,
516 CRYPT_SLH_DSA_GetPubKey,
517 CRYPT_SLH_DSA_GetPrvKey,
518 CRYPT_SLH_DSA_Sign,
519 NULL,
520 CRYPT_SLH_DSA_Verify,
521 NULL,
522 NULL,
523 NULL,
524 NULL,
525 NULL,
526 NULL,
527 NULL,
528 NULL,
529 NULL,
530 NULL,
531 NULL,
532 NULL
533 ),
534 #endif
535 #ifdef HITLS_CRYPTO_HYBRIDKEM
536 EAL_PKEY_METHOD_DEFINE(
537 CRYPT_PKEY_HYBRID_KEM,
538 CRYPT_HYBRID_KEM_NewCtx,
539 NULL,
540 CRYPT_HYBRID_KEM_FreeCtx,
541 NULL, // setPara
542 NULL, // getPara
543 CRYPT_HYBRID_KEM_GenKey,
544 CRYPT_HYBRID_KEM_KeyCtrl,
545 CRYPT_HYBRID_KEM_SetEncapsKey,
546 CRYPT_HYBRID_KEM_SetDecapsKey,
547 CRYPT_HYBRID_KEM_GetEncapsKey,
548 CRYPT_HYBRID_KEM_GetDecapsKey,
549 NULL, // sign
550 NULL, // signData
551 NULL, // verify
552 NULL, // verifyData
553 NULL, // recover
554 NULL, // computeShareKey
555 NULL, // encrypt
556 NULL, // decrypt
557 NULL, // check
558 NULL,
559 NULL, // copyPara
560 CRYPT_HYBRID_KEM_Encaps,
561 CRYPT_HYBRID_KEM_Decaps,
562 NULL, // blind
563 NULL // unBlind
564 ),
565 #endif
566 };
567
CRYPT_EAL_PkeyFindMethod(CRYPT_PKEY_AlgId id)568 const EAL_PkeyMethod *CRYPT_EAL_PkeyFindMethod(CRYPT_PKEY_AlgId id)
569 {
570 uint32_t num = sizeof(METHODS) / sizeof(METHODS[0]);
571 const EAL_PkeyMethod *pkeyMeth = NULL;
572
573 for (uint32_t i = 0; i < num; i++) {
574 if (METHODS[i].id == id) {
575 pkeyMeth = &METHODS[i];
576 return pkeyMeth;
577 }
578 }
579 return NULL;
580 }
581 #endif
582