blob: 087a8e349c348a8e0817ad529b25309806bdf0df [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
Manuel Pégourié-Gonnard37ff1402015-09-04 14:21:07 +02005 * SPDX-License-Identifier: Apache-2.0
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
8 * not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
Paul Bakkerb96f1542010-07-18 20:36:00 +000018 *
Manuel Pégourié-Gonnardfe446432015-03-06 13:17:10 +000019 * This file is part of mbed TLS (https://tls.mbed.org)
Paul Bakker5121ce52009-01-03 21:22:43 +000020 */
21/*
22 * The SHA-256 Secure Hash Standard was published by NIST in 2002.
23 *
24 * http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf
25 */
26
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020027#if !defined(MBEDTLS_CONFIG_FILE)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000028#include "mbedtls/config.h"
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020029#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020030#include MBEDTLS_CONFIG_FILE
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020031#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000032
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020033#if defined(MBEDTLS_SHA256_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000034
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000035#include "mbedtls/sha256.h"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050036#include "mbedtls/platform_util.h"
Janos Follath24eed8d2019-11-22 13:21:35 +000037#include "mbedtls/error.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000038
Rich Evans00ab4702015-02-06 13:43:58 +000039#include <string.h>
40
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020041#if defined(MBEDTLS_SELF_TEST)
42#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000043#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010044#else
Rich Evans00ab4702015-02-06 13:43:58 +000045#include <stdio.h>
Russ Butlerbb83b422016-10-12 17:36:50 -050046#include <stdlib.h>
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020047#define mbedtls_printf printf
Russ Butlerbb83b422016-10-12 17:36:50 -050048#define mbedtls_calloc calloc
49#define mbedtls_free free
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020050#endif /* MBEDTLS_PLATFORM_C */
51#endif /* MBEDTLS_SELF_TEST */
Paul Bakker7dc4c442014-02-01 22:50:26 +010052
Hanno Becker2f6de422018-12-20 10:22:32 +000053#define SHA256_VALIDATE_RET(cond) \
54 MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_SHA256_BAD_INPUT_DATA )
55#define SHA256_VALIDATE(cond) MBEDTLS_INTERNAL_VALIDATE( cond )
56
Manuel Pégourié-Gonnard8b2641d2015-08-27 20:03:46 +020057#if !defined(MBEDTLS_SHA256_ALT)
58
Paul Bakker5121ce52009-01-03 21:22:43 +000059/*
60 * 32-bit integer manipulation macros (big endian)
61 */
Paul Bakker5c2364c2012-10-01 14:41:15 +000062#ifndef GET_UINT32_BE
63#define GET_UINT32_BE(n,b,i) \
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +020064do { \
Paul Bakker5c2364c2012-10-01 14:41:15 +000065 (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
66 | ( (uint32_t) (b)[(i) + 1] << 16 ) \
67 | ( (uint32_t) (b)[(i) + 2] << 8 ) \
68 | ( (uint32_t) (b)[(i) + 3] ); \
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +020069} while( 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +000070#endif
71
Paul Bakker5c2364c2012-10-01 14:41:15 +000072#ifndef PUT_UINT32_BE
73#define PUT_UINT32_BE(n,b,i) \
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +020074do { \
Paul Bakker5121ce52009-01-03 21:22:43 +000075 (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
76 (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
77 (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
78 (b)[(i) + 3] = (unsigned char) ( (n) ); \
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +020079} while( 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +000080#endif
81
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020082void mbedtls_sha256_init( mbedtls_sha256_context *ctx )
Paul Bakker5b4af392014-06-26 12:09:34 +020083{
Hanno Becker8d215e72018-12-18 17:53:21 +000084 SHA256_VALIDATE( ctx != NULL );
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +000085
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020086 memset( ctx, 0, sizeof( mbedtls_sha256_context ) );
Paul Bakker5b4af392014-06-26 12:09:34 +020087}
88
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020089void mbedtls_sha256_free( mbedtls_sha256_context *ctx )
Paul Bakker5b4af392014-06-26 12:09:34 +020090{
91 if( ctx == NULL )
92 return;
93
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050094 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_sha256_context ) );
Paul Bakker5b4af392014-06-26 12:09:34 +020095}
96
Manuel Pégourié-Gonnard16d412f2015-07-06 15:26:26 +020097void mbedtls_sha256_clone( mbedtls_sha256_context *dst,
98 const mbedtls_sha256_context *src )
99{
Hanno Becker8d215e72018-12-18 17:53:21 +0000100 SHA256_VALIDATE( dst != NULL );
101 SHA256_VALIDATE( src != NULL );
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +0000102
Manuel Pégourié-Gonnard16d412f2015-07-06 15:26:26 +0200103 *dst = *src;
104}
105
Paul Bakker5121ce52009-01-03 21:22:43 +0000106/*
107 * SHA-256 context setup
108 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100109int mbedtls_sha256_starts_ret( mbedtls_sha256_context *ctx, int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000110{
Hanno Becker8d215e72018-12-18 17:53:21 +0000111 SHA256_VALIDATE_RET( ctx != NULL );
112 SHA256_VALIDATE_RET( is224 == 0 || is224 == 1 );
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +0000113
Paul Bakker5121ce52009-01-03 21:22:43 +0000114 ctx->total[0] = 0;
115 ctx->total[1] = 0;
116
117 if( is224 == 0 )
118 {
119 /* SHA-256 */
120 ctx->state[0] = 0x6A09E667;
121 ctx->state[1] = 0xBB67AE85;
122 ctx->state[2] = 0x3C6EF372;
123 ctx->state[3] = 0xA54FF53A;
124 ctx->state[4] = 0x510E527F;
125 ctx->state[5] = 0x9B05688C;
126 ctx->state[6] = 0x1F83D9AB;
127 ctx->state[7] = 0x5BE0CD19;
128 }
129 else
130 {
131 /* SHA-224 */
132 ctx->state[0] = 0xC1059ED8;
133 ctx->state[1] = 0x367CD507;
134 ctx->state[2] = 0x3070DD17;
135 ctx->state[3] = 0xF70E5939;
136 ctx->state[4] = 0xFFC00B31;
137 ctx->state[5] = 0x68581511;
138 ctx->state[6] = 0x64F98FA7;
139 ctx->state[7] = 0xBEFA4FA4;
140 }
141
142 ctx->is224 = is224;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100143
144 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000145}
146
Jaeden Amero041039f2018-02-19 15:28:08 +0000147#if !defined(MBEDTLS_DEPRECATED_REMOVED)
148void mbedtls_sha256_starts( mbedtls_sha256_context *ctx,
149 int is224 )
150{
151 mbedtls_sha256_starts_ret( ctx, is224 );
152}
153#endif
154
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200155#if !defined(MBEDTLS_SHA256_PROCESS_ALT)
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200156static const uint32_t K[] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000157{
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200158 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,
159 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,
160 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,
161 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,
162 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,
163 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,
164 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,
165 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,
166 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,
167 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,
168 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,
169 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,
170 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,
171 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,
172 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,
173 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2,
174};
Paul Bakker5121ce52009-01-03 21:22:43 +0000175
Hanno Becker1eeca412018-10-15 12:01:35 +0100176#define SHR(x,n) (((x) & 0xFFFFFFFF) >> (n))
177#define ROTR(x,n) (SHR(x,n) | ((x) << (32 - (n))))
Paul Bakker5121ce52009-01-03 21:22:43 +0000178
179#define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^ SHR(x, 3))
180#define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^ SHR(x,10))
181
182#define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22))
183#define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25))
184
Hanno Becker1eeca412018-10-15 12:01:35 +0100185#define F0(x,y,z) (((x) & (y)) | ((z) & ((x) | (y))))
186#define F1(x,y,z) ((z) ^ ((x) & ((y) ^ (z))))
Paul Bakker5121ce52009-01-03 21:22:43 +0000187
188#define R(t) \
Hanno Becker1eeca412018-10-15 12:01:35 +0100189 ( \
190 W[t] = S1(W[(t) - 2]) + W[(t) - 7] + \
191 S0(W[(t) - 15]) + W[(t) - 16] \
192 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000193
Hanno Becker1eeca412018-10-15 12:01:35 +0100194#define P(a,b,c,d,e,f,g,h,x,K) \
195 do \
196 { \
Hanno Becker818bac52018-10-26 09:13:26 +0100197 temp1 = (h) + S3(e) + F1((e),(f),(g)) + (K) + (x); \
198 temp2 = S2(a) + F0((a),(b),(c)); \
Hanno Becker1eeca412018-10-15 12:01:35 +0100199 (d) += temp1; (h) = temp1 + temp2; \
200 } while( 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000201
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100202int mbedtls_internal_sha256_process( mbedtls_sha256_context *ctx,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100203 const unsigned char data[64] )
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200204{
205 uint32_t temp1, temp2, W[64];
206 uint32_t A[8];
207 unsigned int i;
Paul Bakker5121ce52009-01-03 21:22:43 +0000208
Hanno Becker8d215e72018-12-18 17:53:21 +0000209 SHA256_VALIDATE_RET( ctx != NULL );
210 SHA256_VALIDATE_RET( (const unsigned char *)data != NULL );
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +0000211
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200212 for( i = 0; i < 8; i++ )
213 A[i] = ctx->state[i];
214
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200215#if defined(MBEDTLS_SHA256_SMALLER)
216 for( i = 0; i < 64; i++ )
217 {
218 if( i < 16 )
219 GET_UINT32_BE( W[i], data, 4 * i );
220 else
221 R( i );
222
223 P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], W[i], K[i] );
224
225 temp1 = A[7]; A[7] = A[6]; A[6] = A[5]; A[5] = A[4]; A[4] = A[3];
226 A[3] = A[2]; A[2] = A[1]; A[1] = A[0]; A[0] = temp1;
227 }
228#else /* MBEDTLS_SHA256_SMALLER */
229 for( i = 0; i < 16; i++ )
230 GET_UINT32_BE( W[i], data, 4 * i );
231
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200232 for( i = 0; i < 16; i += 8 )
233 {
234 P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], W[i+0], K[i+0] );
235 P( A[7], A[0], A[1], A[2], A[3], A[4], A[5], A[6], W[i+1], K[i+1] );
236 P( A[6], A[7], A[0], A[1], A[2], A[3], A[4], A[5], W[i+2], K[i+2] );
237 P( A[5], A[6], A[7], A[0], A[1], A[2], A[3], A[4], W[i+3], K[i+3] );
238 P( A[4], A[5], A[6], A[7], A[0], A[1], A[2], A[3], W[i+4], K[i+4] );
239 P( A[3], A[4], A[5], A[6], A[7], A[0], A[1], A[2], W[i+5], K[i+5] );
240 P( A[2], A[3], A[4], A[5], A[6], A[7], A[0], A[1], W[i+6], K[i+6] );
241 P( A[1], A[2], A[3], A[4], A[5], A[6], A[7], A[0], W[i+7], K[i+7] );
242 }
243
244 for( i = 16; i < 64; i += 8 )
245 {
246 P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], R(i+0), K[i+0] );
247 P( A[7], A[0], A[1], A[2], A[3], A[4], A[5], A[6], R(i+1), K[i+1] );
248 P( A[6], A[7], A[0], A[1], A[2], A[3], A[4], A[5], R(i+2), K[i+2] );
249 P( A[5], A[6], A[7], A[0], A[1], A[2], A[3], A[4], R(i+3), K[i+3] );
250 P( A[4], A[5], A[6], A[7], A[0], A[1], A[2], A[3], R(i+4), K[i+4] );
251 P( A[3], A[4], A[5], A[6], A[7], A[0], A[1], A[2], R(i+5), K[i+5] );
252 P( A[2], A[3], A[4], A[5], A[6], A[7], A[0], A[1], R(i+6), K[i+6] );
253 P( A[1], A[2], A[3], A[4], A[5], A[6], A[7], A[0], R(i+7), K[i+7] );
254 }
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200255#endif /* MBEDTLS_SHA256_SMALLER */
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200256
257 for( i = 0; i < 8; i++ )
258 ctx->state[i] += A[i];
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100259
260 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000261}
Jaeden Amero041039f2018-02-19 15:28:08 +0000262
263#if !defined(MBEDTLS_DEPRECATED_REMOVED)
264void mbedtls_sha256_process( mbedtls_sha256_context *ctx,
265 const unsigned char data[64] )
266{
267 mbedtls_internal_sha256_process( ctx, data );
268}
269#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200270#endif /* !MBEDTLS_SHA256_PROCESS_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000271
272/*
273 * SHA-256 process buffer
274 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100275int mbedtls_sha256_update_ret( mbedtls_sha256_context *ctx,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100276 const unsigned char *input,
277 size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000278{
Janos Follath24eed8d2019-11-22 13:21:35 +0000279 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker23986e52011-04-24 08:57:21 +0000280 size_t fill;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000281 uint32_t left;
Paul Bakker5121ce52009-01-03 21:22:43 +0000282
Hanno Becker8d215e72018-12-18 17:53:21 +0000283 SHA256_VALIDATE_RET( ctx != NULL );
284 SHA256_VALIDATE_RET( ilen == 0 || input != NULL );
Hanno Becker596e0142018-12-18 15:00:38 +0000285
Brian White12895d12014-04-11 11:29:42 -0400286 if( ilen == 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100287 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000288
289 left = ctx->total[0] & 0x3F;
290 fill = 64 - left;
291
Paul Bakker5c2364c2012-10-01 14:41:15 +0000292 ctx->total[0] += (uint32_t) ilen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000293 ctx->total[0] &= 0xFFFFFFFF;
294
Paul Bakker5c2364c2012-10-01 14:41:15 +0000295 if( ctx->total[0] < (uint32_t) ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000296 ctx->total[1]++;
297
298 if( left && ilen >= fill )
299 {
Paul Bakker3c2122f2013-06-24 19:03:14 +0200300 memcpy( (void *) (ctx->buffer + left), input, fill );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100301
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100302 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100303 return( ret );
304
Paul Bakker5121ce52009-01-03 21:22:43 +0000305 input += fill;
306 ilen -= fill;
307 left = 0;
308 }
309
310 while( ilen >= 64 )
311 {
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100312 if( ( ret = mbedtls_internal_sha256_process( ctx, input ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100313 return( ret );
314
Paul Bakker5121ce52009-01-03 21:22:43 +0000315 input += 64;
316 ilen -= 64;
317 }
318
319 if( ilen > 0 )
Paul Bakker3c2122f2013-06-24 19:03:14 +0200320 memcpy( (void *) (ctx->buffer + left), input, ilen );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100321
322 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000323}
324
Jaeden Amero041039f2018-02-19 15:28:08 +0000325#if !defined(MBEDTLS_DEPRECATED_REMOVED)
326void mbedtls_sha256_update( mbedtls_sha256_context *ctx,
327 const unsigned char *input,
328 size_t ilen )
329{
330 mbedtls_sha256_update_ret( ctx, input, ilen );
331}
332#endif
333
Paul Bakker5121ce52009-01-03 21:22:43 +0000334/*
335 * SHA-256 final digest
336 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100337int mbedtls_sha256_finish_ret( mbedtls_sha256_context *ctx,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100338 unsigned char output[32] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000339{
Janos Follath24eed8d2019-11-22 13:21:35 +0000340 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200341 uint32_t used;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000342 uint32_t high, low;
Paul Bakker5121ce52009-01-03 21:22:43 +0000343
Hanno Becker8d215e72018-12-18 17:53:21 +0000344 SHA256_VALIDATE_RET( ctx != NULL );
345 SHA256_VALIDATE_RET( (unsigned char *)output != NULL );
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +0000346
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200347 /*
348 * Add padding: 0x80 then 0x00 until 8 bytes remain for the length
349 */
350 used = ctx->total[0] & 0x3F;
351
352 ctx->buffer[used++] = 0x80;
353
354 if( used <= 56 )
355 {
356 /* Enough room for padding + length in current block */
357 memset( ctx->buffer + used, 0, 56 - used );
358 }
359 else
360 {
361 /* We'll need an extra block */
362 memset( ctx->buffer + used, 0, 64 - used );
363
364 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
365 return( ret );
366
367 memset( ctx->buffer, 0, 56 );
368 }
369
370 /*
371 * Add message length
372 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000373 high = ( ctx->total[0] >> 29 )
374 | ( ctx->total[1] << 3 );
375 low = ( ctx->total[0] << 3 );
376
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200377 PUT_UINT32_BE( high, ctx->buffer, 56 );
378 PUT_UINT32_BE( low, ctx->buffer, 60 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000379
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200380 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
Andres Amaya Garciaaa464ef2017-07-21 14:21:53 +0100381 return( ret );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100382
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200383 /*
384 * Output final state
385 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000386 PUT_UINT32_BE( ctx->state[0], output, 0 );
387 PUT_UINT32_BE( ctx->state[1], output, 4 );
388 PUT_UINT32_BE( ctx->state[2], output, 8 );
389 PUT_UINT32_BE( ctx->state[3], output, 12 );
390 PUT_UINT32_BE( ctx->state[4], output, 16 );
391 PUT_UINT32_BE( ctx->state[5], output, 20 );
392 PUT_UINT32_BE( ctx->state[6], output, 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000393
394 if( ctx->is224 == 0 )
Paul Bakker5c2364c2012-10-01 14:41:15 +0000395 PUT_UINT32_BE( ctx->state[7], output, 28 );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100396
397 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000398}
399
Jaeden Amero041039f2018-02-19 15:28:08 +0000400#if !defined(MBEDTLS_DEPRECATED_REMOVED)
401void mbedtls_sha256_finish( mbedtls_sha256_context *ctx,
402 unsigned char output[32] )
403{
404 mbedtls_sha256_finish_ret( ctx, output );
405}
406#endif
407
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200408#endif /* !MBEDTLS_SHA256_ALT */
Paul Bakker90995b52013-06-24 19:20:35 +0200409
Paul Bakker5121ce52009-01-03 21:22:43 +0000410/*
411 * output = SHA-256( input buffer )
412 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100413int mbedtls_sha256_ret( const unsigned char *input,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100414 size_t ilen,
415 unsigned char output[32],
416 int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000417{
Janos Follath24eed8d2019-11-22 13:21:35 +0000418 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200419 mbedtls_sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000420
Hanno Becker8d215e72018-12-18 17:53:21 +0000421 SHA256_VALIDATE_RET( is224 == 0 || is224 == 1 );
422 SHA256_VALIDATE_RET( ilen == 0 || input != NULL );
423 SHA256_VALIDATE_RET( (unsigned char *)output != NULL );
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +0000424
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200425 mbedtls_sha256_init( &ctx );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100426
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100427 if( ( ret = mbedtls_sha256_starts_ret( &ctx, is224 ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100428 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100429
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100430 if( ( ret = mbedtls_sha256_update_ret( &ctx, input, ilen ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100431 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100432
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100433 if( ( ret = mbedtls_sha256_finish_ret( &ctx, output ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100434 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100435
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100436exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200437 mbedtls_sha256_free( &ctx );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100438
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100439 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000440}
441
Jaeden Amero041039f2018-02-19 15:28:08 +0000442#if !defined(MBEDTLS_DEPRECATED_REMOVED)
443void mbedtls_sha256( const unsigned char *input,
444 size_t ilen,
445 unsigned char output[32],
446 int is224 )
447{
448 mbedtls_sha256_ret( input, ilen, output, is224 );
449}
450#endif
451
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200452#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000453/*
454 * FIPS-180-2 test vectors
455 */
Manuel Pégourié-Gonnard28122e42015-03-11 09:13:42 +0000456static const unsigned char sha256_test_buf[3][57] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000457{
458 { "abc" },
459 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
460 { "" }
461};
462
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100463static const size_t sha256_test_buflen[3] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000464{
465 3, 56, 1000
466};
467
Paul Bakker9e36f042013-06-30 14:34:05 +0200468static const unsigned char sha256_test_sum[6][32] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000469{
470 /*
471 * SHA-224 test vectors
472 */
473 { 0x23, 0x09, 0x7D, 0x22, 0x34, 0x05, 0xD8, 0x22,
474 0x86, 0x42, 0xA4, 0x77, 0xBD, 0xA2, 0x55, 0xB3,
475 0x2A, 0xAD, 0xBC, 0xE4, 0xBD, 0xA0, 0xB3, 0xF7,
476 0xE3, 0x6C, 0x9D, 0xA7 },
477 { 0x75, 0x38, 0x8B, 0x16, 0x51, 0x27, 0x76, 0xCC,
478 0x5D, 0xBA, 0x5D, 0xA1, 0xFD, 0x89, 0x01, 0x50,
479 0xB0, 0xC6, 0x45, 0x5C, 0xB4, 0xF5, 0x8B, 0x19,
480 0x52, 0x52, 0x25, 0x25 },
481 { 0x20, 0x79, 0x46, 0x55, 0x98, 0x0C, 0x91, 0xD8,
482 0xBB, 0xB4, 0xC1, 0xEA, 0x97, 0x61, 0x8A, 0x4B,
483 0xF0, 0x3F, 0x42, 0x58, 0x19, 0x48, 0xB2, 0xEE,
484 0x4E, 0xE7, 0xAD, 0x67 },
485
486 /*
487 * SHA-256 test vectors
488 */
489 { 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA,
490 0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23,
491 0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C,
492 0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD },
493 { 0x24, 0x8D, 0x6A, 0x61, 0xD2, 0x06, 0x38, 0xB8,
494 0xE5, 0xC0, 0x26, 0x93, 0x0C, 0x3E, 0x60, 0x39,
495 0xA3, 0x3C, 0xE4, 0x59, 0x64, 0xFF, 0x21, 0x67,
496 0xF6, 0xEC, 0xED, 0xD4, 0x19, 0xDB, 0x06, 0xC1 },
497 { 0xCD, 0xC7, 0x6E, 0x5C, 0x99, 0x14, 0xFB, 0x92,
498 0x81, 0xA1, 0xC7, 0xE2, 0x84, 0xD7, 0x3E, 0x67,
499 0xF1, 0x80, 0x9A, 0x48, 0xA4, 0x97, 0x20, 0x0E,
500 0x04, 0x6D, 0x39, 0xCC, 0xC7, 0x11, 0x2C, 0xD0 }
501};
502
503/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000504 * Checkup routine
505 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200506int mbedtls_sha256_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000507{
Paul Bakker5b4af392014-06-26 12:09:34 +0200508 int i, j, k, buflen, ret = 0;
Russ Butlerbb83b422016-10-12 17:36:50 -0500509 unsigned char *buf;
Paul Bakker9e36f042013-06-30 14:34:05 +0200510 unsigned char sha256sum[32];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200511 mbedtls_sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000512
Russ Butlerbb83b422016-10-12 17:36:50 -0500513 buf = mbedtls_calloc( 1024, sizeof(unsigned char) );
514 if( NULL == buf )
515 {
516 if( verbose != 0 )
517 mbedtls_printf( "Buffer allocation failed\n" );
518
519 return( 1 );
520 }
521
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200522 mbedtls_sha256_init( &ctx );
Paul Bakker5b4af392014-06-26 12:09:34 +0200523
Paul Bakker5121ce52009-01-03 21:22:43 +0000524 for( i = 0; i < 6; i++ )
525 {
526 j = i % 3;
527 k = i < 3;
528
529 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200530 mbedtls_printf( " SHA-%d test #%d: ", 256 - k * 32, j + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000531
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100532 if( ( ret = mbedtls_sha256_starts_ret( &ctx, k ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100533 goto fail;
Paul Bakker5121ce52009-01-03 21:22:43 +0000534
535 if( j == 2 )
536 {
537 memset( buf, 'a', buflen = 1000 );
538
539 for( j = 0; j < 1000; j++ )
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100540 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100541 ret = mbedtls_sha256_update_ret( &ctx, buf, buflen );
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100542 if( ret != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100543 goto fail;
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100544 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100545
Paul Bakker5121ce52009-01-03 21:22:43 +0000546 }
547 else
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100548 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100549 ret = mbedtls_sha256_update_ret( &ctx, sha256_test_buf[j],
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100550 sha256_test_buflen[j] );
551 if( ret != 0 )
552 goto fail;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100553 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000554
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100555 if( ( ret = mbedtls_sha256_finish_ret( &ctx, sha256sum ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100556 goto fail;
557
Paul Bakker5121ce52009-01-03 21:22:43 +0000558
Paul Bakker9e36f042013-06-30 14:34:05 +0200559 if( memcmp( sha256sum, sha256_test_sum[i], 32 - k * 4 ) != 0 )
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100560 {
561 ret = 1;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100562 goto fail;
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100563 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000564
565 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200566 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000567 }
568
569 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200570 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000571
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100572 goto exit;
573
574fail:
575 if( verbose != 0 )
576 mbedtls_printf( "failed\n" );
577
Paul Bakker5b4af392014-06-26 12:09:34 +0200578exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200579 mbedtls_sha256_free( &ctx );
Russ Butlerbb83b422016-10-12 17:36:50 -0500580 mbedtls_free( buf );
Paul Bakker5b4af392014-06-26 12:09:34 +0200581
582 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000583}
584
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200585#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000586
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200587#endif /* MBEDTLS_SHA256_C */