sha3.c revision 1.1 1 1.1 riastrad /* $NetBSD: sha3.c,v 1.1 2017/11/30 05:47:24 riastradh Exp $ */
2 1.1 riastrad
3 1.1 riastrad /*-
4 1.1 riastrad * Copyright (c) 2015 Taylor R. Campbell
5 1.1 riastrad * All rights reserved.
6 1.1 riastrad *
7 1.1 riastrad * Redistribution and use in source and binary forms, with or without
8 1.1 riastrad * modification, are permitted provided that the following conditions
9 1.1 riastrad * are met:
10 1.1 riastrad * 1. Redistributions of source code must retain the above copyright
11 1.1 riastrad * notice, this list of conditions and the following disclaimer.
12 1.1 riastrad * 2. Redistributions in binary form must reproduce the above copyright
13 1.1 riastrad * notice, this list of conditions and the following disclaimer in the
14 1.1 riastrad * documentation and/or other materials provided with the distribution.
15 1.1 riastrad *
16 1.1 riastrad * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 1.1 riastrad * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 1.1 riastrad * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 1.1 riastrad * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 1.1 riastrad * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 1.1 riastrad * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 1.1 riastrad * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 1.1 riastrad * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 1.1 riastrad * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 1.1 riastrad * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 1.1 riastrad * SUCH DAMAGE.
27 1.1 riastrad */
28 1.1 riastrad
29 1.1 riastrad /*
30 1.1 riastrad * SHA-3: FIPS-202, Permutation-Based Hash and Extendable-Ouptut Functions
31 1.1 riastrad */
32 1.1 riastrad
33 1.1 riastrad #if HAVE_NBTOOL_CONFIG_H
34 1.1 riastrad #include "nbtool_config.h"
35 1.1 riastrad #endif
36 1.1 riastrad
37 1.1 riastrad #include <sys/cdefs.h>
38 1.1 riastrad
39 1.1 riastrad #if defined(_KERNEL) || defined(_STANDALONE)
40 1.1 riastrad
41 1.1 riastrad __KERNEL_RCSID(0, "$NetBSD: sha3.c,v 1.1 2017/11/30 05:47:24 riastradh Exp $");
42 1.1 riastrad #include <lib/libkern/libkern.h>
43 1.1 riastrad
44 1.1 riastrad #define SHA3_ASSERT KASSERT
45 1.1 riastrad
46 1.1 riastrad #else
47 1.1 riastrad
48 1.1 riastrad __RCSID("$NetBSD: sha3.c,v 1.1 2017/11/30 05:47:24 riastradh Exp $");
49 1.1 riastrad
50 1.1 riastrad #include "namespace.h"
51 1.1 riastrad
52 1.1 riastrad #include <assert.h>
53 1.1 riastrad #include <string.h>
54 1.1 riastrad
55 1.1 riastrad #define SHA3_ASSERT _DIAGASSERT
56 1.1 riastrad
57 1.1 riastrad #endif
58 1.1 riastrad
59 1.1 riastrad #include <sys/endian.h>
60 1.1 riastrad #include <sys/sha3.h>
61 1.1 riastrad
62 1.1 riastrad #include "keccak.h"
63 1.1 riastrad
64 1.1 riastrad /* XXX Disabled for now -- these will be libc-private. */
65 1.1 riastrad #if 0 && !defined(_KERNEL) && !defined(_STANDALONE)
66 1.1 riastrad #ifdef __weak_alias
67 1.1 riastrad __weak_alias(SHA3_224_Init,_SHA3_224_Init)
68 1.1 riastrad __weak_alias(SHA3_224_Update,_SHA3_224_Update)
69 1.1 riastrad __weak_alias(SHA3_224_Final,_SHA3_224_Final)
70 1.1 riastrad __weak_alias(SHA3_256_Init,_SHA3_256_Init)
71 1.1 riastrad __weak_alias(SHA3_256_Update,_SHA3_256_Update)
72 1.1 riastrad __weak_alias(SHA3_256_Final,_SHA3_256_Final)
73 1.1 riastrad __weak_alias(SHA3_384_Init,_SHA3_384_Init)
74 1.1 riastrad __weak_alias(SHA3_384_Update,_SHA3_384_Update)
75 1.1 riastrad __weak_alias(SHA3_384_Final,_SHA3_384_Final)
76 1.1 riastrad __weak_alias(SHA3_512_Init,_SHA3_512_Init)
77 1.1 riastrad __weak_alias(SHA3_512_Update,_SHA3_512_Update)
78 1.1 riastrad __weak_alias(SHA3_512_Final,_SHA3_512_Final)
79 1.1 riastrad __weak_alias(SHA3_Selftest,_SHA3_Selftest)
80 1.1 riastrad __weak_alias(SHAKE128_Init,_SHAKE128_Init)
81 1.1 riastrad __weak_alias(SHAKE128_Update,_SHAKE128_Update)
82 1.1 riastrad __weak_alias(SHAKE128_Final,_SHAKE128_Final)
83 1.1 riastrad __weak_alias(SHAKE256_Init,_SHAKE256_Init)
84 1.1 riastrad __weak_alias(SHAKE256_Update,_SHAKE256_Update)
85 1.1 riastrad __weak_alias(SHAKE256_Final,_SHAKE256_Final)
86 1.1 riastrad #endif /* __weak_alias */
87 1.1 riastrad #endif /* kernel/standalone */
88 1.1 riastrad
89 1.1 riastrad #define MIN(a,b) ((a) < (b) ? (a) : (b))
90 1.1 riastrad
91 1.1 riastrad /*
92 1.1 riastrad * Common body. All the SHA-3 functions share code structure. They
93 1.1 riastrad * differ only in the size of the chunks they split the message into:
94 1.1 riastrad * for digest size d, they are split into chunks of 200 - d bytes.
95 1.1 riastrad */
96 1.1 riastrad
97 1.1 riastrad static inline unsigned
98 1.1 riastrad sha3_rate(unsigned d)
99 1.1 riastrad {
100 1.1 riastrad const unsigned cw = 2*d/8; /* capacity in words */
101 1.1 riastrad
102 1.1 riastrad return 25 - cw;
103 1.1 riastrad }
104 1.1 riastrad
105 1.1 riastrad static void
106 1.1 riastrad sha3_init(struct sha3 *C, unsigned rw)
107 1.1 riastrad {
108 1.1 riastrad unsigned iw;
109 1.1 riastrad
110 1.1 riastrad C->nb = 8*rw;
111 1.1 riastrad for (iw = 0; iw < 25; iw++)
112 1.1 riastrad C->A[iw] = 0;
113 1.1 riastrad }
114 1.1 riastrad
115 1.1 riastrad static void
116 1.1 riastrad sha3_update(struct sha3 *C, const uint8_t *data, size_t len, unsigned rw)
117 1.1 riastrad {
118 1.1 riastrad uint64_t T;
119 1.1 riastrad unsigned ib, iw; /* index of byte/word */
120 1.1 riastrad
121 1.1 riastrad assert(0 < C->nb);
122 1.1 riastrad
123 1.1 riastrad /* If there's a partial word, try to fill it. */
124 1.1 riastrad if ((C->nb % 8) != 0) {
125 1.1 riastrad T = 0;
126 1.1 riastrad for (ib = 0; ib < MIN(len, C->nb % 8); ib++)
127 1.1 riastrad T |= (uint64_t)data[ib] << (8*ib);
128 1.1 riastrad C->A[rw - (C->nb + 7)/8] ^= T << (8*(8 - (C->nb % 8)));
129 1.1 riastrad C->nb -= ib;
130 1.1 riastrad data += ib;
131 1.1 riastrad len -= ib;
132 1.1 riastrad
133 1.1 riastrad /* If we filled the buffer, permute now. */
134 1.1 riastrad if (C->nb == 0) {
135 1.1 riastrad keccakf1600(C->A);
136 1.1 riastrad C->nb = 8*rw;
137 1.1 riastrad }
138 1.1 riastrad
139 1.1 riastrad /* If that exhausted the input, we're done. */
140 1.1 riastrad if (len == 0)
141 1.1 riastrad return;
142 1.1 riastrad }
143 1.1 riastrad
144 1.1 riastrad /* At a word boundary. Fill any partial buffer. */
145 1.1 riastrad assert((C->nb % 8) == 0);
146 1.1 riastrad if (C->nb < 8*rw) {
147 1.1 riastrad for (iw = 0; iw < MIN(len, C->nb)/8; iw++)
148 1.1 riastrad C->A[rw - C->nb/8 + iw] ^= le64dec(data + 8*iw);
149 1.1 riastrad C->nb -= 8*iw;
150 1.1 riastrad data += 8*iw;
151 1.1 riastrad len -= 8*iw;
152 1.1 riastrad
153 1.1 riastrad /* If we filled the buffer, permute now. */
154 1.1 riastrad if (C->nb == 0) {
155 1.1 riastrad keccakf1600(C->A);
156 1.1 riastrad C->nb = 8*rw;
157 1.1 riastrad } else {
158 1.1 riastrad /* Otherwise, less than a word left. */
159 1.1 riastrad assert(len < 8);
160 1.1 riastrad goto partial;
161 1.1 riastrad }
162 1.1 riastrad }
163 1.1 riastrad
164 1.1 riastrad /* At a buffer boundary. Absorb input one buffer at a time. */
165 1.1 riastrad assert(C->nb == 8*rw);
166 1.1 riastrad while (8*rw <= len) {
167 1.1 riastrad for (iw = 0; iw < rw; iw++)
168 1.1 riastrad C->A[iw] ^= le64dec(data + 8*iw);
169 1.1 riastrad keccakf1600(C->A);
170 1.1 riastrad data += 8*rw;
171 1.1 riastrad len -= 8*rw;
172 1.1 riastrad }
173 1.1 riastrad
174 1.1 riastrad /* Partially fill the buffer with as many words as we can. */
175 1.1 riastrad for (iw = 0; iw < len/8; iw++)
176 1.1 riastrad C->A[rw - C->nb/8 + iw] ^= le64dec(data + 8*iw);
177 1.1 riastrad C->nb -= 8*iw;
178 1.1 riastrad data += 8*iw;
179 1.1 riastrad len -= 8*iw;
180 1.1 riastrad
181 1.1 riastrad partial:
182 1.1 riastrad /* Partially fill the last word with as many bytes as we can. */
183 1.1 riastrad assert(len < 8);
184 1.1 riastrad assert(0 < C->nb);
185 1.1 riastrad assert((C->nb % 8) == 0);
186 1.1 riastrad T = 0;
187 1.1 riastrad for (ib = 0; ib < len; ib++)
188 1.1 riastrad T |= (uint64_t)data[ib] << (8*ib);
189 1.1 riastrad C->A[rw - C->nb/8] ^= T;
190 1.1 riastrad C->nb -= ib;
191 1.1 riastrad assert(0 < C->nb);
192 1.1 riastrad }
193 1.1 riastrad
194 1.1 riastrad static void
195 1.1 riastrad sha3_final(uint8_t *h, unsigned d, struct sha3 *C, unsigned rw)
196 1.1 riastrad {
197 1.1 riastrad unsigned nw, iw;
198 1.1 riastrad
199 1.1 riastrad assert(d <= 8*25);
200 1.1 riastrad assert(0 < C->nb);
201 1.1 riastrad
202 1.1 riastrad /* Append 01, pad with 10*1 up to buffer boundary, LSB first. */
203 1.1 riastrad nw = (C->nb + 7)/8;
204 1.1 riastrad assert(0 < nw);
205 1.1 riastrad assert(nw <= rw);
206 1.1 riastrad C->A[rw - nw] ^= (uint64_t)0x06 << (8*(8*nw - C->nb));
207 1.1 riastrad C->A[rw - 1] ^= 0x8000000000000000ULL;
208 1.1 riastrad
209 1.1 riastrad /* Permute one last time. */
210 1.1 riastrad keccakf1600(C->A);
211 1.1 riastrad
212 1.1 riastrad /* Reveal the first 8d bits of state, forget 1600-8d of them. */
213 1.1 riastrad for (iw = 0; iw < d/8; iw++)
214 1.1 riastrad le64enc(h + 8*iw, C->A[iw]);
215 1.1 riastrad h += 8*iw;
216 1.1 riastrad d -= 8*iw;
217 1.1 riastrad if (0 < d) {
218 1.1 riastrad /* For SHA3-224, we need to expose a partial word. */
219 1.1 riastrad uint64_t T = C->A[iw];
220 1.1 riastrad do {
221 1.1 riastrad *h++ = T & 0xff;
222 1.1 riastrad T >>= 8;
223 1.1 riastrad } while (--d);
224 1.1 riastrad }
225 1.1 riastrad (void)explicit_memset(C->A, 0, sizeof C->A);
226 1.1 riastrad C->nb = 0;
227 1.1 riastrad }
228 1.1 riastrad
229 1.1 riastrad static void
230 1.1 riastrad shake_final(uint8_t *h, unsigned d, struct sha3 *C, unsigned rw)
231 1.1 riastrad {
232 1.1 riastrad unsigned nw, iw;
233 1.1 riastrad
234 1.1 riastrad assert(0 < C->nb);
235 1.1 riastrad
236 1.1 riastrad /* Append 1111, pad with 10*1 up to buffer boundary, LSB first. */
237 1.1 riastrad nw = (C->nb + 7)/8;
238 1.1 riastrad assert(0 < nw);
239 1.1 riastrad assert(nw <= rw);
240 1.1 riastrad C->A[rw - nw] ^= (uint64_t)0x1f << (8*(8*nw - C->nb));
241 1.1 riastrad C->A[rw - 1] ^= 0x8000000000000000ULL;
242 1.1 riastrad
243 1.1 riastrad /* Permute, reveal first rw words of state, repeat. */
244 1.1 riastrad while (8*rw <= d) {
245 1.1 riastrad keccakf1600(C->A);
246 1.1 riastrad for (iw = 0; iw < rw; iw++)
247 1.1 riastrad le64enc(h + 8*iw, C->A[iw]);
248 1.1 riastrad h += 8*iw;
249 1.1 riastrad d -= 8*iw;
250 1.1 riastrad }
251 1.1 riastrad
252 1.1 riastrad /*
253 1.1 riastrad * If 8*rw (the output rate in bytes) does not divide d, more
254 1.1 riastrad * words are wanted: permute again and reveal a little more.
255 1.1 riastrad */
256 1.1 riastrad if (0 < d) {
257 1.1 riastrad keccakf1600(C->A);
258 1.1 riastrad for (iw = 0; iw < d/8; iw++)
259 1.1 riastrad le64enc(h + 8*iw, C->A[iw]);
260 1.1 riastrad h += 8*iw;
261 1.1 riastrad d -= 8*iw;
262 1.1 riastrad
263 1.1 riastrad /*
264 1.1 riastrad * If 8 does not divide d, more bytes are wanted:
265 1.1 riastrad * reveal them.
266 1.1 riastrad */
267 1.1 riastrad if (0 < d) {
268 1.1 riastrad uint64_t T = C->A[iw];
269 1.1 riastrad do {
270 1.1 riastrad *h++ = T & 0xff;
271 1.1 riastrad T >>= 8;
272 1.1 riastrad } while (--d);
273 1.1 riastrad }
274 1.1 riastrad }
275 1.1 riastrad
276 1.1 riastrad (void)explicit_memset(C->A, 0, sizeof C->A);
277 1.1 riastrad C->nb = 0;
278 1.1 riastrad }
279 1.1 riastrad
280 1.1 riastrad void
281 1.1 riastrad SHA3_224_Init(SHA3_224_CTX *C)
282 1.1 riastrad {
283 1.1 riastrad
284 1.1 riastrad sha3_init(&C->C224, sha3_rate(SHA3_224_DIGEST_LENGTH));
285 1.1 riastrad }
286 1.1 riastrad
287 1.1 riastrad void
288 1.1 riastrad SHA3_224_Update(SHA3_224_CTX *C, const uint8_t *data, size_t len)
289 1.1 riastrad {
290 1.1 riastrad
291 1.1 riastrad sha3_update(&C->C224, data, len, sha3_rate(SHA3_224_DIGEST_LENGTH));
292 1.1 riastrad }
293 1.1 riastrad
294 1.1 riastrad void
295 1.1 riastrad SHA3_224_Final(uint8_t h[SHA3_224_DIGEST_LENGTH], SHA3_224_CTX *C)
296 1.1 riastrad {
297 1.1 riastrad
298 1.1 riastrad sha3_final(h, SHA3_224_DIGEST_LENGTH, &C->C224,
299 1.1 riastrad sha3_rate(SHA3_224_DIGEST_LENGTH));
300 1.1 riastrad }
301 1.1 riastrad
302 1.1 riastrad void
303 1.1 riastrad SHA3_256_Init(SHA3_256_CTX *C)
304 1.1 riastrad {
305 1.1 riastrad
306 1.1 riastrad sha3_init(&C->C256, sha3_rate(SHA3_256_DIGEST_LENGTH));
307 1.1 riastrad }
308 1.1 riastrad
309 1.1 riastrad void
310 1.1 riastrad SHA3_256_Update(SHA3_256_CTX *C, const uint8_t *data, size_t len)
311 1.1 riastrad {
312 1.1 riastrad
313 1.1 riastrad sha3_update(&C->C256, data, len, sha3_rate(SHA3_256_DIGEST_LENGTH));
314 1.1 riastrad }
315 1.1 riastrad
316 1.1 riastrad void
317 1.1 riastrad SHA3_256_Final(uint8_t h[SHA3_256_DIGEST_LENGTH], SHA3_256_CTX *C)
318 1.1 riastrad {
319 1.1 riastrad
320 1.1 riastrad sha3_final(h, SHA3_256_DIGEST_LENGTH, &C->C256,
321 1.1 riastrad sha3_rate(SHA3_256_DIGEST_LENGTH));
322 1.1 riastrad }
323 1.1 riastrad
324 1.1 riastrad void
325 1.1 riastrad SHA3_384_Init(SHA3_384_CTX *C)
326 1.1 riastrad {
327 1.1 riastrad
328 1.1 riastrad sha3_init(&C->C384, sha3_rate(SHA3_384_DIGEST_LENGTH));
329 1.1 riastrad }
330 1.1 riastrad
331 1.1 riastrad void
332 1.1 riastrad SHA3_384_Update(SHA3_384_CTX *C, const uint8_t *data, size_t len)
333 1.1 riastrad {
334 1.1 riastrad
335 1.1 riastrad sha3_update(&C->C384, data, len, sha3_rate(SHA3_384_DIGEST_LENGTH));
336 1.1 riastrad }
337 1.1 riastrad
338 1.1 riastrad void
339 1.1 riastrad SHA3_384_Final(uint8_t h[SHA3_384_DIGEST_LENGTH], SHA3_384_CTX *C)
340 1.1 riastrad {
341 1.1 riastrad
342 1.1 riastrad sha3_final(h, SHA3_384_DIGEST_LENGTH, &C->C384,
343 1.1 riastrad sha3_rate(SHA3_384_DIGEST_LENGTH));
344 1.1 riastrad }
345 1.1 riastrad
346 1.1 riastrad void
347 1.1 riastrad SHA3_512_Init(SHA3_512_CTX *C)
348 1.1 riastrad {
349 1.1 riastrad
350 1.1 riastrad sha3_init(&C->C512, sha3_rate(SHA3_512_DIGEST_LENGTH));
351 1.1 riastrad }
352 1.1 riastrad
353 1.1 riastrad void
354 1.1 riastrad SHA3_512_Update(SHA3_512_CTX *C, const uint8_t *data, size_t len)
355 1.1 riastrad {
356 1.1 riastrad
357 1.1 riastrad sha3_update(&C->C512, data, len, sha3_rate(SHA3_512_DIGEST_LENGTH));
358 1.1 riastrad }
359 1.1 riastrad
360 1.1 riastrad void
361 1.1 riastrad SHA3_512_Final(uint8_t h[SHA3_512_DIGEST_LENGTH], SHA3_512_CTX *C)
362 1.1 riastrad {
363 1.1 riastrad
364 1.1 riastrad sha3_final(h, SHA3_512_DIGEST_LENGTH, &C->C512,
365 1.1 riastrad sha3_rate(SHA3_512_DIGEST_LENGTH));
366 1.1 riastrad }
367 1.1 riastrad
368 1.1 riastrad void
369 1.1 riastrad SHAKE128_Init(SHAKE128_CTX *C)
370 1.1 riastrad {
371 1.1 riastrad
372 1.1 riastrad sha3_init(&C->C128, sha3_rate(128/8));
373 1.1 riastrad }
374 1.1 riastrad
375 1.1 riastrad void
376 1.1 riastrad SHAKE128_Update(SHAKE128_CTX *C, const uint8_t *data, size_t len)
377 1.1 riastrad {
378 1.1 riastrad
379 1.1 riastrad sha3_update(&C->C128, data, len, sha3_rate(128/8));
380 1.1 riastrad }
381 1.1 riastrad
382 1.1 riastrad void
383 1.1 riastrad SHAKE128_Final(uint8_t *h, size_t d, SHAKE128_CTX *C)
384 1.1 riastrad {
385 1.1 riastrad
386 1.1 riastrad shake_final(h, d, &C->C128, sha3_rate(128/8));
387 1.1 riastrad }
388 1.1 riastrad
389 1.1 riastrad void
390 1.1 riastrad SHAKE256_Init(SHAKE256_CTX *C)
391 1.1 riastrad {
392 1.1 riastrad
393 1.1 riastrad sha3_init(&C->C256, sha3_rate(256/8));
394 1.1 riastrad }
395 1.1 riastrad
396 1.1 riastrad void
397 1.1 riastrad SHAKE256_Update(SHAKE256_CTX *C, const uint8_t *data, size_t len)
398 1.1 riastrad {
399 1.1 riastrad
400 1.1 riastrad sha3_update(&C->C256, data, len, sha3_rate(256/8));
401 1.1 riastrad }
402 1.1 riastrad
403 1.1 riastrad void
404 1.1 riastrad SHAKE256_Final(uint8_t *h, size_t d, SHAKE256_CTX *C)
405 1.1 riastrad {
406 1.1 riastrad
407 1.1 riastrad shake_final(h, d, &C->C256, sha3_rate(256/8));
408 1.1 riastrad }
409 1.1 riastrad
410 1.1 riastrad static void
411 1.1 riastrad sha3_selftest_prng(void *buf, size_t len, uint32_t seed)
412 1.1 riastrad {
413 1.1 riastrad uint8_t *p = buf;
414 1.1 riastrad size_t n = len;
415 1.1 riastrad uint32_t t, a, b;
416 1.1 riastrad
417 1.1 riastrad a = 0xdead4bad * seed;
418 1.1 riastrad b = 1;
419 1.1 riastrad
420 1.1 riastrad while (n--) {
421 1.1 riastrad t = a + b;
422 1.1 riastrad *p++ = t >> 24;
423 1.1 riastrad a = b;
424 1.1 riastrad b = t;
425 1.1 riastrad }
426 1.1 riastrad }
427 1.1 riastrad
428 1.1 riastrad int
429 1.1 riastrad SHA3_Selftest(void)
430 1.1 riastrad {
431 1.1 riastrad const uint8_t d224_0[] = { /* SHA3-224(0-bit) */
432 1.1 riastrad 0x6b,0x4e,0x03,0x42,0x36,0x67,0xdb,0xb7,
433 1.1 riastrad 0x3b,0x6e,0x15,0x45,0x4f,0x0e,0xb1,0xab,
434 1.1 riastrad 0xd4,0x59,0x7f,0x9a,0x1b,0x07,0x8e,0x3f,
435 1.1 riastrad 0x5b,0x5a,0x6b,0xc7,
436 1.1 riastrad };
437 1.1 riastrad const uint8_t d256_0[] = { /* SHA3-256(0-bit) */
438 1.1 riastrad 0xa7,0xff,0xc6,0xf8,0xbf,0x1e,0xd7,0x66,
439 1.1 riastrad 0x51,0xc1,0x47,0x56,0xa0,0x61,0xd6,0x62,
440 1.1 riastrad 0xf5,0x80,0xff,0x4d,0xe4,0x3b,0x49,0xfa,
441 1.1 riastrad 0x82,0xd8,0x0a,0x4b,0x80,0xf8,0x43,0x4a,
442 1.1 riastrad };
443 1.1 riastrad const uint8_t d384_0[] = { /* SHA3-384(0-bit) */
444 1.1 riastrad 0x0c,0x63,0xa7,0x5b,0x84,0x5e,0x4f,0x7d,
445 1.1 riastrad 0x01,0x10,0x7d,0x85,0x2e,0x4c,0x24,0x85,
446 1.1 riastrad 0xc5,0x1a,0x50,0xaa,0xaa,0x94,0xfc,0x61,
447 1.1 riastrad 0x99,0x5e,0x71,0xbb,0xee,0x98,0x3a,0x2a,
448 1.1 riastrad 0xc3,0x71,0x38,0x31,0x26,0x4a,0xdb,0x47,
449 1.1 riastrad 0xfb,0x6b,0xd1,0xe0,0x58,0xd5,0xf0,0x04,
450 1.1 riastrad };
451 1.1 riastrad const uint8_t d512_0[] = { /* SHA3-512(0-bit) */
452 1.1 riastrad 0xa6,0x9f,0x73,0xcc,0xa2,0x3a,0x9a,0xc5,
453 1.1 riastrad 0xc8,0xb5,0x67,0xdc,0x18,0x5a,0x75,0x6e,
454 1.1 riastrad 0x97,0xc9,0x82,0x16,0x4f,0xe2,0x58,0x59,
455 1.1 riastrad 0xe0,0xd1,0xdc,0xc1,0x47,0x5c,0x80,0xa6,
456 1.1 riastrad 0x15,0xb2,0x12,0x3a,0xf1,0xf5,0xf9,0x4c,
457 1.1 riastrad 0x11,0xe3,0xe9,0x40,0x2c,0x3a,0xc5,0x58,
458 1.1 riastrad 0xf5,0x00,0x19,0x9d,0x95,0xb6,0xd3,0xe3,
459 1.1 riastrad 0x01,0x75,0x85,0x86,0x28,0x1d,0xcd,0x26,
460 1.1 riastrad };
461 1.1 riastrad const uint8_t shake128_0_41[] = { /* SHAKE128(0-bit, 41) */
462 1.1 riastrad 0x7f,0x9c,0x2b,0xa4,0xe8,0x8f,0x82,0x7d,
463 1.1 riastrad 0x61,0x60,0x45,0x50,0x76,0x05,0x85,0x3e,
464 1.1 riastrad 0xd7,0x3b,0x80,0x93,0xf6,0xef,0xbc,0x88,
465 1.1 riastrad 0xeb,0x1a,0x6e,0xac,0xfa,0x66,0xef,0x26,
466 1.1 riastrad 0x3c,0xb1,0xee,0xa9,0x88,0x00,0x4b,0x93,0x10,
467 1.1 riastrad };
468 1.1 riastrad const uint8_t shake256_0_73[] = { /* SHAKE256(0-bit, 73) */
469 1.1 riastrad 0x46,0xb9,0xdd,0x2b,0x0b,0xa8,0x8d,0x13,
470 1.1 riastrad 0x23,0x3b,0x3f,0xeb,0x74,0x3e,0xeb,0x24,
471 1.1 riastrad 0x3f,0xcd,0x52,0xea,0x62,0xb8,0x1b,0x82,
472 1.1 riastrad 0xb5,0x0c,0x27,0x64,0x6e,0xd5,0x76,0x2f,
473 1.1 riastrad 0xd7,0x5d,0xc4,0xdd,0xd8,0xc0,0xf2,0x00,
474 1.1 riastrad 0xcb,0x05,0x01,0x9d,0x67,0xb5,0x92,0xf6,
475 1.1 riastrad 0xfc,0x82,0x1c,0x49,0x47,0x9a,0xb4,0x86,
476 1.1 riastrad 0x40,0x29,0x2e,0xac,0xb3,0xb7,0xc4,0xbe,
477 1.1 riastrad 0x14,0x1e,0x96,0x61,0x6f,0xb1,0x39,0x57,0x69,
478 1.1 riastrad };
479 1.1 riastrad const uint8_t d224_1600[] = { /* SHA3-224(200 * 0xa3) */
480 1.1 riastrad 0x93,0x76,0x81,0x6a,0xba,0x50,0x3f,0x72,
481 1.1 riastrad 0xf9,0x6c,0xe7,0xeb,0x65,0xac,0x09,0x5d,
482 1.1 riastrad 0xee,0xe3,0xbe,0x4b,0xf9,0xbb,0xc2,0xa1,
483 1.1 riastrad 0xcb,0x7e,0x11,0xe0,
484 1.1 riastrad };
485 1.1 riastrad const uint8_t d256_1600[] = { /* SHA3-256(200 * 0xa3) */
486 1.1 riastrad 0x79,0xf3,0x8a,0xde,0xc5,0xc2,0x03,0x07,
487 1.1 riastrad 0xa9,0x8e,0xf7,0x6e,0x83,0x24,0xaf,0xbf,
488 1.1 riastrad 0xd4,0x6c,0xfd,0x81,0xb2,0x2e,0x39,0x73,
489 1.1 riastrad 0xc6,0x5f,0xa1,0xbd,0x9d,0xe3,0x17,0x87,
490 1.1 riastrad };
491 1.1 riastrad const uint8_t d384_1600[] = { /* SHA3-384(200 * 0xa3) */
492 1.1 riastrad 0x18,0x81,0xde,0x2c,0xa7,0xe4,0x1e,0xf9,
493 1.1 riastrad 0x5d,0xc4,0x73,0x2b,0x8f,0x5f,0x00,0x2b,
494 1.1 riastrad 0x18,0x9c,0xc1,0xe4,0x2b,0x74,0x16,0x8e,
495 1.1 riastrad 0xd1,0x73,0x26,0x49,0xce,0x1d,0xbc,0xdd,
496 1.1 riastrad 0x76,0x19,0x7a,0x31,0xfd,0x55,0xee,0x98,
497 1.1 riastrad 0x9f,0x2d,0x70,0x50,0xdd,0x47,0x3e,0x8f,
498 1.1 riastrad };
499 1.1 riastrad const uint8_t d512_1600[] = { /* SHA3-512(200 * 0xa3) */
500 1.1 riastrad 0xe7,0x6d,0xfa,0xd2,0x20,0x84,0xa8,0xb1,
501 1.1 riastrad 0x46,0x7f,0xcf,0x2f,0xfa,0x58,0x36,0x1b,
502 1.1 riastrad 0xec,0x76,0x28,0xed,0xf5,0xf3,0xfd,0xc0,
503 1.1 riastrad 0xe4,0x80,0x5d,0xc4,0x8c,0xae,0xec,0xa8,
504 1.1 riastrad 0x1b,0x7c,0x13,0xc3,0x0a,0xdf,0x52,0xa3,
505 1.1 riastrad 0x65,0x95,0x84,0x73,0x9a,0x2d,0xf4,0x6b,
506 1.1 riastrad 0xe5,0x89,0xc5,0x1c,0xa1,0xa4,0xa8,0x41,
507 1.1 riastrad 0x6d,0xf6,0x54,0x5a,0x1c,0xe8,0xba,0x00,
508 1.1 riastrad };
509 1.1 riastrad const uint8_t shake128_1600_41[] = { /* SHAKE128(200 * 0xa3, 41) */
510 1.1 riastrad 0x13,0x1a,0xb8,0xd2,0xb5,0x94,0x94,0x6b,
511 1.1 riastrad 0x9c,0x81,0x33,0x3f,0x9b,0xb6,0xe0,0xce,
512 1.1 riastrad 0x75,0xc3,0xb9,0x31,0x04,0xfa,0x34,0x69,
513 1.1 riastrad 0xd3,0x91,0x74,0x57,0x38,0x5d,0xa0,0x37,
514 1.1 riastrad 0xcf,0x23,0x2e,0xf7,0x16,0x4a,0x6d,0x1e,0xb4,
515 1.1 riastrad };
516 1.1 riastrad const uint8_t shake256_1600_73[] = { /* SHAKE256(200 * 0xa3, 73) */
517 1.1 riastrad 0xcd,0x8a,0x92,0x0e,0xd1,0x41,0xaa,0x04,
518 1.1 riastrad 0x07,0xa2,0x2d,0x59,0x28,0x86,0x52,0xe9,
519 1.1 riastrad 0xd9,0xf1,0xa7,0xee,0x0c,0x1e,0x7c,0x1c,
520 1.1 riastrad 0xa6,0x99,0x42,0x4d,0xa8,0x4a,0x90,0x4d,
521 1.1 riastrad 0x2d,0x70,0x0c,0xaa,0xe7,0x39,0x6e,0xce,
522 1.1 riastrad 0x96,0x60,0x44,0x40,0x57,0x7d,0xa4,0xf3,
523 1.1 riastrad 0xaa,0x22,0xae,0xb8,0x85,0x7f,0x96,0x1c,
524 1.1 riastrad 0x4c,0xd8,0xe0,0x6f,0x0a,0xe6,0x61,0x0b,
525 1.1 riastrad 0x10,0x48,0xa7,0xf6,0x4e,0x10,0x74,0xcd,0x62,
526 1.1 riastrad };
527 1.1 riastrad const uint8_t d0[] = {
528 1.1 riastrad 0x6c,0x02,0x1a,0xc6,0x65,0xaf,0x80,0xfb,
529 1.1 riastrad 0x52,0xe6,0x2d,0x27,0xe5,0x02,0x88,0x84,
530 1.1 riastrad 0xec,0x1c,0x0c,0xe7,0x0b,0x94,0x55,0x83,
531 1.1 riastrad 0x19,0xf2,0xbf,0x09,0x86,0xeb,0x1a,0xbb,
532 1.1 riastrad 0xc3,0x0d,0x1c,0xef,0x22,0xfe,0xc5,0x4c,
533 1.1 riastrad 0x45,0x90,0x66,0x14,0x00,0x6e,0xc8,0x79,
534 1.1 riastrad 0xdf,0x1e,0x02,0xbd,0x75,0xe9,0x60,0xd8,
535 1.1 riastrad 0x60,0x39,0x85,0xc9,0xc4,0xee,0x33,0xab,
536 1.1 riastrad };
537 1.1 riastrad const unsigned mlen[6] = { 0, 3, 128, 129, 255, 1024 };
538 1.1 riastrad uint8_t m[1024], d[73];
539 1.1 riastrad SHA3_224_CTX sha3224;
540 1.1 riastrad SHA3_256_CTX sha3256;
541 1.1 riastrad SHA3_384_CTX sha3384;
542 1.1 riastrad SHA3_512_CTX sha3512;
543 1.1 riastrad SHAKE128_CTX shake128;
544 1.1 riastrad SHAKE256_CTX shake256;
545 1.1 riastrad SHA3_512_CTX ctx;
546 1.1 riastrad unsigned mi;
547 1.1 riastrad
548 1.1 riastrad /*
549 1.1 riastrad * NIST test vectors from
550 1.1 riastrad * <http://csrc.nist.gov/groups/ST/toolkit/examples.html#aHashing>:
551 1.1 riastrad * 0-bit, 1600-bit repeated 0xa3 (= 0b10100011).
552 1.1 riastrad */
553 1.1 riastrad SHA3_224_Init(&sha3224);
554 1.1 riastrad SHA3_224_Final(d, &sha3224);
555 1.1 riastrad if (memcmp(d, d224_0, 28) != 0)
556 1.1 riastrad return -1;
557 1.1 riastrad SHA3_256_Init(&sha3256);
558 1.1 riastrad SHA3_256_Final(d, &sha3256);
559 1.1 riastrad if (memcmp(d, d256_0, 32) != 0)
560 1.1 riastrad return -1;
561 1.1 riastrad SHA3_384_Init(&sha3384);
562 1.1 riastrad SHA3_384_Final(d, &sha3384);
563 1.1 riastrad if (memcmp(d, d384_0, 48) != 0)
564 1.1 riastrad return -1;
565 1.1 riastrad SHA3_512_Init(&sha3512);
566 1.1 riastrad SHA3_512_Final(d, &sha3512);
567 1.1 riastrad if (memcmp(d, d512_0, 64) != 0)
568 1.1 riastrad return -1;
569 1.1 riastrad SHAKE128_Init(&shake128);
570 1.1 riastrad SHAKE128_Final(d, 41, &shake128);
571 1.1 riastrad if (memcmp(d, shake128_0_41, 41) != 0)
572 1.1 riastrad return -1;
573 1.1 riastrad SHAKE256_Init(&shake256);
574 1.1 riastrad SHAKE256_Final(d, 73, &shake256);
575 1.1 riastrad if (memcmp(d, shake256_0_73, 73) != 0)
576 1.1 riastrad return -1;
577 1.1 riastrad
578 1.1 riastrad (void)memset(m, 0xa3, 200);
579 1.1 riastrad SHA3_224_Init(&sha3224);
580 1.1 riastrad SHA3_224_Update(&sha3224, m, 200);
581 1.1 riastrad SHA3_224_Final(d, &sha3224);
582 1.1 riastrad if (memcmp(d, d224_1600, 28) != 0)
583 1.1 riastrad return -1;
584 1.1 riastrad SHA3_256_Init(&sha3256);
585 1.1 riastrad SHA3_256_Update(&sha3256, m, 200);
586 1.1 riastrad SHA3_256_Final(d, &sha3256);
587 1.1 riastrad if (memcmp(d, d256_1600, 32) != 0)
588 1.1 riastrad return -1;
589 1.1 riastrad SHA3_384_Init(&sha3384);
590 1.1 riastrad SHA3_384_Update(&sha3384, m, 200);
591 1.1 riastrad SHA3_384_Final(d, &sha3384);
592 1.1 riastrad if (memcmp(d, d384_1600, 48) != 0)
593 1.1 riastrad return -1;
594 1.1 riastrad SHA3_512_Init(&sha3512);
595 1.1 riastrad SHA3_512_Update(&sha3512, m, 200);
596 1.1 riastrad SHA3_512_Final(d, &sha3512);
597 1.1 riastrad if (memcmp(d, d512_1600, 64) != 0)
598 1.1 riastrad return -1;
599 1.1 riastrad SHAKE128_Init(&shake128);
600 1.1 riastrad SHAKE128_Update(&shake128, m, 200);
601 1.1 riastrad SHAKE128_Final(d, 41, &shake128);
602 1.1 riastrad if (memcmp(d, shake128_1600_41, 41) != 0)
603 1.1 riastrad return -1;
604 1.1 riastrad SHAKE256_Init(&shake256);
605 1.1 riastrad SHAKE256_Update(&shake256, m, 200);
606 1.1 riastrad SHAKE256_Final(d, 73, &shake256);
607 1.1 riastrad if (memcmp(d, shake256_1600_73, 73) != 0)
608 1.1 riastrad return -1;
609 1.1 riastrad
610 1.1 riastrad /*
611 1.1 riastrad * Hand-crufted test vectors with unaligned message lengths.
612 1.1 riastrad */
613 1.1 riastrad SHA3_512_Init(&ctx);
614 1.1 riastrad for (mi = 0; mi < 6; mi++) {
615 1.1 riastrad sha3_selftest_prng(m, mlen[mi], (224/8)*mlen[mi]);
616 1.1 riastrad SHA3_224_Init(&sha3224);
617 1.1 riastrad SHA3_224_Update(&sha3224, m, mlen[mi]);
618 1.1 riastrad SHA3_224_Final(d, &sha3224);
619 1.1 riastrad SHA3_512_Update(&ctx, d, 224/8);
620 1.1 riastrad }
621 1.1 riastrad for (mi = 0; mi < 6; mi++) {
622 1.1 riastrad sha3_selftest_prng(m, mlen[mi], (256/8)*mlen[mi]);
623 1.1 riastrad SHA3_256_Init(&sha3256);
624 1.1 riastrad SHA3_256_Update(&sha3256, m, mlen[mi]);
625 1.1 riastrad SHA3_256_Final(d, &sha3256);
626 1.1 riastrad SHA3_512_Update(&ctx, d, 256/8);
627 1.1 riastrad }
628 1.1 riastrad for (mi = 0; mi < 6; mi++) {
629 1.1 riastrad sha3_selftest_prng(m, mlen[mi], (384/8)*mlen[mi]);
630 1.1 riastrad SHA3_384_Init(&sha3384);
631 1.1 riastrad SHA3_384_Update(&sha3384, m, mlen[mi]);
632 1.1 riastrad SHA3_384_Final(d, &sha3384);
633 1.1 riastrad SHA3_512_Update(&ctx, d, 384/8);
634 1.1 riastrad }
635 1.1 riastrad for (mi = 0; mi < 6; mi++) {
636 1.1 riastrad sha3_selftest_prng(m, mlen[mi], (512/8)*mlen[mi]);
637 1.1 riastrad SHA3_512_Init(&sha3512);
638 1.1 riastrad SHA3_512_Update(&sha3512, m, mlen[mi]);
639 1.1 riastrad SHA3_512_Final(d, &sha3512);
640 1.1 riastrad SHA3_512_Update(&ctx, d, 512/8);
641 1.1 riastrad }
642 1.1 riastrad SHA3_512_Final(d, &ctx);
643 1.1 riastrad if (memcmp(d, d0, 64) != 0)
644 1.1 riastrad return -1;
645 1.1 riastrad
646 1.1 riastrad return 0;
647 1.1 riastrad }
648