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