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