blob: c8fa06c657ccddccdbe181a6fe872a7a98883f70 [file] [log] [blame]
Pol Henarejos0cd1f1c2022-05-09 01:04:15 +02001/*
2 * FIPS-202 compliant SHA3 implementation
3 *
4 * Copyright The Mbed TLS Contributors
5 * SPDX-License-Identifier: Apache-2.0
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
8 * not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 */
19/*
20 * The SHA-3 Secure Hash Standard was published by NIST in 2015.
21 *
22 * https://nvlpubs.nist.gov/nistpubs/fips/nist.fips.202.pdf
23 */
24
25#include "common.h"
26
27#if defined(MBEDTLS_SHA3_C)
28
29#include "mbedtls/sha3.h"
30#include "mbedtls/platform_util.h"
31#include "mbedtls/error.h"
32
33#include <string.h>
34
35#if defined(MBEDTLS_SELF_TEST)
36#if defined(MBEDTLS_PLATFORM_C)
37#include "mbedtls/platform.h"
38#else
39#include <stdio.h>
40#include <stdlib.h>
41#define mbedtls_printf printf
42#define mbedtls_calloc calloc
43#define mbedtls_free free
44#endif /* MBEDTLS_PLATFORM_C */
45#endif /* MBEDTLS_SELF_TEST */
46
Pol Henarejos0cd1f1c2022-05-09 01:04:15 +020047/*
48 * List of supported SHA-3 families
49 */
50static mbedtls_sha3_family_functions sha3_families[] = {
51 { MBEDTLS_SHA3_224, 1152, 224, 0x06 },
52 { MBEDTLS_SHA3_256, 1088, 256, 0x06 },
53 { MBEDTLS_SHA3_384, 832, 384, 0x06 },
54 { MBEDTLS_SHA3_512, 576, 512, 0x06 },
55 { MBEDTLS_SHA3_NONE, 0, 0, 0 }
56};
57
58static const uint64_t rc[24] = {
59 0x0000000000000001, 0x0000000000008082, 0x800000000000808a, 0x8000000080008000,
60 0x000000000000808b, 0x0000000080000001, 0x8000000080008081, 0x8000000000008009,
61 0x000000000000008a, 0x0000000000000088, 0x0000000080008009, 0x000000008000000a,
62 0x000000008000808b, 0x800000000000008b, 0x8000000000008089, 0x8000000000008003,
63 0x8000000000008002, 0x8000000000000080, 0x000000000000800a, 0x800000008000000a,
64 0x8000000080008081, 0x8000000000008080, 0x0000000080000001, 0x8000000080008008,
65};
66
67static const uint8_t rho[24] = {
68 1, 62, 28, 27, 36, 44, 6, 55, 20,
69 3, 10, 43, 25, 39, 41, 45, 15,
70 21, 8, 18, 2, 61, 56, 14
71};
72
73static const uint8_t pi[24] = {
74 10, 7, 11, 17, 18, 3, 5, 16, 8, 21, 24, 4,
75 15, 23, 19, 13, 12, 2, 20, 14, 22, 9, 6, 1,
76};
77
78#define ROT64( x , y ) ( ( ( x ) << ( y ) ) | ( ( x ) >> ( 64U - ( y ) ) ) )
79#define ABSORB( ctx, idx, v ) do { ctx->state[( idx ) >> 3] ^= ( ( uint64_t ) ( v ) ) << ( ( ( idx ) & 0x7 ) << 3 ); } while( 0 )
80#define SQUEEZE( ctx, idx ) ( ( uint8_t )( ctx->state[( idx ) >> 3] >> ( ( ( idx ) & 0x7 ) << 3 ) ) )
81#define SWAP( x, y ) do { uint64_t tmp = ( x ); ( x ) = ( y ); ( y ) = tmp; } while( 0 )
82
83/* The permutation function. */
84static void keccak_f1600(mbedtls_sha3_context *ctx)
85{
86 uint64_t lane[5];
87 uint64_t *s = ctx->state;
88 int i;
89
90 for( int round = 0; round < 24; round++ )
91 {
92 uint64_t t;
93
94 /* Theta */
95 lane[0] = s[0] ^ s[5] ^ s[10] ^ s[15] ^ s[20];
96 lane[1] = s[1] ^ s[6] ^ s[11] ^ s[16] ^ s[21];
97 lane[2] = s[2] ^ s[7] ^ s[12] ^ s[17] ^ s[22];
98 lane[3] = s[3] ^ s[8] ^ s[13] ^ s[18] ^ s[23];
99 lane[4] = s[4] ^ s[9] ^ s[14] ^ s[19] ^ s[24];
100
101 t = lane[4] ^ ROT64( lane[1], 1 );
102 s[0] ^= t; s[5] ^= t; s[10] ^= t; s[15] ^= t; s[20] ^= t;
103
104 t = lane[0] ^ ROT64( lane[2], 1 );
105 s[1] ^= t; s[6] ^= t; s[11] ^= t; s[16] ^= t; s[21] ^= t;
106
107 t = lane[1] ^ ROT64( lane[3], 1 );
108 s[2] ^= t; s[7] ^= t; s[12] ^= t; s[17] ^= t; s[22] ^= t;
109
110 t = lane[2] ^ ROT64( lane[4], 1 );
111 s[3] ^= t; s[8] ^= t; s[13] ^= t; s[18] ^= t; s[23] ^= t;
112
113 t = lane[3] ^ ROT64( lane[0], 1 );
114 s[4] ^= t; s[9] ^= t; s[14] ^= t; s[19] ^= t; s[24] ^= t;
115
116 /* Rho */
117 for( i = 1; i < 25; i++ )
118 s[i] = ROT64( s[i], rho[i-1] );
119
120 /* Pi */
121 t = s[1];
122 for( i = 0; i < 24; i++ )
123 SWAP( s[pi[i]], t );
124
125 /* Chi */
126 lane[0] = s[0]; lane[1] = s[1]; lane[2] = s[2]; lane[3] = s[3]; lane[4] = s[4];
127 s[0] ^= (~lane[1]) & lane[2];
128 s[1] ^= (~lane[2]) & lane[3];
129 s[2] ^= (~lane[3]) & lane[4];
130 s[3] ^= (~lane[4]) & lane[0];
131 s[4] ^= (~lane[0]) & lane[1];
132
133 lane[0] = s[5]; lane[1] = s[6]; lane[2] = s[7]; lane[3] = s[8]; lane[4] = s[9];
134 s[5] ^= (~lane[1]) & lane[2];
135 s[6] ^= (~lane[2]) & lane[3];
136 s[7] ^= (~lane[3]) & lane[4];
137 s[8] ^= (~lane[4]) & lane[0];
138 s[9] ^= (~lane[0]) & lane[1];
139
140 lane[0] = s[10]; lane[1] = s[11]; lane[2] = s[12]; lane[3] = s[13]; lane[4] = s[14];
141 s[10] ^= (~lane[1]) & lane[2];
142 s[11] ^= (~lane[2]) & lane[3];
143 s[12] ^= (~lane[3]) & lane[4];
144 s[13] ^= (~lane[4]) & lane[0];
145 s[14] ^= (~lane[0]) & lane[1];
146
147 lane[0] = s[15]; lane[1] = s[16]; lane[2] = s[17]; lane[3] = s[18]; lane[4] = s[19];
148 s[15] ^= (~lane[1]) & lane[2];
149 s[16] ^= (~lane[2]) & lane[3];
150 s[17] ^= (~lane[3]) & lane[4];
151 s[18] ^= (~lane[4]) & lane[0];
152 s[19] ^= (~lane[0]) & lane[1];
153
154 lane[0] = s[20]; lane[1] = s[21]; lane[2] = s[22]; lane[3] = s[23]; lane[4] = s[24];
155 s[20] ^= (~lane[1]) & lane[2];
156 s[21] ^= (~lane[2]) & lane[3];
157 s[22] ^= (~lane[3]) & lane[4];
158 s[23] ^= (~lane[4]) & lane[0];
159 s[24] ^= (~lane[0]) & lane[1];
160
161 /* Iota */
162 s[0] ^= rc[round];
163 }
164}
165
166void mbedtls_sha3_init( mbedtls_sha3_context *ctx )
167{
168 if( ctx == NULL )
169 return;
170
171 memset( ctx, 0, sizeof( mbedtls_sha3_context ) );
172}
173
174void mbedtls_sha3_free( mbedtls_sha3_context *ctx )
175{
176 if( ctx == NULL )
177 return;
178
179 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_sha3_context ) );
180}
181
182void mbedtls_sha3_clone( mbedtls_sha3_context *dst,
183 const mbedtls_sha3_context *src )
184{
185 if ( dst == NULL || src == NULL )
186 return;
187
188 *dst = *src;
189}
190
191/*
192 * SHA-3 context setup
193 */
194int mbedtls_sha3_starts( mbedtls_sha3_context *ctx, mbedtls_sha3_id id )
195{
196 mbedtls_sha3_family_functions *p = NULL;
197 if( ctx == NULL )
198 return( MBEDTLS_ERR_SHA3_BAD_INPUT_DATA );
199
200 for( p = sha3_families; p->id != MBEDTLS_SHA3_NONE; p++ )
201 {
202 if( p->id == id )
203 break;
204 }
205
Pol Henarejos116411e2022-05-17 11:45:59 +0200206 if( p == NULL || p->id == MBEDTLS_SHA3_NONE )
Pol Henarejos0cd1f1c2022-05-09 01:04:15 +0200207 return( MBEDTLS_ERR_SHA3_BAD_INPUT_DATA );
208
209 ctx->id = id;
210 ctx->r = p->r;
211 ctx->olen = p->olen / 8;
212 ctx->xor_byte = p->xor_byte;
213 ctx->max_block_size = ctx->r / 8;
214
Pol Henarejos938b5ab2022-05-20 16:01:07 +0200215 memset( ctx->state, 0, sizeof( ctx->state ) );
216 ctx->index = 0;
217
Pol Henarejos0cd1f1c2022-05-09 01:04:15 +0200218 return( 0 );
219}
220
221/*
222 * SHA-3 process buffer
223 */
224int mbedtls_sha3_update( mbedtls_sha3_context *ctx,
225 const uint8_t *input,
226 size_t ilen )
227{
228 if( ctx == NULL )
229 return( MBEDTLS_ERR_SHA3_BAD_INPUT_DATA );
230
231 if( ilen == 0 || input == NULL )
232 return( 0 );
233
234 while( ilen-- > 0 )
235 {
236 ABSORB( ctx, ctx->index, *input++ );
237 if( ( ctx->index = ( ctx->index + 1) % ctx->max_block_size ) == 0 )
238 keccak_f1600( ctx );
239 }
240
241 return( 0 );
242}
243
244int mbedtls_sha3_finish( mbedtls_sha3_context *ctx,
245 uint8_t *output, size_t olen )
246{
Pol Henarejos85eeda02022-05-17 11:43:15 +0200247 if( ctx == NULL || output == NULL )
Pol Henarejos0cd1f1c2022-05-09 01:04:15 +0200248 return( MBEDTLS_ERR_SHA3_BAD_INPUT_DATA );
249
Pol Henarejos1f3ae162022-05-17 12:53:30 +0200250 /* Catch SHA-3 families, with fixed output length */
251 if( ctx->olen > 0 )
252 {
253 if ( ctx->olen > olen )
254 return( MBEDTLS_ERR_SHA3_BAD_INPUT_DATA );
255 olen = ctx->olen;
256 }
Pol Henarejos0cd1f1c2022-05-09 01:04:15 +0200257
258 ABSORB( ctx, ctx->index, ctx->xor_byte );
259 ABSORB( ctx, ctx->max_block_size - 1, 0x80 );
260 keccak_f1600( ctx );
261 ctx->index = 0;
262
263 while( olen-- > 0 )
264 {
265 *output++ = SQUEEZE( ctx, ctx->index );
266
267 if( ( ctx->index = ( ctx->index + 1) % ctx->max_block_size ) == 0 )
268 keccak_f1600( ctx );
269 }
270
271 return( 0 );
272}
273
Pol Henarejos0cd1f1c2022-05-09 01:04:15 +0200274/*
275 * output = SHA3( input buffer )
276 */
277int mbedtls_sha3( mbedtls_sha3_id id, const uint8_t *input,
278 size_t ilen, uint8_t *output, size_t olen )
279{
280 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
281 mbedtls_sha3_context ctx;
282
Pol Henarejos0cd1f1c2022-05-09 01:04:15 +0200283 mbedtls_sha3_init( &ctx );
284
Pol Henarejos85eeda02022-05-17 11:43:15 +0200285 /* Sanity checks are performed in every mbedtls_sha3_xxx() */
Pol Henarejos0cd1f1c2022-05-09 01:04:15 +0200286 if( ( ret = mbedtls_sha3_starts( &ctx, id ) ) != 0 )
287 goto exit;
288
289 if( ( ret = mbedtls_sha3_update( &ctx, input, ilen ) ) != 0 )
290 goto exit;
291
292 if( ( ret = mbedtls_sha3_finish( &ctx, output, olen ) ) != 0 )
293 goto exit;
294
295exit:
296 mbedtls_sha3_free( &ctx );
297
298 return( ret );
299}
300
Pol Henarejos7dbd5d12022-05-20 20:42:33 +0200301/**************** Self-tests ****************/
302
303#if defined(MBEDTLS_SELF_TEST)
304
305static const unsigned char test_data[2][4] =
306{
307 "",
308 "abc",
309};
310
311static const size_t test_data_len[2] =
312{
313 0, /* "" */
314 3 /* "abc" */
315};
316
317static const unsigned char test_hash_sha3_224[2][28] =
318{
319 { /* "" */
320 0x6B, 0x4E, 0x03, 0x42, 0x36, 0x67, 0xDB, 0xB7,
321 0x3B, 0x6E, 0x15, 0x45, 0x4F, 0x0E, 0xB1, 0xAB,
322 0xD4, 0x59, 0x7F, 0x9A, 0x1B, 0x07, 0x8E, 0x3F,
323 0x5B, 0x5A, 0x6B, 0xC7
324 },
325 { /* "abc" */
326 0xE6, 0x42, 0x82, 0x4C, 0x3F, 0x8C, 0xF2, 0x4A,
327 0xD0, 0x92, 0x34, 0xEE, 0x7D, 0x3C, 0x76, 0x6F,
328 0xC9, 0xA3, 0xA5, 0x16, 0x8D, 0x0C, 0x94, 0xAD,
329 0x73, 0xB4, 0x6F, 0xDF
330 }
331};
332
333static const unsigned char test_hash_sha3_256[2][32] =
334{
335 { /* "" */
336 0xA7, 0xFF, 0xC6, 0xF8, 0xBF, 0x1E, 0xD7, 0x66,
337 0x51, 0xC1, 0x47, 0x56, 0xA0, 0x61, 0xD6, 0x62,
338 0xF5, 0x80, 0xFF, 0x4D, 0xE4, 0x3B, 0x49, 0xFA,
339 0x82, 0xD8, 0x0A, 0x4B, 0x80, 0xF8, 0x43, 0x4A
340 },
341 { /* "abc" */
342 0x3A, 0x98, 0x5D, 0xA7, 0x4F, 0xE2, 0x25, 0xB2,
343 0x04, 0x5C, 0x17, 0x2D, 0x6B, 0xD3, 0x90, 0xBD,
344 0x85, 0x5F, 0x08, 0x6E, 0x3E, 0x9D, 0x52, 0x5B,
345 0x46, 0xBF, 0xE2, 0x45, 0x11, 0x43, 0x15, 0x32
346 }
347};
348
349static const unsigned char test_hash_sha3_384[2][48] =
350{
351 { /* "" */
352 0x0C, 0x63, 0xA7, 0x5B, 0x84, 0x5E, 0x4F, 0x7D,
353 0x01, 0x10, 0x7D, 0x85, 0x2E, 0x4C, 0x24, 0x85,
354 0xC5, 0x1A, 0x50, 0xAA, 0xAA, 0x94, 0xFC, 0x61,
355 0x99, 0x5E, 0x71, 0xBB, 0xEE, 0x98, 0x3A, 0x2A,
356 0xC3, 0x71, 0x38, 0x31, 0x26, 0x4A, 0xDB, 0x47,
357 0xFB, 0x6B, 0xD1, 0xE0, 0x58, 0xD5, 0xF0, 0x04
358 },
359 { /* "abc" */
360 0xEC, 0x01, 0x49, 0x82, 0x88, 0x51, 0x6F, 0xC9,
361 0x26, 0x45, 0x9F, 0x58, 0xE2, 0xC6, 0xAD, 0x8D,
362 0xF9, 0xB4, 0x73, 0xCB, 0x0F, 0xC0, 0x8C, 0x25,
363 0x96, 0xDA, 0x7C, 0xF0, 0xE4, 0x9B, 0xE4, 0xB2,
364 0x98, 0xD8, 0x8C, 0xEA, 0x92, 0x7A, 0xC7, 0xF5,
365 0x39, 0xF1, 0xED, 0xF2, 0x28, 0x37, 0x6D, 0x25
366 }
367};
368
369static const unsigned char test_hash_sha3_512[2][64] =
370{
371 { /* "" */
372 0xA6, 0x9F, 0x73, 0xCC, 0xA2, 0x3A, 0x9A, 0xC5,
373 0xC8, 0xB5, 0x67, 0xDC, 0x18, 0x5A, 0x75, 0x6E,
374 0x97, 0xC9, 0x82, 0x16, 0x4F, 0xE2, 0x58, 0x59,
375 0xE0, 0xD1, 0xDC, 0xC1, 0x47, 0x5C, 0x80, 0xA6,
376 0x15, 0xB2, 0x12, 0x3A, 0xF1, 0xF5, 0xF9, 0x4C,
377 0x11, 0xE3, 0xE9, 0x40, 0x2C, 0x3A, 0xC5, 0x58,
378 0xF5, 0x00, 0x19, 0x9D, 0x95, 0xB6, 0xD3, 0xE3,
379 0x01, 0x75, 0x85, 0x86, 0x28, 0x1D, 0xCD, 0x26
380 },
381 { /* "abc" */
382 0xB7, 0x51, 0x85, 0x0B, 0x1A, 0x57, 0x16, 0x8A,
383 0x56, 0x93, 0xCD, 0x92, 0x4B, 0x6B, 0x09, 0x6E,
384 0x08, 0xF6, 0x21, 0x82, 0x74, 0x44, 0xF7, 0x0D,
385 0x88, 0x4F, 0x5D, 0x02, 0x40, 0xD2, 0x71, 0x2E,
386 0x10, 0xE1, 0x16, 0xE9, 0x19, 0x2A, 0xF3, 0xC9,
387 0x1A, 0x7E, 0xC5, 0x76, 0x47, 0xE3, 0x93, 0x40,
388 0x57, 0x34, 0x0B, 0x4C, 0xF4, 0x08, 0xD5, 0xA5,
389 0x65, 0x92, 0xF8, 0x27, 0x4E, 0xEC, 0x53, 0xF0
390 }
391};
392
393static const unsigned char long_kat_hash_sha3_224[28] =
394{
395 0xD6, 0x93, 0x35, 0xB9, 0x33, 0x25, 0x19, 0x2E,
396 0x51, 0x6A, 0x91, 0x2E, 0x6D, 0x19, 0xA1, 0x5C,
397 0xB5, 0x1C, 0x6E, 0xD5, 0xC1, 0x52, 0x43, 0xE7,
398 0xA7, 0xFD, 0x65, 0x3C
399};
400
401static const unsigned char long_kat_hash_sha3_256[32] =
402{
403 0x5C, 0x88, 0x75, 0xAE, 0x47, 0x4A, 0x36, 0x34,
404 0xBA, 0x4F, 0xD5, 0x5E, 0xC8, 0x5B, 0xFF, 0xD6,
405 0x61, 0xF3, 0x2A, 0xCA, 0x75, 0xC6, 0xD6, 0x99,
406 0xD0, 0xCD, 0xCB, 0x6C, 0x11, 0x58, 0x91, 0xC1
407};
408
409static const unsigned char long_kat_hash_sha3_384[48] =
410{
411 0xEE, 0xE9, 0xE2, 0x4D, 0x78, 0xC1, 0x85, 0x53,
412 0x37, 0x98, 0x34, 0x51, 0xDF, 0x97, 0xC8, 0xAD,
413 0x9E, 0xED, 0xF2, 0x56, 0xC6, 0x33, 0x4F, 0x8E,
414 0x94, 0x8D, 0x25, 0x2D, 0x5E, 0x0E, 0x76, 0x84,
415 0x7A, 0xA0, 0x77, 0x4D, 0xDB, 0x90, 0xA8, 0x42,
416 0x19, 0x0D, 0x2C, 0x55, 0x8B, 0x4B, 0x83, 0x40
417};
418
419static const unsigned char long_kat_hash_sha3_512[64] =
420{
421 0x3C, 0x3A, 0x87, 0x6D, 0xA1, 0x40, 0x34, 0xAB,
422 0x60, 0x62, 0x7C, 0x07, 0x7B, 0xB9, 0x8F, 0x7E,
423 0x12, 0x0A, 0x2A, 0x53, 0x70, 0x21, 0x2D, 0xFF,
424 0xB3, 0x38, 0x5A, 0x18, 0xD4, 0xF3, 0x88, 0x59,
425 0xED, 0x31, 0x1D, 0x0A, 0x9D, 0x51, 0x41, 0xCE,
426 0x9C, 0xC5, 0xC6, 0x6E, 0xE6, 0x89, 0xB2, 0x66,
427 0xA8, 0xAA, 0x18, 0xAC, 0xE8, 0x28, 0x2A, 0x0E,
428 0x0D, 0xB5, 0x96, 0xC9, 0x0B, 0x0A, 0x7B, 0x87
429};
430
431static int mbedtls_sha3_kat_test( int verbose,
432 const char* type_name,
433 mbedtls_sha3_id id,
434 int test_num )
435{
436 uint8_t hash[64];
437 int result;
438
439 result = mbedtls_sha3( id,
440 test_data[test_num], test_data_len[test_num],
441 hash, sizeof( hash ) );
442 if( result != 0 )
443 {
444 if( verbose != 0 )
445 {
446 mbedtls_printf( " %s test %d error code: %d\n",
447 type_name, test_num, result );
448 }
449
450 return( result );
451 }
452
453 switch( id )
454 {
455 case MBEDTLS_SHA3_224:
456 result = memcmp( hash, test_hash_sha3_224[test_num], 28 );
457 break;
458 case MBEDTLS_SHA3_256:
459 result = memcmp( hash, test_hash_sha3_256[test_num], 32 );
460 break;
461 case MBEDTLS_SHA3_384:
462 result = memcmp( hash, test_hash_sha3_384[test_num], 48 );
463 break;
464 case MBEDTLS_SHA3_512:
465 result = memcmp( hash, test_hash_sha3_512[test_num], 64 );
466 break;
467 default:
468 break;
469 }
470
471 if( 0 != result )
472 {
473 if( verbose != 0 )
474 {
475 mbedtls_printf( " %s test %d failed\n", type_name, test_num );
476 }
477
478 return( -1 );
479 }
480
481 if( verbose != 0 )
482 {
483 mbedtls_printf( " %s test %d passed\n", type_name, test_num );
484 }
485
486 return( 0 );
487}
488
489static int mbedtls_sha3_long_kat_test( int verbose,
490 const char* type_name,
491 mbedtls_sha3_id id )
492{
493 mbedtls_sha3_context ctx;
494 unsigned char buffer[1000];
495 unsigned char hash[64];
496 int i;
497 int result = 0;
498
499 memset( buffer, 'a', 1000 );
500
501 if( verbose != 0 )
502 {
503 mbedtls_printf( " %s long KAT test ", type_name );
504 }
505
506 mbedtls_sha3_init( &ctx );
507
508 result = mbedtls_sha3_starts( &ctx, id );
509 if( result != 0 )
510 {
511 if( verbose != 0 )
512 {
513 mbedtls_printf( "setup failed\n " );
514 }
515 }
516
517 /* Process 1,000,000 (one million) 'a' characters */
518 for( i = 0; i < 1000; i++ )
519 {
520 result = mbedtls_sha3_update( &ctx, buffer, 1000 );
521 if( result != 0 )
522 {
523 if( verbose != 0 )
524 {
525 mbedtls_printf( "update error code: %i\n", result );
526 }
527
528 goto cleanup;
529 }
530 }
531
532 result = mbedtls_sha3_finish( &ctx, hash, sizeof( hash ) );
533 if( result != 0 )
534 {
535 if( verbose != 0 )
536 {
537 mbedtls_printf( "finish error code: %d\n", result );
538 }
539
540 goto cleanup;
541 }
542
543 switch( id )
544 {
545 case MBEDTLS_SHA3_224:
546 result = memcmp( hash, long_kat_hash_sha3_224, 28 );
547 break;
548 case MBEDTLS_SHA3_256:
549 result = memcmp( hash, long_kat_hash_sha3_256, 32 );
550 break;
551 case MBEDTLS_SHA3_384:
552 result = memcmp( hash, long_kat_hash_sha3_384, 48 );
553 break;
554 case MBEDTLS_SHA3_512:
555 result = memcmp( hash, long_kat_hash_sha3_512, 64 );
556 break;
557 default:
558 break;
559 }
560
561 if( result != 0 )
562 {
563 if( verbose != 0 )
564 {
565 mbedtls_printf( "failed\n" );
566 }
567 }
568
569 if( verbose != 0 )
570 {
571 mbedtls_printf( "passed\n" );
572 }
573
574cleanup:
575 mbedtls_sha3_free( &ctx );
576 return( result );
577}
578
579int mbedtls_sha3_self_test( int verbose )
580{
581 int i;
582
583 /* SHA3 Known Answer Tests (KAT) */
584 for( i = 0; i < 2; i++ )
585 {
586 if( 0 != mbedtls_sha3_kat_test( verbose,
587 "SHA3-224", MBEDTLS_SHA3_224, i ) )
588 return( 1 );
589
590 if( 0 != mbedtls_sha3_kat_test( verbose,
591 "SHA3-256", MBEDTLS_SHA3_256, i ) )
592 return( 1 );
593
594 if( 0 != mbedtls_sha3_kat_test( verbose,
595 "SHA3-384", MBEDTLS_SHA3_384, i ) )
596 return( 1 );
597
598 if( 0 != mbedtls_sha3_kat_test( verbose,
599 "SHA3-512", MBEDTLS_SHA3_512, i ) )
600 return( 1 );
601 }
602
603 /* SHA3 long KAT tests */
604 if( 0 != mbedtls_sha3_long_kat_test( verbose,
605 "SHA3-224", MBEDTLS_SHA3_224 ) )
606 return( 1 );
607
608 if( 0 != mbedtls_sha3_long_kat_test( verbose,
609 "SHA3-256", MBEDTLS_SHA3_256 ) )
610 return( 1 );
611
612 if( 0 != mbedtls_sha3_long_kat_test( verbose,
613 "SHA3-384", MBEDTLS_SHA3_384 ) )
614 return( 1 );
615
616 if( 0 != mbedtls_sha3_long_kat_test( verbose,
617 "SHA3-512", MBEDTLS_SHA3_512 ) )
618 return( 1 );
619
620 if( verbose != 0 )
621 {
622 mbedtls_printf( "\n" );
623 }
624
625 return( 0 );
626}
627#endif /* MBEDTLS_SELF_TEST */
628
Pol Henarejos0cd1f1c2022-05-09 01:04:15 +0200629#endif /* MBEDTLS_SHA3_C */