blob: 6e6a58f880f8c3e41a249972cab2d7df5c266069 [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * FIPS-180-2 compliant SHA-256 implementation
3 *
Bence Szépkúti1e148272020-08-07 13:07:28 +02004 * Copyright The Mbed TLS Contributors
Manuel Pégourié-Gonnard37ff1402015-09-04 14:21:07 +02005 * 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.
Paul Bakker5121ce52009-01-03 21:22:43 +000018 */
19/*
20 * The SHA-256 Secure Hash Standard was published by NIST in 2002.
21 *
22 * http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf
23 */
24
Gilles Peskinedb09ef62020-06-03 01:43:33 +020025#include "common.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000026
Valerio Settia3f99592022-12-14 10:56:54 +010027#if defined(MBEDTLS_SHA256_C) || defined(MBEDTLS_SHA224_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000028
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000029#include "mbedtls/sha256.h"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050030#include "mbedtls/platform_util.h"
Janos Follath24eed8d2019-11-22 13:21:35 +000031#include "mbedtls/error.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000032
Rich Evans00ab4702015-02-06 13:43:58 +000033#include <string.h>
34
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000035#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010036
Tom Cosgrovef3ebd902022-02-20 22:25:31 +000037#if defined(__aarch64__)
38# if defined(MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT) || \
39 defined(MBEDTLS_SHA256_USE_A64_CRYPTO_ONLY)
40# include <arm_neon.h>
41# endif
Tom Cosgroveb7f5b972022-03-15 11:26:55 +000042# if defined(MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT)
43# if defined(__unix__)
44# if defined(__linux__)
45 /* Our preferred method of detection is getauxval() */
46# include <sys/auxv.h>
47# endif
48 /* Use SIGILL on Unix, and fall back to it on Linux */
49# include <signal.h>
50# endif
Tom Cosgrovef3ebd902022-02-20 22:25:31 +000051# endif
Tom Cosgroveb9987fc2022-02-21 12:26:11 +000052#elif defined(_M_ARM64)
53# if defined(MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT) || \
54 defined(MBEDTLS_SHA256_USE_A64_CRYPTO_ONLY)
55# include <arm64_neon.h>
56# endif
Tom Cosgrovef3ebd902022-02-20 22:25:31 +000057#else
58# undef MBEDTLS_SHA256_USE_A64_CRYPTO_ONLY
59# undef MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT
60#endif
61
62#if defined(MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT)
63/*
64 * Capability detection code comes early, so we can disable
65 * MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT if no detection mechanism found
66 */
67#if defined(HWCAP_SHA2)
Tom Cosgrove7e7aba82022-02-24 08:33:11 +000068static int mbedtls_a64_crypto_sha256_determine_support( void )
Tom Cosgrovef3ebd902022-02-20 22:25:31 +000069{
70 return( ( getauxval( AT_HWCAP ) & HWCAP_SHA2 ) ? 1 : 0 );
71}
72#elif defined(__APPLE__)
Tom Cosgrove7e7aba82022-02-24 08:33:11 +000073static int mbedtls_a64_crypto_sha256_determine_support( void )
Tom Cosgrovef3ebd902022-02-20 22:25:31 +000074{
75 return( 1 );
76}
Tom Cosgroveb9987fc2022-02-21 12:26:11 +000077#elif defined(_M_ARM64)
78#define WIN32_LEAN_AND_MEAN
79#include <Windows.h>
80#include <processthreadsapi.h>
81
Tom Cosgrove7e7aba82022-02-24 08:33:11 +000082static int mbedtls_a64_crypto_sha256_determine_support( void )
Tom Cosgroveb9987fc2022-02-21 12:26:11 +000083{
84 return( IsProcessorFeaturePresent( PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE ) ?
85 1 : 0 );
86}
Tom Cosgrovef3ebd902022-02-20 22:25:31 +000087#elif defined(__unix__) && defined(SIG_SETMASK)
88/* Detection with SIGILL, setjmp() and longjmp() */
89#include <signal.h>
90#include <setjmp.h>
91
David Horstmanne3d8f312023-01-03 11:07:09 +000092/* *INDENT-OFF* */
Tom Cosgrovef3ebd902022-02-20 22:25:31 +000093#ifndef asm
94#define asm __asm__
95#endif
David Horstmanne3d8f312023-01-03 11:07:09 +000096/* *INDENT-ON* */
Tom Cosgrovef3ebd902022-02-20 22:25:31 +000097
98static jmp_buf return_from_sigill;
99
100/*
101 * A64 SHA256 support detection via SIGILL
102 */
103static void sigill_handler( int signal )
104{
105 (void) signal;
106 longjmp( return_from_sigill, 1 );
107}
108
Tom Cosgrove7e7aba82022-02-24 08:33:11 +0000109static int mbedtls_a64_crypto_sha256_determine_support( void )
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000110{
111 struct sigaction old_action, new_action;
112
113 sigset_t old_mask;
114 if( sigprocmask( 0, NULL, &old_mask ) )
115 return( 0 );
116
117 sigemptyset( &new_action.sa_mask );
118 new_action.sa_flags = 0;
119 new_action.sa_handler = sigill_handler;
120
121 sigaction( SIGILL, &new_action, &old_action );
122
123 static int ret = 0;
124
125 if( setjmp( return_from_sigill ) == 0 ) /* First return only */
126 {
127 /* If this traps, we will return a second time from setjmp() with 1 */
128 asm( "sha256h q0, q0, v0.4s" : : : "v0" );
129 ret = 1;
130 }
131
132 sigaction( SIGILL, &old_action, NULL );
133 sigprocmask( SIG_SETMASK, &old_mask, NULL );
134
135 return( ret );
136}
137#else
138#warning "No mechanism to detect A64_CRYPTO found, using C code only"
139#undef MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT
140#endif /* HWCAP_SHA2, __APPLE__, __unix__ && SIG_SETMASK */
141
142#endif /* MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT */
143
Manuel Pégourié-Gonnard8b2641d2015-08-27 20:03:46 +0200144#if !defined(MBEDTLS_SHA256_ALT)
145
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000146#define SHA256_BLOCK_SIZE 64
147
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200148void mbedtls_sha256_init( mbedtls_sha256_context *ctx )
Paul Bakker5b4af392014-06-26 12:09:34 +0200149{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200150 memset( ctx, 0, sizeof( mbedtls_sha256_context ) );
Paul Bakker5b4af392014-06-26 12:09:34 +0200151}
152
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200153void mbedtls_sha256_free( mbedtls_sha256_context *ctx )
Paul Bakker5b4af392014-06-26 12:09:34 +0200154{
155 if( ctx == NULL )
156 return;
157
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500158 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_sha256_context ) );
Paul Bakker5b4af392014-06-26 12:09:34 +0200159}
160
Manuel Pégourié-Gonnard16d412f2015-07-06 15:26:26 +0200161void mbedtls_sha256_clone( mbedtls_sha256_context *dst,
162 const mbedtls_sha256_context *src )
163{
164 *dst = *src;
165}
166
Paul Bakker5121ce52009-01-03 21:22:43 +0000167/*
168 * SHA-256 context setup
169 */
TRodziewicz26371e42021-06-08 16:45:41 +0200170int mbedtls_sha256_starts( mbedtls_sha256_context *ctx, int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000171{
Valerio Settia3f99592022-12-14 10:56:54 +0100172#if defined(MBEDTLS_SHA224_C) && defined(MBEDTLS_SHA256_C)
Tuvshinzaya Erdenekhuu696dfb62022-08-05 15:59:19 +0100173 if( is224 != 0 && is224 != 1 )
174 return MBEDTLS_ERR_SHA256_BAD_INPUT_DATA;
Valerio Settia3f99592022-12-14 10:56:54 +0100175#elif defined(MBEDTLS_SHA256_C)
Tuvshinzaya Erdenekhuu696dfb62022-08-05 15:59:19 +0100176 if( is224 != 0 )
177 return MBEDTLS_ERR_SHA256_BAD_INPUT_DATA;
Valerio Settia3f99592022-12-14 10:56:54 +0100178#else /* defined MBEDTLS_SHA224_C only */
179 if( is224 == 0 )
180 return MBEDTLS_ERR_SHA256_BAD_INPUT_DATA;
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200181#endif
182
Paul Bakker5121ce52009-01-03 21:22:43 +0000183 ctx->total[0] = 0;
184 ctx->total[1] = 0;
185
186 if( is224 == 0 )
187 {
Valerio Settia3f99592022-12-14 10:56:54 +0100188#if defined(MBEDTLS_SHA256_C)
Paul Bakker5121ce52009-01-03 21:22:43 +0000189 ctx->state[0] = 0x6A09E667;
190 ctx->state[1] = 0xBB67AE85;
191 ctx->state[2] = 0x3C6EF372;
192 ctx->state[3] = 0xA54FF53A;
193 ctx->state[4] = 0x510E527F;
194 ctx->state[5] = 0x9B05688C;
195 ctx->state[6] = 0x1F83D9AB;
196 ctx->state[7] = 0x5BE0CD19;
Valerio Settia3f99592022-12-14 10:56:54 +0100197#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000198 }
199 else
200 {
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200201#if defined(MBEDTLS_SHA224_C)
Paul Bakker5121ce52009-01-03 21:22:43 +0000202 ctx->state[0] = 0xC1059ED8;
203 ctx->state[1] = 0x367CD507;
204 ctx->state[2] = 0x3070DD17;
205 ctx->state[3] = 0xF70E5939;
206 ctx->state[4] = 0xFFC00B31;
207 ctx->state[5] = 0x68581511;
208 ctx->state[6] = 0x64F98FA7;
209 ctx->state[7] = 0xBEFA4FA4;
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200210#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000211 }
212
Valerio Settia3f99592022-12-14 10:56:54 +0100213#if defined(MBEDTLS_SHA224_C)
Paul Bakker5121ce52009-01-03 21:22:43 +0000214 ctx->is224 = is224;
Valerio Settia3f99592022-12-14 10:56:54 +0100215#endif
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100216
217 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000218}
219
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200220#if !defined(MBEDTLS_SHA256_PROCESS_ALT)
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200221static const uint32_t K[] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000222{
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200223 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,
224 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,
225 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,
226 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,
227 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,
228 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,
229 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,
230 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,
231 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,
232 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,
233 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,
234 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,
235 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,
236 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,
237 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,
238 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2,
239};
Paul Bakker5121ce52009-01-03 21:22:43 +0000240
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000241#endif
242
243#if defined(MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT) || \
244 defined(MBEDTLS_SHA256_USE_A64_CRYPTO_ONLY)
245
246#if defined(MBEDTLS_SHA256_USE_A64_CRYPTO_ONLY)
247# define mbedtls_internal_sha256_process_many_a64_crypto mbedtls_internal_sha256_process_many
248# define mbedtls_internal_sha256_process_a64_crypto mbedtls_internal_sha256_process
249#endif
250
251static size_t mbedtls_internal_sha256_process_many_a64_crypto(
252 mbedtls_sha256_context *ctx, const uint8_t *msg, size_t len )
253{
254 uint32x4_t abcd = vld1q_u32( &ctx->state[0] );
255 uint32x4_t efgh = vld1q_u32( &ctx->state[4] );
256
257 size_t processed = 0;
258
259 for( ;
260 len >= SHA256_BLOCK_SIZE;
261 processed += SHA256_BLOCK_SIZE,
262 msg += SHA256_BLOCK_SIZE,
263 len -= SHA256_BLOCK_SIZE )
264 {
265 uint32x4_t tmp, abcd_prev;
266
267 uint32x4_t abcd_orig = abcd;
268 uint32x4_t efgh_orig = efgh;
269
Tom Cosgroveb7f5b972022-03-15 11:26:55 +0000270 uint32x4_t sched0 = (uint32x4_t) vld1q_u8( msg + 16 * 0 );
271 uint32x4_t sched1 = (uint32x4_t) vld1q_u8( msg + 16 * 1 );
272 uint32x4_t sched2 = (uint32x4_t) vld1q_u8( msg + 16 * 2 );
273 uint32x4_t sched3 = (uint32x4_t) vld1q_u8( msg + 16 * 3 );
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000274
275#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ /* Will be true if not defined */
276 /* Untested on BE */
277 sched0 = vreinterpretq_u32_u8( vrev32q_u8( vreinterpretq_u8_u32( sched0 ) ) );
278 sched1 = vreinterpretq_u32_u8( vrev32q_u8( vreinterpretq_u8_u32( sched1 ) ) );
279 sched2 = vreinterpretq_u32_u8( vrev32q_u8( vreinterpretq_u8_u32( sched2 ) ) );
280 sched3 = vreinterpretq_u32_u8( vrev32q_u8( vreinterpretq_u8_u32( sched3 ) ) );
281#endif
282
283 /* Rounds 0 to 3 */
284 tmp = vaddq_u32( sched0, vld1q_u32( &K[0] ) );
285 abcd_prev = abcd;
286 abcd = vsha256hq_u32( abcd_prev, efgh, tmp );
287 efgh = vsha256h2q_u32( efgh, abcd_prev, tmp );
288
289 /* Rounds 4 to 7 */
290 tmp = vaddq_u32( sched1, vld1q_u32( &K[4] ) );
291 abcd_prev = abcd;
292 abcd = vsha256hq_u32( abcd_prev, efgh, tmp );
293 efgh = vsha256h2q_u32( efgh, abcd_prev, tmp );
294
295 /* Rounds 8 to 11 */
296 tmp = vaddq_u32( sched2, vld1q_u32( &K[8] ) );
297 abcd_prev = abcd;
298 abcd = vsha256hq_u32( abcd_prev, efgh, tmp );
299 efgh = vsha256h2q_u32( efgh, abcd_prev, tmp );
300
301 /* Rounds 12 to 15 */
302 tmp = vaddq_u32( sched3, vld1q_u32( &K[12] ) );
303 abcd_prev = abcd;
304 abcd = vsha256hq_u32( abcd_prev, efgh, tmp );
305 efgh = vsha256h2q_u32( efgh, abcd_prev, tmp );
306
307 for( int t = 16; t < 64; t += 16 )
308 {
309 /* Rounds t to t + 3 */
310 sched0 = vsha256su1q_u32( vsha256su0q_u32( sched0, sched1 ), sched2, sched3 );
311 tmp = vaddq_u32( sched0, vld1q_u32( &K[t] ) );
312 abcd_prev = abcd;
313 abcd = vsha256hq_u32( abcd_prev, efgh, tmp );
314 efgh = vsha256h2q_u32( efgh, abcd_prev, tmp );
315
316 /* Rounds t + 4 to t + 7 */
317 sched1 = vsha256su1q_u32( vsha256su0q_u32( sched1, sched2 ), sched3, sched0 );
318 tmp = vaddq_u32( sched1, vld1q_u32( &K[t + 4] ) );
319 abcd_prev = abcd;
320 abcd = vsha256hq_u32( abcd_prev, efgh, tmp );
321 efgh = vsha256h2q_u32( efgh, abcd_prev, tmp );
322
323 /* Rounds t + 8 to t + 11 */
324 sched2 = vsha256su1q_u32( vsha256su0q_u32( sched2, sched3 ), sched0, sched1 );
325 tmp = vaddq_u32( sched2, vld1q_u32( &K[t + 8] ) );
326 abcd_prev = abcd;
327 abcd = vsha256hq_u32( abcd_prev, efgh, tmp );
328 efgh = vsha256h2q_u32( efgh, abcd_prev, tmp );
329
330 /* Rounds t + 12 to t + 15 */
331 sched3 = vsha256su1q_u32( vsha256su0q_u32( sched3, sched0 ), sched1, sched2 );
332 tmp = vaddq_u32( sched3, vld1q_u32( &K[t + 12] ) );
333 abcd_prev = abcd;
334 abcd = vsha256hq_u32( abcd_prev, efgh, tmp );
335 efgh = vsha256h2q_u32( efgh, abcd_prev, tmp );
336 }
337
338 abcd = vaddq_u32( abcd, abcd_orig );
339 efgh = vaddq_u32( efgh, efgh_orig );
340 }
341
342 vst1q_u32( &ctx->state[0], abcd );
343 vst1q_u32( &ctx->state[4], efgh );
344
345 return( processed );
346}
347
Tom Cosgrovec144ca62022-04-19 13:52:24 +0100348#if defined(MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT)
349/*
350 * This function is for internal use only if we are building both C and A64
351 * versions, otherwise it is renamed to be the public mbedtls_internal_sha256_process()
352 */
353static
354#endif
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000355int mbedtls_internal_sha256_process_a64_crypto( mbedtls_sha256_context *ctx,
356 const unsigned char data[SHA256_BLOCK_SIZE] )
357{
358 return( ( mbedtls_internal_sha256_process_many_a64_crypto( ctx, data,
359 SHA256_BLOCK_SIZE ) == SHA256_BLOCK_SIZE ) ? 0 : -1 );
360}
361
362#endif /* MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT || MBEDTLS_SHA256_USE_A64_CRYPTO_ONLY */
363
364
365#if !defined(MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT)
366#define mbedtls_internal_sha256_process_many_c mbedtls_internal_sha256_process_many
367#define mbedtls_internal_sha256_process_c mbedtls_internal_sha256_process
368#endif
369
370
371#if !defined(MBEDTLS_SHA256_PROCESS_ALT) && \
372 !defined(MBEDTLS_SHA256_USE_A64_CRYPTO_ONLY)
373
Hanno Becker1eeca412018-10-15 12:01:35 +0100374#define SHR(x,n) (((x) & 0xFFFFFFFF) >> (n))
375#define ROTR(x,n) (SHR(x,n) | ((x) << (32 - (n))))
Paul Bakker5121ce52009-01-03 21:22:43 +0000376
377#define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^ SHR(x, 3))
378#define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^ SHR(x,10))
379
380#define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22))
381#define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25))
382
Hanno Becker1eeca412018-10-15 12:01:35 +0100383#define F0(x,y,z) (((x) & (y)) | ((z) & ((x) | (y))))
384#define F1(x,y,z) ((z) ^ ((x) & ((y) ^ (z))))
Paul Bakker5121ce52009-01-03 21:22:43 +0000385
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200386#define R(t) \
387 ( \
388 local.W[t] = S1(local.W[(t) - 2]) + local.W[(t) - 7] + \
389 S0(local.W[(t) - 15]) + local.W[(t) - 16] \
Hanno Becker1eeca412018-10-15 12:01:35 +0100390 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000391
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200392#define P(a,b,c,d,e,f,g,h,x,K) \
393 do \
394 { \
395 local.temp1 = (h) + S3(e) + F1((e),(f),(g)) + (K) + (x); \
396 local.temp2 = S2(a) + F0((a),(b),(c)); \
397 (d) += local.temp1; (h) = local.temp1 + local.temp2; \
Hanno Becker1eeca412018-10-15 12:01:35 +0100398 } while( 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000399
Tom Cosgrovec144ca62022-04-19 13:52:24 +0100400#if defined(MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT)
401/*
402 * This function is for internal use only if we are building both C and A64
403 * versions, otherwise it is renamed to be the public mbedtls_internal_sha256_process()
404 */
405static
406#endif
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000407int mbedtls_internal_sha256_process_c( mbedtls_sha256_context *ctx,
408 const unsigned char data[SHA256_BLOCK_SIZE] )
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200409{
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200410 struct
411 {
412 uint32_t temp1, temp2, W[64];
413 uint32_t A[8];
414 } local;
415
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200416 unsigned int i;
Paul Bakker5121ce52009-01-03 21:22:43 +0000417
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200418 for( i = 0; i < 8; i++ )
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200419 local.A[i] = ctx->state[i];
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200420
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200421#if defined(MBEDTLS_SHA256_SMALLER)
422 for( i = 0; i < 64; i++ )
423 {
424 if( i < 16 )
Joe Subbiani6a506312021-07-07 16:56:29 +0100425 local.W[i] = MBEDTLS_GET_UINT32_BE( data, 4 * i );
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200426 else
427 R( i );
428
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200429 P( local.A[0], local.A[1], local.A[2], local.A[3], local.A[4],
430 local.A[5], local.A[6], local.A[7], local.W[i], K[i] );
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200431
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200432 local.temp1 = local.A[7]; local.A[7] = local.A[6];
433 local.A[6] = local.A[5]; local.A[5] = local.A[4];
434 local.A[4] = local.A[3]; local.A[3] = local.A[2];
435 local.A[2] = local.A[1]; local.A[1] = local.A[0];
436 local.A[0] = local.temp1;
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200437 }
438#else /* MBEDTLS_SHA256_SMALLER */
439 for( i = 0; i < 16; i++ )
Joe Subbiani6a506312021-07-07 16:56:29 +0100440 local.W[i] = MBEDTLS_GET_UINT32_BE( data, 4 * i );
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200441
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200442 for( i = 0; i < 16; i += 8 )
443 {
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200444 P( local.A[0], local.A[1], local.A[2], local.A[3], local.A[4],
445 local.A[5], local.A[6], local.A[7], local.W[i+0], K[i+0] );
446 P( local.A[7], local.A[0], local.A[1], local.A[2], local.A[3],
447 local.A[4], local.A[5], local.A[6], local.W[i+1], K[i+1] );
448 P( local.A[6], local.A[7], local.A[0], local.A[1], local.A[2],
449 local.A[3], local.A[4], local.A[5], local.W[i+2], K[i+2] );
450 P( local.A[5], local.A[6], local.A[7], local.A[0], local.A[1],
451 local.A[2], local.A[3], local.A[4], local.W[i+3], K[i+3] );
452 P( local.A[4], local.A[5], local.A[6], local.A[7], local.A[0],
453 local.A[1], local.A[2], local.A[3], local.W[i+4], K[i+4] );
454 P( local.A[3], local.A[4], local.A[5], local.A[6], local.A[7],
455 local.A[0], local.A[1], local.A[2], local.W[i+5], K[i+5] );
456 P( local.A[2], local.A[3], local.A[4], local.A[5], local.A[6],
457 local.A[7], local.A[0], local.A[1], local.W[i+6], K[i+6] );
458 P( local.A[1], local.A[2], local.A[3], local.A[4], local.A[5],
459 local.A[6], local.A[7], local.A[0], local.W[i+7], K[i+7] );
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200460 }
461
462 for( i = 16; i < 64; i += 8 )
463 {
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200464 P( local.A[0], local.A[1], local.A[2], local.A[3], local.A[4],
465 local.A[5], local.A[6], local.A[7], R(i+0), K[i+0] );
466 P( local.A[7], local.A[0], local.A[1], local.A[2], local.A[3],
467 local.A[4], local.A[5], local.A[6], R(i+1), K[i+1] );
468 P( local.A[6], local.A[7], local.A[0], local.A[1], local.A[2],
469 local.A[3], local.A[4], local.A[5], R(i+2), K[i+2] );
470 P( local.A[5], local.A[6], local.A[7], local.A[0], local.A[1],
471 local.A[2], local.A[3], local.A[4], R(i+3), K[i+3] );
472 P( local.A[4], local.A[5], local.A[6], local.A[7], local.A[0],
473 local.A[1], local.A[2], local.A[3], R(i+4), K[i+4] );
474 P( local.A[3], local.A[4], local.A[5], local.A[6], local.A[7],
475 local.A[0], local.A[1], local.A[2], R(i+5), K[i+5] );
476 P( local.A[2], local.A[3], local.A[4], local.A[5], local.A[6],
477 local.A[7], local.A[0], local.A[1], R(i+6), K[i+6] );
478 P( local.A[1], local.A[2], local.A[3], local.A[4], local.A[5],
479 local.A[6], local.A[7], local.A[0], R(i+7), K[i+7] );
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200480 }
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200481#endif /* MBEDTLS_SHA256_SMALLER */
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200482
483 for( i = 0; i < 8; i++ )
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200484 ctx->state[i] += local.A[i];
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100485
gabor-mezei-arm76749ae2020-07-30 16:41:25 +0200486 /* Zeroise buffers and variables to clear sensitive data from memory. */
gabor-mezei-arm4cb56f82020-08-25 19:12:01 +0200487 mbedtls_platform_zeroize( &local, sizeof( local ) );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100488
489 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000490}
Jaeden Amero041039f2018-02-19 15:28:08 +0000491
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000492#endif /* !MBEDTLS_SHA256_PROCESS_ALT && !MBEDTLS_SHA256_USE_A64_CRYPTO_ONLY */
493
494
495#if !defined(MBEDTLS_SHA256_USE_A64_CRYPTO_ONLY)
496
497static size_t mbedtls_internal_sha256_process_many_c(
498 mbedtls_sha256_context *ctx, const uint8_t *data, size_t len )
499{
500 size_t processed = 0;
501
502 while( len >= SHA256_BLOCK_SIZE )
503 {
504 if( mbedtls_internal_sha256_process_c( ctx, data ) != 0 )
505 return( 0 );
506
507 data += SHA256_BLOCK_SIZE;
508 len -= SHA256_BLOCK_SIZE;
509
510 processed += SHA256_BLOCK_SIZE;
511 }
512
513 return( processed );
514}
515
516#endif /* !MBEDTLS_SHA256_USE_A64_CRYPTO_ONLY */
517
518
519#if defined(MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT)
520
521static int mbedtls_a64_crypto_sha256_has_support( void )
522{
523 static int done = 0;
524 static int supported = 0;
525
526 if( !done )
527 {
Tom Cosgrove7e7aba82022-02-24 08:33:11 +0000528 supported = mbedtls_a64_crypto_sha256_determine_support();
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000529 done = 1;
530 }
531
532 return( supported );
533}
534
535static size_t mbedtls_internal_sha256_process_many( mbedtls_sha256_context *ctx,
536 const uint8_t *msg, size_t len )
537{
538 if( mbedtls_a64_crypto_sha256_has_support() )
539 return( mbedtls_internal_sha256_process_many_a64_crypto( ctx, msg, len ) );
540 else
541 return( mbedtls_internal_sha256_process_many_c( ctx, msg, len ) );
542}
543
544int mbedtls_internal_sha256_process( mbedtls_sha256_context *ctx,
545 const unsigned char data[SHA256_BLOCK_SIZE] )
546{
547 if( mbedtls_a64_crypto_sha256_has_support() )
548 return( mbedtls_internal_sha256_process_a64_crypto( ctx, data ) );
549 else
550 return( mbedtls_internal_sha256_process_c( ctx, data ) );
551}
552
553#endif /* MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT */
554
Paul Bakker5121ce52009-01-03 21:22:43 +0000555
556/*
557 * SHA-256 process buffer
558 */
TRodziewicz26371e42021-06-08 16:45:41 +0200559int mbedtls_sha256_update( mbedtls_sha256_context *ctx,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100560 const unsigned char *input,
561 size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000562{
Janos Follath24eed8d2019-11-22 13:21:35 +0000563 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker23986e52011-04-24 08:57:21 +0000564 size_t fill;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000565 uint32_t left;
Paul Bakker5121ce52009-01-03 21:22:43 +0000566
Brian White12895d12014-04-11 11:29:42 -0400567 if( ilen == 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100568 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000569
570 left = ctx->total[0] & 0x3F;
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000571 fill = SHA256_BLOCK_SIZE - left;
Paul Bakker5121ce52009-01-03 21:22:43 +0000572
Paul Bakker5c2364c2012-10-01 14:41:15 +0000573 ctx->total[0] += (uint32_t) ilen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000574 ctx->total[0] &= 0xFFFFFFFF;
575
Paul Bakker5c2364c2012-10-01 14:41:15 +0000576 if( ctx->total[0] < (uint32_t) ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000577 ctx->total[1]++;
578
579 if( left && ilen >= fill )
580 {
Paul Bakker3c2122f2013-06-24 19:03:14 +0200581 memcpy( (void *) (ctx->buffer + left), input, fill );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100582
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100583 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100584 return( ret );
585
Paul Bakker5121ce52009-01-03 21:22:43 +0000586 input += fill;
587 ilen -= fill;
588 left = 0;
589 }
590
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000591 while( ilen >= SHA256_BLOCK_SIZE )
Paul Bakker5121ce52009-01-03 21:22:43 +0000592 {
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000593 size_t processed =
594 mbedtls_internal_sha256_process_many( ctx, input, ilen );
595 if( processed < SHA256_BLOCK_SIZE )
596 return( MBEDTLS_ERR_ERROR_GENERIC_ERROR );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100597
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000598 input += processed;
599 ilen -= processed;
Paul Bakker5121ce52009-01-03 21:22:43 +0000600 }
601
602 if( ilen > 0 )
Paul Bakker3c2122f2013-06-24 19:03:14 +0200603 memcpy( (void *) (ctx->buffer + left), input, ilen );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100604
605 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000606}
607
Paul Bakker5121ce52009-01-03 21:22:43 +0000608/*
609 * SHA-256 final digest
610 */
TRodziewicz26371e42021-06-08 16:45:41 +0200611int mbedtls_sha256_finish( mbedtls_sha256_context *ctx,
Gilles Peskined7b3d922021-05-13 00:45:25 +0200612 unsigned char *output )
Paul Bakker5121ce52009-01-03 21:22:43 +0000613{
Janos Follath24eed8d2019-11-22 13:21:35 +0000614 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200615 uint32_t used;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000616 uint32_t high, low;
Paul Bakker5121ce52009-01-03 21:22:43 +0000617
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200618 /*
619 * Add padding: 0x80 then 0x00 until 8 bytes remain for the length
620 */
621 used = ctx->total[0] & 0x3F;
622
623 ctx->buffer[used++] = 0x80;
624
625 if( used <= 56 )
626 {
627 /* Enough room for padding + length in current block */
628 memset( ctx->buffer + used, 0, 56 - used );
629 }
630 else
631 {
632 /* We'll need an extra block */
Tom Cosgrovef3ebd902022-02-20 22:25:31 +0000633 memset( ctx->buffer + used, 0, SHA256_BLOCK_SIZE - used );
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200634
635 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
636 return( ret );
637
638 memset( ctx->buffer, 0, 56 );
639 }
640
641 /*
642 * Add message length
643 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000644 high = ( ctx->total[0] >> 29 )
645 | ( ctx->total[1] << 3 );
646 low = ( ctx->total[0] << 3 );
647
Joe Subbiani5ecac212021-06-24 13:00:03 +0100648 MBEDTLS_PUT_UINT32_BE( high, ctx->buffer, 56 );
649 MBEDTLS_PUT_UINT32_BE( low, ctx->buffer, 60 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000650
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200651 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
Andres Amaya Garciaaa464ef2017-07-21 14:21:53 +0100652 return( ret );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100653
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200654 /*
655 * Output final state
656 */
Joe Subbiani5ecac212021-06-24 13:00:03 +0100657 MBEDTLS_PUT_UINT32_BE( ctx->state[0], output, 0 );
658 MBEDTLS_PUT_UINT32_BE( ctx->state[1], output, 4 );
659 MBEDTLS_PUT_UINT32_BE( ctx->state[2], output, 8 );
660 MBEDTLS_PUT_UINT32_BE( ctx->state[3], output, 12 );
661 MBEDTLS_PUT_UINT32_BE( ctx->state[4], output, 16 );
662 MBEDTLS_PUT_UINT32_BE( ctx->state[5], output, 20 );
663 MBEDTLS_PUT_UINT32_BE( ctx->state[6], output, 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000664
David Horstmann687262c2022-10-06 17:54:57 +0100665 int truncated = 0;
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200666#if defined(MBEDTLS_SHA224_C)
David Horstmann687262c2022-10-06 17:54:57 +0100667 truncated = ctx->is224;
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200668#endif
David Horstmann687262c2022-10-06 17:54:57 +0100669 if( !truncated )
Joe Subbiani5ecac212021-06-24 13:00:03 +0100670 MBEDTLS_PUT_UINT32_BE( ctx->state[7], output, 28 );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100671
672 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000673}
674
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200675#endif /* !MBEDTLS_SHA256_ALT */
Paul Bakker90995b52013-06-24 19:20:35 +0200676
Paul Bakker5121ce52009-01-03 21:22:43 +0000677/*
678 * output = SHA-256( input buffer )
679 */
TRodziewicz26371e42021-06-08 16:45:41 +0200680int mbedtls_sha256( const unsigned char *input,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100681 size_t ilen,
Gilles Peskined7b3d922021-05-13 00:45:25 +0200682 unsigned char *output,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100683 int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000684{
Janos Follath24eed8d2019-11-22 13:21:35 +0000685 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200686 mbedtls_sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000687
Valerio Settia3f99592022-12-14 10:56:54 +0100688#if defined(MBEDTLS_SHA224_C) && defined(MBEDTLS_SHA256_C)
Tuvshinzaya Erdenekhuu696dfb62022-08-05 15:59:19 +0100689 if( is224 != 0 && is224 != 1 )
690 return MBEDTLS_ERR_SHA256_BAD_INPUT_DATA;
Valerio Settia3f99592022-12-14 10:56:54 +0100691#elif defined(MBEDTLS_SHA256_C)
Tuvshinzaya Erdenekhuu696dfb62022-08-05 15:59:19 +0100692 if( is224 != 0 )
693 return MBEDTLS_ERR_SHA256_BAD_INPUT_DATA;
Valerio Settia3f99592022-12-14 10:56:54 +0100694#else /* defined MBEDTLS_SHA224_C only */
695 if( is224 == 0 )
696 return MBEDTLS_ERR_SHA256_BAD_INPUT_DATA;
Mateusz Starzyke3c48b42021-04-19 16:46:28 +0200697#endif
698
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200699 mbedtls_sha256_init( &ctx );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100700
TRodziewicz26371e42021-06-08 16:45:41 +0200701 if( ( ret = mbedtls_sha256_starts( &ctx, is224 ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100702 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100703
TRodziewicz26371e42021-06-08 16:45:41 +0200704 if( ( ret = mbedtls_sha256_update( &ctx, input, ilen ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100705 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100706
TRodziewicz26371e42021-06-08 16:45:41 +0200707 if( ( ret = mbedtls_sha256_finish( &ctx, output ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100708 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100709
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100710exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200711 mbedtls_sha256_free( &ctx );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100712
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100713 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000714}
715
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200716#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000717/*
718 * FIPS-180-2 test vectors
719 */
Valerio Settia3f99592022-12-14 10:56:54 +0100720static const unsigned char sha_test_buf[3][57] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000721{
722 { "abc" },
723 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
724 { "" }
725};
726
Valerio Settia3f99592022-12-14 10:56:54 +0100727static const size_t sha_test_buflen[3] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000728{
729 3, 56, 1000
730};
731
Valerio Settia3f99592022-12-14 10:56:54 +0100732typedef const unsigned char (sha_test_sum_t)[32];
733
734/*
735 * SHA-224 test vectors
736 */
737#if defined(MBEDTLS_SHA224_C)
738static sha_test_sum_t sha224_test_sum[] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000739{
Paul Bakker5121ce52009-01-03 21:22:43 +0000740 { 0x23, 0x09, 0x7D, 0x22, 0x34, 0x05, 0xD8, 0x22,
741 0x86, 0x42, 0xA4, 0x77, 0xBD, 0xA2, 0x55, 0xB3,
742 0x2A, 0xAD, 0xBC, 0xE4, 0xBD, 0xA0, 0xB3, 0xF7,
743 0xE3, 0x6C, 0x9D, 0xA7 },
744 { 0x75, 0x38, 0x8B, 0x16, 0x51, 0x27, 0x76, 0xCC,
745 0x5D, 0xBA, 0x5D, 0xA1, 0xFD, 0x89, 0x01, 0x50,
746 0xB0, 0xC6, 0x45, 0x5C, 0xB4, 0xF5, 0x8B, 0x19,
747 0x52, 0x52, 0x25, 0x25 },
748 { 0x20, 0x79, 0x46, 0x55, 0x98, 0x0C, 0x91, 0xD8,
749 0xBB, 0xB4, 0xC1, 0xEA, 0x97, 0x61, 0x8A, 0x4B,
750 0xF0, 0x3F, 0x42, 0x58, 0x19, 0x48, 0xB2, 0xEE,
Valerio Settia3f99592022-12-14 10:56:54 +0100751 0x4E, 0xE7, 0xAD, 0x67 }
752};
753#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000754
Valerio Settia3f99592022-12-14 10:56:54 +0100755/*
756 * SHA-256 test vectors
757 */
758#if defined(MBEDTLS_SHA256_C)
759static sha_test_sum_t sha256_test_sum[] =
760{
Paul Bakker5121ce52009-01-03 21:22:43 +0000761 { 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA,
762 0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23,
763 0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C,
764 0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD },
765 { 0x24, 0x8D, 0x6A, 0x61, 0xD2, 0x06, 0x38, 0xB8,
766 0xE5, 0xC0, 0x26, 0x93, 0x0C, 0x3E, 0x60, 0x39,
767 0xA3, 0x3C, 0xE4, 0x59, 0x64, 0xFF, 0x21, 0x67,
768 0xF6, 0xEC, 0xED, 0xD4, 0x19, 0xDB, 0x06, 0xC1 },
769 { 0xCD, 0xC7, 0x6E, 0x5C, 0x99, 0x14, 0xFB, 0x92,
770 0x81, 0xA1, 0xC7, 0xE2, 0x84, 0xD7, 0x3E, 0x67,
771 0xF1, 0x80, 0x9A, 0x48, 0xA4, 0x97, 0x20, 0x0E,
772 0x04, 0x6D, 0x39, 0xCC, 0xC7, 0x11, 0x2C, 0xD0 }
773};
Valerio Settia3f99592022-12-14 10:56:54 +0100774#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000775
776/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000777 * Checkup routine
778 */
Valerio Settia3f99592022-12-14 10:56:54 +0100779static int mbedtls_sha256_common_self_test( int verbose, int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000780{
Valerio Settia3f99592022-12-14 10:56:54 +0100781 int i, buflen, ret = 0;
Russ Butlerbb83b422016-10-12 17:36:50 -0500782 unsigned char *buf;
Paul Bakker9e36f042013-06-30 14:34:05 +0200783 unsigned char sha256sum[32];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200784 mbedtls_sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000785
Valerio Settia3f99592022-12-14 10:56:54 +0100786#if defined(MBEDTLS_SHA224_C) && defined(MBEDTLS_SHA256_C)
Valerio Setti326cf462022-12-23 14:57:18 +0100787 sha_test_sum_t* sha_test_sum = ( is224 ) ? sha224_test_sum : sha256_test_sum;
Valerio Settia3f99592022-12-14 10:56:54 +0100788#elif defined(MBEDTLS_SHA256_C)
Valerio Setti326cf462022-12-23 14:57:18 +0100789 sha_test_sum_t* sha_test_sum = sha256_test_sum;
Valerio Settia3f99592022-12-14 10:56:54 +0100790#else
Valerio Setti326cf462022-12-23 14:57:18 +0100791 sha_test_sum_t* sha_test_sum = sha224_test_sum;
Valerio Settia3f99592022-12-14 10:56:54 +0100792#endif
793
Russ Butlerbb83b422016-10-12 17:36:50 -0500794 buf = mbedtls_calloc( 1024, sizeof(unsigned char) );
795 if( NULL == buf )
796 {
797 if( verbose != 0 )
798 mbedtls_printf( "Buffer allocation failed\n" );
799
800 return( 1 );
801 }
802
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200803 mbedtls_sha256_init( &ctx );
Paul Bakker5b4af392014-06-26 12:09:34 +0200804
Valerio Settia3f99592022-12-14 10:56:54 +0100805 for( i = 0; i < 3; i++ )
Paul Bakker5121ce52009-01-03 21:22:43 +0000806 {
Paul Bakker5121ce52009-01-03 21:22:43 +0000807 if( verbose != 0 )
Valerio Settia3f99592022-12-14 10:56:54 +0100808 mbedtls_printf( " SHA-%d test #%d: ", 256 - is224 * 32, i + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000809
Valerio Settia3f99592022-12-14 10:56:54 +0100810 if( ( ret = mbedtls_sha256_starts( &ctx, is224 ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100811 goto fail;
Paul Bakker5121ce52009-01-03 21:22:43 +0000812
Valerio Settia3f99592022-12-14 10:56:54 +0100813 if( i == 2 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000814 {
815 memset( buf, 'a', buflen = 1000 );
816
Valerio Settia3f99592022-12-14 10:56:54 +0100817 for( int j = 0; j < 1000; j++ )
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100818 {
TRodziewicz26371e42021-06-08 16:45:41 +0200819 ret = mbedtls_sha256_update( &ctx, buf, buflen );
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100820 if( ret != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100821 goto fail;
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100822 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100823
Paul Bakker5121ce52009-01-03 21:22:43 +0000824 }
825 else
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100826 {
Valerio Settia3f99592022-12-14 10:56:54 +0100827 ret = mbedtls_sha256_update( &ctx, sha_test_buf[i],
828 sha_test_buflen[i] );
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100829 if( ret != 0 )
830 goto fail;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100831 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000832
TRodziewicz26371e42021-06-08 16:45:41 +0200833 if( ( ret = mbedtls_sha256_finish( &ctx, sha256sum ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100834 goto fail;
835
Paul Bakker5121ce52009-01-03 21:22:43 +0000836
Valerio Settia3f99592022-12-14 10:56:54 +0100837 if( memcmp( sha256sum, sha_test_sum[i], 32 - is224 * 4 ) != 0 )
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100838 {
839 ret = 1;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100840 goto fail;
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100841 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000842
843 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200844 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000845 }
846
847 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200848 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000849
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100850 goto exit;
851
852fail:
853 if( verbose != 0 )
854 mbedtls_printf( "failed\n" );
855
Paul Bakker5b4af392014-06-26 12:09:34 +0200856exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200857 mbedtls_sha256_free( &ctx );
Russ Butlerbb83b422016-10-12 17:36:50 -0500858 mbedtls_free( buf );
Paul Bakker5b4af392014-06-26 12:09:34 +0200859
860 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000861}
862
Valerio Settia3f99592022-12-14 10:56:54 +0100863#if defined(MBEDTLS_SHA256_C)
864int mbedtls_sha256_self_test( int verbose )
865{
866 return mbedtls_sha256_common_self_test( verbose, 0 );
867}
868#endif /* MBEDTLS_SHA256_C */
869
870#if defined(MBEDTLS_SHA224_C)
871int mbedtls_sha224_self_test( int verbose )
872{
873 return mbedtls_sha256_common_self_test( verbose, 1 );
874}
875#endif /* MBEDTLS_SHA224_C */
876
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200877#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000878
Valerio Settia3f99592022-12-14 10:56:54 +0100879#endif /* MBEDTLS_SHA256_C || MBEDTLS_SHA224_C */