blob: 5169584b684d3b09cd469a2b50d98fadbb2fa4c1 [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * FIPS-180-2 compliant SHA-256 implementation
3 *
Bence Szépkútia2947ac2020-08-19 16:37:36 +02004 * Copyright The Mbed TLS Contributors
Bence Szépkútif744bd72020-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útif744bd72020-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"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050061#include "mbedtls/platform_util.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000062
Rich Evans00ab4702015-02-06 13:43:58 +000063#include <string.h>
64
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020065#if defined(MBEDTLS_SELF_TEST)
66#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000067#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010068#else
Rich Evans00ab4702015-02-06 13:43:58 +000069#include <stdio.h>
Russ Butlerbb83b422016-10-12 17:36:50 -050070#include <stdlib.h>
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020071#define mbedtls_printf printf
Russ Butlerbb83b422016-10-12 17:36:50 -050072#define mbedtls_calloc calloc
73#define mbedtls_free free
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020074#endif /* MBEDTLS_PLATFORM_C */
75#endif /* MBEDTLS_SELF_TEST */
Paul Bakker7dc4c442014-02-01 22:50:26 +010076
Hanno Becker2f6de422018-12-20 10:22:32 +000077#define SHA256_VALIDATE_RET(cond) \
78 MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_SHA256_BAD_INPUT_DATA )
79#define SHA256_VALIDATE(cond) MBEDTLS_INTERNAL_VALIDATE( cond )
80
Manuel Pégourié-Gonnard8b2641d2015-08-27 20:03:46 +020081#if !defined(MBEDTLS_SHA256_ALT)
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{
Hanno Becker8d215e72018-12-18 17:53:21 +0000108 SHA256_VALIDATE( ctx != NULL );
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +0000109
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
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500118 mbedtls_platform_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{
Hanno Becker8d215e72018-12-18 17:53:21 +0000124 SHA256_VALIDATE( dst != NULL );
125 SHA256_VALIDATE( src != NULL );
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +0000126
Manuel Pégourié-Gonnard16d412f2015-07-06 15:26:26 +0200127 *dst = *src;
128}
129
Paul Bakker5121ce52009-01-03 21:22:43 +0000130/*
131 * SHA-256 context setup
132 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100133int mbedtls_sha256_starts_ret( mbedtls_sha256_context *ctx, int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000134{
Hanno Becker8d215e72018-12-18 17:53:21 +0000135 SHA256_VALIDATE_RET( ctx != NULL );
136 SHA256_VALIDATE_RET( is224 == 0 || is224 == 1 );
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +0000137
Paul Bakker5121ce52009-01-03 21:22:43 +0000138 ctx->total[0] = 0;
139 ctx->total[1] = 0;
140
141 if( is224 == 0 )
142 {
143 /* SHA-256 */
144 ctx->state[0] = 0x6A09E667;
145 ctx->state[1] = 0xBB67AE85;
146 ctx->state[2] = 0x3C6EF372;
147 ctx->state[3] = 0xA54FF53A;
148 ctx->state[4] = 0x510E527F;
149 ctx->state[5] = 0x9B05688C;
150 ctx->state[6] = 0x1F83D9AB;
151 ctx->state[7] = 0x5BE0CD19;
152 }
153 else
154 {
155 /* SHA-224 */
156 ctx->state[0] = 0xC1059ED8;
157 ctx->state[1] = 0x367CD507;
158 ctx->state[2] = 0x3070DD17;
159 ctx->state[3] = 0xF70E5939;
160 ctx->state[4] = 0xFFC00B31;
161 ctx->state[5] = 0x68581511;
162 ctx->state[6] = 0x64F98FA7;
163 ctx->state[7] = 0xBEFA4FA4;
164 }
165
166 ctx->is224 = is224;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100167
168 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000169}
170
Jaeden Amero041039f2018-02-19 15:28:08 +0000171#if !defined(MBEDTLS_DEPRECATED_REMOVED)
172void mbedtls_sha256_starts( mbedtls_sha256_context *ctx,
173 int is224 )
174{
175 mbedtls_sha256_starts_ret( ctx, is224 );
176}
177#endif
178
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200179#if !defined(MBEDTLS_SHA256_PROCESS_ALT)
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200180static const uint32_t K[] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000181{
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200182 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,
183 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,
184 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,
185 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,
186 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,
187 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,
188 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,
189 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,
190 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,
191 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,
192 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,
193 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,
194 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,
195 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,
196 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,
197 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2,
198};
Paul Bakker5121ce52009-01-03 21:22:43 +0000199
Hanno Beckerd6028a12018-10-15 12:01:35 +0100200#define SHR(x,n) (((x) & 0xFFFFFFFF) >> (n))
201#define ROTR(x,n) (SHR(x,n) | ((x) << (32 - (n))))
Paul Bakker5121ce52009-01-03 21:22:43 +0000202
203#define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^ SHR(x, 3))
204#define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^ SHR(x,10))
205
206#define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22))
207#define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25))
208
Hanno Beckerd6028a12018-10-15 12:01:35 +0100209#define F0(x,y,z) (((x) & (y)) | ((z) & ((x) | (y))))
210#define F1(x,y,z) ((z) ^ ((x) & ((y) ^ (z))))
Paul Bakker5121ce52009-01-03 21:22:43 +0000211
212#define R(t) \
Hanno Beckerd6028a12018-10-15 12:01:35 +0100213 ( \
214 W[t] = S1(W[(t) - 2]) + W[(t) - 7] + \
215 S0(W[(t) - 15]) + W[(t) - 16] \
216 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000217
Hanno Beckerd6028a12018-10-15 12:01:35 +0100218#define P(a,b,c,d,e,f,g,h,x,K) \
219 do \
220 { \
Hanno Becker3ac21ac2018-10-26 09:13:26 +0100221 temp1 = (h) + S3(e) + F1((e),(f),(g)) + (K) + (x); \
222 temp2 = S2(a) + F0((a),(b),(c)); \
Hanno Beckerd6028a12018-10-15 12:01:35 +0100223 (d) += temp1; (h) = temp1 + temp2; \
224 } while( 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000225
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100226int mbedtls_internal_sha256_process( mbedtls_sha256_context *ctx,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100227 const unsigned char data[64] )
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200228{
229 uint32_t temp1, temp2, W[64];
230 uint32_t A[8];
231 unsigned int i;
Paul Bakker5121ce52009-01-03 21:22:43 +0000232
Hanno Becker8d215e72018-12-18 17:53:21 +0000233 SHA256_VALIDATE_RET( ctx != NULL );
234 SHA256_VALIDATE_RET( (const unsigned char *)data != NULL );
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +0000235
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200236 for( i = 0; i < 8; i++ )
237 A[i] = ctx->state[i];
238
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200239#if defined(MBEDTLS_SHA256_SMALLER)
240 for( i = 0; i < 64; i++ )
241 {
242 if( i < 16 )
243 GET_UINT32_BE( W[i], data, 4 * i );
244 else
245 R( i );
246
247 P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], W[i], K[i] );
248
249 temp1 = A[7]; A[7] = A[6]; A[6] = A[5]; A[5] = A[4]; A[4] = A[3];
250 A[3] = A[2]; A[2] = A[1]; A[1] = A[0]; A[0] = temp1;
251 }
252#else /* MBEDTLS_SHA256_SMALLER */
253 for( i = 0; i < 16; i++ )
254 GET_UINT32_BE( W[i], data, 4 * i );
255
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200256 for( i = 0; i < 16; i += 8 )
257 {
258 P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], W[i+0], K[i+0] );
259 P( A[7], A[0], A[1], A[2], A[3], A[4], A[5], A[6], W[i+1], K[i+1] );
260 P( A[6], A[7], A[0], A[1], A[2], A[3], A[4], A[5], W[i+2], K[i+2] );
261 P( A[5], A[6], A[7], A[0], A[1], A[2], A[3], A[4], W[i+3], K[i+3] );
262 P( A[4], A[5], A[6], A[7], A[0], A[1], A[2], A[3], W[i+4], K[i+4] );
263 P( A[3], A[4], A[5], A[6], A[7], A[0], A[1], A[2], W[i+5], K[i+5] );
264 P( A[2], A[3], A[4], A[5], A[6], A[7], A[0], A[1], W[i+6], K[i+6] );
265 P( A[1], A[2], A[3], A[4], A[5], A[6], A[7], A[0], W[i+7], K[i+7] );
266 }
267
268 for( i = 16; i < 64; i += 8 )
269 {
270 P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], R(i+0), K[i+0] );
271 P( A[7], A[0], A[1], A[2], A[3], A[4], A[5], A[6], R(i+1), K[i+1] );
272 P( A[6], A[7], A[0], A[1], A[2], A[3], A[4], A[5], R(i+2), K[i+2] );
273 P( A[5], A[6], A[7], A[0], A[1], A[2], A[3], A[4], R(i+3), K[i+3] );
274 P( A[4], A[5], A[6], A[7], A[0], A[1], A[2], A[3], R(i+4), K[i+4] );
275 P( A[3], A[4], A[5], A[6], A[7], A[0], A[1], A[2], R(i+5), K[i+5] );
276 P( A[2], A[3], A[4], A[5], A[6], A[7], A[0], A[1], R(i+6), K[i+6] );
277 P( A[1], A[2], A[3], A[4], A[5], A[6], A[7], A[0], R(i+7), K[i+7] );
278 }
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200279#endif /* MBEDTLS_SHA256_SMALLER */
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200280
281 for( i = 0; i < 8; i++ )
282 ctx->state[i] += A[i];
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100283
284 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000285}
Jaeden Amero041039f2018-02-19 15:28:08 +0000286
287#if !defined(MBEDTLS_DEPRECATED_REMOVED)
288void mbedtls_sha256_process( mbedtls_sha256_context *ctx,
289 const unsigned char data[64] )
290{
291 mbedtls_internal_sha256_process( ctx, data );
292}
293#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200294#endif /* !MBEDTLS_SHA256_PROCESS_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000295
296/*
297 * SHA-256 process buffer
298 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100299int mbedtls_sha256_update_ret( mbedtls_sha256_context *ctx,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100300 const unsigned char *input,
301 size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000302{
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100303 int ret;
Paul Bakker23986e52011-04-24 08:57:21 +0000304 size_t fill;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000305 uint32_t left;
Paul Bakker5121ce52009-01-03 21:22:43 +0000306
Hanno Becker8d215e72018-12-18 17:53:21 +0000307 SHA256_VALIDATE_RET( ctx != NULL );
308 SHA256_VALIDATE_RET( ilen == 0 || input != NULL );
Hanno Becker596e0142018-12-18 15:00:38 +0000309
Brian White12895d12014-04-11 11:29:42 -0400310 if( ilen == 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100311 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000312
313 left = ctx->total[0] & 0x3F;
314 fill = 64 - left;
315
Paul Bakker5c2364c2012-10-01 14:41:15 +0000316 ctx->total[0] += (uint32_t) ilen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000317 ctx->total[0] &= 0xFFFFFFFF;
318
Paul Bakker5c2364c2012-10-01 14:41:15 +0000319 if( ctx->total[0] < (uint32_t) ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000320 ctx->total[1]++;
321
322 if( left && ilen >= fill )
323 {
Paul Bakker3c2122f2013-06-24 19:03:14 +0200324 memcpy( (void *) (ctx->buffer + left), input, fill );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100325
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100326 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100327 return( ret );
328
Paul Bakker5121ce52009-01-03 21:22:43 +0000329 input += fill;
330 ilen -= fill;
331 left = 0;
332 }
333
334 while( ilen >= 64 )
335 {
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100336 if( ( ret = mbedtls_internal_sha256_process( ctx, input ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100337 return( ret );
338
Paul Bakker5121ce52009-01-03 21:22:43 +0000339 input += 64;
340 ilen -= 64;
341 }
342
343 if( ilen > 0 )
Paul Bakker3c2122f2013-06-24 19:03:14 +0200344 memcpy( (void *) (ctx->buffer + left), input, ilen );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100345
346 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000347}
348
Jaeden Amero041039f2018-02-19 15:28:08 +0000349#if !defined(MBEDTLS_DEPRECATED_REMOVED)
350void mbedtls_sha256_update( mbedtls_sha256_context *ctx,
351 const unsigned char *input,
352 size_t ilen )
353{
354 mbedtls_sha256_update_ret( ctx, input, ilen );
355}
356#endif
357
Paul Bakker5121ce52009-01-03 21:22:43 +0000358/*
359 * SHA-256 final digest
360 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100361int mbedtls_sha256_finish_ret( mbedtls_sha256_context *ctx,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100362 unsigned char output[32] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000363{
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100364 int ret;
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200365 uint32_t used;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000366 uint32_t high, low;
Paul Bakker5121ce52009-01-03 21:22:43 +0000367
Hanno Becker8d215e72018-12-18 17:53:21 +0000368 SHA256_VALIDATE_RET( ctx != NULL );
369 SHA256_VALIDATE_RET( (unsigned char *)output != NULL );
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +0000370
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200371 /*
372 * Add padding: 0x80 then 0x00 until 8 bytes remain for the length
373 */
374 used = ctx->total[0] & 0x3F;
375
376 ctx->buffer[used++] = 0x80;
377
378 if( used <= 56 )
379 {
380 /* Enough room for padding + length in current block */
381 memset( ctx->buffer + used, 0, 56 - used );
382 }
383 else
384 {
385 /* We'll need an extra block */
386 memset( ctx->buffer + used, 0, 64 - used );
387
388 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
389 return( ret );
390
391 memset( ctx->buffer, 0, 56 );
392 }
393
394 /*
395 * Add message length
396 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000397 high = ( ctx->total[0] >> 29 )
398 | ( ctx->total[1] << 3 );
399 low = ( ctx->total[0] << 3 );
400
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200401 PUT_UINT32_BE( high, ctx->buffer, 56 );
402 PUT_UINT32_BE( low, ctx->buffer, 60 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000403
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200404 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
Andres Amaya Garciaaa464ef2017-07-21 14:21:53 +0100405 return( ret );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100406
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200407 /*
408 * Output final state
409 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000410 PUT_UINT32_BE( ctx->state[0], output, 0 );
411 PUT_UINT32_BE( ctx->state[1], output, 4 );
412 PUT_UINT32_BE( ctx->state[2], output, 8 );
413 PUT_UINT32_BE( ctx->state[3], output, 12 );
414 PUT_UINT32_BE( ctx->state[4], output, 16 );
415 PUT_UINT32_BE( ctx->state[5], output, 20 );
416 PUT_UINT32_BE( ctx->state[6], output, 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000417
418 if( ctx->is224 == 0 )
Paul Bakker5c2364c2012-10-01 14:41:15 +0000419 PUT_UINT32_BE( ctx->state[7], output, 28 );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100420
421 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000422}
423
Jaeden Amero041039f2018-02-19 15:28:08 +0000424#if !defined(MBEDTLS_DEPRECATED_REMOVED)
425void mbedtls_sha256_finish( mbedtls_sha256_context *ctx,
426 unsigned char output[32] )
427{
428 mbedtls_sha256_finish_ret( ctx, output );
429}
430#endif
431
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200432#endif /* !MBEDTLS_SHA256_ALT */
Paul Bakker90995b52013-06-24 19:20:35 +0200433
Paul Bakker5121ce52009-01-03 21:22:43 +0000434/*
435 * output = SHA-256( input buffer )
436 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100437int mbedtls_sha256_ret( const unsigned char *input,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100438 size_t ilen,
439 unsigned char output[32],
440 int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000441{
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100442 int ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200443 mbedtls_sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000444
Hanno Becker8d215e72018-12-18 17:53:21 +0000445 SHA256_VALIDATE_RET( is224 == 0 || is224 == 1 );
446 SHA256_VALIDATE_RET( ilen == 0 || input != NULL );
447 SHA256_VALIDATE_RET( (unsigned char *)output != NULL );
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +0000448
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200449 mbedtls_sha256_init( &ctx );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100450
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100451 if( ( ret = mbedtls_sha256_starts_ret( &ctx, is224 ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100452 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100453
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100454 if( ( ret = mbedtls_sha256_update_ret( &ctx, input, ilen ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100455 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100456
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100457 if( ( ret = mbedtls_sha256_finish_ret( &ctx, output ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100458 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100459
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100460exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200461 mbedtls_sha256_free( &ctx );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100462
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100463 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000464}
465
Jaeden Amero041039f2018-02-19 15:28:08 +0000466#if !defined(MBEDTLS_DEPRECATED_REMOVED)
467void mbedtls_sha256( const unsigned char *input,
468 size_t ilen,
469 unsigned char output[32],
470 int is224 )
471{
472 mbedtls_sha256_ret( input, ilen, output, is224 );
473}
474#endif
475
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200476#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000477/*
478 * FIPS-180-2 test vectors
479 */
Manuel Pégourié-Gonnard28122e42015-03-11 09:13:42 +0000480static const unsigned char sha256_test_buf[3][57] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000481{
482 { "abc" },
483 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
484 { "" }
485};
486
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100487static const size_t sha256_test_buflen[3] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000488{
489 3, 56, 1000
490};
491
Paul Bakker9e36f042013-06-30 14:34:05 +0200492static const unsigned char sha256_test_sum[6][32] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000493{
494 /*
495 * SHA-224 test vectors
496 */
497 { 0x23, 0x09, 0x7D, 0x22, 0x34, 0x05, 0xD8, 0x22,
498 0x86, 0x42, 0xA4, 0x77, 0xBD, 0xA2, 0x55, 0xB3,
499 0x2A, 0xAD, 0xBC, 0xE4, 0xBD, 0xA0, 0xB3, 0xF7,
500 0xE3, 0x6C, 0x9D, 0xA7 },
501 { 0x75, 0x38, 0x8B, 0x16, 0x51, 0x27, 0x76, 0xCC,
502 0x5D, 0xBA, 0x5D, 0xA1, 0xFD, 0x89, 0x01, 0x50,
503 0xB0, 0xC6, 0x45, 0x5C, 0xB4, 0xF5, 0x8B, 0x19,
504 0x52, 0x52, 0x25, 0x25 },
505 { 0x20, 0x79, 0x46, 0x55, 0x98, 0x0C, 0x91, 0xD8,
506 0xBB, 0xB4, 0xC1, 0xEA, 0x97, 0x61, 0x8A, 0x4B,
507 0xF0, 0x3F, 0x42, 0x58, 0x19, 0x48, 0xB2, 0xEE,
508 0x4E, 0xE7, 0xAD, 0x67 },
509
510 /*
511 * SHA-256 test vectors
512 */
513 { 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA,
514 0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23,
515 0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C,
516 0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD },
517 { 0x24, 0x8D, 0x6A, 0x61, 0xD2, 0x06, 0x38, 0xB8,
518 0xE5, 0xC0, 0x26, 0x93, 0x0C, 0x3E, 0x60, 0x39,
519 0xA3, 0x3C, 0xE4, 0x59, 0x64, 0xFF, 0x21, 0x67,
520 0xF6, 0xEC, 0xED, 0xD4, 0x19, 0xDB, 0x06, 0xC1 },
521 { 0xCD, 0xC7, 0x6E, 0x5C, 0x99, 0x14, 0xFB, 0x92,
522 0x81, 0xA1, 0xC7, 0xE2, 0x84, 0xD7, 0x3E, 0x67,
523 0xF1, 0x80, 0x9A, 0x48, 0xA4, 0x97, 0x20, 0x0E,
524 0x04, 0x6D, 0x39, 0xCC, 0xC7, 0x11, 0x2C, 0xD0 }
525};
526
527/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000528 * Checkup routine
529 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200530int mbedtls_sha256_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000531{
Paul Bakker5b4af392014-06-26 12:09:34 +0200532 int i, j, k, buflen, ret = 0;
Russ Butlerbb83b422016-10-12 17:36:50 -0500533 unsigned char *buf;
Paul Bakker9e36f042013-06-30 14:34:05 +0200534 unsigned char sha256sum[32];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200535 mbedtls_sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000536
Russ Butlerbb83b422016-10-12 17:36:50 -0500537 buf = mbedtls_calloc( 1024, sizeof(unsigned char) );
538 if( NULL == buf )
539 {
540 if( verbose != 0 )
541 mbedtls_printf( "Buffer allocation failed\n" );
542
543 return( 1 );
544 }
545
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200546 mbedtls_sha256_init( &ctx );
Paul Bakker5b4af392014-06-26 12:09:34 +0200547
Paul Bakker5121ce52009-01-03 21:22:43 +0000548 for( i = 0; i < 6; i++ )
549 {
550 j = i % 3;
551 k = i < 3;
552
553 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200554 mbedtls_printf( " SHA-%d test #%d: ", 256 - k * 32, j + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000555
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100556 if( ( ret = mbedtls_sha256_starts_ret( &ctx, k ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100557 goto fail;
Paul Bakker5121ce52009-01-03 21:22:43 +0000558
559 if( j == 2 )
560 {
561 memset( buf, 'a', buflen = 1000 );
562
563 for( j = 0; j < 1000; j++ )
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100564 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100565 ret = mbedtls_sha256_update_ret( &ctx, buf, buflen );
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100566 if( ret != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100567 goto fail;
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100568 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100569
Paul Bakker5121ce52009-01-03 21:22:43 +0000570 }
571 else
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100572 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100573 ret = mbedtls_sha256_update_ret( &ctx, sha256_test_buf[j],
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100574 sha256_test_buflen[j] );
575 if( ret != 0 )
576 goto fail;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100577 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000578
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100579 if( ( ret = mbedtls_sha256_finish_ret( &ctx, sha256sum ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100580 goto fail;
581
Paul Bakker5121ce52009-01-03 21:22:43 +0000582
Paul Bakker9e36f042013-06-30 14:34:05 +0200583 if( memcmp( sha256sum, sha256_test_sum[i], 32 - k * 4 ) != 0 )
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100584 {
585 ret = 1;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100586 goto fail;
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100587 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000588
589 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200590 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000591 }
592
593 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200594 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000595
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100596 goto exit;
597
598fail:
599 if( verbose != 0 )
600 mbedtls_printf( "failed\n" );
601
Paul Bakker5b4af392014-06-26 12:09:34 +0200602exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200603 mbedtls_sha256_free( &ctx );
Russ Butlerbb83b422016-10-12 17:36:50 -0500604 mbedtls_free( buf );
Paul Bakker5b4af392014-06-26 12:09:34 +0200605
606 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000607}
608
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200609#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000610
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200611#endif /* MBEDTLS_SHA256_C */