blob: 2decd08f05f2614a922e6b9c4a68d5c76bdb3b5c [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
gabor-mezei-armd5253bb2020-07-30 16:41:25 +0200284 /* Zeroise buffers and variables to clear sensitive data from memory. */
285 mbedtls_platform_zeroize( &A, sizeof( A ) );
286 mbedtls_platform_zeroize( &W, sizeof( W ) );
287 mbedtls_platform_zeroize( &temp1, sizeof( temp1 ) );
288 mbedtls_platform_zeroize( &temp2, sizeof( temp2 ) );
289
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100290 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000291}
Jaeden Amero041039f2018-02-19 15:28:08 +0000292
293#if !defined(MBEDTLS_DEPRECATED_REMOVED)
294void mbedtls_sha256_process( mbedtls_sha256_context *ctx,
295 const unsigned char data[64] )
296{
297 mbedtls_internal_sha256_process( ctx, data );
298}
299#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200300#endif /* !MBEDTLS_SHA256_PROCESS_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000301
302/*
303 * SHA-256 process buffer
304 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100305int mbedtls_sha256_update_ret( mbedtls_sha256_context *ctx,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100306 const unsigned char *input,
307 size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000308{
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100309 int ret;
Paul Bakker23986e52011-04-24 08:57:21 +0000310 size_t fill;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000311 uint32_t left;
Paul Bakker5121ce52009-01-03 21:22:43 +0000312
Hanno Becker8d215e72018-12-18 17:53:21 +0000313 SHA256_VALIDATE_RET( ctx != NULL );
314 SHA256_VALIDATE_RET( ilen == 0 || input != NULL );
Hanno Becker596e0142018-12-18 15:00:38 +0000315
Brian White12895d12014-04-11 11:29:42 -0400316 if( ilen == 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100317 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000318
319 left = ctx->total[0] & 0x3F;
320 fill = 64 - left;
321
Paul Bakker5c2364c2012-10-01 14:41:15 +0000322 ctx->total[0] += (uint32_t) ilen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000323 ctx->total[0] &= 0xFFFFFFFF;
324
Paul Bakker5c2364c2012-10-01 14:41:15 +0000325 if( ctx->total[0] < (uint32_t) ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000326 ctx->total[1]++;
327
328 if( left && ilen >= fill )
329 {
Paul Bakker3c2122f2013-06-24 19:03:14 +0200330 memcpy( (void *) (ctx->buffer + left), input, fill );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100331
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100332 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100333 return( ret );
334
Paul Bakker5121ce52009-01-03 21:22:43 +0000335 input += fill;
336 ilen -= fill;
337 left = 0;
338 }
339
340 while( ilen >= 64 )
341 {
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100342 if( ( ret = mbedtls_internal_sha256_process( ctx, input ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100343 return( ret );
344
Paul Bakker5121ce52009-01-03 21:22:43 +0000345 input += 64;
346 ilen -= 64;
347 }
348
349 if( ilen > 0 )
Paul Bakker3c2122f2013-06-24 19:03:14 +0200350 memcpy( (void *) (ctx->buffer + left), input, ilen );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100351
352 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000353}
354
Jaeden Amero041039f2018-02-19 15:28:08 +0000355#if !defined(MBEDTLS_DEPRECATED_REMOVED)
356void mbedtls_sha256_update( mbedtls_sha256_context *ctx,
357 const unsigned char *input,
358 size_t ilen )
359{
360 mbedtls_sha256_update_ret( ctx, input, ilen );
361}
362#endif
363
Paul Bakker5121ce52009-01-03 21:22:43 +0000364/*
365 * SHA-256 final digest
366 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100367int mbedtls_sha256_finish_ret( mbedtls_sha256_context *ctx,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100368 unsigned char output[32] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000369{
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100370 int ret;
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200371 uint32_t used;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000372 uint32_t high, low;
Paul Bakker5121ce52009-01-03 21:22:43 +0000373
Hanno Becker8d215e72018-12-18 17:53:21 +0000374 SHA256_VALIDATE_RET( ctx != NULL );
375 SHA256_VALIDATE_RET( (unsigned char *)output != NULL );
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +0000376
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200377 /*
378 * Add padding: 0x80 then 0x00 until 8 bytes remain for the length
379 */
380 used = ctx->total[0] & 0x3F;
381
382 ctx->buffer[used++] = 0x80;
383
384 if( used <= 56 )
385 {
386 /* Enough room for padding + length in current block */
387 memset( ctx->buffer + used, 0, 56 - used );
388 }
389 else
390 {
391 /* We'll need an extra block */
392 memset( ctx->buffer + used, 0, 64 - used );
393
394 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
395 return( ret );
396
397 memset( ctx->buffer, 0, 56 );
398 }
399
400 /*
401 * Add message length
402 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000403 high = ( ctx->total[0] >> 29 )
404 | ( ctx->total[1] << 3 );
405 low = ( ctx->total[0] << 3 );
406
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200407 PUT_UINT32_BE( high, ctx->buffer, 56 );
408 PUT_UINT32_BE( low, ctx->buffer, 60 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000409
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200410 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
Andres Amaya Garciaaa464ef2017-07-21 14:21:53 +0100411 return( ret );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100412
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200413 /*
414 * Output final state
415 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000416 PUT_UINT32_BE( ctx->state[0], output, 0 );
417 PUT_UINT32_BE( ctx->state[1], output, 4 );
418 PUT_UINT32_BE( ctx->state[2], output, 8 );
419 PUT_UINT32_BE( ctx->state[3], output, 12 );
420 PUT_UINT32_BE( ctx->state[4], output, 16 );
421 PUT_UINT32_BE( ctx->state[5], output, 20 );
422 PUT_UINT32_BE( ctx->state[6], output, 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000423
424 if( ctx->is224 == 0 )
Paul Bakker5c2364c2012-10-01 14:41:15 +0000425 PUT_UINT32_BE( ctx->state[7], output, 28 );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100426
427 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000428}
429
Jaeden Amero041039f2018-02-19 15:28:08 +0000430#if !defined(MBEDTLS_DEPRECATED_REMOVED)
431void mbedtls_sha256_finish( mbedtls_sha256_context *ctx,
432 unsigned char output[32] )
433{
434 mbedtls_sha256_finish_ret( ctx, output );
435}
436#endif
437
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200438#endif /* !MBEDTLS_SHA256_ALT */
Paul Bakker90995b52013-06-24 19:20:35 +0200439
Paul Bakker5121ce52009-01-03 21:22:43 +0000440/*
441 * output = SHA-256( input buffer )
442 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100443int mbedtls_sha256_ret( const unsigned char *input,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100444 size_t ilen,
445 unsigned char output[32],
446 int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000447{
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100448 int ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200449 mbedtls_sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000450
Hanno Becker8d215e72018-12-18 17:53:21 +0000451 SHA256_VALIDATE_RET( is224 == 0 || is224 == 1 );
452 SHA256_VALIDATE_RET( ilen == 0 || input != NULL );
453 SHA256_VALIDATE_RET( (unsigned char *)output != NULL );
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +0000454
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200455 mbedtls_sha256_init( &ctx );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100456
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100457 if( ( ret = mbedtls_sha256_starts_ret( &ctx, is224 ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100458 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100459
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100460 if( ( ret = mbedtls_sha256_update_ret( &ctx, input, ilen ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100461 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100462
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100463 if( ( ret = mbedtls_sha256_finish_ret( &ctx, output ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100464 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100465
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100466exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200467 mbedtls_sha256_free( &ctx );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100468
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100469 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000470}
471
Jaeden Amero041039f2018-02-19 15:28:08 +0000472#if !defined(MBEDTLS_DEPRECATED_REMOVED)
473void mbedtls_sha256( const unsigned char *input,
474 size_t ilen,
475 unsigned char output[32],
476 int is224 )
477{
478 mbedtls_sha256_ret( input, ilen, output, is224 );
479}
480#endif
481
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200482#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000483/*
484 * FIPS-180-2 test vectors
485 */
Manuel Pégourié-Gonnard28122e42015-03-11 09:13:42 +0000486static const unsigned char sha256_test_buf[3][57] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000487{
488 { "abc" },
489 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
490 { "" }
491};
492
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100493static const size_t sha256_test_buflen[3] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000494{
495 3, 56, 1000
496};
497
Paul Bakker9e36f042013-06-30 14:34:05 +0200498static const unsigned char sha256_test_sum[6][32] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000499{
500 /*
501 * SHA-224 test vectors
502 */
503 { 0x23, 0x09, 0x7D, 0x22, 0x34, 0x05, 0xD8, 0x22,
504 0x86, 0x42, 0xA4, 0x77, 0xBD, 0xA2, 0x55, 0xB3,
505 0x2A, 0xAD, 0xBC, 0xE4, 0xBD, 0xA0, 0xB3, 0xF7,
506 0xE3, 0x6C, 0x9D, 0xA7 },
507 { 0x75, 0x38, 0x8B, 0x16, 0x51, 0x27, 0x76, 0xCC,
508 0x5D, 0xBA, 0x5D, 0xA1, 0xFD, 0x89, 0x01, 0x50,
509 0xB0, 0xC6, 0x45, 0x5C, 0xB4, 0xF5, 0x8B, 0x19,
510 0x52, 0x52, 0x25, 0x25 },
511 { 0x20, 0x79, 0x46, 0x55, 0x98, 0x0C, 0x91, 0xD8,
512 0xBB, 0xB4, 0xC1, 0xEA, 0x97, 0x61, 0x8A, 0x4B,
513 0xF0, 0x3F, 0x42, 0x58, 0x19, 0x48, 0xB2, 0xEE,
514 0x4E, 0xE7, 0xAD, 0x67 },
515
516 /*
517 * SHA-256 test vectors
518 */
519 { 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA,
520 0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23,
521 0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C,
522 0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD },
523 { 0x24, 0x8D, 0x6A, 0x61, 0xD2, 0x06, 0x38, 0xB8,
524 0xE5, 0xC0, 0x26, 0x93, 0x0C, 0x3E, 0x60, 0x39,
525 0xA3, 0x3C, 0xE4, 0x59, 0x64, 0xFF, 0x21, 0x67,
526 0xF6, 0xEC, 0xED, 0xD4, 0x19, 0xDB, 0x06, 0xC1 },
527 { 0xCD, 0xC7, 0x6E, 0x5C, 0x99, 0x14, 0xFB, 0x92,
528 0x81, 0xA1, 0xC7, 0xE2, 0x84, 0xD7, 0x3E, 0x67,
529 0xF1, 0x80, 0x9A, 0x48, 0xA4, 0x97, 0x20, 0x0E,
530 0x04, 0x6D, 0x39, 0xCC, 0xC7, 0x11, 0x2C, 0xD0 }
531};
532
533/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000534 * Checkup routine
535 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200536int mbedtls_sha256_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000537{
Paul Bakker5b4af392014-06-26 12:09:34 +0200538 int i, j, k, buflen, ret = 0;
Russ Butlerbb83b422016-10-12 17:36:50 -0500539 unsigned char *buf;
Paul Bakker9e36f042013-06-30 14:34:05 +0200540 unsigned char sha256sum[32];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200541 mbedtls_sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000542
Russ Butlerbb83b422016-10-12 17:36:50 -0500543 buf = mbedtls_calloc( 1024, sizeof(unsigned char) );
544 if( NULL == buf )
545 {
546 if( verbose != 0 )
547 mbedtls_printf( "Buffer allocation failed\n" );
548
549 return( 1 );
550 }
551
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200552 mbedtls_sha256_init( &ctx );
Paul Bakker5b4af392014-06-26 12:09:34 +0200553
Paul Bakker5121ce52009-01-03 21:22:43 +0000554 for( i = 0; i < 6; i++ )
555 {
556 j = i % 3;
557 k = i < 3;
558
559 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200560 mbedtls_printf( " SHA-%d test #%d: ", 256 - k * 32, j + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000561
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100562 if( ( ret = mbedtls_sha256_starts_ret( &ctx, k ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100563 goto fail;
Paul Bakker5121ce52009-01-03 21:22:43 +0000564
565 if( j == 2 )
566 {
567 memset( buf, 'a', buflen = 1000 );
568
569 for( j = 0; j < 1000; j++ )
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100570 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100571 ret = mbedtls_sha256_update_ret( &ctx, buf, buflen );
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100572 if( ret != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100573 goto fail;
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100574 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100575
Paul Bakker5121ce52009-01-03 21:22:43 +0000576 }
577 else
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100578 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100579 ret = mbedtls_sha256_update_ret( &ctx, sha256_test_buf[j],
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100580 sha256_test_buflen[j] );
581 if( ret != 0 )
582 goto fail;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100583 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000584
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100585 if( ( ret = mbedtls_sha256_finish_ret( &ctx, sha256sum ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100586 goto fail;
587
Paul Bakker5121ce52009-01-03 21:22:43 +0000588
Paul Bakker9e36f042013-06-30 14:34:05 +0200589 if( memcmp( sha256sum, sha256_test_sum[i], 32 - k * 4 ) != 0 )
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100590 {
591 ret = 1;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100592 goto fail;
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100593 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000594
595 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200596 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000597 }
598
599 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200600 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000601
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100602 goto exit;
603
604fail:
605 if( verbose != 0 )
606 mbedtls_printf( "failed\n" );
607
Paul Bakker5b4af392014-06-26 12:09:34 +0200608exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200609 mbedtls_sha256_free( &ctx );
Russ Butlerbb83b422016-10-12 17:36:50 -0500610 mbedtls_free( buf );
Paul Bakker5b4af392014-06-26 12:09:34 +0200611
612 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000613}
614
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200615#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000616
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200617#endif /* MBEDTLS_SHA256_C */