API参考
载入中...
搜索中...
未找到
crypt_sha3.h
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#ifndef CRYPT_SHA3_H
17#define CRYPT_SHA3_H
18
19#include "hitls_build.h"
20#ifdef HITLS_CRYPTO_SHA3
21
22#include <stdint.h>
23#include <stdlib.h>
24#include "crypt_types.h"
25
26#ifdef HITLS_CRYPTO_PROVIDER
27#include "bsl_params.h"
28#endif
29
30#ifdef __cplusplus
31extern "C" {
32#endif /* __cpluscplus */
33
34
36
37/* SHA3-224 */
38#define CRYPT_SHA3_224_BLOCKSIZE 144 // ((1600 - 224 * 2) / 8)
39#define CRYPT_SHA3_224_DIGESTSIZE 28
40
41/* SHA3-256 */
42#define CRYPT_SHA3_256_BLOCKSIZE 136 // ((1600 - 256 * 2) / 8)
43#define CRYPT_SHA3_256_DIGESTSIZE 32
44
45/* SHA3-384 */
46#define CRYPT_SHA3_384_BLOCKSIZE 104 // ((1600 - 384 * 2) / 8)
47#define CRYPT_SHA3_384_DIGESTSIZE 48
48
49/* SHA3-512 */
50#define CRYPT_SHA3_512_BLOCKSIZE 72 // ((1600 - 512 * 2) / 8)
51#define CRYPT_SHA3_512_DIGESTSIZE 64
52
53/* SHAKE128 */
54#define CRYPT_SHAKE128_BLOCKSIZE 168 // ((1600 - 128 * 2) / 8)
55#define CRYPT_SHAKE128_DIGESTSIZE 0
56
57/* SHAKE256 */
58#define CRYPT_SHAKE256_BLOCKSIZE 136 // ((1600 - 256 * 2) / 8)
59#define CRYPT_SHAKE256_DIGESTSIZE 0
60
61typedef struct {
62 uint8_t state[200]; // State array, 200bytes is 1600bits
63 uint32_t num; // Data length in the remaining buffer.
64 uint32_t blockSize; // For example, BlockSize(sha3-224) = ((1600 - 224 * 2) / 8) bytes
65 uint32_t mdSize; // sha3-224 corresponds to 28 bytes, sha3-256: 32 bytes, sha3-384: 48 bytes, sha3-512: 64 bytes
66 // Non-integer multiple data cache. 168 = (1600 - 128 * 2) / 8, that is maximum block size used by shake_*
67 uint8_t buf[168];
68 uint8_t padChr; // char for padding, sha3_* use 0x06 and shake_* use 0x1f
69 bool squeeze;
70} CRYPT_SHA3_Ctx;
71
72typedef CRYPT_SHA3_Ctx CRYPT_SHA3_224_Ctx;
73
74typedef CRYPT_SHA3_Ctx CRYPT_SHA3_256_Ctx;
75
76typedef CRYPT_SHA3_Ctx CRYPT_SHA3_384_Ctx;
77
78typedef CRYPT_SHA3_Ctx CRYPT_SHA3_512_Ctx;
79
80typedef CRYPT_SHA3_Ctx CRYPT_SHAKE128_Ctx;
81
82typedef CRYPT_SHA3_Ctx CRYPT_SHAKE256_Ctx;
83
84CRYPT_SHA3_Ctx *CRYPT_SHA3_NewCtx(void);
85#define CRYPT_SHA3_224_NewCtx CRYPT_SHA3_NewCtx
86#define CRYPT_SHA3_256_NewCtx CRYPT_SHA3_NewCtx
87#define CRYPT_SHA3_384_NewCtx CRYPT_SHA3_NewCtx
88#define CRYPT_SHA3_512_NewCtx CRYPT_SHA3_NewCtx
89#define CRYPT_SHAKE128_NewCtx CRYPT_SHA3_NewCtx
90#define CRYPT_SHAKE256_NewCtx CRYPT_SHA3_NewCtx
91
92CRYPT_SHA3_Ctx *CRYPT_SHA3_NewCtxEx(void *libCtx, int32_t algId);
93#define CRYPT_SHA3_224_NewCtxEx CRYPT_SHA3_NewCtxEx
94#define CRYPT_SHA3_256_NewCtxEx CRYPT_SHA3_NewCtxEx
95#define CRYPT_SHA3_384_NewCtxEx CRYPT_SHA3_NewCtxEx
96#define CRYPT_SHA3_512_NewCtxEx CRYPT_SHA3_NewCtxEx
97#define CRYPT_SHAKE128_NewCtxEx CRYPT_SHA3_NewCtxEx
98#define CRYPT_SHAKE256_NewCtxEx CRYPT_SHA3_NewCtxEx
99
100void CRYPT_SHA3_FreeCtx(CRYPT_SHA3_Ctx *ctx);
101#define CRYPT_SHA3_224_FreeCtx CRYPT_SHA3_FreeCtx
102#define CRYPT_SHA3_256_FreeCtx CRYPT_SHA3_FreeCtx
103#define CRYPT_SHA3_384_FreeCtx CRYPT_SHA3_FreeCtx
104#define CRYPT_SHA3_512_FreeCtx CRYPT_SHA3_FreeCtx
105#define CRYPT_SHAKE128_FreeCtx CRYPT_SHA3_FreeCtx
106#define CRYPT_SHAKE256_FreeCtx CRYPT_SHA3_FreeCtx
107
108// Initialize the context
109int32_t CRYPT_SHA3_224_Init(CRYPT_SHA3_224_Ctx *ctx);
110int32_t CRYPT_SHA3_224_InitEx(CRYPT_SHA3_224_Ctx *ctx, void *param);
111
112int32_t CRYPT_SHA3_256_Init(CRYPT_SHA3_256_Ctx *ctx);
113int32_t CRYPT_SHA3_256_InitEx(CRYPT_SHA3_256_Ctx *ctx, void *param);
114
115int32_t CRYPT_SHA3_384_Init(CRYPT_SHA3_384_Ctx *ctx);
116int32_t CRYPT_SHA3_384_InitEx(CRYPT_SHA3_384_Ctx *ctx, void *param);
117
118int32_t CRYPT_SHA3_512_Init(CRYPT_SHA3_512_Ctx *ctx);
119int32_t CRYPT_SHA3_512_InitEx(CRYPT_SHA3_512_Ctx *ctx, void *param);
120
121int32_t CRYPT_SHAKE128_Init(CRYPT_SHAKE128_Ctx *ctx);
122int32_t CRYPT_SHAKE128_InitEx(CRYPT_SHAKE128_Ctx *ctx, void *param);
123
124int32_t CRYPT_SHAKE256_Init(CRYPT_SHAKE256_Ctx *ctx);
125int32_t CRYPT_SHAKE256_InitEx(CRYPT_SHAKE256_Ctx *ctx, void *param);
126
127// Data update API
128int32_t CRYPT_SHA3_Update(CRYPT_SHA3_Ctx *ctx, const uint8_t *in, uint32_t len);
129#define CRYPT_SHA3_224_Update CRYPT_SHA3_Update
130#define CRYPT_SHA3_256_Update CRYPT_SHA3_Update
131#define CRYPT_SHA3_384_Update CRYPT_SHA3_Update
132#define CRYPT_SHA3_512_Update CRYPT_SHA3_Update
133#define CRYPT_SHAKE128_Update CRYPT_SHA3_Update
134#define CRYPT_SHAKE256_Update CRYPT_SHA3_Update
135
136// Padding and output the digest value
137int32_t CRYPT_SHA3_Final(CRYPT_SHA3_Ctx *ctx, uint8_t *out, uint32_t *len);
138#define CRYPT_SHA3_224_Final CRYPT_SHA3_Final
139#define CRYPT_SHA3_256_Final CRYPT_SHA3_Final
140#define CRYPT_SHA3_384_Final CRYPT_SHA3_Final
141#define CRYPT_SHA3_512_Final CRYPT_SHA3_Final
142#define CRYPT_SHAKE128_Final CRYPT_SHA3_Final
143#define CRYPT_SHAKE256_Final CRYPT_SHA3_Final
144
145int32_t CRYPT_SHA3_Squeeze(CRYPT_SHA3_Ctx *ctx, uint8_t *out, uint32_t len);
146#define CRYPT_SHA3_224_Squeeze NULL
147#define CRYPT_SHA3_256_Squeeze NULL
148#define CRYPT_SHA3_384_Squeeze NULL
149#define CRYPT_SHA3_512_Squeeze NULL
150#define CRYPT_SHAKE128_Squeeze CRYPT_SHA3_Squeeze
151#define CRYPT_SHAKE256_Squeeze CRYPT_SHA3_Squeeze
152
153// Clear the context
154int32_t CRYPT_SHA3_Deinit(CRYPT_SHA3_Ctx *ctx);
155#define CRYPT_SHA3_224_Deinit CRYPT_SHA3_Deinit
156#define CRYPT_SHA3_256_Deinit CRYPT_SHA3_Deinit
157#define CRYPT_SHA3_384_Deinit CRYPT_SHA3_Deinit
158#define CRYPT_SHA3_512_Deinit CRYPT_SHA3_Deinit
159#define CRYPT_SHAKE128_Deinit CRYPT_SHA3_Deinit
160#define CRYPT_SHAKE256_Deinit CRYPT_SHA3_Deinit
161
162// Copy the context
163int32_t CRYPT_SHA3_CopyCtx(CRYPT_SHA3_Ctx *dst, const CRYPT_SHA3_Ctx *src);
164#define CRYPT_SHA3_224_CopyCtx CRYPT_SHA3_CopyCtx
165#define CRYPT_SHA3_256_CopyCtx CRYPT_SHA3_CopyCtx
166#define CRYPT_SHA3_384_CopyCtx CRYPT_SHA3_CopyCtx
167#define CRYPT_SHA3_512_CopyCtx CRYPT_SHA3_CopyCtx
168#define CRYPT_SHAKE128_CopyCtx CRYPT_SHA3_CopyCtx
169#define CRYPT_SHAKE256_CopyCtx CRYPT_SHA3_CopyCtx
170
171// Dup the context
172CRYPT_SHA3_Ctx *CRYPT_SHA3_DupCtx(const CRYPT_SHA3_Ctx *src);
173#define CRYPT_SHA3_224_DupCtx CRYPT_SHA3_DupCtx
174#define CRYPT_SHA3_256_DupCtx CRYPT_SHA3_DupCtx
175#define CRYPT_SHA3_384_DupCtx CRYPT_SHA3_DupCtx
176#define CRYPT_SHA3_512_DupCtx CRYPT_SHA3_DupCtx
177#define CRYPT_SHAKE128_DupCtx CRYPT_SHA3_DupCtx
178#define CRYPT_SHAKE256_DupCtx CRYPT_SHA3_DupCtx
179
180#ifdef HITLS_CRYPTO_PROVIDER
181int32_t CRYPT_SHA3_224_GetParam(CRYPT_SHA3_224_Ctx *ctx, BSL_Param *param);
182int32_t CRYPT_SHA3_256_GetParam(CRYPT_SHA3_256_Ctx *ctx, BSL_Param *param);
183int32_t CRYPT_SHA3_384_GetParam(CRYPT_SHA3_384_Ctx *ctx, BSL_Param *param);
184int32_t CRYPT_SHA3_512_GetParam(CRYPT_SHA3_512_Ctx *ctx, BSL_Param *param);
185int32_t CRYPT_SHAKE128_GetParam(CRYPT_SHAKE128_Ctx *ctx, BSL_Param *param);
186int32_t CRYPT_SHAKE256_GetParam(CRYPT_SHAKE256_Ctx *ctx, BSL_Param *param);
187#else
188#define CRYPT_SHA3_224_GetParam NULL
189#define CRYPT_SHA3_256_GetParam NULL
190#define CRYPT_SHA3_384_GetParam NULL
191#define CRYPT_SHA3_512_GetParam NULL
192#define CRYPT_SHAKE128_GetParam NULL
193#define CRYPT_SHAKE256_GetParam NULL
194#endif
195
196#ifdef __cplusplus
197}
198#endif
199
200#endif // HITLS_CRYPTO_SHA3
201
202#endif // CRYPT_SHA3_H