blob: 5092091e60d029459055229d6e1539bc48434916 [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
Manuel Pégourié-Gonnard8b2641d2015-08-27 20:03:46 +020052#if !defined(MBEDTLS_SHA256_ALT)
53
Paul Bakker5121ce52009-01-03 21:22:43 +000054/*
55 * 32-bit integer manipulation macros (big endian)
56 */
Paul Bakker5c2364c2012-10-01 14:41:15 +000057#ifndef GET_UINT32_BE
58#define GET_UINT32_BE(n,b,i) \
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +020059do { \
Paul Bakker5c2364c2012-10-01 14:41:15 +000060 (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
61 | ( (uint32_t) (b)[(i) + 1] << 16 ) \
62 | ( (uint32_t) (b)[(i) + 2] << 8 ) \
63 | ( (uint32_t) (b)[(i) + 3] ); \
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +020064} while( 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +000065#endif
66
Paul Bakker5c2364c2012-10-01 14:41:15 +000067#ifndef PUT_UINT32_BE
68#define PUT_UINT32_BE(n,b,i) \
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +020069do { \
Paul Bakker5121ce52009-01-03 21:22:43 +000070 (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
71 (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
72 (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
73 (b)[(i) + 3] = (unsigned char) ( (n) ); \
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +020074} while( 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +000075#endif
76
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +000077#define MBEDTLS_SHA256_VALIDATE_RET(cond) \
Hanno Becker230b4f42018-12-18 14:58:32 +000078 MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_SHA256_BAD_INPUT_DATA )
79#define MBEDTLS_SHA256_VALIDATE(cond) MBEDTLS_INTERNAL_VALIDATE( cond )
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +000080
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{
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +000083 MBEDTLS_SHA256_VALIDATE( ctx != NULL );
84
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{
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +000099 MBEDTLS_SHA256_VALIDATE( dst != NULL );
100 MBEDTLS_SHA256_VALIDATE( src != NULL );
101
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{
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +0000110 MBEDTLS_SHA256_VALIDATE( ctx != NULL );
111
Paul Bakker5121ce52009-01-03 21:22:43 +0000112 ctx->total[0] = 0;
113 ctx->total[1] = 0;
114
115 if( is224 == 0 )
116 {
117 /* SHA-256 */
118 ctx->state[0] = 0x6A09E667;
119 ctx->state[1] = 0xBB67AE85;
120 ctx->state[2] = 0x3C6EF372;
121 ctx->state[3] = 0xA54FF53A;
122 ctx->state[4] = 0x510E527F;
123 ctx->state[5] = 0x9B05688C;
124 ctx->state[6] = 0x1F83D9AB;
125 ctx->state[7] = 0x5BE0CD19;
126 }
127 else
128 {
129 /* SHA-224 */
130 ctx->state[0] = 0xC1059ED8;
131 ctx->state[1] = 0x367CD507;
132 ctx->state[2] = 0x3070DD17;
133 ctx->state[3] = 0xF70E5939;
134 ctx->state[4] = 0xFFC00B31;
135 ctx->state[5] = 0x68581511;
136 ctx->state[6] = 0x64F98FA7;
137 ctx->state[7] = 0xBEFA4FA4;
138 }
139
140 ctx->is224 = is224;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100141
142 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000143}
144
Jaeden Amero041039f2018-02-19 15:28:08 +0000145#if !defined(MBEDTLS_DEPRECATED_REMOVED)
146void mbedtls_sha256_starts( mbedtls_sha256_context *ctx,
147 int is224 )
148{
149 mbedtls_sha256_starts_ret( ctx, is224 );
150}
151#endif
152
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200153#if !defined(MBEDTLS_SHA256_PROCESS_ALT)
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200154static const uint32_t K[] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000155{
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200156 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,
157 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,
158 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,
159 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,
160 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,
161 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,
162 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,
163 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,
164 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,
165 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,
166 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,
167 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,
168 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,
169 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,
170 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,
171 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2,
172};
Paul Bakker5121ce52009-01-03 21:22:43 +0000173
174#define SHR(x,n) ((x & 0xFFFFFFFF) >> n)
175#define ROTR(x,n) (SHR(x,n) | (x << (32 - n)))
176
177#define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^ SHR(x, 3))
178#define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^ SHR(x,10))
179
180#define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22))
181#define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25))
182
183#define F0(x,y,z) ((x & y) | (z & (x | y)))
184#define F1(x,y,z) (z ^ (x & (y ^ z)))
185
186#define R(t) \
187( \
188 W[t] = S1(W[t - 2]) + W[t - 7] + \
189 S0(W[t - 15]) + W[t - 16] \
190)
191
192#define P(a,b,c,d,e,f,g,h,x,K) \
193{ \
194 temp1 = h + S3(e) + F1(e,f,g) + K + x; \
195 temp2 = S2(a) + F0(a,b,c); \
196 d += temp1; h = temp1 + temp2; \
197}
198
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100199int mbedtls_internal_sha256_process( mbedtls_sha256_context *ctx,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100200 const unsigned char data[64] )
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200201{
202 uint32_t temp1, temp2, W[64];
203 uint32_t A[8];
204 unsigned int i;
Paul Bakker5121ce52009-01-03 21:22:43 +0000205
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +0000206 MBEDTLS_SHA256_VALIDATE_RET( ctx != NULL );
207 MBEDTLS_SHA256_VALIDATE_RET( (const unsigned char *)data != NULL );
208
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200209 for( i = 0; i < 8; i++ )
210 A[i] = ctx->state[i];
211
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200212#if defined(MBEDTLS_SHA256_SMALLER)
213 for( i = 0; i < 64; i++ )
214 {
215 if( i < 16 )
216 GET_UINT32_BE( W[i], data, 4 * i );
217 else
218 R( i );
219
220 P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], W[i], K[i] );
221
222 temp1 = A[7]; A[7] = A[6]; A[6] = A[5]; A[5] = A[4]; A[4] = A[3];
223 A[3] = A[2]; A[2] = A[1]; A[1] = A[0]; A[0] = temp1;
224 }
225#else /* MBEDTLS_SHA256_SMALLER */
226 for( i = 0; i < 16; i++ )
227 GET_UINT32_BE( W[i], data, 4 * i );
228
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200229 for( i = 0; i < 16; i += 8 )
230 {
231 P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], W[i+0], K[i+0] );
232 P( A[7], A[0], A[1], A[2], A[3], A[4], A[5], A[6], W[i+1], K[i+1] );
233 P( A[6], A[7], A[0], A[1], A[2], A[3], A[4], A[5], W[i+2], K[i+2] );
234 P( A[5], A[6], A[7], A[0], A[1], A[2], A[3], A[4], W[i+3], K[i+3] );
235 P( A[4], A[5], A[6], A[7], A[0], A[1], A[2], A[3], W[i+4], K[i+4] );
236 P( A[3], A[4], A[5], A[6], A[7], A[0], A[1], A[2], W[i+5], K[i+5] );
237 P( A[2], A[3], A[4], A[5], A[6], A[7], A[0], A[1], W[i+6], K[i+6] );
238 P( A[1], A[2], A[3], A[4], A[5], A[6], A[7], A[0], W[i+7], K[i+7] );
239 }
240
241 for( i = 16; i < 64; i += 8 )
242 {
243 P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], R(i+0), K[i+0] );
244 P( A[7], A[0], A[1], A[2], A[3], A[4], A[5], A[6], R(i+1), K[i+1] );
245 P( A[6], A[7], A[0], A[1], A[2], A[3], A[4], A[5], R(i+2), K[i+2] );
246 P( A[5], A[6], A[7], A[0], A[1], A[2], A[3], A[4], R(i+3), K[i+3] );
247 P( A[4], A[5], A[6], A[7], A[0], A[1], A[2], A[3], R(i+4), K[i+4] );
248 P( A[3], A[4], A[5], A[6], A[7], A[0], A[1], A[2], R(i+5), K[i+5] );
249 P( A[2], A[3], A[4], A[5], A[6], A[7], A[0], A[1], R(i+6), K[i+6] );
250 P( A[1], A[2], A[3], A[4], A[5], A[6], A[7], A[0], R(i+7), K[i+7] );
251 }
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200252#endif /* MBEDTLS_SHA256_SMALLER */
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200253
254 for( i = 0; i < 8; i++ )
255 ctx->state[i] += A[i];
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100256
257 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000258}
Jaeden Amero041039f2018-02-19 15:28:08 +0000259
260#if !defined(MBEDTLS_DEPRECATED_REMOVED)
261void mbedtls_sha256_process( mbedtls_sha256_context *ctx,
262 const unsigned char data[64] )
263{
264 mbedtls_internal_sha256_process( ctx, data );
265}
266#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200267#endif /* !MBEDTLS_SHA256_PROCESS_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000268
269/*
270 * SHA-256 process buffer
271 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100272int mbedtls_sha256_update_ret( mbedtls_sha256_context *ctx,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100273 const unsigned char *input,
274 size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000275{
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100276 int ret;
Paul Bakker23986e52011-04-24 08:57:21 +0000277 size_t fill;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000278 uint32_t left;
Paul Bakker5121ce52009-01-03 21:22:43 +0000279
Brian White12895d12014-04-11 11:29:42 -0400280 if( ilen == 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100281 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000282
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +0000283 MBEDTLS_SHA256_VALIDATE_RET( ctx != NULL );
284 MBEDTLS_SHA256_VALIDATE_RET( input != NULL );
285
Paul Bakker5121ce52009-01-03 21:22:43 +0000286 left = ctx->total[0] & 0x3F;
287 fill = 64 - left;
288
Paul Bakker5c2364c2012-10-01 14:41:15 +0000289 ctx->total[0] += (uint32_t) ilen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000290 ctx->total[0] &= 0xFFFFFFFF;
291
Paul Bakker5c2364c2012-10-01 14:41:15 +0000292 if( ctx->total[0] < (uint32_t) ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000293 ctx->total[1]++;
294
295 if( left && ilen >= fill )
296 {
Paul Bakker3c2122f2013-06-24 19:03:14 +0200297 memcpy( (void *) (ctx->buffer + left), input, fill );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100298
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100299 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100300 return( ret );
301
Paul Bakker5121ce52009-01-03 21:22:43 +0000302 input += fill;
303 ilen -= fill;
304 left = 0;
305 }
306
307 while( ilen >= 64 )
308 {
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100309 if( ( ret = mbedtls_internal_sha256_process( ctx, input ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100310 return( ret );
311
Paul Bakker5121ce52009-01-03 21:22:43 +0000312 input += 64;
313 ilen -= 64;
314 }
315
316 if( ilen > 0 )
Paul Bakker3c2122f2013-06-24 19:03:14 +0200317 memcpy( (void *) (ctx->buffer + left), input, ilen );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100318
319 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000320}
321
Jaeden Amero041039f2018-02-19 15:28:08 +0000322#if !defined(MBEDTLS_DEPRECATED_REMOVED)
323void mbedtls_sha256_update( mbedtls_sha256_context *ctx,
324 const unsigned char *input,
325 size_t ilen )
326{
327 mbedtls_sha256_update_ret( ctx, input, ilen );
328}
329#endif
330
Paul Bakker5121ce52009-01-03 21:22:43 +0000331/*
332 * SHA-256 final digest
333 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100334int mbedtls_sha256_finish_ret( mbedtls_sha256_context *ctx,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100335 unsigned char output[32] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000336{
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100337 int ret;
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200338 uint32_t used;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000339 uint32_t high, low;
Paul Bakker5121ce52009-01-03 21:22:43 +0000340
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +0000341 MBEDTLS_SHA256_VALIDATE_RET( ctx != NULL );
342 MBEDTLS_SHA256_VALIDATE_RET( (unsigned char *)output != NULL );
343
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200344 /*
345 * Add padding: 0x80 then 0x00 until 8 bytes remain for the length
346 */
347 used = ctx->total[0] & 0x3F;
348
349 ctx->buffer[used++] = 0x80;
350
351 if( used <= 56 )
352 {
353 /* Enough room for padding + length in current block */
354 memset( ctx->buffer + used, 0, 56 - used );
355 }
356 else
357 {
358 /* We'll need an extra block */
359 memset( ctx->buffer + used, 0, 64 - used );
360
361 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
362 return( ret );
363
364 memset( ctx->buffer, 0, 56 );
365 }
366
367 /*
368 * Add message length
369 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000370 high = ( ctx->total[0] >> 29 )
371 | ( ctx->total[1] << 3 );
372 low = ( ctx->total[0] << 3 );
373
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200374 PUT_UINT32_BE( high, ctx->buffer, 56 );
375 PUT_UINT32_BE( low, ctx->buffer, 60 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000376
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200377 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
Andres Amaya Garciaaa464ef2017-07-21 14:21:53 +0100378 return( ret );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100379
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200380 /*
381 * Output final state
382 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000383 PUT_UINT32_BE( ctx->state[0], output, 0 );
384 PUT_UINT32_BE( ctx->state[1], output, 4 );
385 PUT_UINT32_BE( ctx->state[2], output, 8 );
386 PUT_UINT32_BE( ctx->state[3], output, 12 );
387 PUT_UINT32_BE( ctx->state[4], output, 16 );
388 PUT_UINT32_BE( ctx->state[5], output, 20 );
389 PUT_UINT32_BE( ctx->state[6], output, 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000390
391 if( ctx->is224 == 0 )
Paul Bakker5c2364c2012-10-01 14:41:15 +0000392 PUT_UINT32_BE( ctx->state[7], output, 28 );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100393
394 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000395}
396
Jaeden Amero041039f2018-02-19 15:28:08 +0000397#if !defined(MBEDTLS_DEPRECATED_REMOVED)
398void mbedtls_sha256_finish( mbedtls_sha256_context *ctx,
399 unsigned char output[32] )
400{
401 mbedtls_sha256_finish_ret( ctx, output );
402}
403#endif
404
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200405#endif /* !MBEDTLS_SHA256_ALT */
Paul Bakker90995b52013-06-24 19:20:35 +0200406
Paul Bakker5121ce52009-01-03 21:22:43 +0000407/*
408 * output = SHA-256( input buffer )
409 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100410int mbedtls_sha256_ret( const unsigned char *input,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100411 size_t ilen,
412 unsigned char output[32],
413 int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000414{
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100415 int ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200416 mbedtls_sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000417
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +0000418 MBEDTLS_SHA256_VALIDATE_RET( ilen == 0 || input != NULL );
419 MBEDTLS_SHA256_VALIDATE_RET( (unsigned char *)output != NULL );
420
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200421 mbedtls_sha256_init( &ctx );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100422
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100423 if( ( ret = mbedtls_sha256_starts_ret( &ctx, is224 ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100424 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100425
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100426 if( ( ret = mbedtls_sha256_update_ret( &ctx, input, ilen ) ) != 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_finish_ret( &ctx, output ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100430 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100431
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100432exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200433 mbedtls_sha256_free( &ctx );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100434
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100435 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000436}
437
Jaeden Amero041039f2018-02-19 15:28:08 +0000438#if !defined(MBEDTLS_DEPRECATED_REMOVED)
439void mbedtls_sha256( const unsigned char *input,
440 size_t ilen,
441 unsigned char output[32],
442 int is224 )
443{
444 mbedtls_sha256_ret( input, ilen, output, is224 );
445}
446#endif
447
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200448#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000449/*
450 * FIPS-180-2 test vectors
451 */
Manuel Pégourié-Gonnard28122e42015-03-11 09:13:42 +0000452static const unsigned char sha256_test_buf[3][57] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000453{
454 { "abc" },
455 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
456 { "" }
457};
458
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100459static const size_t sha256_test_buflen[3] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000460{
461 3, 56, 1000
462};
463
Paul Bakker9e36f042013-06-30 14:34:05 +0200464static const unsigned char sha256_test_sum[6][32] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000465{
466 /*
467 * SHA-224 test vectors
468 */
469 { 0x23, 0x09, 0x7D, 0x22, 0x34, 0x05, 0xD8, 0x22,
470 0x86, 0x42, 0xA4, 0x77, 0xBD, 0xA2, 0x55, 0xB3,
471 0x2A, 0xAD, 0xBC, 0xE4, 0xBD, 0xA0, 0xB3, 0xF7,
472 0xE3, 0x6C, 0x9D, 0xA7 },
473 { 0x75, 0x38, 0x8B, 0x16, 0x51, 0x27, 0x76, 0xCC,
474 0x5D, 0xBA, 0x5D, 0xA1, 0xFD, 0x89, 0x01, 0x50,
475 0xB0, 0xC6, 0x45, 0x5C, 0xB4, 0xF5, 0x8B, 0x19,
476 0x52, 0x52, 0x25, 0x25 },
477 { 0x20, 0x79, 0x46, 0x55, 0x98, 0x0C, 0x91, 0xD8,
478 0xBB, 0xB4, 0xC1, 0xEA, 0x97, 0x61, 0x8A, 0x4B,
479 0xF0, 0x3F, 0x42, 0x58, 0x19, 0x48, 0xB2, 0xEE,
480 0x4E, 0xE7, 0xAD, 0x67 },
481
482 /*
483 * SHA-256 test vectors
484 */
485 { 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA,
486 0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23,
487 0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C,
488 0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD },
489 { 0x24, 0x8D, 0x6A, 0x61, 0xD2, 0x06, 0x38, 0xB8,
490 0xE5, 0xC0, 0x26, 0x93, 0x0C, 0x3E, 0x60, 0x39,
491 0xA3, 0x3C, 0xE4, 0x59, 0x64, 0xFF, 0x21, 0x67,
492 0xF6, 0xEC, 0xED, 0xD4, 0x19, 0xDB, 0x06, 0xC1 },
493 { 0xCD, 0xC7, 0x6E, 0x5C, 0x99, 0x14, 0xFB, 0x92,
494 0x81, 0xA1, 0xC7, 0xE2, 0x84, 0xD7, 0x3E, 0x67,
495 0xF1, 0x80, 0x9A, 0x48, 0xA4, 0x97, 0x20, 0x0E,
496 0x04, 0x6D, 0x39, 0xCC, 0xC7, 0x11, 0x2C, 0xD0 }
497};
498
499/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000500 * Checkup routine
501 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200502int mbedtls_sha256_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000503{
Paul Bakker5b4af392014-06-26 12:09:34 +0200504 int i, j, k, buflen, ret = 0;
Russ Butlerbb83b422016-10-12 17:36:50 -0500505 unsigned char *buf;
Paul Bakker9e36f042013-06-30 14:34:05 +0200506 unsigned char sha256sum[32];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200507 mbedtls_sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000508
Russ Butlerbb83b422016-10-12 17:36:50 -0500509 buf = mbedtls_calloc( 1024, sizeof(unsigned char) );
510 if( NULL == buf )
511 {
512 if( verbose != 0 )
513 mbedtls_printf( "Buffer allocation failed\n" );
514
515 return( 1 );
516 }
517
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200518 mbedtls_sha256_init( &ctx );
Paul Bakker5b4af392014-06-26 12:09:34 +0200519
Paul Bakker5121ce52009-01-03 21:22:43 +0000520 for( i = 0; i < 6; i++ )
521 {
522 j = i % 3;
523 k = i < 3;
524
525 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200526 mbedtls_printf( " SHA-%d test #%d: ", 256 - k * 32, j + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000527
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100528 if( ( ret = mbedtls_sha256_starts_ret( &ctx, k ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100529 goto fail;
Paul Bakker5121ce52009-01-03 21:22:43 +0000530
531 if( j == 2 )
532 {
533 memset( buf, 'a', buflen = 1000 );
534
535 for( j = 0; j < 1000; j++ )
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100536 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100537 ret = mbedtls_sha256_update_ret( &ctx, buf, buflen );
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100538 if( ret != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100539 goto fail;
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100540 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100541
Paul Bakker5121ce52009-01-03 21:22:43 +0000542 }
543 else
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100544 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100545 ret = mbedtls_sha256_update_ret( &ctx, sha256_test_buf[j],
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100546 sha256_test_buflen[j] );
547 if( ret != 0 )
548 goto fail;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100549 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000550
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100551 if( ( ret = mbedtls_sha256_finish_ret( &ctx, sha256sum ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100552 goto fail;
553
Paul Bakker5121ce52009-01-03 21:22:43 +0000554
Paul Bakker9e36f042013-06-30 14:34:05 +0200555 if( memcmp( sha256sum, sha256_test_sum[i], 32 - k * 4 ) != 0 )
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100556 {
557 ret = 1;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100558 goto fail;
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100559 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000560
561 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200562 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000563 }
564
565 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200566 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000567
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100568 goto exit;
569
570fail:
571 if( verbose != 0 )
572 mbedtls_printf( "failed\n" );
573
Paul Bakker5b4af392014-06-26 12:09:34 +0200574exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200575 mbedtls_sha256_free( &ctx );
Russ Butlerbb83b422016-10-12 17:36:50 -0500576 mbedtls_free( buf );
Paul Bakker5b4af392014-06-26 12:09:34 +0200577
578 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000579}
580
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200581#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000582
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200583#endif /* MBEDTLS_SHA256_C */