blob: 9552b8ce4ab76e81bc5329ccbd118d787b49cc9e [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * FIPS-180-2 compliant SHA-256 implementation
3 *
Bence Szépkúti44bfbe32020-08-19 16:54:51 +02004 * Copyright The Mbed TLS Contributors
Bence Szépkúti4e9f7122020-06-05 13:02:18 +02005 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
6 *
7 * This file is provided under the Apache License 2.0, or the
8 * GNU General Public License v2.0 or later.
9 *
10 * **********
11 * Apache License 2.0:
Manuel Pégourié-Gonnard37ff1402015-09-04 14:21:07 +020012 *
13 * Licensed under the Apache License, Version 2.0 (the "License"); you may
14 * not use this file except in compliance with the License.
15 * You may obtain a copy of the License at
16 *
17 * http://www.apache.org/licenses/LICENSE-2.0
18 *
19 * Unless required by applicable law or agreed to in writing, software
20 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
21 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
22 * See the License for the specific language governing permissions and
23 * limitations under the License.
Paul Bakkerb96f1542010-07-18 20:36:00 +000024 *
Bence Szépkúti4e9f7122020-06-05 13:02:18 +020025 * **********
26 *
27 * **********
28 * GNU General Public License v2.0 or later:
29 *
30 * This program is free software; you can redistribute it and/or modify
31 * it under the terms of the GNU General Public License as published by
32 * the Free Software Foundation; either version 2 of the License, or
33 * (at your option) any later version.
34 *
35 * This program is distributed in the hope that it will be useful,
36 * but WITHOUT ANY WARRANTY; without even the implied warranty of
37 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
38 * GNU General Public License for more details.
39 *
40 * You should have received a copy of the GNU General Public License along
41 * with this program; if not, write to the Free Software Foundation, Inc.,
42 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
43 *
44 * **********
Paul Bakker5121ce52009-01-03 21:22:43 +000045 */
46/*
47 * The SHA-256 Secure Hash Standard was published by NIST in 2002.
48 *
49 * http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf
50 */
51
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020052#if !defined(MBEDTLS_CONFIG_FILE)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000053#include "mbedtls/config.h"
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020054#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020055#include MBEDTLS_CONFIG_FILE
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020056#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000057
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020058#if defined(MBEDTLS_SHA256_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000059
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000060#include "mbedtls/sha256.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000061
Rich Evans00ab4702015-02-06 13:43:58 +000062#include <string.h>
63
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020064#if defined(MBEDTLS_SELF_TEST)
65#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000066#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010067#else
Rich Evans00ab4702015-02-06 13:43:58 +000068#include <stdio.h>
Russ Butlerbb83b422016-10-12 17:36:50 -050069#include <stdlib.h>
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020070#define mbedtls_printf printf
Russ Butlerbb83b422016-10-12 17:36:50 -050071#define mbedtls_calloc calloc
72#define mbedtls_free free
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020073#endif /* MBEDTLS_PLATFORM_C */
74#endif /* MBEDTLS_SELF_TEST */
Paul Bakker7dc4c442014-02-01 22:50:26 +010075
Manuel Pégourié-Gonnard8b2641d2015-08-27 20:03:46 +020076#if !defined(MBEDTLS_SHA256_ALT)
77
Paul Bakker34617722014-06-13 17:20:13 +020078/* Implementation that should never be optimized out by the compiler */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020079static void mbedtls_zeroize( void *v, size_t n ) {
Paul Bakker34617722014-06-13 17:20:13 +020080 volatile unsigned char *p = v; while( n-- ) *p++ = 0;
81}
82
Paul Bakker5121ce52009-01-03 21:22:43 +000083/*
84 * 32-bit integer manipulation macros (big endian)
85 */
Paul Bakker5c2364c2012-10-01 14:41:15 +000086#ifndef GET_UINT32_BE
87#define GET_UINT32_BE(n,b,i) \
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +020088do { \
Paul Bakker5c2364c2012-10-01 14:41:15 +000089 (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
90 | ( (uint32_t) (b)[(i) + 1] << 16 ) \
91 | ( (uint32_t) (b)[(i) + 2] << 8 ) \
92 | ( (uint32_t) (b)[(i) + 3] ); \
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +020093} while( 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +000094#endif
95
Paul Bakker5c2364c2012-10-01 14:41:15 +000096#ifndef PUT_UINT32_BE
97#define PUT_UINT32_BE(n,b,i) \
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +020098do { \
Paul Bakker5121ce52009-01-03 21:22:43 +000099 (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
100 (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
101 (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
102 (b)[(i) + 3] = (unsigned char) ( (n) ); \
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200103} while( 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000104#endif
105
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200106void mbedtls_sha256_init( mbedtls_sha256_context *ctx )
Paul Bakker5b4af392014-06-26 12:09:34 +0200107{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200108 memset( ctx, 0, sizeof( mbedtls_sha256_context ) );
Paul Bakker5b4af392014-06-26 12:09:34 +0200109}
110
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200111void mbedtls_sha256_free( mbedtls_sha256_context *ctx )
Paul Bakker5b4af392014-06-26 12:09:34 +0200112{
113 if( ctx == NULL )
114 return;
115
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200116 mbedtls_zeroize( ctx, sizeof( mbedtls_sha256_context ) );
Paul Bakker5b4af392014-06-26 12:09:34 +0200117}
118
Manuel Pégourié-Gonnard16d412f2015-07-06 15:26:26 +0200119void mbedtls_sha256_clone( mbedtls_sha256_context *dst,
120 const mbedtls_sha256_context *src )
121{
122 *dst = *src;
123}
124
Paul Bakker5121ce52009-01-03 21:22:43 +0000125/*
126 * SHA-256 context setup
127 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100128int mbedtls_sha256_starts_ret( mbedtls_sha256_context *ctx, int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000129{
130 ctx->total[0] = 0;
131 ctx->total[1] = 0;
132
133 if( is224 == 0 )
134 {
135 /* SHA-256 */
136 ctx->state[0] = 0x6A09E667;
137 ctx->state[1] = 0xBB67AE85;
138 ctx->state[2] = 0x3C6EF372;
139 ctx->state[3] = 0xA54FF53A;
140 ctx->state[4] = 0x510E527F;
141 ctx->state[5] = 0x9B05688C;
142 ctx->state[6] = 0x1F83D9AB;
143 ctx->state[7] = 0x5BE0CD19;
144 }
145 else
146 {
147 /* SHA-224 */
148 ctx->state[0] = 0xC1059ED8;
149 ctx->state[1] = 0x367CD507;
150 ctx->state[2] = 0x3070DD17;
151 ctx->state[3] = 0xF70E5939;
152 ctx->state[4] = 0xFFC00B31;
153 ctx->state[5] = 0x68581511;
154 ctx->state[6] = 0x64F98FA7;
155 ctx->state[7] = 0xBEFA4FA4;
156 }
157
158 ctx->is224 = is224;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100159
160 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000161}
162
Jaeden Ameroa53ff8d2018-02-19 15:28:08 +0000163#if !defined(MBEDTLS_DEPRECATED_REMOVED)
164void mbedtls_sha256_starts( mbedtls_sha256_context *ctx,
165 int is224 )
166{
167 mbedtls_sha256_starts_ret( ctx, is224 );
168}
169#endif
170
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200171#if !defined(MBEDTLS_SHA256_PROCESS_ALT)
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200172static const uint32_t K[] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000173{
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200174 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,
175 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,
176 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,
177 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,
178 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,
179 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,
180 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,
181 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,
182 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,
183 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,
184 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,
185 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,
186 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,
187 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,
188 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,
189 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2,
190};
Paul Bakker5121ce52009-01-03 21:22:43 +0000191
192#define SHR(x,n) ((x & 0xFFFFFFFF) >> n)
193#define ROTR(x,n) (SHR(x,n) | (x << (32 - n)))
194
195#define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^ SHR(x, 3))
196#define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^ SHR(x,10))
197
198#define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22))
199#define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25))
200
201#define F0(x,y,z) ((x & y) | (z & (x | y)))
202#define F1(x,y,z) (z ^ (x & (y ^ z)))
203
204#define R(t) \
205( \
206 W[t] = S1(W[t - 2]) + W[t - 7] + \
207 S0(W[t - 15]) + W[t - 16] \
208)
209
210#define P(a,b,c,d,e,f,g,h,x,K) \
211{ \
212 temp1 = h + S3(e) + F1(e,f,g) + K + x; \
213 temp2 = S2(a) + F0(a,b,c); \
214 d += temp1; h = temp1 + temp2; \
215}
216
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100217int mbedtls_internal_sha256_process( mbedtls_sha256_context *ctx,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100218 const unsigned char data[64] )
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200219{
220 uint32_t temp1, temp2, W[64];
221 uint32_t A[8];
222 unsigned int i;
Paul Bakker5121ce52009-01-03 21:22:43 +0000223
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200224 for( i = 0; i < 8; i++ )
225 A[i] = ctx->state[i];
226
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200227#if defined(MBEDTLS_SHA256_SMALLER)
228 for( i = 0; i < 64; i++ )
229 {
230 if( i < 16 )
231 GET_UINT32_BE( W[i], data, 4 * i );
232 else
233 R( i );
234
235 P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], W[i], K[i] );
236
237 temp1 = A[7]; A[7] = A[6]; A[6] = A[5]; A[5] = A[4]; A[4] = A[3];
238 A[3] = A[2]; A[2] = A[1]; A[1] = A[0]; A[0] = temp1;
239 }
240#else /* MBEDTLS_SHA256_SMALLER */
241 for( i = 0; i < 16; i++ )
242 GET_UINT32_BE( W[i], data, 4 * i );
243
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200244 for( i = 0; i < 16; i += 8 )
245 {
246 P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], W[i+0], K[i+0] );
247 P( A[7], A[0], A[1], A[2], A[3], A[4], A[5], A[6], W[i+1], K[i+1] );
248 P( A[6], A[7], A[0], A[1], A[2], A[3], A[4], A[5], W[i+2], K[i+2] );
249 P( A[5], A[6], A[7], A[0], A[1], A[2], A[3], A[4], W[i+3], K[i+3] );
250 P( A[4], A[5], A[6], A[7], A[0], A[1], A[2], A[3], W[i+4], K[i+4] );
251 P( A[3], A[4], A[5], A[6], A[7], A[0], A[1], A[2], W[i+5], K[i+5] );
252 P( A[2], A[3], A[4], A[5], A[6], A[7], A[0], A[1], W[i+6], K[i+6] );
253 P( A[1], A[2], A[3], A[4], A[5], A[6], A[7], A[0], W[i+7], K[i+7] );
254 }
255
256 for( i = 16; i < 64; i += 8 )
257 {
258 P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], R(i+0), K[i+0] );
259 P( A[7], A[0], A[1], A[2], A[3], A[4], A[5], A[6], R(i+1), K[i+1] );
260 P( A[6], A[7], A[0], A[1], A[2], A[3], A[4], A[5], R(i+2), K[i+2] );
261 P( A[5], A[6], A[7], A[0], A[1], A[2], A[3], A[4], R(i+3), K[i+3] );
262 P( A[4], A[5], A[6], A[7], A[0], A[1], A[2], A[3], R(i+4), K[i+4] );
263 P( A[3], A[4], A[5], A[6], A[7], A[0], A[1], A[2], R(i+5), K[i+5] );
264 P( A[2], A[3], A[4], A[5], A[6], A[7], A[0], A[1], R(i+6), K[i+6] );
265 P( A[1], A[2], A[3], A[4], A[5], A[6], A[7], A[0], R(i+7), K[i+7] );
266 }
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200267#endif /* MBEDTLS_SHA256_SMALLER */
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200268
269 for( i = 0; i < 8; i++ )
270 ctx->state[i] += A[i];
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100271
gabor-mezei-arm461c5a82020-07-30 16:41:25 +0200272 /* Zeroise buffers and variables to clear sensitive data from memory. */
273 mbedtls_zeroize( &A, sizeof( A ) );
274 mbedtls_zeroize( &W, sizeof( W ) );
275 mbedtls_zeroize( &temp1, sizeof( temp1 ) );
276 mbedtls_zeroize( &temp2, sizeof( temp2 ) );
277
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100278 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000279}
Jaeden Ameroa53ff8d2018-02-19 15:28:08 +0000280
281#if !defined(MBEDTLS_DEPRECATED_REMOVED)
282void mbedtls_sha256_process( mbedtls_sha256_context *ctx,
283 const unsigned char data[64] )
284{
285 mbedtls_internal_sha256_process( ctx, data );
286}
287#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200288#endif /* !MBEDTLS_SHA256_PROCESS_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000289
290/*
291 * SHA-256 process buffer
292 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100293int mbedtls_sha256_update_ret( mbedtls_sha256_context *ctx,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100294 const unsigned char *input,
295 size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000296{
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100297 int ret;
Paul Bakker23986e52011-04-24 08:57:21 +0000298 size_t fill;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000299 uint32_t left;
Paul Bakker5121ce52009-01-03 21:22:43 +0000300
Brian White12895d12014-04-11 11:29:42 -0400301 if( ilen == 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100302 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000303
304 left = ctx->total[0] & 0x3F;
305 fill = 64 - left;
306
Paul Bakker5c2364c2012-10-01 14:41:15 +0000307 ctx->total[0] += (uint32_t) ilen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000308 ctx->total[0] &= 0xFFFFFFFF;
309
Paul Bakker5c2364c2012-10-01 14:41:15 +0000310 if( ctx->total[0] < (uint32_t) ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000311 ctx->total[1]++;
312
313 if( left && ilen >= fill )
314 {
Paul Bakker3c2122f2013-06-24 19:03:14 +0200315 memcpy( (void *) (ctx->buffer + left), input, fill );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100316
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100317 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100318 return( ret );
319
Paul Bakker5121ce52009-01-03 21:22:43 +0000320 input += fill;
321 ilen -= fill;
322 left = 0;
323 }
324
325 while( ilen >= 64 )
326 {
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100327 if( ( ret = mbedtls_internal_sha256_process( ctx, input ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100328 return( ret );
329
Paul Bakker5121ce52009-01-03 21:22:43 +0000330 input += 64;
331 ilen -= 64;
332 }
333
334 if( ilen > 0 )
Paul Bakker3c2122f2013-06-24 19:03:14 +0200335 memcpy( (void *) (ctx->buffer + left), input, ilen );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100336
337 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000338}
339
Jaeden Ameroa53ff8d2018-02-19 15:28:08 +0000340#if !defined(MBEDTLS_DEPRECATED_REMOVED)
341void mbedtls_sha256_update( mbedtls_sha256_context *ctx,
342 const unsigned char *input,
343 size_t ilen )
344{
345 mbedtls_sha256_update_ret( ctx, input, ilen );
346}
347#endif
348
Paul Bakker5121ce52009-01-03 21:22:43 +0000349/*
350 * SHA-256 final digest
351 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100352int mbedtls_sha256_finish_ret( mbedtls_sha256_context *ctx,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100353 unsigned char output[32] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000354{
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100355 int ret;
Manuel Pégourié-Gonnard5fcfd032018-06-28 12:10:27 +0200356 uint32_t used;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000357 uint32_t high, low;
Paul Bakker5121ce52009-01-03 21:22:43 +0000358
Manuel Pégourié-Gonnard5fcfd032018-06-28 12:10:27 +0200359 /*
360 * Add padding: 0x80 then 0x00 until 8 bytes remain for the length
361 */
362 used = ctx->total[0] & 0x3F;
363
364 ctx->buffer[used++] = 0x80;
365
366 if( used <= 56 )
367 {
368 /* Enough room for padding + length in current block */
369 memset( ctx->buffer + used, 0, 56 - used );
370 }
371 else
372 {
373 /* We'll need an extra block */
374 memset( ctx->buffer + used, 0, 64 - used );
375
376 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
377 return( ret );
378
379 memset( ctx->buffer, 0, 56 );
380 }
381
382 /*
383 * Add message length
384 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000385 high = ( ctx->total[0] >> 29 )
386 | ( ctx->total[1] << 3 );
387 low = ( ctx->total[0] << 3 );
388
Manuel Pégourié-Gonnard5fcfd032018-06-28 12:10:27 +0200389 PUT_UINT32_BE( high, ctx->buffer, 56 );
390 PUT_UINT32_BE( low, ctx->buffer, 60 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000391
Manuel Pégourié-Gonnard5fcfd032018-06-28 12:10:27 +0200392 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
Andres Amaya Garciaaa464ef2017-07-21 14:21:53 +0100393 return( ret );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100394
Manuel Pégourié-Gonnard5fcfd032018-06-28 12:10:27 +0200395 /*
396 * Output final state
397 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000398 PUT_UINT32_BE( ctx->state[0], output, 0 );
399 PUT_UINT32_BE( ctx->state[1], output, 4 );
400 PUT_UINT32_BE( ctx->state[2], output, 8 );
401 PUT_UINT32_BE( ctx->state[3], output, 12 );
402 PUT_UINT32_BE( ctx->state[4], output, 16 );
403 PUT_UINT32_BE( ctx->state[5], output, 20 );
404 PUT_UINT32_BE( ctx->state[6], output, 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000405
406 if( ctx->is224 == 0 )
Paul Bakker5c2364c2012-10-01 14:41:15 +0000407 PUT_UINT32_BE( ctx->state[7], output, 28 );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100408
409 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000410}
411
Jaeden Ameroa53ff8d2018-02-19 15:28:08 +0000412#if !defined(MBEDTLS_DEPRECATED_REMOVED)
413void mbedtls_sha256_finish( mbedtls_sha256_context *ctx,
414 unsigned char output[32] )
415{
416 mbedtls_sha256_finish_ret( ctx, output );
417}
418#endif
419
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200420#endif /* !MBEDTLS_SHA256_ALT */
Paul Bakker90995b52013-06-24 19:20:35 +0200421
Paul Bakker5121ce52009-01-03 21:22:43 +0000422/*
423 * output = SHA-256( input buffer )
424 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100425int mbedtls_sha256_ret( const unsigned char *input,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100426 size_t ilen,
427 unsigned char output[32],
428 int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000429{
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100430 int ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200431 mbedtls_sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000432
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200433 mbedtls_sha256_init( &ctx );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100434
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100435 if( ( ret = mbedtls_sha256_starts_ret( &ctx, is224 ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100436 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100437
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100438 if( ( ret = mbedtls_sha256_update_ret( &ctx, input, ilen ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100439 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100440
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100441 if( ( ret = mbedtls_sha256_finish_ret( &ctx, output ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100442 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100443
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100444exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200445 mbedtls_sha256_free( &ctx );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100446
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100447 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000448}
449
Jaeden Ameroa53ff8d2018-02-19 15:28:08 +0000450#if !defined(MBEDTLS_DEPRECATED_REMOVED)
451void mbedtls_sha256( const unsigned char *input,
452 size_t ilen,
453 unsigned char output[32],
454 int is224 )
455{
456 mbedtls_sha256_ret( input, ilen, output, is224 );
457}
458#endif
459
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200460#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000461/*
462 * FIPS-180-2 test vectors
463 */
Manuel Pégourié-Gonnard28122e42015-03-11 09:13:42 +0000464static const unsigned char sha256_test_buf[3][57] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000465{
466 { "abc" },
467 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
468 { "" }
469};
470
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100471static const size_t sha256_test_buflen[3] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000472{
473 3, 56, 1000
474};
475
Paul Bakker9e36f042013-06-30 14:34:05 +0200476static const unsigned char sha256_test_sum[6][32] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000477{
478 /*
479 * SHA-224 test vectors
480 */
481 { 0x23, 0x09, 0x7D, 0x22, 0x34, 0x05, 0xD8, 0x22,
482 0x86, 0x42, 0xA4, 0x77, 0xBD, 0xA2, 0x55, 0xB3,
483 0x2A, 0xAD, 0xBC, 0xE4, 0xBD, 0xA0, 0xB3, 0xF7,
484 0xE3, 0x6C, 0x9D, 0xA7 },
485 { 0x75, 0x38, 0x8B, 0x16, 0x51, 0x27, 0x76, 0xCC,
486 0x5D, 0xBA, 0x5D, 0xA1, 0xFD, 0x89, 0x01, 0x50,
487 0xB0, 0xC6, 0x45, 0x5C, 0xB4, 0xF5, 0x8B, 0x19,
488 0x52, 0x52, 0x25, 0x25 },
489 { 0x20, 0x79, 0x46, 0x55, 0x98, 0x0C, 0x91, 0xD8,
490 0xBB, 0xB4, 0xC1, 0xEA, 0x97, 0x61, 0x8A, 0x4B,
491 0xF0, 0x3F, 0x42, 0x58, 0x19, 0x48, 0xB2, 0xEE,
492 0x4E, 0xE7, 0xAD, 0x67 },
493
494 /*
495 * SHA-256 test vectors
496 */
497 { 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA,
498 0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23,
499 0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C,
500 0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD },
501 { 0x24, 0x8D, 0x6A, 0x61, 0xD2, 0x06, 0x38, 0xB8,
502 0xE5, 0xC0, 0x26, 0x93, 0x0C, 0x3E, 0x60, 0x39,
503 0xA3, 0x3C, 0xE4, 0x59, 0x64, 0xFF, 0x21, 0x67,
504 0xF6, 0xEC, 0xED, 0xD4, 0x19, 0xDB, 0x06, 0xC1 },
505 { 0xCD, 0xC7, 0x6E, 0x5C, 0x99, 0x14, 0xFB, 0x92,
506 0x81, 0xA1, 0xC7, 0xE2, 0x84, 0xD7, 0x3E, 0x67,
507 0xF1, 0x80, 0x9A, 0x48, 0xA4, 0x97, 0x20, 0x0E,
508 0x04, 0x6D, 0x39, 0xCC, 0xC7, 0x11, 0x2C, 0xD0 }
509};
510
511/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000512 * Checkup routine
513 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200514int mbedtls_sha256_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000515{
Paul Bakker5b4af392014-06-26 12:09:34 +0200516 int i, j, k, buflen, ret = 0;
Russ Butlerbb83b422016-10-12 17:36:50 -0500517 unsigned char *buf;
Paul Bakker9e36f042013-06-30 14:34:05 +0200518 unsigned char sha256sum[32];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200519 mbedtls_sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000520
Russ Butlerbb83b422016-10-12 17:36:50 -0500521 buf = mbedtls_calloc( 1024, sizeof(unsigned char) );
522 if( NULL == buf )
523 {
524 if( verbose != 0 )
525 mbedtls_printf( "Buffer allocation failed\n" );
526
527 return( 1 );
528 }
529
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200530 mbedtls_sha256_init( &ctx );
Paul Bakker5b4af392014-06-26 12:09:34 +0200531
Paul Bakker5121ce52009-01-03 21:22:43 +0000532 for( i = 0; i < 6; i++ )
533 {
534 j = i % 3;
535 k = i < 3;
536
537 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200538 mbedtls_printf( " SHA-%d test #%d: ", 256 - k * 32, j + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000539
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100540 if( ( ret = mbedtls_sha256_starts_ret( &ctx, k ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100541 goto fail;
Paul Bakker5121ce52009-01-03 21:22:43 +0000542
543 if( j == 2 )
544 {
545 memset( buf, 'a', buflen = 1000 );
546
547 for( j = 0; j < 1000; j++ )
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100548 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100549 ret = mbedtls_sha256_update_ret( &ctx, buf, buflen );
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100550 if( ret != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100551 goto fail;
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100552 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100553
Paul Bakker5121ce52009-01-03 21:22:43 +0000554 }
555 else
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100556 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100557 ret = mbedtls_sha256_update_ret( &ctx, sha256_test_buf[j],
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100558 sha256_test_buflen[j] );
559 if( ret != 0 )
560 goto fail;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100561 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000562
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100563 if( ( ret = mbedtls_sha256_finish_ret( &ctx, sha256sum ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100564 goto fail;
565
Paul Bakker5121ce52009-01-03 21:22:43 +0000566
Paul Bakker9e36f042013-06-30 14:34:05 +0200567 if( memcmp( sha256sum, sha256_test_sum[i], 32 - k * 4 ) != 0 )
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100568 {
569 ret = 1;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100570 goto fail;
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100571 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000572
573 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200574 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000575 }
576
577 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200578 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000579
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100580 goto exit;
581
582fail:
583 if( verbose != 0 )
584 mbedtls_printf( "failed\n" );
585
Paul Bakker5b4af392014-06-26 12:09:34 +0200586exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200587 mbedtls_sha256_free( &ctx );
Russ Butlerbb83b422016-10-12 17:36:50 -0500588 mbedtls_free( buf );
Paul Bakker5b4af392014-06-26 12:09:34 +0200589
590 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000591}
592
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200593#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000594
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200595#endif /* MBEDTLS_SHA256_C */