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_hmac.h"
21 #include "crypt_cmac.h"
22 #include "crypt_cbc_mac.h"
23 #include "crypt_gmac.h"
24 #include "crypt_siphash.h"
25 #include "crypt_ealinit.h"
26 #include "bsl_sal.h"
27 #include "crypt_errno.h"
28 #include "bsl_log_internal.h"
29 #include "bsl_err_internal.h"
30
31 #define MAC_DEINIT_FUNC(name) \
32 static int32_t CRYPT_##name##_DeinitWrapper(void *ctx) \
33 { \
34 CRYPT_##name##_Deinit(ctx); \
35 return CRYPT_SUCCESS; \
36 }
37
38 #define MAC_REINIT_FUNC(name) \
39 static int32_t CRYPT_##name##_ReinitWrapper(void *ctx) \
40 { \
41 CRYPT_##name##_Reinit(ctx); \
42 return CRYPT_SUCCESS; \
43 }
44
45 #define MAC_FUNCS(name) \
46 MAC_DEINIT_FUNC(name) \
47 MAC_REINIT_FUNC(name)
48
CRYPT_EAL_DefMacNewCtx(void * provCtx,int32_t algId)49 void *CRYPT_EAL_DefMacNewCtx(void *provCtx, int32_t algId)
50 {
51 (void)provCtx;
52 #ifdef HITLS_CRYPTO_ASM_CHECK
53 if (CRYPT_ASMCAP_Mac(algId) != CRYPT_SUCCESS) {
54 BSL_ERR_PUSH_ERROR(CRYPT_EAL_ALG_ASM_NOT_SUPPORT);
55 return NULL;
56 }
57 #endif
58
59 switch (algId) {
60 #ifdef HITLS_CRYPTO_HMAC
61 case CRYPT_MAC_HMAC_MD5:
62 case CRYPT_MAC_HMAC_SHA1:
63 case CRYPT_MAC_HMAC_SHA224:
64 case CRYPT_MAC_HMAC_SHA256:
65 case CRYPT_MAC_HMAC_SHA384:
66 case CRYPT_MAC_HMAC_SHA512:
67 case CRYPT_MAC_HMAC_SHA3_224:
68 case CRYPT_MAC_HMAC_SHA3_256:
69 case CRYPT_MAC_HMAC_SHA3_384:
70 case CRYPT_MAC_HMAC_SHA3_512:
71 case CRYPT_MAC_HMAC_SM3:
72 return CRYPT_HMAC_NewCtx(algId);
73 #endif
74 #ifdef HITLS_CRYPTO_CMAC
75 case CRYPT_MAC_CMAC_AES128:
76 case CRYPT_MAC_CMAC_AES192:
77 case CRYPT_MAC_CMAC_AES256:
78 case CRYPT_MAC_CMAC_SM4:
79 return CRYPT_CMAC_NewCtx(algId);
80 #endif
81 #ifdef HITLS_CRYPTO_CBC_MAC
82 case CRYPT_MAC_CBC_MAC_SM4:
83 return CRYPT_CBC_MAC_NewCtx(algId);
84 #endif
85 #ifdef HITLS_CRYPTO_SIPHASH
86 case CRYPT_MAC_SIPHASH64:
87 case CRYPT_MAC_SIPHASH128:
88 return CRYPT_SIPHASH_NewCtx(algId);
89 #endif
90 #ifdef HITLS_CRYPTO_GMAC
91 case CRYPT_MAC_GMAC_AES128:
92 case CRYPT_MAC_GMAC_AES192:
93 case CRYPT_MAC_GMAC_AES256:
94 return CRYPT_GMAC_NewCtx(algId);
95 #endif
96 default:
97 BSL_ERR_PUSH_ERROR(CRYPT_PROVIDER_NOT_SUPPORT);
98 return NULL;
99 }
100 }
101
102 #ifdef HITLS_CRYPTO_HMAC
103 MAC_FUNCS(HMAC)
104 #endif
105
106 #ifdef HITLS_CRYPTO_CMAC
107 MAC_FUNCS(CMAC)
108 #endif
109
110 #ifdef HITLS_CRYPTO_CBC_MAC
111 MAC_FUNCS(CBC_MAC)
112 #endif
113
114 #ifdef HITLS_CRYPTO_SIPHASH
115 MAC_FUNCS(SIPHASH)
116 #endif
117
118 #ifdef HITLS_CRYPTO_GMAC
119 MAC_DEINIT_FUNC(GMAC)
120 #endif
121 const CRYPT_EAL_Func g_defEalMacHmac[] = {
122 #ifdef HITLS_CRYPTO_HMAC
123 {CRYPT_EAL_IMPLMAC_NEWCTX, (CRYPT_EAL_ImplMacNewCtx)CRYPT_EAL_DefMacNewCtx},
124 {CRYPT_EAL_IMPLMAC_INIT, (CRYPT_EAL_ImplMacInit)CRYPT_HMAC_Init},
125 {CRYPT_EAL_IMPLMAC_UPDATE, (CRYPT_EAL_ImplMacUpdate)CRYPT_HMAC_Update},
126 {CRYPT_EAL_IMPLMAC_FINAL, (CRYPT_EAL_ImplMacFinal)CRYPT_HMAC_Final},
127 {CRYPT_EAL_IMPLMAC_DEINITCTX, (CRYPT_EAL_ImplMacDeInitCtx)CRYPT_HMAC_DeinitWrapper},
128 {CRYPT_EAL_IMPLMAC_REINITCTX, (CRYPT_EAL_ImplMacReInitCtx)CRYPT_HMAC_ReinitWrapper},
129 {CRYPT_EAL_IMPLMAC_CTRL, (CRYPT_EAL_ImplMacCtrl)CRYPT_HMAC_Ctrl},
130 {CRYPT_EAL_IMPLMAC_FREECTX, (CRYPT_EAL_ImplMacFreeCtx)CRYPT_HMAC_FreeCtx},
131 #endif
132 CRYPT_EAL_FUNC_END,
133 };
134
135 const CRYPT_EAL_Func g_defEalMacCmac[] = {
136 #ifdef HITLS_CRYPTO_CMAC
137 {CRYPT_EAL_IMPLMAC_NEWCTX, (CRYPT_EAL_ImplMacNewCtx)CRYPT_EAL_DefMacNewCtx},
138 {CRYPT_EAL_IMPLMAC_INIT, (CRYPT_EAL_ImplMacInit)CRYPT_CMAC_Init},
139 {CRYPT_EAL_IMPLMAC_UPDATE, (CRYPT_EAL_ImplMacUpdate)CRYPT_CMAC_Update},
140 {CRYPT_EAL_IMPLMAC_FINAL, (CRYPT_EAL_ImplMacFinal)CRYPT_CMAC_Final},
141 {CRYPT_EAL_IMPLMAC_DEINITCTX, (CRYPT_EAL_ImplMacDeInitCtx)CRYPT_CMAC_DeinitWrapper},
142 {CRYPT_EAL_IMPLMAC_REINITCTX, (CRYPT_EAL_ImplMacReInitCtx)CRYPT_CMAC_ReinitWrapper},
143 {CRYPT_EAL_IMPLMAC_CTRL, (CRYPT_EAL_ImplMacCtrl)CRYPT_CMAC_Ctrl},
144 {CRYPT_EAL_IMPLMAC_FREECTX, (CRYPT_EAL_ImplMacFreeCtx)CRYPT_CMAC_FreeCtx},
145 #endif
146 CRYPT_EAL_FUNC_END,
147 };
148
149 const CRYPT_EAL_Func g_defEalMacCbcMac[] = {
150 #ifdef HITLS_CRYPTO_CBC_MAC
151 {CRYPT_EAL_IMPLMAC_NEWCTX, (CRYPT_EAL_ImplMacNewCtx)CRYPT_EAL_DefMacNewCtx},
152 {CRYPT_EAL_IMPLMAC_INIT, (CRYPT_EAL_ImplMacInit)CRYPT_CBC_MAC_Init},
153 {CRYPT_EAL_IMPLMAC_UPDATE, (CRYPT_EAL_ImplMacUpdate)CRYPT_CBC_MAC_Update},
154 {CRYPT_EAL_IMPLMAC_FINAL, (CRYPT_EAL_ImplMacFinal)CRYPT_CBC_MAC_Final},
155 {CRYPT_EAL_IMPLMAC_DEINITCTX, (CRYPT_EAL_ImplMacDeInitCtx)CRYPT_CBC_MAC_DeinitWrapper},
156 {CRYPT_EAL_IMPLMAC_REINITCTX, (CRYPT_EAL_ImplMacReInitCtx)CRYPT_CBC_MAC_ReinitWrapper},
157 {CRYPT_EAL_IMPLMAC_CTRL, (CRYPT_EAL_ImplMacCtrl)CRYPT_CBC_MAC_Ctrl},
158 {CRYPT_EAL_IMPLMAC_FREECTX, (CRYPT_EAL_ImplMacFreeCtx)CRYPT_CBC_MAC_FreeCtx},
159 #endif
160 CRYPT_EAL_FUNC_END,
161 };
162
163 const CRYPT_EAL_Func g_defEalMacGmac[] = {
164 #ifdef HITLS_CRYPTO_GMAC
165 {CRYPT_EAL_IMPLMAC_NEWCTX, (CRYPT_EAL_ImplMacNewCtx)CRYPT_EAL_DefMacNewCtx},
166 {CRYPT_EAL_IMPLMAC_INIT, (CRYPT_EAL_ImplMacInit)CRYPT_GMAC_Init},
167 {CRYPT_EAL_IMPLMAC_UPDATE, (CRYPT_EAL_ImplMacUpdate)CRYPT_GMAC_Update},
168 {CRYPT_EAL_IMPLMAC_FINAL, (CRYPT_EAL_ImplMacFinal)CRYPT_GMAC_Final},
169 {CRYPT_EAL_IMPLMAC_DEINITCTX, (CRYPT_EAL_ImplMacDeInitCtx)CRYPT_GMAC_DeinitWrapper},
170 {CRYPT_EAL_IMPLMAC_REINITCTX, NULL},
171 {CRYPT_EAL_IMPLMAC_CTRL, (CRYPT_EAL_ImplMacCtrl)CRYPT_GMAC_Ctrl},
172 {CRYPT_EAL_IMPLMAC_FREECTX, (CRYPT_EAL_ImplMacFreeCtx)CRYPT_GMAC_FreeCtx},
173 #endif
174 CRYPT_EAL_FUNC_END,
175 };
176
177 const CRYPT_EAL_Func g_defEalMacSiphash[] = {
178 #ifdef HITLS_CRYPTO_SIPHASH
179 {CRYPT_EAL_IMPLMAC_NEWCTX, (CRYPT_EAL_ImplMacNewCtx)CRYPT_EAL_DefMacNewCtx},
180 {CRYPT_EAL_IMPLMAC_INIT, (CRYPT_EAL_ImplMacInit)CRYPT_SIPHASH_Init},
181 {CRYPT_EAL_IMPLMAC_UPDATE, (CRYPT_EAL_ImplMacUpdate)CRYPT_SIPHASH_Update},
182 {CRYPT_EAL_IMPLMAC_FINAL, (CRYPT_EAL_ImplMacFinal)CRYPT_SIPHASH_Final},
183 {CRYPT_EAL_IMPLMAC_DEINITCTX, (CRYPT_EAL_ImplMacDeInitCtx)CRYPT_SIPHASH_DeinitWrapper},
184 {CRYPT_EAL_IMPLMAC_REINITCTX, (CRYPT_EAL_ImplMacReInitCtx)CRYPT_SIPHASH_ReinitWrapper},
185 {CRYPT_EAL_IMPLMAC_CTRL, (CRYPT_EAL_ImplMacCtrl)CRYPT_SIPHASH_Ctrl},
186 {CRYPT_EAL_IMPLMAC_FREECTX, (CRYPT_EAL_ImplMacFreeCtx)CRYPT_SIPHASH_FreeCtx},
187 #endif
188 CRYPT_EAL_FUNC_END,
189 };
190
191 #endif /* HITLS_CRYPTO_PROVIDER */