ec-field-test.c: Make the field-element type use internal format.
[secnet] / sha3.h
CommitLineData
a1a6042e
MW
1/* -*-c-*-
2 *
3 * The SHA3 algorithm family
4 *
5 * (c) 2017 Straylight/Edgeware
6 */
7
8/*----- Licensing notice --------------------------------------------------*
9 *
10 * This file is part of secnet.
11 * See README for full list of copyright holders.
12 *
13 * secnet is free software; you can redistribute it and/or modify it
14 * under the terms of the GNU General Public License as published by
15 * the Free Software Foundation; either version d of the License, or
16 * (at your option) any later version.
17 *
18 * secnet is distributed in the hope that it will be useful, but
19 * WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 * General Public License for more details.
22 *
23 * You should have received a copy of the GNU General Public License
24 * version 3 along with secnet; if not, see
25 * https://www.gnu.org/licenses/gpl.html.
26 *
27 * This file was originally part of Catacomb, but has been automatically
28 * modified for incorporation into secnet: see `import-catacomb-crypto'
29 * for details.
30 *
31 * Catacomb is free software; you can redistribute it and/or modify
32 * it under the terms of the GNU Library General Public License as
33 * published by the Free Software Foundation; either version 2 of the
34 * License, or (at your option) any later version.
35 *
36 * Catacomb is distributed in the hope that it will be useful,
37 * but WITHOUT ANY WARRANTY; without even the implied warranty of
38 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
39 * GNU Library General Public License for more details.
40 *
41 * You should have received a copy of the GNU Library General Public
42 * License along with Catacomb; if not, write to the Free
43 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
44 * MA 02111-1307, USA.
45 */
46
47#ifndef CATACOMB_SHA3_H
48#define CATACOMB_SHA3_H
49
50#ifdef __cplusplus
51 extern "C" {
52#endif
53
54/*----- Notes on the SHA3 algorithm family --------------------------------*
55 *
56 * The winner of the SHA3 competition was Keccak, designed by Guido Bertoni,
57 * Joan Daemen, Michaƫl Peeters, and Gilles Van Assche. The algorithm uses
58 * their `sponge construction', based on a fixed attempt to instantiate an
59 * `ideal permutation'. The construction is rather versatile, and NIST has
60 * standardized a number of algorithms based on it.
61 *
62 * The basic offerings are the drop-in replacements for the SHA2 family.
63 * These are slower than is ideal, because of the decision to provide O(2^n)
64 * resistance to second-preimage attacks for the n-bit hash function, which
65 * means that, effectively, the capacity parameter is set unnecessarily
66 * large. (There was a major fuss when NIST tried to change this in a draft
67 * of te standard.) All of the obvious hash modes, e.g., HMAC, MGF, can be
68 * applied to the SHA3 hash functions, though I can't really recommend this:
69 * there's almost certainly a better way of doing whatever it is.
70 *
71 * Other members of the family are: SHAKE and cSHAKE, `extendable-output
72 * funnctions' which can be used directly in place of MGFs; and KMAC, a
73 * message authentication code with arbitrary-length key, message, and tag,
74 * which can therefore be used as a key-derivation function. The cSHAKE
75 * construction, on which KMAC is based, introduces a personalization string
76 * which can be used for domain separation.
77 */
78
79/*----- Header files ------------------------------------------------------*/
80
81#include "fake-mLib-bits.h"
82
83#ifndef CATACOMB_KECCAK1600_H
84# include "keccak1600.h"
85#endif
86
87/*----- The SHA3 hash function family -------------------------------------*/
88
89typedef struct sha3_ctx {
90 keccak1600_state s;
91 unsigned r, w, n;
92 octet buf[200];
93} sha3_ctx;
94#define sha3_224_ctx sha3_ctx
95#define sha3_256_ctx sha3_ctx
96#define sha3_384_ctx sha3_ctx
97#define sha3_512_ctx sha3_ctx
98
99#define SHA3_224_HASHSZ 28
100#define SHA3_256_HASHSZ 32
101#define SHA3_384_HASHSZ 48
102#define SHA3_512_HASHSZ 64
103
104#define SHA3_224_BUFSZ 144
105#define SHA3_256_BUFSZ 136
106#define SHA3_384_BUFSZ 104
107#define SHA3_512_BUFSZ 72
108
109#define SHA3_STATESZ (sizeof(sha3_ctx))
110#define SHA3_224_STATESZ SHA3_STATESZ
111#define SHA3_256_STATESZ SHA3_STATESZ
112#define SHA3_384_STATESZ SHA3_STATESZ
113#define SHA3_512_STATESZ SHA3_STATESZ
114
115/* --- @sha3_{224,256,384,512}_init@ --- *
116 *
117 * Arguments: @sha3_ctx *ctx@ = pointer to context block to initialize
118 *
119 * Returns: ---
120 *
121 * Use: Initializes a SHA3 hashing context for use.
122 */
123
124extern void sha3_224_init(sha3_ctx */*ctx*/);
125extern void sha3_256_init(sha3_ctx */*ctx*/);
126extern void sha3_384_init(sha3_ctx */*ctx*/);
127extern void sha3_512_init(sha3_ctx */*ctx*/);
128
129/* --- @sha3_hash@ --- *
130 *
131 * Arguments: @sha3_ctx *ctx@ = pointer to context bock
132 * @const void *p@ = pointer to data to hash
133 * @size_t sz@ = size of buffer to hash
134 *
135 * Returns: ---
136 *
137 * Use: Hashes a buffer of data. The buffer may be of any size and
138 * alignment.
139 */
140
141#define sha3_224_hash sha3_hash
142#define sha3_256_hash sha3_hash
143#define sha3_384_hash sha3_hash
144#define sha3_512_hash sha3_hash
145
146extern void sha3_hash(sha3_ctx */*ctx*/, const void */*p*/, size_t /*sz*/);
147
148/* --- @sha3_done@ --- *
149 *
150 * Arguments: @sha3_ctx *ctx@ = pointer to context block
151 * @void *hash@ = pointer to output buffer
152 *
153 * Returns: ---
154 *
155 * Use: Returns the hash of the data read so far.
156 */
157
158#define sha3_224_done sha3_done
159#define sha3_256_done sha3_done
160#define sha3_384_done sha3_done
161#define sha3_512_done sha3_done
162
163extern void sha3_done(sha3_ctx */*ctx*/, void */*hash*/);
164
165/*----- The cSHAKE XOF algorithm ------------------------------------------*/
166
167typedef struct shake_ctx {
168 sha3_ctx h;
169 unsigned st, op;
170} shake_ctx;
171#define shake128_ctx shake_ctx
172#define shake256_ctx shake_ctx
173
174#define SHAKE128_KEYSZ 16
175#define SHAKE256_KEYSZ 32
176
177#define SHAKE128_HASHSZ 32 /* Somewhat arbitrary... */
178#define SHAKE256_HASHSZ 64
179
180/* --- @cshake{128,256}_init@ --- *
181 *
182 * Arguments: @shake_ctx *ctx@ = pointer to context to initialize
183 * @const void *func@ = NIST-allocated function name
184 * @size_t fsz@ = length of function name
185 * @const void *perso@ = user personalization string
186 * @size_t psz@ = length of personalization string
187 *
188 * Returns: ---
189 *
190 * Use: Initializes a cSHAKE context. The context is initially in
191 * the `absorbing' state: feed it data with @shake_hash@.
192 */
193
194extern void cshake128_init(shake_ctx */*ctx*/,
195 const void */*func*/, size_t /*fsz*/,
196 const void */*perso*/, size_t /*psz*/);
197
198extern void cshake256_init(shake_ctx */*ctx*/,
199 const void */*func*/, size_t /*fsz*/,
200 const void */*perso*/, size_t /*psz*/);
201
202/* --- @shake{128,256}_init@ --- *
203 *
204 * Arguments: @sha3_ctx *ctx@ = pointer to context to initialize
205 *
206 * Returns: ---
207 *
208 * Use: Initializes a SHAKE context. The context is initially in
209 * the `absorbing' state: feed it data with @shake_hash@.
210 */
211
212extern void shake128_init(shake_ctx */*ctx*/);
213extern void shake256_init(shake_ctx */*ctx*/);
214
215/* --- @shake_hash@ --- *
216 *
217 * Arguments: @shake_ctx *ctx@ = context to update
218 * @const void *p@ = input buffer
219 * @size_t sz@ = size of input
220 *
221 * Returns: ---
222 *
223 * Use: Feeds input data into a SHAKE context. The context must be
224 * in `absorbing' state.
225 */
226
227extern void shake_hash(shake_ctx */*ctx*/, const void */*p*/, size_t /*sz*/);
228
229/* --- @shake_xof@ --- *
230 *
231 * Arguments: @shake_ctx *ctx@ = context to update
232 *
233 * Returns: ---
234 *
235 * Use: Switches the context into `squeezing' state. Use @shake_get@
236 * or @shake_mask@ to extract data.
237 */
238
239extern void shake_xof(shake_ctx */*ctx*/);
240
241/* --- @shake_get@ --- *
242 *
243 * Arguments: @shake_ctx *ctx@ = context to update
244 * @void *p@ = output buffer
245 * @size_t sz@ = size of output
246 *
247 * Returns: ---
248 *
249 * Use: Extracts output from a SHAKE context. The context must be
250 * in `squeezing' state.
251 */
252
253extern void shake_get(shake_ctx */*ctx*/, void */*p*/, size_t /*sz*/);
254
255/* --- @shake_done@ --- *
256 *
257 * Arguments: @shake_ctx *ctx@ = context to update
258 * @void *h@ = where to write the hash
259 * @size_t hsz@ = size of the hash to make
260 *
261 * Returns: ---
262 *
263 * Use: Switches the context into `squeezing' state. Use @shake_get@
264 * or @shake_mask@ to extract data.
265 */
266
267extern void shake_done(shake_ctx */*ctx*/, void */*h*/, size_t /*hsz*/);
268
269/*----- That's all, folks -------------------------------------------------*/
270
271#ifdef __cplusplus
272 }
273#endif
274
275#endif