blob: 6ae6a0ef6ec1ddb1a6301c267e02084f446545dc [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
272 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000273}
Jaeden Ameroa53ff8d2018-02-19 15:28:08 +0000274
275#if !defined(MBEDTLS_DEPRECATED_REMOVED)
276void mbedtls_sha256_process( mbedtls_sha256_context *ctx,
277 const unsigned char data[64] )
278{
279 mbedtls_internal_sha256_process( ctx, data );
280}
281#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200282#endif /* !MBEDTLS_SHA256_PROCESS_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000283
284/*
285 * SHA-256 process buffer
286 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100287int mbedtls_sha256_update_ret( mbedtls_sha256_context *ctx,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100288 const unsigned char *input,
289 size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000290{
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100291 int ret;
Paul Bakker23986e52011-04-24 08:57:21 +0000292 size_t fill;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000293 uint32_t left;
Paul Bakker5121ce52009-01-03 21:22:43 +0000294
Brian White12895d12014-04-11 11:29:42 -0400295 if( ilen == 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100296 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000297
298 left = ctx->total[0] & 0x3F;
299 fill = 64 - left;
300
Paul Bakker5c2364c2012-10-01 14:41:15 +0000301 ctx->total[0] += (uint32_t) ilen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000302 ctx->total[0] &= 0xFFFFFFFF;
303
Paul Bakker5c2364c2012-10-01 14:41:15 +0000304 if( ctx->total[0] < (uint32_t) ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000305 ctx->total[1]++;
306
307 if( left && ilen >= fill )
308 {
Paul Bakker3c2122f2013-06-24 19:03:14 +0200309 memcpy( (void *) (ctx->buffer + left), input, fill );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100310
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100311 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100312 return( ret );
313
Paul Bakker5121ce52009-01-03 21:22:43 +0000314 input += fill;
315 ilen -= fill;
316 left = 0;
317 }
318
319 while( ilen >= 64 )
320 {
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100321 if( ( ret = mbedtls_internal_sha256_process( ctx, input ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100322 return( ret );
323
Paul Bakker5121ce52009-01-03 21:22:43 +0000324 input += 64;
325 ilen -= 64;
326 }
327
328 if( ilen > 0 )
Paul Bakker3c2122f2013-06-24 19:03:14 +0200329 memcpy( (void *) (ctx->buffer + left), input, ilen );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100330
331 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000332}
333
Jaeden Ameroa53ff8d2018-02-19 15:28:08 +0000334#if !defined(MBEDTLS_DEPRECATED_REMOVED)
335void mbedtls_sha256_update( mbedtls_sha256_context *ctx,
336 const unsigned char *input,
337 size_t ilen )
338{
339 mbedtls_sha256_update_ret( ctx, input, ilen );
340}
341#endif
342
Paul Bakker5121ce52009-01-03 21:22:43 +0000343/*
344 * SHA-256 final digest
345 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100346int mbedtls_sha256_finish_ret( mbedtls_sha256_context *ctx,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100347 unsigned char output[32] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000348{
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100349 int ret;
Manuel Pégourié-Gonnard5fcfd032018-06-28 12:10:27 +0200350 uint32_t used;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000351 uint32_t high, low;
Paul Bakker5121ce52009-01-03 21:22:43 +0000352
Manuel Pégourié-Gonnard5fcfd032018-06-28 12:10:27 +0200353 /*
354 * Add padding: 0x80 then 0x00 until 8 bytes remain for the length
355 */
356 used = ctx->total[0] & 0x3F;
357
358 ctx->buffer[used++] = 0x80;
359
360 if( used <= 56 )
361 {
362 /* Enough room for padding + length in current block */
363 memset( ctx->buffer + used, 0, 56 - used );
364 }
365 else
366 {
367 /* We'll need an extra block */
368 memset( ctx->buffer + used, 0, 64 - used );
369
370 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
371 return( ret );
372
373 memset( ctx->buffer, 0, 56 );
374 }
375
376 /*
377 * Add message length
378 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000379 high = ( ctx->total[0] >> 29 )
380 | ( ctx->total[1] << 3 );
381 low = ( ctx->total[0] << 3 );
382
Manuel Pégourié-Gonnard5fcfd032018-06-28 12:10:27 +0200383 PUT_UINT32_BE( high, ctx->buffer, 56 );
384 PUT_UINT32_BE( low, ctx->buffer, 60 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000385
Manuel Pégourié-Gonnard5fcfd032018-06-28 12:10:27 +0200386 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
Andres Amaya Garciaaa464ef2017-07-21 14:21:53 +0100387 return( ret );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100388
Manuel Pégourié-Gonnard5fcfd032018-06-28 12:10:27 +0200389 /*
390 * Output final state
391 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000392 PUT_UINT32_BE( ctx->state[0], output, 0 );
393 PUT_UINT32_BE( ctx->state[1], output, 4 );
394 PUT_UINT32_BE( ctx->state[2], output, 8 );
395 PUT_UINT32_BE( ctx->state[3], output, 12 );
396 PUT_UINT32_BE( ctx->state[4], output, 16 );
397 PUT_UINT32_BE( ctx->state[5], output, 20 );
398 PUT_UINT32_BE( ctx->state[6], output, 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000399
400 if( ctx->is224 == 0 )
Paul Bakker5c2364c2012-10-01 14:41:15 +0000401 PUT_UINT32_BE( ctx->state[7], output, 28 );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100402
403 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000404}
405
Jaeden Ameroa53ff8d2018-02-19 15:28:08 +0000406#if !defined(MBEDTLS_DEPRECATED_REMOVED)
407void mbedtls_sha256_finish( mbedtls_sha256_context *ctx,
408 unsigned char output[32] )
409{
410 mbedtls_sha256_finish_ret( ctx, output );
411}
412#endif
413
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200414#endif /* !MBEDTLS_SHA256_ALT */
Paul Bakker90995b52013-06-24 19:20:35 +0200415
Paul Bakker5121ce52009-01-03 21:22:43 +0000416/*
417 * output = SHA-256( input buffer )
418 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100419int mbedtls_sha256_ret( const unsigned char *input,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100420 size_t ilen,
421 unsigned char output[32],
422 int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000423{
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100424 int ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200425 mbedtls_sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000426
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200427 mbedtls_sha256_init( &ctx );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100428
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100429 if( ( ret = mbedtls_sha256_starts_ret( &ctx, is224 ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100430 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100431
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100432 if( ( ret = mbedtls_sha256_update_ret( &ctx, input, ilen ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100433 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100434
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100435 if( ( ret = mbedtls_sha256_finish_ret( &ctx, output ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100436 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100437
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100438exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200439 mbedtls_sha256_free( &ctx );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100440
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100441 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000442}
443
Jaeden Ameroa53ff8d2018-02-19 15:28:08 +0000444#if !defined(MBEDTLS_DEPRECATED_REMOVED)
445void mbedtls_sha256( const unsigned char *input,
446 size_t ilen,
447 unsigned char output[32],
448 int is224 )
449{
450 mbedtls_sha256_ret( input, ilen, output, is224 );
451}
452#endif
453
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200454#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000455/*
456 * FIPS-180-2 test vectors
457 */
Manuel Pégourié-Gonnard28122e42015-03-11 09:13:42 +0000458static const unsigned char sha256_test_buf[3][57] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000459{
460 { "abc" },
461 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
462 { "" }
463};
464
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100465static const size_t sha256_test_buflen[3] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000466{
467 3, 56, 1000
468};
469
Paul Bakker9e36f042013-06-30 14:34:05 +0200470static const unsigned char sha256_test_sum[6][32] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000471{
472 /*
473 * SHA-224 test vectors
474 */
475 { 0x23, 0x09, 0x7D, 0x22, 0x34, 0x05, 0xD8, 0x22,
476 0x86, 0x42, 0xA4, 0x77, 0xBD, 0xA2, 0x55, 0xB3,
477 0x2A, 0xAD, 0xBC, 0xE4, 0xBD, 0xA0, 0xB3, 0xF7,
478 0xE3, 0x6C, 0x9D, 0xA7 },
479 { 0x75, 0x38, 0x8B, 0x16, 0x51, 0x27, 0x76, 0xCC,
480 0x5D, 0xBA, 0x5D, 0xA1, 0xFD, 0x89, 0x01, 0x50,
481 0xB0, 0xC6, 0x45, 0x5C, 0xB4, 0xF5, 0x8B, 0x19,
482 0x52, 0x52, 0x25, 0x25 },
483 { 0x20, 0x79, 0x46, 0x55, 0x98, 0x0C, 0x91, 0xD8,
484 0xBB, 0xB4, 0xC1, 0xEA, 0x97, 0x61, 0x8A, 0x4B,
485 0xF0, 0x3F, 0x42, 0x58, 0x19, 0x48, 0xB2, 0xEE,
486 0x4E, 0xE7, 0xAD, 0x67 },
487
488 /*
489 * SHA-256 test vectors
490 */
491 { 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA,
492 0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23,
493 0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C,
494 0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD },
495 { 0x24, 0x8D, 0x6A, 0x61, 0xD2, 0x06, 0x38, 0xB8,
496 0xE5, 0xC0, 0x26, 0x93, 0x0C, 0x3E, 0x60, 0x39,
497 0xA3, 0x3C, 0xE4, 0x59, 0x64, 0xFF, 0x21, 0x67,
498 0xF6, 0xEC, 0xED, 0xD4, 0x19, 0xDB, 0x06, 0xC1 },
499 { 0xCD, 0xC7, 0x6E, 0x5C, 0x99, 0x14, 0xFB, 0x92,
500 0x81, 0xA1, 0xC7, 0xE2, 0x84, 0xD7, 0x3E, 0x67,
501 0xF1, 0x80, 0x9A, 0x48, 0xA4, 0x97, 0x20, 0x0E,
502 0x04, 0x6D, 0x39, 0xCC, 0xC7, 0x11, 0x2C, 0xD0 }
503};
504
505/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000506 * Checkup routine
507 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200508int mbedtls_sha256_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000509{
Paul Bakker5b4af392014-06-26 12:09:34 +0200510 int i, j, k, buflen, ret = 0;
Russ Butlerbb83b422016-10-12 17:36:50 -0500511 unsigned char *buf;
Paul Bakker9e36f042013-06-30 14:34:05 +0200512 unsigned char sha256sum[32];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200513 mbedtls_sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000514
Russ Butlerbb83b422016-10-12 17:36:50 -0500515 buf = mbedtls_calloc( 1024, sizeof(unsigned char) );
516 if( NULL == buf )
517 {
518 if( verbose != 0 )
519 mbedtls_printf( "Buffer allocation failed\n" );
520
521 return( 1 );
522 }
523
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200524 mbedtls_sha256_init( &ctx );
Paul Bakker5b4af392014-06-26 12:09:34 +0200525
Paul Bakker5121ce52009-01-03 21:22:43 +0000526 for( i = 0; i < 6; i++ )
527 {
528 j = i % 3;
529 k = i < 3;
530
531 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200532 mbedtls_printf( " SHA-%d test #%d: ", 256 - k * 32, j + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000533
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100534 if( ( ret = mbedtls_sha256_starts_ret( &ctx, k ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100535 goto fail;
Paul Bakker5121ce52009-01-03 21:22:43 +0000536
537 if( j == 2 )
538 {
539 memset( buf, 'a', buflen = 1000 );
540
541 for( j = 0; j < 1000; j++ )
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100542 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100543 ret = mbedtls_sha256_update_ret( &ctx, buf, buflen );
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100544 if( ret != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100545 goto fail;
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100546 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100547
Paul Bakker5121ce52009-01-03 21:22:43 +0000548 }
549 else
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100550 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100551 ret = mbedtls_sha256_update_ret( &ctx, sha256_test_buf[j],
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100552 sha256_test_buflen[j] );
553 if( ret != 0 )
554 goto fail;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100555 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000556
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100557 if( ( ret = mbedtls_sha256_finish_ret( &ctx, sha256sum ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100558 goto fail;
559
Paul Bakker5121ce52009-01-03 21:22:43 +0000560
Paul Bakker9e36f042013-06-30 14:34:05 +0200561 if( memcmp( sha256sum, sha256_test_sum[i], 32 - k * 4 ) != 0 )
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100562 {
563 ret = 1;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100564 goto fail;
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100565 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000566
567 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200568 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000569 }
570
571 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200572 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000573
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100574 goto exit;
575
576fail:
577 if( verbose != 0 )
578 mbedtls_printf( "failed\n" );
579
Paul Bakker5b4af392014-06-26 12:09:34 +0200580exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200581 mbedtls_sha256_free( &ctx );
Russ Butlerbb83b422016-10-12 17:36:50 -0500582 mbedtls_free( buf );
Paul Bakker5b4af392014-06-26 12:09:34 +0200583
584 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000585}
586
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200587#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000588
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200589#endif /* MBEDTLS_SHA256_C */