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_MD)
18
19 #include "crypt_local_types.h"
20 #include "crypt_algid.h"
21 #ifdef HITLS_CRYPTO_SHA2
22 #include "crypt_sha2.h"
23 #endif
24 #ifdef HITLS_CRYPTO_SHA1
25 #include "crypt_sha1.h"
26 #endif
27 #ifdef HITLS_CRYPTO_SM3
28 #include "crypt_sm3.h"
29 #endif
30 #ifdef HITLS_CRYPTO_SHA3
31 #include "crypt_sha3.h"
32 #endif
33 #ifdef HITLS_CRYPTO_MD5
34 #include "crypt_md5.h"
35 #endif
36 #include "bsl_err_internal.h"
37 #include "eal_common.h"
38 #include "bsl_sal.h"
39 #include "crypt_errno.h"
40
41 #define CRYPT_MD_IMPL_METHOD_DECLARE(name) \
42 EAL_MdMethod g_mdMethod_##name = { \
43 CRYPT_##name##_BLOCKSIZE, CRYPT_##name##_DIGESTSIZE, \
44 (MdNewCtx)CRYPT_##name##_NewCtx, (MdInit)CRYPT_##name##_Init, \
45 (MdUpdate)CRYPT_##name##_Update, (MdFinal)CRYPT_##name##_Final, \
46 (MdDeinit)CRYPT_##name##_Deinit, (MdCopyCtx)CRYPT_##name##_CopyCtx, \
47 (MdDupCtx)CRYPT_##name##_DupCtx, (MdFreeCtx)CRYPT_##name##_FreeCtx, NULL, NULL \
48 }
49
50 #ifdef HITLS_CRYPTO_MD5
51 CRYPT_MD_IMPL_METHOD_DECLARE(MD5);
52 #endif
53 #ifdef HITLS_CRYPTO_SHA1
54 CRYPT_MD_IMPL_METHOD_DECLARE(SHA1);
55 #endif
56 #ifdef HITLS_CRYPTO_SHA2
57 #ifdef HITLS_CRYPTO_SHA224
58 CRYPT_MD_IMPL_METHOD_DECLARE(SHA2_224);
59 #endif
60 #ifdef HITLS_CRYPTO_SHA256
61 CRYPT_MD_IMPL_METHOD_DECLARE(SHA2_256);
62 #endif
63 #ifdef HITLS_CRYPTO_SHA384
64 CRYPT_MD_IMPL_METHOD_DECLARE(SHA2_384);
65 #endif
66 #ifdef HITLS_CRYPTO_SHA512
67 CRYPT_MD_IMPL_METHOD_DECLARE(SHA2_512);
68 #endif
69 #endif
70 #ifdef HITLS_CRYPTO_SHA3
71 CRYPT_MD_IMPL_METHOD_DECLARE(SHA3_224);
72 CRYPT_MD_IMPL_METHOD_DECLARE(SHA3_256);
73 CRYPT_MD_IMPL_METHOD_DECLARE(SHA3_384);
74 CRYPT_MD_IMPL_METHOD_DECLARE(SHA3_512);
75 EAL_MdMethod g_mdMethod_SHAKE128 = {
76 CRYPT_SHAKE128_BLOCKSIZE, CRYPT_SHAKE128_DIGESTSIZE,
77 (MdNewCtx)CRYPT_SHAKE128_NewCtx, (MdInit)CRYPT_SHAKE128_Init,
78 (MdUpdate)CRYPT_SHAKE128_Update, (MdFinal)CRYPT_SHAKE128_Final,
79 (MdDeinit)CRYPT_SHAKE128_Deinit, (MdCopyCtx)CRYPT_SHAKE128_CopyCtx,
80 (MdDupCtx)CRYPT_SHAKE128_DupCtx, (MdFreeCtx)CRYPT_SHAKE128_FreeCtx,
81 NULL, (MdSqueeze)CRYPT_SHAKE128_Squeeze
82 };
83 EAL_MdMethod g_mdMethod_SHAKE256 = {
84 CRYPT_SHAKE256_BLOCKSIZE, CRYPT_SHAKE256_DIGESTSIZE,
85 (MdNewCtx)CRYPT_SHAKE256_NewCtx, (MdInit)CRYPT_SHAKE256_Init,
86 (MdUpdate)CRYPT_SHAKE256_Update, (MdFinal)CRYPT_SHAKE256_Final,
87 (MdDeinit)CRYPT_SHAKE256_Deinit, (MdCopyCtx)CRYPT_SHAKE256_CopyCtx,
88 (MdDupCtx)CRYPT_SHAKE256_DupCtx, (MdFreeCtx)CRYPT_SHAKE256_FreeCtx,
89 NULL, (MdSqueeze)CRYPT_SHAKE256_Squeeze
90 };
91 #endif
92 #ifdef HITLS_CRYPTO_SM3
93 CRYPT_MD_IMPL_METHOD_DECLARE(SM3);
94 #endif
95
96 static const EAL_CidToMdMeth ID_TO_MD_METH_TABLE[] = {
97 #ifdef HITLS_CRYPTO_MD5
98 {CRYPT_MD_MD5, &g_mdMethod_MD5},
99 #endif
100 #ifdef HITLS_CRYPTO_SHA1
101 {CRYPT_MD_SHA1, &g_mdMethod_SHA1},
102 #endif
103 #ifdef HITLS_CRYPTO_SHA224
104 {CRYPT_MD_SHA224, &g_mdMethod_SHA2_224},
105 #endif
106 #ifdef HITLS_CRYPTO_SHA256
107 {CRYPT_MD_SHA256, &g_mdMethod_SHA2_256},
108 #endif
109 #ifdef HITLS_CRYPTO_SHA384
110 {CRYPT_MD_SHA384, &g_mdMethod_SHA2_384},
111 #endif
112 #ifdef HITLS_CRYPTO_SHA512
113 {CRYPT_MD_SHA512, &g_mdMethod_SHA2_512},
114 #endif
115 #ifdef HITLS_CRYPTO_SHA3
116 {CRYPT_MD_SHA3_224, &g_mdMethod_SHA3_224},
117 {CRYPT_MD_SHA3_256, &g_mdMethod_SHA3_256},
118 {CRYPT_MD_SHA3_384, &g_mdMethod_SHA3_384},
119 {CRYPT_MD_SHA3_512, &g_mdMethod_SHA3_512},
120 {CRYPT_MD_SHAKE128, &g_mdMethod_SHAKE128},
121 {CRYPT_MD_SHAKE256, &g_mdMethod_SHAKE256},
122 #endif
123 #ifdef HITLS_CRYPTO_SM3
124 {CRYPT_MD_SM3, &g_mdMethod_SM3}, // SM3
125 #endif
126 };
127
EAL_MdFindMethod(CRYPT_MD_AlgId id)128 const EAL_MdMethod *EAL_MdFindMethod(CRYPT_MD_AlgId id)
129 {
130 EAL_MdMethod *pMdMeth = NULL;
131 uint32_t num = sizeof(ID_TO_MD_METH_TABLE) / sizeof(ID_TO_MD_METH_TABLE[0]);
132
133 for (uint32_t i = 0; i < num; i++) {
134 if (ID_TO_MD_METH_TABLE[i].id == id) {
135 pMdMeth = ID_TO_MD_METH_TABLE[i].mdMeth;
136 return pMdMeth;
137 }
138 }
139
140 return NULL;
141 }
142
EAL_Md(CRYPT_MD_AlgId id,const uint8_t * in,uint32_t inLen,uint8_t * out,uint32_t * outLen)143 int32_t EAL_Md(CRYPT_MD_AlgId id, const uint8_t *in, uint32_t inLen, uint8_t *out, uint32_t *outLen)
144 {
145 int32_t ret;
146 if (out == NULL || outLen == NULL) {
147 EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_MD, id, CRYPT_NULL_INPUT);
148 return CRYPT_NULL_INPUT;
149 }
150 if (in == NULL && inLen != 0) {
151 EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_MD, id, CRYPT_NULL_INPUT);
152 return CRYPT_NULL_INPUT;
153 }
154 const EAL_MdMethod *method = EAL_MdFindMethod(id);
155 if (method == NULL) {
156 EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_MD, id, CRYPT_EAL_ERR_ALGID);
157 return CRYPT_EAL_ERR_ALGID;
158 }
159
160 void *data = method->newCtx();
161 if (data == NULL) {
162 EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_MD, id, CRYPT_MEM_ALLOC_FAIL);
163 return CRYPT_MEM_ALLOC_FAIL;
164 }
165
166 ret = method->init(data, NULL);
167 if (ret != CRYPT_SUCCESS) {
168 EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_MD, id, ret);
169 goto EXIT;
170 }
171 if (inLen != 0) {
172 ret = method->update(data, in, inLen);
173 if (ret != CRYPT_SUCCESS) {
174 EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_MD, id, ret);
175 goto EXIT;
176 }
177 }
178
179 ret = method->final(data, out, outLen);
180 if (ret != CRYPT_SUCCESS) {
181 EAL_ERR_REPORT(CRYPT_EVENT_ERR, CRYPT_ALGO_MD, id, ret);
182 goto EXIT;
183 }
184 *outLen = method->mdSize;
185
186 EXIT:
187 method->freeCtx(data);
188 return ret;
189 }
190 #endif
191