blob: 75a8f8a2b25f81c87654c6a8b7835ca82d696296 [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
gabor-mezei-arm70f7f672020-08-25 19:12:01 +0200212#define R(t) \
213 ( \
214 local.W[t] = S1(local.W[(t) - 2]) + local.W[(t) - 7] + \
215 S0(local.W[(t) - 15]) + local.W[(t) - 16] \
Hanno Beckerd6028a12018-10-15 12:01:35 +0100216 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000217
gabor-mezei-arm70f7f672020-08-25 19:12:01 +0200218#define P(a,b,c,d,e,f,g,h,x,K) \
219 do \
220 { \
221 local.temp1 = (h) + S3(e) + F1((e),(f),(g)) + (K) + (x); \
222 local.temp2 = S2(a) + F0((a),(b),(c)); \
223 (d) += local.temp1; (h) = local.temp1 + local.temp2; \
Hanno Beckerd6028a12018-10-15 12:01:35 +0100224 } 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{
gabor-mezei-arm70f7f672020-08-25 19:12:01 +0200229 struct
230 {
231 uint32_t temp1, temp2, W[64];
232 uint32_t A[8];
233 } local;
234
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200235 unsigned int i;
Paul Bakker5121ce52009-01-03 21:22:43 +0000236
Hanno Becker8d215e72018-12-18 17:53:21 +0000237 SHA256_VALIDATE_RET( ctx != NULL );
238 SHA256_VALIDATE_RET( (const unsigned char *)data != NULL );
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +0000239
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200240 for( i = 0; i < 8; i++ )
gabor-mezei-arm70f7f672020-08-25 19:12:01 +0200241 local.A[i] = ctx->state[i];
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200242
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200243#if defined(MBEDTLS_SHA256_SMALLER)
244 for( i = 0; i < 64; i++ )
245 {
246 if( i < 16 )
gabor-mezei-arm70f7f672020-08-25 19:12:01 +0200247 GET_UINT32_BE( local.W[i], data, 4 * i );
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200248 else
249 R( i );
250
gabor-mezei-arm70f7f672020-08-25 19:12:01 +0200251 P( local.A[0], local.A[1], local.A[2], local.A[3], local.A[4],
252 local.A[5], local.A[6], local.A[7], local.W[i], K[i] );
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200253
gabor-mezei-arm70f7f672020-08-25 19:12:01 +0200254 local.temp1 = local.A[7]; local.A[7] = local.A[6];
255 local.A[6] = local.A[5]; local.A[5] = local.A[4];
256 local.A[4] = local.A[3]; local.A[3] = local.A[2];
257 local.A[2] = local.A[1]; local.A[1] = local.A[0];
258 local.A[0] = local.temp1;
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200259 }
260#else /* MBEDTLS_SHA256_SMALLER */
261 for( i = 0; i < 16; i++ )
gabor-mezei-arm70f7f672020-08-25 19:12:01 +0200262 GET_UINT32_BE( local.W[i], data, 4 * i );
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200263
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200264 for( i = 0; i < 16; i += 8 )
265 {
gabor-mezei-arm70f7f672020-08-25 19:12:01 +0200266 P( local.A[0], local.A[1], local.A[2], local.A[3], local.A[4],
267 local.A[5], local.A[6], local.A[7], local.W[i+0], K[i+0] );
268 P( local.A[7], local.A[0], local.A[1], local.A[2], local.A[3],
269 local.A[4], local.A[5], local.A[6], local.W[i+1], K[i+1] );
270 P( local.A[6], local.A[7], local.A[0], local.A[1], local.A[2],
271 local.A[3], local.A[4], local.A[5], local.W[i+2], K[i+2] );
272 P( local.A[5], local.A[6], local.A[7], local.A[0], local.A[1],
273 local.A[2], local.A[3], local.A[4], local.W[i+3], K[i+3] );
274 P( local.A[4], local.A[5], local.A[6], local.A[7], local.A[0],
275 local.A[1], local.A[2], local.A[3], local.W[i+4], K[i+4] );
276 P( local.A[3], local.A[4], local.A[5], local.A[6], local.A[7],
277 local.A[0], local.A[1], local.A[2], local.W[i+5], K[i+5] );
278 P( local.A[2], local.A[3], local.A[4], local.A[5], local.A[6],
279 local.A[7], local.A[0], local.A[1], local.W[i+6], K[i+6] );
280 P( local.A[1], local.A[2], local.A[3], local.A[4], local.A[5],
281 local.A[6], local.A[7], local.A[0], local.W[i+7], K[i+7] );
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200282 }
283
284 for( i = 16; i < 64; i += 8 )
285 {
gabor-mezei-arm70f7f672020-08-25 19:12:01 +0200286 P( local.A[0], local.A[1], local.A[2], local.A[3], local.A[4],
287 local.A[5], local.A[6], local.A[7], R(i+0), K[i+0] );
288 P( local.A[7], local.A[0], local.A[1], local.A[2], local.A[3],
289 local.A[4], local.A[5], local.A[6], R(i+1), K[i+1] );
290 P( local.A[6], local.A[7], local.A[0], local.A[1], local.A[2],
291 local.A[3], local.A[4], local.A[5], R(i+2), K[i+2] );
292 P( local.A[5], local.A[6], local.A[7], local.A[0], local.A[1],
293 local.A[2], local.A[3], local.A[4], R(i+3), K[i+3] );
294 P( local.A[4], local.A[5], local.A[6], local.A[7], local.A[0],
295 local.A[1], local.A[2], local.A[3], R(i+4), K[i+4] );
296 P( local.A[3], local.A[4], local.A[5], local.A[6], local.A[7],
297 local.A[0], local.A[1], local.A[2], R(i+5), K[i+5] );
298 P( local.A[2], local.A[3], local.A[4], local.A[5], local.A[6],
299 local.A[7], local.A[0], local.A[1], R(i+6), K[i+6] );
300 P( local.A[1], local.A[2], local.A[3], local.A[4], local.A[5],
301 local.A[6], local.A[7], local.A[0], R(i+7), K[i+7] );
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200302 }
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200303#endif /* MBEDTLS_SHA256_SMALLER */
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200304
305 for( i = 0; i < 8; i++ )
gabor-mezei-arm70f7f672020-08-25 19:12:01 +0200306 ctx->state[i] += local.A[i];
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100307
gabor-mezei-armd5253bb2020-07-30 16:41:25 +0200308 /* Zeroise buffers and variables to clear sensitive data from memory. */
gabor-mezei-arm70f7f672020-08-25 19:12:01 +0200309 mbedtls_platform_zeroize( &local, sizeof( local ) );
gabor-mezei-armd5253bb2020-07-30 16:41:25 +0200310
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100311 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000312}
Jaeden Amero041039f2018-02-19 15:28:08 +0000313
314#if !defined(MBEDTLS_DEPRECATED_REMOVED)
315void mbedtls_sha256_process( mbedtls_sha256_context *ctx,
316 const unsigned char data[64] )
317{
318 mbedtls_internal_sha256_process( ctx, data );
319}
320#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200321#endif /* !MBEDTLS_SHA256_PROCESS_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000322
323/*
324 * SHA-256 process buffer
325 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100326int mbedtls_sha256_update_ret( mbedtls_sha256_context *ctx,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100327 const unsigned char *input,
328 size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000329{
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100330 int ret;
Paul Bakker23986e52011-04-24 08:57:21 +0000331 size_t fill;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000332 uint32_t left;
Paul Bakker5121ce52009-01-03 21:22:43 +0000333
Hanno Becker8d215e72018-12-18 17:53:21 +0000334 SHA256_VALIDATE_RET( ctx != NULL );
335 SHA256_VALIDATE_RET( ilen == 0 || input != NULL );
Hanno Becker596e0142018-12-18 15:00:38 +0000336
Brian White12895d12014-04-11 11:29:42 -0400337 if( ilen == 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100338 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000339
340 left = ctx->total[0] & 0x3F;
341 fill = 64 - left;
342
Paul Bakker5c2364c2012-10-01 14:41:15 +0000343 ctx->total[0] += (uint32_t) ilen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000344 ctx->total[0] &= 0xFFFFFFFF;
345
Paul Bakker5c2364c2012-10-01 14:41:15 +0000346 if( ctx->total[0] < (uint32_t) ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000347 ctx->total[1]++;
348
349 if( left && ilen >= fill )
350 {
Paul Bakker3c2122f2013-06-24 19:03:14 +0200351 memcpy( (void *) (ctx->buffer + left), input, fill );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100352
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100353 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100354 return( ret );
355
Paul Bakker5121ce52009-01-03 21:22:43 +0000356 input += fill;
357 ilen -= fill;
358 left = 0;
359 }
360
361 while( ilen >= 64 )
362 {
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100363 if( ( ret = mbedtls_internal_sha256_process( ctx, input ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100364 return( ret );
365
Paul Bakker5121ce52009-01-03 21:22:43 +0000366 input += 64;
367 ilen -= 64;
368 }
369
370 if( ilen > 0 )
Paul Bakker3c2122f2013-06-24 19:03:14 +0200371 memcpy( (void *) (ctx->buffer + left), input, ilen );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100372
373 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000374}
375
Jaeden Amero041039f2018-02-19 15:28:08 +0000376#if !defined(MBEDTLS_DEPRECATED_REMOVED)
377void mbedtls_sha256_update( mbedtls_sha256_context *ctx,
378 const unsigned char *input,
379 size_t ilen )
380{
381 mbedtls_sha256_update_ret( ctx, input, ilen );
382}
383#endif
384
Paul Bakker5121ce52009-01-03 21:22:43 +0000385/*
386 * SHA-256 final digest
387 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100388int mbedtls_sha256_finish_ret( mbedtls_sha256_context *ctx,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100389 unsigned char output[32] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000390{
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100391 int ret;
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200392 uint32_t used;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000393 uint32_t high, low;
Paul Bakker5121ce52009-01-03 21:22:43 +0000394
Hanno Becker8d215e72018-12-18 17:53:21 +0000395 SHA256_VALIDATE_RET( ctx != NULL );
396 SHA256_VALIDATE_RET( (unsigned char *)output != NULL );
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +0000397
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200398 /*
399 * Add padding: 0x80 then 0x00 until 8 bytes remain for the length
400 */
401 used = ctx->total[0] & 0x3F;
402
403 ctx->buffer[used++] = 0x80;
404
405 if( used <= 56 )
406 {
407 /* Enough room for padding + length in current block */
408 memset( ctx->buffer + used, 0, 56 - used );
409 }
410 else
411 {
412 /* We'll need an extra block */
413 memset( ctx->buffer + used, 0, 64 - used );
414
415 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
416 return( ret );
417
418 memset( ctx->buffer, 0, 56 );
419 }
420
421 /*
422 * Add message length
423 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000424 high = ( ctx->total[0] >> 29 )
425 | ( ctx->total[1] << 3 );
426 low = ( ctx->total[0] << 3 );
427
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200428 PUT_UINT32_BE( high, ctx->buffer, 56 );
429 PUT_UINT32_BE( low, ctx->buffer, 60 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000430
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200431 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
Andres Amaya Garciaaa464ef2017-07-21 14:21:53 +0100432 return( ret );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100433
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200434 /*
435 * Output final state
436 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000437 PUT_UINT32_BE( ctx->state[0], output, 0 );
438 PUT_UINT32_BE( ctx->state[1], output, 4 );
439 PUT_UINT32_BE( ctx->state[2], output, 8 );
440 PUT_UINT32_BE( ctx->state[3], output, 12 );
441 PUT_UINT32_BE( ctx->state[4], output, 16 );
442 PUT_UINT32_BE( ctx->state[5], output, 20 );
443 PUT_UINT32_BE( ctx->state[6], output, 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000444
445 if( ctx->is224 == 0 )
Paul Bakker5c2364c2012-10-01 14:41:15 +0000446 PUT_UINT32_BE( ctx->state[7], output, 28 );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100447
448 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000449}
450
Jaeden Amero041039f2018-02-19 15:28:08 +0000451#if !defined(MBEDTLS_DEPRECATED_REMOVED)
452void mbedtls_sha256_finish( mbedtls_sha256_context *ctx,
453 unsigned char output[32] )
454{
455 mbedtls_sha256_finish_ret( ctx, output );
456}
457#endif
458
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200459#endif /* !MBEDTLS_SHA256_ALT */
Paul Bakker90995b52013-06-24 19:20:35 +0200460
Paul Bakker5121ce52009-01-03 21:22:43 +0000461/*
462 * output = SHA-256( input buffer )
463 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100464int mbedtls_sha256_ret( const unsigned char *input,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100465 size_t ilen,
466 unsigned char output[32],
467 int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000468{
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100469 int ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200470 mbedtls_sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000471
Hanno Becker8d215e72018-12-18 17:53:21 +0000472 SHA256_VALIDATE_RET( is224 == 0 || is224 == 1 );
473 SHA256_VALIDATE_RET( ilen == 0 || input != NULL );
474 SHA256_VALIDATE_RET( (unsigned char *)output != NULL );
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +0000475
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200476 mbedtls_sha256_init( &ctx );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100477
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100478 if( ( ret = mbedtls_sha256_starts_ret( &ctx, is224 ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100479 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100480
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100481 if( ( ret = mbedtls_sha256_update_ret( &ctx, input, ilen ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100482 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100483
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100484 if( ( ret = mbedtls_sha256_finish_ret( &ctx, output ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100485 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100486
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100487exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200488 mbedtls_sha256_free( &ctx );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100489
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100490 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000491}
492
Jaeden Amero041039f2018-02-19 15:28:08 +0000493#if !defined(MBEDTLS_DEPRECATED_REMOVED)
494void mbedtls_sha256( const unsigned char *input,
495 size_t ilen,
496 unsigned char output[32],
497 int is224 )
498{
499 mbedtls_sha256_ret( input, ilen, output, is224 );
500}
501#endif
502
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200503#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000504/*
505 * FIPS-180-2 test vectors
506 */
Manuel Pégourié-Gonnard28122e42015-03-11 09:13:42 +0000507static const unsigned char sha256_test_buf[3][57] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000508{
509 { "abc" },
510 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
511 { "" }
512};
513
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100514static const size_t sha256_test_buflen[3] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000515{
516 3, 56, 1000
517};
518
Paul Bakker9e36f042013-06-30 14:34:05 +0200519static const unsigned char sha256_test_sum[6][32] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000520{
521 /*
522 * SHA-224 test vectors
523 */
524 { 0x23, 0x09, 0x7D, 0x22, 0x34, 0x05, 0xD8, 0x22,
525 0x86, 0x42, 0xA4, 0x77, 0xBD, 0xA2, 0x55, 0xB3,
526 0x2A, 0xAD, 0xBC, 0xE4, 0xBD, 0xA0, 0xB3, 0xF7,
527 0xE3, 0x6C, 0x9D, 0xA7 },
528 { 0x75, 0x38, 0x8B, 0x16, 0x51, 0x27, 0x76, 0xCC,
529 0x5D, 0xBA, 0x5D, 0xA1, 0xFD, 0x89, 0x01, 0x50,
530 0xB0, 0xC6, 0x45, 0x5C, 0xB4, 0xF5, 0x8B, 0x19,
531 0x52, 0x52, 0x25, 0x25 },
532 { 0x20, 0x79, 0x46, 0x55, 0x98, 0x0C, 0x91, 0xD8,
533 0xBB, 0xB4, 0xC1, 0xEA, 0x97, 0x61, 0x8A, 0x4B,
534 0xF0, 0x3F, 0x42, 0x58, 0x19, 0x48, 0xB2, 0xEE,
535 0x4E, 0xE7, 0xAD, 0x67 },
536
537 /*
538 * SHA-256 test vectors
539 */
540 { 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA,
541 0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23,
542 0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C,
543 0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD },
544 { 0x24, 0x8D, 0x6A, 0x61, 0xD2, 0x06, 0x38, 0xB8,
545 0xE5, 0xC0, 0x26, 0x93, 0x0C, 0x3E, 0x60, 0x39,
546 0xA3, 0x3C, 0xE4, 0x59, 0x64, 0xFF, 0x21, 0x67,
547 0xF6, 0xEC, 0xED, 0xD4, 0x19, 0xDB, 0x06, 0xC1 },
548 { 0xCD, 0xC7, 0x6E, 0x5C, 0x99, 0x14, 0xFB, 0x92,
549 0x81, 0xA1, 0xC7, 0xE2, 0x84, 0xD7, 0x3E, 0x67,
550 0xF1, 0x80, 0x9A, 0x48, 0xA4, 0x97, 0x20, 0x0E,
551 0x04, 0x6D, 0x39, 0xCC, 0xC7, 0x11, 0x2C, 0xD0 }
552};
553
554/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000555 * Checkup routine
556 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200557int mbedtls_sha256_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000558{
Paul Bakker5b4af392014-06-26 12:09:34 +0200559 int i, j, k, buflen, ret = 0;
Russ Butlerbb83b422016-10-12 17:36:50 -0500560 unsigned char *buf;
Paul Bakker9e36f042013-06-30 14:34:05 +0200561 unsigned char sha256sum[32];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200562 mbedtls_sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000563
Russ Butlerbb83b422016-10-12 17:36:50 -0500564 buf = mbedtls_calloc( 1024, sizeof(unsigned char) );
565 if( NULL == buf )
566 {
567 if( verbose != 0 )
568 mbedtls_printf( "Buffer allocation failed\n" );
569
570 return( 1 );
571 }
572
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200573 mbedtls_sha256_init( &ctx );
Paul Bakker5b4af392014-06-26 12:09:34 +0200574
Paul Bakker5121ce52009-01-03 21:22:43 +0000575 for( i = 0; i < 6; i++ )
576 {
577 j = i % 3;
578 k = i < 3;
579
580 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200581 mbedtls_printf( " SHA-%d test #%d: ", 256 - k * 32, j + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000582
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100583 if( ( ret = mbedtls_sha256_starts_ret( &ctx, k ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100584 goto fail;
Paul Bakker5121ce52009-01-03 21:22:43 +0000585
586 if( j == 2 )
587 {
588 memset( buf, 'a', buflen = 1000 );
589
590 for( j = 0; j < 1000; j++ )
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100591 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100592 ret = mbedtls_sha256_update_ret( &ctx, buf, buflen );
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100593 if( ret != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100594 goto fail;
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100595 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100596
Paul Bakker5121ce52009-01-03 21:22:43 +0000597 }
598 else
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100599 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100600 ret = mbedtls_sha256_update_ret( &ctx, sha256_test_buf[j],
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100601 sha256_test_buflen[j] );
602 if( ret != 0 )
603 goto fail;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100604 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000605
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100606 if( ( ret = mbedtls_sha256_finish_ret( &ctx, sha256sum ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100607 goto fail;
608
Paul Bakker5121ce52009-01-03 21:22:43 +0000609
Paul Bakker9e36f042013-06-30 14:34:05 +0200610 if( memcmp( sha256sum, sha256_test_sum[i], 32 - k * 4 ) != 0 )
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100611 {
612 ret = 1;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100613 goto fail;
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100614 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000615
616 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200617 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000618 }
619
620 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200621 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000622
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100623 goto exit;
624
625fail:
626 if( verbose != 0 )
627 mbedtls_printf( "failed\n" );
628
Paul Bakker5b4af392014-06-26 12:09:34 +0200629exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200630 mbedtls_sha256_free( &ctx );
Russ Butlerbb83b422016-10-12 17:36:50 -0500631 mbedtls_free( buf );
Paul Bakker5b4af392014-06-26 12:09:34 +0200632
633 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000634}
635
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200636#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000637
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200638#endif /* MBEDTLS_SHA256_C */