blob: 987580c8108f5ea38da0314e346ab1cd019309ce [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * FIPS-180-2 compliant SHA-256 implementation
3 *
Manuel Pégourié-Gonnard6fb81872015-07-27 11:11:48 +02004 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
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 * **********
45 *
Manuel Pégourié-Gonnardfe446432015-03-06 13:17:10 +000046 * This file is part of mbed TLS (https://tls.mbed.org)
Paul Bakker5121ce52009-01-03 21:22:43 +000047 */
48/*
49 * The SHA-256 Secure Hash Standard was published by NIST in 2002.
50 *
51 * http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf
52 */
53
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020054#if !defined(MBEDTLS_CONFIG_FILE)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000055#include "mbedtls/config.h"
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020056#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020057#include MBEDTLS_CONFIG_FILE
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020058#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000059
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020060#if defined(MBEDTLS_SHA256_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000061
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000062#include "mbedtls/sha256.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000063
Rich Evans00ab4702015-02-06 13:43:58 +000064#include <string.h>
65
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020066#if defined(MBEDTLS_SELF_TEST)
67#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000068#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010069#else
Rich Evans00ab4702015-02-06 13:43:58 +000070#include <stdio.h>
Russ Butlerbb83b422016-10-12 17:36:50 -050071#include <stdlib.h>
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020072#define mbedtls_printf printf
Russ Butlerbb83b422016-10-12 17:36:50 -050073#define mbedtls_calloc calloc
74#define mbedtls_free free
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020075#endif /* MBEDTLS_PLATFORM_C */
76#endif /* MBEDTLS_SELF_TEST */
Paul Bakker7dc4c442014-02-01 22:50:26 +010077
Manuel Pégourié-Gonnard8b2641d2015-08-27 20:03:46 +020078#if !defined(MBEDTLS_SHA256_ALT)
79
Paul Bakker34617722014-06-13 17:20:13 +020080/* Implementation that should never be optimized out by the compiler */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020081static void mbedtls_zeroize( void *v, size_t n ) {
Paul Bakker34617722014-06-13 17:20:13 +020082 volatile unsigned char *p = v; while( n-- ) *p++ = 0;
83}
84
Paul Bakker5121ce52009-01-03 21:22:43 +000085/*
86 * 32-bit integer manipulation macros (big endian)
87 */
Paul Bakker5c2364c2012-10-01 14:41:15 +000088#ifndef GET_UINT32_BE
89#define GET_UINT32_BE(n,b,i) \
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +020090do { \
Paul Bakker5c2364c2012-10-01 14:41:15 +000091 (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
92 | ( (uint32_t) (b)[(i) + 1] << 16 ) \
93 | ( (uint32_t) (b)[(i) + 2] << 8 ) \
94 | ( (uint32_t) (b)[(i) + 3] ); \
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +020095} while( 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +000096#endif
97
Paul Bakker5c2364c2012-10-01 14:41:15 +000098#ifndef PUT_UINT32_BE
99#define PUT_UINT32_BE(n,b,i) \
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200100do { \
Paul Bakker5121ce52009-01-03 21:22:43 +0000101 (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
102 (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
103 (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
104 (b)[(i) + 3] = (unsigned char) ( (n) ); \
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200105} while( 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000106#endif
107
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200108void mbedtls_sha256_init( mbedtls_sha256_context *ctx )
Paul Bakker5b4af392014-06-26 12:09:34 +0200109{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200110 memset( ctx, 0, sizeof( mbedtls_sha256_context ) );
Paul Bakker5b4af392014-06-26 12:09:34 +0200111}
112
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200113void mbedtls_sha256_free( mbedtls_sha256_context *ctx )
Paul Bakker5b4af392014-06-26 12:09:34 +0200114{
115 if( ctx == NULL )
116 return;
117
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200118 mbedtls_zeroize( ctx, sizeof( mbedtls_sha256_context ) );
Paul Bakker5b4af392014-06-26 12:09:34 +0200119}
120
Manuel Pégourié-Gonnard16d412f2015-07-06 15:26:26 +0200121void mbedtls_sha256_clone( mbedtls_sha256_context *dst,
122 const mbedtls_sha256_context *src )
123{
124 *dst = *src;
125}
126
Paul Bakker5121ce52009-01-03 21:22:43 +0000127/*
128 * SHA-256 context setup
129 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100130int mbedtls_sha256_starts_ret( mbedtls_sha256_context *ctx, int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000131{
132 ctx->total[0] = 0;
133 ctx->total[1] = 0;
134
135 if( is224 == 0 )
136 {
137 /* SHA-256 */
138 ctx->state[0] = 0x6A09E667;
139 ctx->state[1] = 0xBB67AE85;
140 ctx->state[2] = 0x3C6EF372;
141 ctx->state[3] = 0xA54FF53A;
142 ctx->state[4] = 0x510E527F;
143 ctx->state[5] = 0x9B05688C;
144 ctx->state[6] = 0x1F83D9AB;
145 ctx->state[7] = 0x5BE0CD19;
146 }
147 else
148 {
149 /* SHA-224 */
150 ctx->state[0] = 0xC1059ED8;
151 ctx->state[1] = 0x367CD507;
152 ctx->state[2] = 0x3070DD17;
153 ctx->state[3] = 0xF70E5939;
154 ctx->state[4] = 0xFFC00B31;
155 ctx->state[5] = 0x68581511;
156 ctx->state[6] = 0x64F98FA7;
157 ctx->state[7] = 0xBEFA4FA4;
158 }
159
160 ctx->is224 = is224;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100161
162 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000163}
164
Jaeden Ameroa53ff8d2018-02-19 15:28:08 +0000165#if !defined(MBEDTLS_DEPRECATED_REMOVED)
166void mbedtls_sha256_starts( mbedtls_sha256_context *ctx,
167 int is224 )
168{
169 mbedtls_sha256_starts_ret( ctx, is224 );
170}
171#endif
172
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200173#if !defined(MBEDTLS_SHA256_PROCESS_ALT)
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200174static const uint32_t K[] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000175{
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200176 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,
177 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,
178 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,
179 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,
180 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,
181 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,
182 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,
183 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,
184 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,
185 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,
186 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,
187 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,
188 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,
189 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,
190 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,
191 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2,
192};
Paul Bakker5121ce52009-01-03 21:22:43 +0000193
194#define SHR(x,n) ((x & 0xFFFFFFFF) >> n)
195#define ROTR(x,n) (SHR(x,n) | (x << (32 - n)))
196
197#define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^ SHR(x, 3))
198#define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^ SHR(x,10))
199
200#define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22))
201#define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25))
202
203#define F0(x,y,z) ((x & y) | (z & (x | y)))
204#define F1(x,y,z) (z ^ (x & (y ^ z)))
205
206#define R(t) \
207( \
208 W[t] = S1(W[t - 2]) + W[t - 7] + \
209 S0(W[t - 15]) + W[t - 16] \
210)
211
212#define P(a,b,c,d,e,f,g,h,x,K) \
213{ \
214 temp1 = h + S3(e) + F1(e,f,g) + K + x; \
215 temp2 = S2(a) + F0(a,b,c); \
216 d += temp1; h = temp1 + temp2; \
217}
218
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100219int mbedtls_internal_sha256_process( mbedtls_sha256_context *ctx,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100220 const unsigned char data[64] )
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200221{
222 uint32_t temp1, temp2, W[64];
223 uint32_t A[8];
224 unsigned int i;
Paul Bakker5121ce52009-01-03 21:22:43 +0000225
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200226 for( i = 0; i < 8; i++ )
227 A[i] = ctx->state[i];
228
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200229#if defined(MBEDTLS_SHA256_SMALLER)
230 for( i = 0; i < 64; i++ )
231 {
232 if( i < 16 )
233 GET_UINT32_BE( W[i], data, 4 * i );
234 else
235 R( i );
236
237 P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], W[i], K[i] );
238
239 temp1 = A[7]; A[7] = A[6]; A[6] = A[5]; A[5] = A[4]; A[4] = A[3];
240 A[3] = A[2]; A[2] = A[1]; A[1] = A[0]; A[0] = temp1;
241 }
242#else /* MBEDTLS_SHA256_SMALLER */
243 for( i = 0; i < 16; i++ )
244 GET_UINT32_BE( W[i], data, 4 * i );
245
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200246 for( i = 0; i < 16; i += 8 )
247 {
248 P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], W[i+0], K[i+0] );
249 P( A[7], A[0], A[1], A[2], A[3], A[4], A[5], A[6], W[i+1], K[i+1] );
250 P( A[6], A[7], A[0], A[1], A[2], A[3], A[4], A[5], W[i+2], K[i+2] );
251 P( A[5], A[6], A[7], A[0], A[1], A[2], A[3], A[4], W[i+3], K[i+3] );
252 P( A[4], A[5], A[6], A[7], A[0], A[1], A[2], A[3], W[i+4], K[i+4] );
253 P( A[3], A[4], A[5], A[6], A[7], A[0], A[1], A[2], W[i+5], K[i+5] );
254 P( A[2], A[3], A[4], A[5], A[6], A[7], A[0], A[1], W[i+6], K[i+6] );
255 P( A[1], A[2], A[3], A[4], A[5], A[6], A[7], A[0], W[i+7], K[i+7] );
256 }
257
258 for( i = 16; i < 64; i += 8 )
259 {
260 P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], R(i+0), K[i+0] );
261 P( A[7], A[0], A[1], A[2], A[3], A[4], A[5], A[6], R(i+1), K[i+1] );
262 P( A[6], A[7], A[0], A[1], A[2], A[3], A[4], A[5], R(i+2), K[i+2] );
263 P( A[5], A[6], A[7], A[0], A[1], A[2], A[3], A[4], R(i+3), K[i+3] );
264 P( A[4], A[5], A[6], A[7], A[0], A[1], A[2], A[3], R(i+4), K[i+4] );
265 P( A[3], A[4], A[5], A[6], A[7], A[0], A[1], A[2], R(i+5), K[i+5] );
266 P( A[2], A[3], A[4], A[5], A[6], A[7], A[0], A[1], R(i+6), K[i+6] );
267 P( A[1], A[2], A[3], A[4], A[5], A[6], A[7], A[0], R(i+7), K[i+7] );
268 }
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200269#endif /* MBEDTLS_SHA256_SMALLER */
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200270
271 for( i = 0; i < 8; i++ )
272 ctx->state[i] += A[i];
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100273
274 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000275}
Jaeden Ameroa53ff8d2018-02-19 15:28:08 +0000276
277#if !defined(MBEDTLS_DEPRECATED_REMOVED)
278void mbedtls_sha256_process( mbedtls_sha256_context *ctx,
279 const unsigned char data[64] )
280{
281 mbedtls_internal_sha256_process( ctx, data );
282}
283#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200284#endif /* !MBEDTLS_SHA256_PROCESS_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000285
286/*
287 * SHA-256 process buffer
288 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100289int mbedtls_sha256_update_ret( mbedtls_sha256_context *ctx,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100290 const unsigned char *input,
291 size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000292{
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100293 int ret;
Paul Bakker23986e52011-04-24 08:57:21 +0000294 size_t fill;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000295 uint32_t left;
Paul Bakker5121ce52009-01-03 21:22:43 +0000296
Brian White12895d12014-04-11 11:29:42 -0400297 if( ilen == 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100298 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000299
300 left = ctx->total[0] & 0x3F;
301 fill = 64 - left;
302
Paul Bakker5c2364c2012-10-01 14:41:15 +0000303 ctx->total[0] += (uint32_t) ilen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000304 ctx->total[0] &= 0xFFFFFFFF;
305
Paul Bakker5c2364c2012-10-01 14:41:15 +0000306 if( ctx->total[0] < (uint32_t) ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000307 ctx->total[1]++;
308
309 if( left && ilen >= fill )
310 {
Paul Bakker3c2122f2013-06-24 19:03:14 +0200311 memcpy( (void *) (ctx->buffer + left), input, fill );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100312
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100313 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100314 return( ret );
315
Paul Bakker5121ce52009-01-03 21:22:43 +0000316 input += fill;
317 ilen -= fill;
318 left = 0;
319 }
320
321 while( ilen >= 64 )
322 {
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100323 if( ( ret = mbedtls_internal_sha256_process( ctx, input ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100324 return( ret );
325
Paul Bakker5121ce52009-01-03 21:22:43 +0000326 input += 64;
327 ilen -= 64;
328 }
329
330 if( ilen > 0 )
Paul Bakker3c2122f2013-06-24 19:03:14 +0200331 memcpy( (void *) (ctx->buffer + left), input, ilen );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100332
333 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000334}
335
Jaeden Ameroa53ff8d2018-02-19 15:28:08 +0000336#if !defined(MBEDTLS_DEPRECATED_REMOVED)
337void mbedtls_sha256_update( mbedtls_sha256_context *ctx,
338 const unsigned char *input,
339 size_t ilen )
340{
341 mbedtls_sha256_update_ret( ctx, input, ilen );
342}
343#endif
344
Paul Bakker5121ce52009-01-03 21:22:43 +0000345/*
346 * SHA-256 final digest
347 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100348int mbedtls_sha256_finish_ret( mbedtls_sha256_context *ctx,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100349 unsigned char output[32] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000350{
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100351 int ret;
Manuel Pégourié-Gonnard5fcfd032018-06-28 12:10:27 +0200352 uint32_t used;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000353 uint32_t high, low;
Paul Bakker5121ce52009-01-03 21:22:43 +0000354
Manuel Pégourié-Gonnard5fcfd032018-06-28 12:10:27 +0200355 /*
356 * Add padding: 0x80 then 0x00 until 8 bytes remain for the length
357 */
358 used = ctx->total[0] & 0x3F;
359
360 ctx->buffer[used++] = 0x80;
361
362 if( used <= 56 )
363 {
364 /* Enough room for padding + length in current block */
365 memset( ctx->buffer + used, 0, 56 - used );
366 }
367 else
368 {
369 /* We'll need an extra block */
370 memset( ctx->buffer + used, 0, 64 - used );
371
372 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
373 return( ret );
374
375 memset( ctx->buffer, 0, 56 );
376 }
377
378 /*
379 * Add message length
380 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000381 high = ( ctx->total[0] >> 29 )
382 | ( ctx->total[1] << 3 );
383 low = ( ctx->total[0] << 3 );
384
Manuel Pégourié-Gonnard5fcfd032018-06-28 12:10:27 +0200385 PUT_UINT32_BE( high, ctx->buffer, 56 );
386 PUT_UINT32_BE( low, ctx->buffer, 60 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000387
Manuel Pégourié-Gonnard5fcfd032018-06-28 12:10:27 +0200388 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
Andres Amaya Garciaaa464ef2017-07-21 14:21:53 +0100389 return( ret );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100390
Manuel Pégourié-Gonnard5fcfd032018-06-28 12:10:27 +0200391 /*
392 * Output final state
393 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000394 PUT_UINT32_BE( ctx->state[0], output, 0 );
395 PUT_UINT32_BE( ctx->state[1], output, 4 );
396 PUT_UINT32_BE( ctx->state[2], output, 8 );
397 PUT_UINT32_BE( ctx->state[3], output, 12 );
398 PUT_UINT32_BE( ctx->state[4], output, 16 );
399 PUT_UINT32_BE( ctx->state[5], output, 20 );
400 PUT_UINT32_BE( ctx->state[6], output, 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000401
402 if( ctx->is224 == 0 )
Paul Bakker5c2364c2012-10-01 14:41:15 +0000403 PUT_UINT32_BE( ctx->state[7], output, 28 );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100404
405 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000406}
407
Jaeden Ameroa53ff8d2018-02-19 15:28:08 +0000408#if !defined(MBEDTLS_DEPRECATED_REMOVED)
409void mbedtls_sha256_finish( mbedtls_sha256_context *ctx,
410 unsigned char output[32] )
411{
412 mbedtls_sha256_finish_ret( ctx, output );
413}
414#endif
415
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200416#endif /* !MBEDTLS_SHA256_ALT */
Paul Bakker90995b52013-06-24 19:20:35 +0200417
Paul Bakker5121ce52009-01-03 21:22:43 +0000418/*
419 * output = SHA-256( input buffer )
420 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100421int mbedtls_sha256_ret( const unsigned char *input,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100422 size_t ilen,
423 unsigned char output[32],
424 int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000425{
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100426 int ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200427 mbedtls_sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000428
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200429 mbedtls_sha256_init( &ctx );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100430
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100431 if( ( ret = mbedtls_sha256_starts_ret( &ctx, is224 ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100432 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100433
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100434 if( ( ret = mbedtls_sha256_update_ret( &ctx, input, ilen ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100435 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100436
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100437 if( ( ret = mbedtls_sha256_finish_ret( &ctx, output ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100438 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100439
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100440exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200441 mbedtls_sha256_free( &ctx );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100442
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100443 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000444}
445
Jaeden Ameroa53ff8d2018-02-19 15:28:08 +0000446#if !defined(MBEDTLS_DEPRECATED_REMOVED)
447void mbedtls_sha256( const unsigned char *input,
448 size_t ilen,
449 unsigned char output[32],
450 int is224 )
451{
452 mbedtls_sha256_ret( input, ilen, output, is224 );
453}
454#endif
455
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200456#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000457/*
458 * FIPS-180-2 test vectors
459 */
Manuel Pégourié-Gonnard28122e42015-03-11 09:13:42 +0000460static const unsigned char sha256_test_buf[3][57] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000461{
462 { "abc" },
463 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
464 { "" }
465};
466
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100467static const size_t sha256_test_buflen[3] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000468{
469 3, 56, 1000
470};
471
Paul Bakker9e36f042013-06-30 14:34:05 +0200472static const unsigned char sha256_test_sum[6][32] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000473{
474 /*
475 * SHA-224 test vectors
476 */
477 { 0x23, 0x09, 0x7D, 0x22, 0x34, 0x05, 0xD8, 0x22,
478 0x86, 0x42, 0xA4, 0x77, 0xBD, 0xA2, 0x55, 0xB3,
479 0x2A, 0xAD, 0xBC, 0xE4, 0xBD, 0xA0, 0xB3, 0xF7,
480 0xE3, 0x6C, 0x9D, 0xA7 },
481 { 0x75, 0x38, 0x8B, 0x16, 0x51, 0x27, 0x76, 0xCC,
482 0x5D, 0xBA, 0x5D, 0xA1, 0xFD, 0x89, 0x01, 0x50,
483 0xB0, 0xC6, 0x45, 0x5C, 0xB4, 0xF5, 0x8B, 0x19,
484 0x52, 0x52, 0x25, 0x25 },
485 { 0x20, 0x79, 0x46, 0x55, 0x98, 0x0C, 0x91, 0xD8,
486 0xBB, 0xB4, 0xC1, 0xEA, 0x97, 0x61, 0x8A, 0x4B,
487 0xF0, 0x3F, 0x42, 0x58, 0x19, 0x48, 0xB2, 0xEE,
488 0x4E, 0xE7, 0xAD, 0x67 },
489
490 /*
491 * SHA-256 test vectors
492 */
493 { 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA,
494 0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23,
495 0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C,
496 0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD },
497 { 0x24, 0x8D, 0x6A, 0x61, 0xD2, 0x06, 0x38, 0xB8,
498 0xE5, 0xC0, 0x26, 0x93, 0x0C, 0x3E, 0x60, 0x39,
499 0xA3, 0x3C, 0xE4, 0x59, 0x64, 0xFF, 0x21, 0x67,
500 0xF6, 0xEC, 0xED, 0xD4, 0x19, 0xDB, 0x06, 0xC1 },
501 { 0xCD, 0xC7, 0x6E, 0x5C, 0x99, 0x14, 0xFB, 0x92,
502 0x81, 0xA1, 0xC7, 0xE2, 0x84, 0xD7, 0x3E, 0x67,
503 0xF1, 0x80, 0x9A, 0x48, 0xA4, 0x97, 0x20, 0x0E,
504 0x04, 0x6D, 0x39, 0xCC, 0xC7, 0x11, 0x2C, 0xD0 }
505};
506
507/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000508 * Checkup routine
509 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200510int mbedtls_sha256_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000511{
Paul Bakker5b4af392014-06-26 12:09:34 +0200512 int i, j, k, buflen, ret = 0;
Russ Butlerbb83b422016-10-12 17:36:50 -0500513 unsigned char *buf;
Paul Bakker9e36f042013-06-30 14:34:05 +0200514 unsigned char sha256sum[32];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200515 mbedtls_sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000516
Russ Butlerbb83b422016-10-12 17:36:50 -0500517 buf = mbedtls_calloc( 1024, sizeof(unsigned char) );
518 if( NULL == buf )
519 {
520 if( verbose != 0 )
521 mbedtls_printf( "Buffer allocation failed\n" );
522
523 return( 1 );
524 }
525
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200526 mbedtls_sha256_init( &ctx );
Paul Bakker5b4af392014-06-26 12:09:34 +0200527
Paul Bakker5121ce52009-01-03 21:22:43 +0000528 for( i = 0; i < 6; i++ )
529 {
530 j = i % 3;
531 k = i < 3;
532
533 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200534 mbedtls_printf( " SHA-%d test #%d: ", 256 - k * 32, j + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000535
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100536 if( ( ret = mbedtls_sha256_starts_ret( &ctx, k ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100537 goto fail;
Paul Bakker5121ce52009-01-03 21:22:43 +0000538
539 if( j == 2 )
540 {
541 memset( buf, 'a', buflen = 1000 );
542
543 for( j = 0; j < 1000; j++ )
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100544 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100545 ret = mbedtls_sha256_update_ret( &ctx, buf, buflen );
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100546 if( ret != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100547 goto fail;
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100548 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100549
Paul Bakker5121ce52009-01-03 21:22:43 +0000550 }
551 else
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100552 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100553 ret = mbedtls_sha256_update_ret( &ctx, sha256_test_buf[j],
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100554 sha256_test_buflen[j] );
555 if( ret != 0 )
556 goto fail;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100557 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000558
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100559 if( ( ret = mbedtls_sha256_finish_ret( &ctx, sha256sum ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100560 goto fail;
561
Paul Bakker5121ce52009-01-03 21:22:43 +0000562
Paul Bakker9e36f042013-06-30 14:34:05 +0200563 if( memcmp( sha256sum, sha256_test_sum[i], 32 - k * 4 ) != 0 )
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100564 {
565 ret = 1;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100566 goto fail;
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100567 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000568
569 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200570 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000571 }
572
573 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200574 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000575
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100576 goto exit;
577
578fail:
579 if( verbose != 0 )
580 mbedtls_printf( "failed\n" );
581
Paul Bakker5b4af392014-06-26 12:09:34 +0200582exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200583 mbedtls_sha256_free( &ctx );
Russ Butlerbb83b422016-10-12 17:36:50 -0500584 mbedtls_free( buf );
Paul Bakker5b4af392014-06-26 12:09:34 +0200585
586 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000587}
588
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200589#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000590
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200591#endif /* MBEDTLS_SHA256_C */