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 #ifdef HITLS_CRYPTO_PROVIDER
18
19 #include "crypt_eal_implprovider.h"
20 #include "crypt_modes_cbc.h"
21 #include "crypt_modes_ccm.h"
22 #include "crypt_modes_chacha20poly1305.h"
23 #include "crypt_modes_ctr.h"
24 #include "crypt_modes_ecb.h"
25 #include "crypt_modes_gcm.h"
26 #include "crypt_modes_ofb.h"
27 #include "crypt_modes_cfb.h"
28 #include "crypt_modes_xts.h"
29 #include "crypt_local_types.h"
30 #include "crypt_errno.h"
31 #include "bsl_err_internal.h"
32 #include "crypt_ealinit.h"
33
CRYPT_EAL_DefCipherNewCtx(void * provCtx,int32_t algId)34 static void *CRYPT_EAL_DefCipherNewCtx(void *provCtx, int32_t algId)
35 {
36 (void) provCtx;
37 #ifdef HITLS_CRYPTO_ASM_CHECK
38 if (CRYPT_ASMCAP_Cipher(algId) != CRYPT_SUCCESS) {
39 BSL_ERR_PUSH_ERROR(CRYPT_EAL_ALG_ASM_NOT_SUPPORT);
40 return NULL;
41 }
42 #endif
43 CRYPT_EAL_Func cipherNewCtxFunc[] = {
44 {CRYPT_CIPHER_AES128_CBC, MODES_CBC_NewCtx},
45 {CRYPT_CIPHER_AES192_CBC, MODES_CBC_NewCtx},
46 {CRYPT_CIPHER_AES256_CBC, MODES_CBC_NewCtx},
47 {CRYPT_CIPHER_AES128_CTR, MODES_CTR_NewCtx},
48 {CRYPT_CIPHER_AES192_CTR, MODES_CTR_NewCtx},
49 {CRYPT_CIPHER_AES256_CTR, MODES_CTR_NewCtx},
50 {CRYPT_CIPHER_AES128_ECB, MODES_ECB_NewCtx},
51 {CRYPT_CIPHER_AES192_ECB, MODES_ECB_NewCtx},
52 {CRYPT_CIPHER_AES256_ECB, MODES_ECB_NewCtx},
53 {CRYPT_CIPHER_AES128_CCM, MODES_CCM_NewCtx},
54 {CRYPT_CIPHER_AES192_CCM, MODES_CCM_NewCtx},
55 {CRYPT_CIPHER_AES256_CCM, MODES_CCM_NewCtx},
56 {CRYPT_CIPHER_AES128_GCM, MODES_GCM_NewCtx},
57 {CRYPT_CIPHER_AES192_GCM, MODES_GCM_NewCtx},
58 {CRYPT_CIPHER_AES256_GCM, MODES_GCM_NewCtx},
59 {CRYPT_CIPHER_AES128_CFB, MODES_CFB_NewCtx},
60 {CRYPT_CIPHER_AES192_CFB, MODES_CFB_NewCtx},
61 {CRYPT_CIPHER_AES256_CFB, MODES_CFB_NewCtx},
62 {CRYPT_CIPHER_AES128_OFB, MODES_OFB_NewCtx},
63 {CRYPT_CIPHER_AES192_OFB, MODES_OFB_NewCtx},
64 {CRYPT_CIPHER_AES256_OFB, MODES_OFB_NewCtx},
65 {CRYPT_CIPHER_AES128_XTS, MODES_XTS_NewCtx},
66 {CRYPT_CIPHER_AES256_XTS, MODES_XTS_NewCtx},
67 {CRYPT_CIPHER_CHACHA20_POLY1305, MODES_CHACHA20POLY1305_NewCtx},
68 {CRYPT_CIPHER_SM4_XTS, MODES_XTS_NewCtx},
69 {CRYPT_CIPHER_SM4_CBC, MODES_CBC_NewCtx},
70 {CRYPT_CIPHER_SM4_ECB, MODES_ECB_NewCtx},
71 {CRYPT_CIPHER_SM4_CTR, MODES_CTR_NewCtx},
72 {CRYPT_CIPHER_SM4_GCM, MODES_GCM_NewCtx},
73 {CRYPT_CIPHER_SM4_CFB, MODES_CFB_NewCtx},
74 {CRYPT_CIPHER_SM4_OFB, MODES_OFB_NewCtx},
75 };
76 for (size_t i = 0; i < sizeof(cipherNewCtxFunc)/sizeof(cipherNewCtxFunc[0]); i++) {
77 if (cipherNewCtxFunc[i].id == algId) {
78 return ((CipherNewCtx)cipherNewCtxFunc[i].func)(algId);
79 }
80 }
81
82 return NULL;
83 }
84
85 const CRYPT_EAL_Func g_defEalCbc[] = {
86 #ifdef HITLS_CRYPTO_CBC
87 {CRYPT_EAL_IMPLCIPHER_NEWCTX, (CRYPT_EAL_ImplCipherNewCtx)CRYPT_EAL_DefCipherNewCtx},
88 {CRYPT_EAL_IMPLCIPHER_INITCTX, (CRYPT_EAL_ImplCipherInitCtx)MODES_CBC_InitCtxEx},
89 {CRYPT_EAL_IMPLCIPHER_UPDATE, (CRYPT_EAL_ImplCipherUpdate)MODES_CBC_UpdateEx},
90 {CRYPT_EAL_IMPLCIPHER_FINAL, (CRYPT_EAL_ImplCipherFinal)MODES_CBC_FinalEx},
91 {CRYPT_EAL_IMPLCIPHER_DEINITCTX, (CRYPT_EAL_ImplCipherDeinitCtx)MODES_CBC_DeInitCtx},
92 {CRYPT_EAL_IMPLCIPHER_CTRL, (CRYPT_EAL_ImplCipherCtrl)MODES_CBC_Ctrl},
93 {CRYPT_EAL_IMPLCIPHER_FREECTX, (CRYPT_EAL_ImplCipherFreeCtx)MODES_CBC_FreeCtx},
94 #endif
95 CRYPT_EAL_FUNC_END,
96 };
97
98 const CRYPT_EAL_Func g_defEalCcm[] = {
99 #ifdef HITLS_CRYPTO_CCM
100 {CRYPT_EAL_IMPLCIPHER_NEWCTX, (CRYPT_EAL_ImplCipherNewCtx)CRYPT_EAL_DefCipherNewCtx},
101 {CRYPT_EAL_IMPLCIPHER_INITCTX, (CRYPT_EAL_ImplCipherInitCtx)MODES_CCM_InitCtx},
102 {CRYPT_EAL_IMPLCIPHER_UPDATE, (CRYPT_EAL_ImplCipherUpdate)MODES_CCM_UpdateEx},
103 {CRYPT_EAL_IMPLCIPHER_FINAL, (CRYPT_EAL_ImplCipherFinal)MODES_CCM_Final},
104 {CRYPT_EAL_IMPLCIPHER_DEINITCTX, (CRYPT_EAL_ImplCipherDeinitCtx)MODES_CCM_DeInitCtx},
105 {CRYPT_EAL_IMPLCIPHER_CTRL, (CRYPT_EAL_ImplCipherCtrl)MODES_CCM_Ctrl},
106 {CRYPT_EAL_IMPLCIPHER_FREECTX, (CRYPT_EAL_ImplCipherFreeCtx)MODES_CCM_FreeCtx},
107 #endif
108 CRYPT_EAL_FUNC_END,
109 };
110
111 const CRYPT_EAL_Func g_defEalCfb[] = {
112 #ifdef HITLS_CRYPTO_CFB
113 {CRYPT_EAL_IMPLCIPHER_NEWCTX, (CRYPT_EAL_ImplCipherNewCtx)CRYPT_EAL_DefCipherNewCtx},
114 {CRYPT_EAL_IMPLCIPHER_INITCTX, (CRYPT_EAL_ImplCipherInitCtx)MODES_CFB_InitCtxEx},
115 {CRYPT_EAL_IMPLCIPHER_UPDATE, (CRYPT_EAL_ImplCipherUpdate)MODES_CFB_UpdateEx},
116 {CRYPT_EAL_IMPLCIPHER_FINAL, (CRYPT_EAL_ImplCipherFinal)MODES_CFB_Final},
117 {CRYPT_EAL_IMPLCIPHER_DEINITCTX, (CRYPT_EAL_ImplCipherDeinitCtx)MODES_CFB_DeInitCtx},
118 {CRYPT_EAL_IMPLCIPHER_CTRL, (CRYPT_EAL_ImplCipherCtrl)MODES_CFB_Ctrl},
119 {CRYPT_EAL_IMPLCIPHER_FREECTX, (CRYPT_EAL_ImplCipherFreeCtx)MODES_CFB_FreeCtx},
120 #endif
121 CRYPT_EAL_FUNC_END,
122 };
123
124 const CRYPT_EAL_Func g_defEalChaCha[] = {
125 #if defined(HITLS_CRYPTO_CHACHA20) && defined(HITLS_CRYPTO_CHACHA20POLY1305)
126 {CRYPT_EAL_IMPLCIPHER_NEWCTX, (CRYPT_EAL_ImplCipherNewCtx)CRYPT_EAL_DefCipherNewCtx},
127 {CRYPT_EAL_IMPLCIPHER_INITCTX, (CRYPT_EAL_ImplCipherInitCtx)MODES_CHACHA20POLY1305_InitCtx},
128 {CRYPT_EAL_IMPLCIPHER_UPDATE, (CRYPT_EAL_ImplCipherUpdate)MODES_CHACHA20POLY1305_Update},
129 {CRYPT_EAL_IMPLCIPHER_FINAL, (CRYPT_EAL_ImplCipherFinal)MODES_CHACHA20POLY1305_Final},
130 {CRYPT_EAL_IMPLCIPHER_DEINITCTX, (CRYPT_EAL_ImplCipherDeinitCtx)MODES_CHACHA20POLY1305_DeInitCtx},
131 {CRYPT_EAL_IMPLCIPHER_CTRL, (CRYPT_EAL_ImplCipherCtrl)MODES_CHACHA20POLY1305_Ctrl},
132 {CRYPT_EAL_IMPLCIPHER_FREECTX, (CRYPT_EAL_ImplCipherFreeCtx)MODES_CHACHA20POLY1305_FreeCtx},
133 #endif
134 CRYPT_EAL_FUNC_END,
135 };
136
137 const CRYPT_EAL_Func g_defEalCtr[] = {
138 #ifdef HITLS_CRYPTO_CTR
139 {CRYPT_EAL_IMPLCIPHER_NEWCTX, (CRYPT_EAL_ImplCipherNewCtx)CRYPT_EAL_DefCipherNewCtx},
140 {CRYPT_EAL_IMPLCIPHER_INITCTX, (CRYPT_EAL_ImplCipherInitCtx)MODES_CTR_InitCtxEx},
141 {CRYPT_EAL_IMPLCIPHER_UPDATE, (CRYPT_EAL_ImplCipherUpdate)MODES_CTR_UpdateEx},
142 {CRYPT_EAL_IMPLCIPHER_FINAL, (CRYPT_EAL_ImplCipherFinal)MODES_CTR_Final},
143 {CRYPT_EAL_IMPLCIPHER_DEINITCTX, (CRYPT_EAL_ImplCipherDeinitCtx)MODES_CTR_DeInitCtx},
144 {CRYPT_EAL_IMPLCIPHER_CTRL, (CRYPT_EAL_ImplCipherCtrl)MODES_CTR_Ctrl},
145 {CRYPT_EAL_IMPLCIPHER_FREECTX, (CRYPT_EAL_ImplCipherFreeCtx)MODES_CTR_FreeCtx},
146 #endif
147 CRYPT_EAL_FUNC_END,
148 };
149
150 const CRYPT_EAL_Func g_defEalEcb[] = {
151 #ifdef HITLS_CRYPTO_ECB
152 {CRYPT_EAL_IMPLCIPHER_NEWCTX, (CRYPT_EAL_ImplCipherNewCtx)CRYPT_EAL_DefCipherNewCtx},
153 {CRYPT_EAL_IMPLCIPHER_INITCTX, (CRYPT_EAL_ImplCipherInitCtx)MODES_ECB_InitCtxEx},
154 {CRYPT_EAL_IMPLCIPHER_UPDATE, (CRYPT_EAL_ImplCipherUpdate)MODES_ECB_UpdateEx},
155 {CRYPT_EAL_IMPLCIPHER_FINAL, (CRYPT_EAL_ImplCipherFinal)MODES_ECB_FinalEx},
156 {CRYPT_EAL_IMPLCIPHER_DEINITCTX, (CRYPT_EAL_ImplCipherDeinitCtx)MODES_ECB_DeinitCtx},
157 {CRYPT_EAL_IMPLCIPHER_CTRL, (CRYPT_EAL_ImplCipherCtrl)MODES_ECB_Ctrl},
158 {CRYPT_EAL_IMPLCIPHER_FREECTX, (CRYPT_EAL_ImplCipherFreeCtx)MODES_ECB_FreeCtx},
159 #endif
160 CRYPT_EAL_FUNC_END,
161 };
162
163 const CRYPT_EAL_Func g_defEalGcm[] = {
164 #ifdef HITLS_CRYPTO_GCM
165 {CRYPT_EAL_IMPLCIPHER_NEWCTX, (CRYPT_EAL_ImplCipherNewCtx)CRYPT_EAL_DefCipherNewCtx},
166 {CRYPT_EAL_IMPLCIPHER_INITCTX, (CRYPT_EAL_ImplCipherInitCtx)MODES_GCM_InitCtxEx},
167 {CRYPT_EAL_IMPLCIPHER_UPDATE, (CRYPT_EAL_ImplCipherUpdate)MODES_GCM_UpdateEx},
168 {CRYPT_EAL_IMPLCIPHER_FINAL, (CRYPT_EAL_ImplCipherFinal)MODES_GCM_Final},
169 {CRYPT_EAL_IMPLCIPHER_DEINITCTX, (CRYPT_EAL_ImplCipherDeinitCtx)MODES_GCM_DeInitCtx},
170 {CRYPT_EAL_IMPLCIPHER_CTRL, (CRYPT_EAL_ImplCipherCtrl)MODES_GCM_Ctrl},
171 {CRYPT_EAL_IMPLCIPHER_FREECTX, (CRYPT_EAL_ImplCipherFreeCtx)MODES_GCM_FreeCtx},
172 #endif
173 CRYPT_EAL_FUNC_END,
174 };
175
176 const CRYPT_EAL_Func g_defEalOfb[] = {
177 #ifdef HITLS_CRYPTO_OFB
178 {CRYPT_EAL_IMPLCIPHER_NEWCTX, (CRYPT_EAL_ImplCipherNewCtx)CRYPT_EAL_DefCipherNewCtx},
179 {CRYPT_EAL_IMPLCIPHER_INITCTX, (CRYPT_EAL_ImplCipherInitCtx)MODES_OFB_InitCtxEx},
180 {CRYPT_EAL_IMPLCIPHER_UPDATE, (CRYPT_EAL_ImplCipherUpdate)MODES_OFB_UpdateEx},
181 {CRYPT_EAL_IMPLCIPHER_FINAL, (CRYPT_EAL_ImplCipherFinal)MODES_OFB_Final},
182 {CRYPT_EAL_IMPLCIPHER_DEINITCTX, (CRYPT_EAL_ImplCipherDeinitCtx)MODES_OFB_DeInitCtx},
183 {CRYPT_EAL_IMPLCIPHER_CTRL, (CRYPT_EAL_ImplCipherCtrl)MODES_OFB_Ctrl},
184 {CRYPT_EAL_IMPLCIPHER_FREECTX, (CRYPT_EAL_ImplCipherFreeCtx)MODES_OFB_FreeCtx},
185 #endif
186 CRYPT_EAL_FUNC_END,
187 };
188
189 const CRYPT_EAL_Func g_defEalXts[] = {
190 #ifdef HITLS_CRYPTO_XTS
191 {CRYPT_EAL_IMPLCIPHER_NEWCTX, (CRYPT_EAL_ImplCipherNewCtx)CRYPT_EAL_DefCipherNewCtx},
192 {CRYPT_EAL_IMPLCIPHER_INITCTX, (CRYPT_EAL_ImplCipherInitCtx)MODES_XTS_InitCtxEx},
193 {CRYPT_EAL_IMPLCIPHER_UPDATE, (CRYPT_EAL_ImplCipherUpdate)MODES_XTS_UpdateEx},
194 {CRYPT_EAL_IMPLCIPHER_FINAL, (CRYPT_EAL_ImplCipherFinal)MODES_XTS_Final},
195 {CRYPT_EAL_IMPLCIPHER_DEINITCTX, (CRYPT_EAL_ImplCipherDeinitCtx)MODES_XTS_DeInitCtx},
196 {CRYPT_EAL_IMPLCIPHER_CTRL, (CRYPT_EAL_ImplCipherCtrl)MODES_XTS_Ctrl},
197 {CRYPT_EAL_IMPLCIPHER_FREECTX, (CRYPT_EAL_ImplCipherFreeCtx)MODES_XTS_FreeCtx},
198 #endif
199 CRYPT_EAL_FUNC_END,
200 };
201
202 #endif /* HITLS_CRYPTO_PROVIDER */