blob: 2dc0e1a2c9cbe4aab63432ae7700f8ac6b90b9b7 [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"
Paul Bakker5121ce52009-01-03 21:22:43 +000037
Rich Evans00ab4702015-02-06 13:43:58 +000038#include <string.h>
39
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020040#if defined(MBEDTLS_SELF_TEST)
41#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000042#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010043#else
Rich Evans00ab4702015-02-06 13:43:58 +000044#include <stdio.h>
Russ Butlerbb83b422016-10-12 17:36:50 -050045#include <stdlib.h>
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020046#define mbedtls_printf printf
Russ Butlerbb83b422016-10-12 17:36:50 -050047#define mbedtls_calloc calloc
48#define mbedtls_free free
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020049#endif /* MBEDTLS_PLATFORM_C */
50#endif /* MBEDTLS_SELF_TEST */
Paul Bakker7dc4c442014-02-01 22:50:26 +010051
Hanno Becker2f6de422018-12-20 10:22:32 +000052#define SHA256_VALIDATE_RET(cond) \
53 MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_SHA256_BAD_INPUT_DATA )
54#define SHA256_VALIDATE(cond) MBEDTLS_INTERNAL_VALIDATE( cond )
55
Manuel Pégourié-Gonnard8b2641d2015-08-27 20:03:46 +020056#if !defined(MBEDTLS_SHA256_ALT)
57
Paul Bakker5121ce52009-01-03 21:22:43 +000058/*
59 * 32-bit integer manipulation macros (big endian)
60 */
Paul Bakker5c2364c2012-10-01 14:41:15 +000061#ifndef GET_UINT32_BE
62#define GET_UINT32_BE(n,b,i) \
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +020063do { \
Paul Bakker5c2364c2012-10-01 14:41:15 +000064 (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
65 | ( (uint32_t) (b)[(i) + 1] << 16 ) \
66 | ( (uint32_t) (b)[(i) + 2] << 8 ) \
67 | ( (uint32_t) (b)[(i) + 3] ); \
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +020068} while( 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +000069#endif
70
Paul Bakker5c2364c2012-10-01 14:41:15 +000071#ifndef PUT_UINT32_BE
72#define PUT_UINT32_BE(n,b,i) \
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +020073do { \
Paul Bakker5121ce52009-01-03 21:22:43 +000074 (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
75 (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
76 (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
77 (b)[(i) + 3] = (unsigned char) ( (n) ); \
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +020078} while( 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +000079#endif
80
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020081void mbedtls_sha256_init( mbedtls_sha256_context *ctx )
Paul Bakker5b4af392014-06-26 12:09:34 +020082{
Hanno Becker8d215e72018-12-18 17:53:21 +000083 SHA256_VALIDATE( ctx != NULL );
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +000084
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020085 memset( ctx, 0, sizeof( mbedtls_sha256_context ) );
Paul Bakker5b4af392014-06-26 12:09:34 +020086}
87
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020088void mbedtls_sha256_free( mbedtls_sha256_context *ctx )
Paul Bakker5b4af392014-06-26 12:09:34 +020089{
90 if( ctx == NULL )
91 return;
92
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050093 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_sha256_context ) );
Paul Bakker5b4af392014-06-26 12:09:34 +020094}
95
Manuel Pégourié-Gonnard16d412f2015-07-06 15:26:26 +020096void mbedtls_sha256_clone( mbedtls_sha256_context *dst,
97 const mbedtls_sha256_context *src )
98{
Hanno Becker8d215e72018-12-18 17:53:21 +000099 SHA256_VALIDATE( dst != NULL );
100 SHA256_VALIDATE( src != NULL );
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +0000101
Manuel Pégourié-Gonnard16d412f2015-07-06 15:26:26 +0200102 *dst = *src;
103}
104
Paul Bakker5121ce52009-01-03 21:22:43 +0000105/*
106 * SHA-256 context setup
107 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100108int mbedtls_sha256_starts_ret( mbedtls_sha256_context *ctx, int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000109{
Hanno Becker8d215e72018-12-18 17:53:21 +0000110 SHA256_VALIDATE_RET( ctx != NULL );
111 SHA256_VALIDATE_RET( is224 == 0 || is224 == 1 );
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +0000112
Paul Bakker5121ce52009-01-03 21:22:43 +0000113 ctx->total[0] = 0;
114 ctx->total[1] = 0;
115
116 if( is224 == 0 )
117 {
118 /* SHA-256 */
119 ctx->state[0] = 0x6A09E667;
120 ctx->state[1] = 0xBB67AE85;
121 ctx->state[2] = 0x3C6EF372;
122 ctx->state[3] = 0xA54FF53A;
123 ctx->state[4] = 0x510E527F;
124 ctx->state[5] = 0x9B05688C;
125 ctx->state[6] = 0x1F83D9AB;
126 ctx->state[7] = 0x5BE0CD19;
127 }
128 else
129 {
130 /* SHA-224 */
131 ctx->state[0] = 0xC1059ED8;
132 ctx->state[1] = 0x367CD507;
133 ctx->state[2] = 0x3070DD17;
134 ctx->state[3] = 0xF70E5939;
135 ctx->state[4] = 0xFFC00B31;
136 ctx->state[5] = 0x68581511;
137 ctx->state[6] = 0x64F98FA7;
138 ctx->state[7] = 0xBEFA4FA4;
139 }
140
141 ctx->is224 = is224;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100142
143 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000144}
145
Jaeden Amero041039f2018-02-19 15:28:08 +0000146#if !defined(MBEDTLS_DEPRECATED_REMOVED)
147void mbedtls_sha256_starts( mbedtls_sha256_context *ctx,
148 int is224 )
149{
150 mbedtls_sha256_starts_ret( ctx, is224 );
151}
152#endif
153
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200154#if !defined(MBEDTLS_SHA256_PROCESS_ALT)
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200155static const uint32_t K[] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000156{
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200157 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,
158 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,
159 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,
160 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,
161 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,
162 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,
163 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,
164 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,
165 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,
166 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,
167 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,
168 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,
169 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,
170 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,
171 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,
172 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2,
173};
Paul Bakker5121ce52009-01-03 21:22:43 +0000174
Hanno Becker1eeca412018-10-15 12:01:35 +0100175#define SHR(x,n) (((x) & 0xFFFFFFFF) >> (n))
176#define ROTR(x,n) (SHR(x,n) | ((x) << (32 - (n))))
Paul Bakker5121ce52009-01-03 21:22:43 +0000177
178#define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^ SHR(x, 3))
179#define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^ SHR(x,10))
180
181#define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22))
182#define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25))
183
Hanno Becker1eeca412018-10-15 12:01:35 +0100184#define F0(x,y,z) (((x) & (y)) | ((z) & ((x) | (y))))
185#define F1(x,y,z) ((z) ^ ((x) & ((y) ^ (z))))
Paul Bakker5121ce52009-01-03 21:22:43 +0000186
187#define R(t) \
Hanno Becker1eeca412018-10-15 12:01:35 +0100188 ( \
189 W[t] = S1(W[(t) - 2]) + W[(t) - 7] + \
190 S0(W[(t) - 15]) + W[(t) - 16] \
191 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000192
Hanno Becker1eeca412018-10-15 12:01:35 +0100193#define P(a,b,c,d,e,f,g,h,x,K) \
194 do \
195 { \
Hanno Becker818bac52018-10-26 09:13:26 +0100196 temp1 = (h) + S3(e) + F1((e),(f),(g)) + (K) + (x); \
197 temp2 = S2(a) + F0((a),(b),(c)); \
Hanno Becker1eeca412018-10-15 12:01:35 +0100198 (d) += temp1; (h) = temp1 + temp2; \
199 } while( 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000200
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100201int mbedtls_internal_sha256_process( mbedtls_sha256_context *ctx,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100202 const unsigned char data[64] )
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200203{
204 uint32_t temp1, temp2, W[64];
205 uint32_t A[8];
206 unsigned int i;
Paul Bakker5121ce52009-01-03 21:22:43 +0000207
Hanno Becker8d215e72018-12-18 17:53:21 +0000208 SHA256_VALIDATE_RET( ctx != NULL );
209 SHA256_VALIDATE_RET( (const unsigned char *)data != NULL );
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +0000210
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200211 for( i = 0; i < 8; i++ )
212 A[i] = ctx->state[i];
213
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200214#if defined(MBEDTLS_SHA256_SMALLER)
215 for( i = 0; i < 64; i++ )
216 {
217 if( i < 16 )
218 GET_UINT32_BE( W[i], data, 4 * i );
219 else
220 R( i );
221
222 P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], W[i], K[i] );
223
224 temp1 = A[7]; A[7] = A[6]; A[6] = A[5]; A[5] = A[4]; A[4] = A[3];
225 A[3] = A[2]; A[2] = A[1]; A[1] = A[0]; A[0] = temp1;
226 }
227#else /* MBEDTLS_SHA256_SMALLER */
228 for( i = 0; i < 16; i++ )
229 GET_UINT32_BE( W[i], data, 4 * i );
230
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200231 for( i = 0; i < 16; i += 8 )
232 {
233 P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], W[i+0], K[i+0] );
234 P( A[7], A[0], A[1], A[2], A[3], A[4], A[5], A[6], W[i+1], K[i+1] );
235 P( A[6], A[7], A[0], A[1], A[2], A[3], A[4], A[5], W[i+2], K[i+2] );
236 P( A[5], A[6], A[7], A[0], A[1], A[2], A[3], A[4], W[i+3], K[i+3] );
237 P( A[4], A[5], A[6], A[7], A[0], A[1], A[2], A[3], W[i+4], K[i+4] );
238 P( A[3], A[4], A[5], A[6], A[7], A[0], A[1], A[2], W[i+5], K[i+5] );
239 P( A[2], A[3], A[4], A[5], A[6], A[7], A[0], A[1], W[i+6], K[i+6] );
240 P( A[1], A[2], A[3], A[4], A[5], A[6], A[7], A[0], W[i+7], K[i+7] );
241 }
242
243 for( i = 16; i < 64; i += 8 )
244 {
245 P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], R(i+0), K[i+0] );
246 P( A[7], A[0], A[1], A[2], A[3], A[4], A[5], A[6], R(i+1), K[i+1] );
247 P( A[6], A[7], A[0], A[1], A[2], A[3], A[4], A[5], R(i+2), K[i+2] );
248 P( A[5], A[6], A[7], A[0], A[1], A[2], A[3], A[4], R(i+3), K[i+3] );
249 P( A[4], A[5], A[6], A[7], A[0], A[1], A[2], A[3], R(i+4), K[i+4] );
250 P( A[3], A[4], A[5], A[6], A[7], A[0], A[1], A[2], R(i+5), K[i+5] );
251 P( A[2], A[3], A[4], A[5], A[6], A[7], A[0], A[1], R(i+6), K[i+6] );
252 P( A[1], A[2], A[3], A[4], A[5], A[6], A[7], A[0], R(i+7), K[i+7] );
253 }
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200254#endif /* MBEDTLS_SHA256_SMALLER */
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200255
256 for( i = 0; i < 8; i++ )
257 ctx->state[i] += A[i];
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100258
259 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000260}
Jaeden Amero041039f2018-02-19 15:28:08 +0000261
262#if !defined(MBEDTLS_DEPRECATED_REMOVED)
263void mbedtls_sha256_process( mbedtls_sha256_context *ctx,
264 const unsigned char data[64] )
265{
266 mbedtls_internal_sha256_process( ctx, data );
267}
268#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200269#endif /* !MBEDTLS_SHA256_PROCESS_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000270
271/*
272 * SHA-256 process buffer
273 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100274int mbedtls_sha256_update_ret( mbedtls_sha256_context *ctx,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100275 const unsigned char *input,
276 size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000277{
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100278 int ret;
Paul Bakker23986e52011-04-24 08:57:21 +0000279 size_t fill;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000280 uint32_t left;
Paul Bakker5121ce52009-01-03 21:22:43 +0000281
Hanno Becker8d215e72018-12-18 17:53:21 +0000282 SHA256_VALIDATE_RET( ctx != NULL );
283 SHA256_VALIDATE_RET( ilen == 0 || input != NULL );
Hanno Becker596e0142018-12-18 15:00:38 +0000284
Brian White12895d12014-04-11 11:29:42 -0400285 if( ilen == 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100286 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000287
288 left = ctx->total[0] & 0x3F;
289 fill = 64 - left;
290
Paul Bakker5c2364c2012-10-01 14:41:15 +0000291 ctx->total[0] += (uint32_t) ilen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000292 ctx->total[0] &= 0xFFFFFFFF;
293
Paul Bakker5c2364c2012-10-01 14:41:15 +0000294 if( ctx->total[0] < (uint32_t) ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000295 ctx->total[1]++;
296
297 if( left && ilen >= fill )
298 {
Paul Bakker3c2122f2013-06-24 19:03:14 +0200299 memcpy( (void *) (ctx->buffer + left), input, fill );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100300
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100301 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100302 return( ret );
303
Paul Bakker5121ce52009-01-03 21:22:43 +0000304 input += fill;
305 ilen -= fill;
306 left = 0;
307 }
308
309 while( ilen >= 64 )
310 {
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100311 if( ( ret = mbedtls_internal_sha256_process( ctx, input ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100312 return( ret );
313
Paul Bakker5121ce52009-01-03 21:22:43 +0000314 input += 64;
315 ilen -= 64;
316 }
317
318 if( ilen > 0 )
Paul Bakker3c2122f2013-06-24 19:03:14 +0200319 memcpy( (void *) (ctx->buffer + left), input, ilen );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100320
321 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000322}
323
Jaeden Amero041039f2018-02-19 15:28:08 +0000324#if !defined(MBEDTLS_DEPRECATED_REMOVED)
325void mbedtls_sha256_update( mbedtls_sha256_context *ctx,
326 const unsigned char *input,
327 size_t ilen )
328{
329 mbedtls_sha256_update_ret( ctx, input, ilen );
330}
331#endif
332
Paul Bakker5121ce52009-01-03 21:22:43 +0000333/*
334 * SHA-256 final digest
335 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100336int mbedtls_sha256_finish_ret( mbedtls_sha256_context *ctx,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100337 unsigned char output[32] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000338{
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100339 int ret;
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200340 uint32_t used;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000341 uint32_t high, low;
Paul Bakker5121ce52009-01-03 21:22:43 +0000342
Hanno Becker8d215e72018-12-18 17:53:21 +0000343 SHA256_VALIDATE_RET( ctx != NULL );
344 SHA256_VALIDATE_RET( (unsigned char *)output != NULL );
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +0000345
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200346 /*
347 * Add padding: 0x80 then 0x00 until 8 bytes remain for the length
348 */
349 used = ctx->total[0] & 0x3F;
350
351 ctx->buffer[used++] = 0x80;
352
353 if( used <= 56 )
354 {
355 /* Enough room for padding + length in current block */
356 memset( ctx->buffer + used, 0, 56 - used );
357 }
358 else
359 {
360 /* We'll need an extra block */
361 memset( ctx->buffer + used, 0, 64 - used );
362
363 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
364 return( ret );
365
366 memset( ctx->buffer, 0, 56 );
367 }
368
369 /*
370 * Add message length
371 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000372 high = ( ctx->total[0] >> 29 )
373 | ( ctx->total[1] << 3 );
374 low = ( ctx->total[0] << 3 );
375
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200376 PUT_UINT32_BE( high, ctx->buffer, 56 );
377 PUT_UINT32_BE( low, ctx->buffer, 60 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000378
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200379 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
Andres Amaya Garciaaa464ef2017-07-21 14:21:53 +0100380 return( ret );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100381
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200382 /*
383 * Output final state
384 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000385 PUT_UINT32_BE( ctx->state[0], output, 0 );
386 PUT_UINT32_BE( ctx->state[1], output, 4 );
387 PUT_UINT32_BE( ctx->state[2], output, 8 );
388 PUT_UINT32_BE( ctx->state[3], output, 12 );
389 PUT_UINT32_BE( ctx->state[4], output, 16 );
390 PUT_UINT32_BE( ctx->state[5], output, 20 );
391 PUT_UINT32_BE( ctx->state[6], output, 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000392
393 if( ctx->is224 == 0 )
Paul Bakker5c2364c2012-10-01 14:41:15 +0000394 PUT_UINT32_BE( ctx->state[7], output, 28 );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100395
396 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000397}
398
Jaeden Amero041039f2018-02-19 15:28:08 +0000399#if !defined(MBEDTLS_DEPRECATED_REMOVED)
400void mbedtls_sha256_finish( mbedtls_sha256_context *ctx,
401 unsigned char output[32] )
402{
403 mbedtls_sha256_finish_ret( ctx, output );
404}
405#endif
406
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200407#endif /* !MBEDTLS_SHA256_ALT */
Paul Bakker90995b52013-06-24 19:20:35 +0200408
Paul Bakker5121ce52009-01-03 21:22:43 +0000409/*
410 * output = SHA-256( input buffer )
411 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100412int mbedtls_sha256_ret( const unsigned char *input,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100413 size_t ilen,
414 unsigned char output[32],
415 int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000416{
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100417 int ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200418 mbedtls_sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000419
Hanno Becker8d215e72018-12-18 17:53:21 +0000420 SHA256_VALIDATE_RET( is224 == 0 || is224 == 1 );
421 SHA256_VALIDATE_RET( ilen == 0 || input != NULL );
422 SHA256_VALIDATE_RET( (unsigned char *)output != NULL );
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +0000423
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200424 mbedtls_sha256_init( &ctx );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100425
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100426 if( ( ret = mbedtls_sha256_starts_ret( &ctx, is224 ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100427 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100428
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100429 if( ( ret = mbedtls_sha256_update_ret( &ctx, input, ilen ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100430 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100431
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100432 if( ( ret = mbedtls_sha256_finish_ret( &ctx, output ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100433 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100434
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100435exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200436 mbedtls_sha256_free( &ctx );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100437
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100438 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000439}
440
Jaeden Amero041039f2018-02-19 15:28:08 +0000441#if !defined(MBEDTLS_DEPRECATED_REMOVED)
442void mbedtls_sha256( const unsigned char *input,
443 size_t ilen,
444 unsigned char output[32],
445 int is224 )
446{
447 mbedtls_sha256_ret( input, ilen, output, is224 );
448}
449#endif
450
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200451#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000452/*
453 * FIPS-180-2 test vectors
454 */
Manuel Pégourié-Gonnard28122e42015-03-11 09:13:42 +0000455static const unsigned char sha256_test_buf[3][57] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000456{
457 { "abc" },
458 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
459 { "" }
460};
461
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100462static const size_t sha256_test_buflen[3] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000463{
464 3, 56, 1000
465};
466
Paul Bakker9e36f042013-06-30 14:34:05 +0200467static const unsigned char sha256_test_sum[6][32] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000468{
469 /*
470 * SHA-224 test vectors
471 */
472 { 0x23, 0x09, 0x7D, 0x22, 0x34, 0x05, 0xD8, 0x22,
473 0x86, 0x42, 0xA4, 0x77, 0xBD, 0xA2, 0x55, 0xB3,
474 0x2A, 0xAD, 0xBC, 0xE4, 0xBD, 0xA0, 0xB3, 0xF7,
475 0xE3, 0x6C, 0x9D, 0xA7 },
476 { 0x75, 0x38, 0x8B, 0x16, 0x51, 0x27, 0x76, 0xCC,
477 0x5D, 0xBA, 0x5D, 0xA1, 0xFD, 0x89, 0x01, 0x50,
478 0xB0, 0xC6, 0x45, 0x5C, 0xB4, 0xF5, 0x8B, 0x19,
479 0x52, 0x52, 0x25, 0x25 },
480 { 0x20, 0x79, 0x46, 0x55, 0x98, 0x0C, 0x91, 0xD8,
481 0xBB, 0xB4, 0xC1, 0xEA, 0x97, 0x61, 0x8A, 0x4B,
482 0xF0, 0x3F, 0x42, 0x58, 0x19, 0x48, 0xB2, 0xEE,
483 0x4E, 0xE7, 0xAD, 0x67 },
484
485 /*
486 * SHA-256 test vectors
487 */
488 { 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA,
489 0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23,
490 0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C,
491 0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD },
492 { 0x24, 0x8D, 0x6A, 0x61, 0xD2, 0x06, 0x38, 0xB8,
493 0xE5, 0xC0, 0x26, 0x93, 0x0C, 0x3E, 0x60, 0x39,
494 0xA3, 0x3C, 0xE4, 0x59, 0x64, 0xFF, 0x21, 0x67,
495 0xF6, 0xEC, 0xED, 0xD4, 0x19, 0xDB, 0x06, 0xC1 },
496 { 0xCD, 0xC7, 0x6E, 0x5C, 0x99, 0x14, 0xFB, 0x92,
497 0x81, 0xA1, 0xC7, 0xE2, 0x84, 0xD7, 0x3E, 0x67,
498 0xF1, 0x80, 0x9A, 0x48, 0xA4, 0x97, 0x20, 0x0E,
499 0x04, 0x6D, 0x39, 0xCC, 0xC7, 0x11, 0x2C, 0xD0 }
500};
501
502/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000503 * Checkup routine
504 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200505int mbedtls_sha256_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000506{
Paul Bakker5b4af392014-06-26 12:09:34 +0200507 int i, j, k, buflen, ret = 0;
Russ Butlerbb83b422016-10-12 17:36:50 -0500508 unsigned char *buf;
Paul Bakker9e36f042013-06-30 14:34:05 +0200509 unsigned char sha256sum[32];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200510 mbedtls_sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000511
Russ Butlerbb83b422016-10-12 17:36:50 -0500512 buf = mbedtls_calloc( 1024, sizeof(unsigned char) );
513 if( NULL == buf )
514 {
515 if( verbose != 0 )
516 mbedtls_printf( "Buffer allocation failed\n" );
517
518 return( 1 );
519 }
520
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200521 mbedtls_sha256_init( &ctx );
Paul Bakker5b4af392014-06-26 12:09:34 +0200522
Paul Bakker5121ce52009-01-03 21:22:43 +0000523 for( i = 0; i < 6; i++ )
524 {
525 j = i % 3;
526 k = i < 3;
527
528 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200529 mbedtls_printf( " SHA-%d test #%d: ", 256 - k * 32, j + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000530
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100531 if( ( ret = mbedtls_sha256_starts_ret( &ctx, k ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100532 goto fail;
Paul Bakker5121ce52009-01-03 21:22:43 +0000533
534 if( j == 2 )
535 {
536 memset( buf, 'a', buflen = 1000 );
537
538 for( j = 0; j < 1000; j++ )
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100539 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100540 ret = mbedtls_sha256_update_ret( &ctx, buf, buflen );
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100541 if( ret != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100542 goto fail;
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100543 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100544
Paul Bakker5121ce52009-01-03 21:22:43 +0000545 }
546 else
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100547 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100548 ret = mbedtls_sha256_update_ret( &ctx, sha256_test_buf[j],
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100549 sha256_test_buflen[j] );
550 if( ret != 0 )
551 goto fail;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100552 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000553
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100554 if( ( ret = mbedtls_sha256_finish_ret( &ctx, sha256sum ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100555 goto fail;
556
Paul Bakker5121ce52009-01-03 21:22:43 +0000557
Paul Bakker9e36f042013-06-30 14:34:05 +0200558 if( memcmp( sha256sum, sha256_test_sum[i], 32 - k * 4 ) != 0 )
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100559 {
560 ret = 1;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100561 goto fail;
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100562 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000563
564 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200565 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000566 }
567
568 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200569 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000570
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100571 goto exit;
572
573fail:
574 if( verbose != 0 )
575 mbedtls_printf( "failed\n" );
576
Paul Bakker5b4af392014-06-26 12:09:34 +0200577exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200578 mbedtls_sha256_free( &ctx );
Russ Butlerbb83b422016-10-12 17:36:50 -0500579 mbedtls_free( buf );
Paul Bakker5b4af392014-06-26 12:09:34 +0200580
581 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000582}
583
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200584#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000585
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200586#endif /* MBEDTLS_SHA256_C */