blob: fe381d2a243eea98539f11a75f52fc5e265af026 [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é-Gonnard100c0572019-07-17 12:15:05 +020081#if defined(MBEDTLS_SHA256_SMALLER)
82static void sha256_put_uint32_be( uint32_t n, unsigned char *b, uint8_t i )
83{
84 PUT_UINT32_BE(n, b, i);
85}
86#else
87#define sha256_put_uint32_be PUT_UINT32_BE
88#endif
89
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020090void mbedtls_sha256_init( mbedtls_sha256_context *ctx )
Paul Bakker5b4af392014-06-26 12:09:34 +020091{
Hanno Becker8d215e72018-12-18 17:53:21 +000092 SHA256_VALIDATE( ctx != NULL );
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +000093
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020094 memset( ctx, 0, sizeof( mbedtls_sha256_context ) );
Paul Bakker5b4af392014-06-26 12:09:34 +020095}
96
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020097void mbedtls_sha256_free( mbedtls_sha256_context *ctx )
Paul Bakker5b4af392014-06-26 12:09:34 +020098{
99 if( ctx == NULL )
100 return;
101
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500102 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_sha256_context ) );
Paul Bakker5b4af392014-06-26 12:09:34 +0200103}
104
Manuel Pégourié-Gonnard16d412f2015-07-06 15:26:26 +0200105void mbedtls_sha256_clone( mbedtls_sha256_context *dst,
106 const mbedtls_sha256_context *src )
107{
Hanno Becker8d215e72018-12-18 17:53:21 +0000108 SHA256_VALIDATE( dst != NULL );
109 SHA256_VALIDATE( src != NULL );
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +0000110
Manuel Pégourié-Gonnard16d412f2015-07-06 15:26:26 +0200111 *dst = *src;
112}
113
Paul Bakker5121ce52009-01-03 21:22:43 +0000114/*
115 * SHA-256 context setup
116 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100117int mbedtls_sha256_starts_ret( mbedtls_sha256_context *ctx, int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000118{
Hanno Becker8d215e72018-12-18 17:53:21 +0000119 SHA256_VALIDATE_RET( ctx != NULL );
120 SHA256_VALIDATE_RET( is224 == 0 || is224 == 1 );
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +0000121
Paul Bakker5121ce52009-01-03 21:22:43 +0000122 ctx->total[0] = 0;
123 ctx->total[1] = 0;
124
125 if( is224 == 0 )
126 {
127 /* SHA-256 */
128 ctx->state[0] = 0x6A09E667;
129 ctx->state[1] = 0xBB67AE85;
130 ctx->state[2] = 0x3C6EF372;
131 ctx->state[3] = 0xA54FF53A;
132 ctx->state[4] = 0x510E527F;
133 ctx->state[5] = 0x9B05688C;
134 ctx->state[6] = 0x1F83D9AB;
135 ctx->state[7] = 0x5BE0CD19;
136 }
137 else
138 {
139 /* SHA-224 */
140 ctx->state[0] = 0xC1059ED8;
141 ctx->state[1] = 0x367CD507;
142 ctx->state[2] = 0x3070DD17;
143 ctx->state[3] = 0xF70E5939;
144 ctx->state[4] = 0xFFC00B31;
145 ctx->state[5] = 0x68581511;
146 ctx->state[6] = 0x64F98FA7;
147 ctx->state[7] = 0xBEFA4FA4;
148 }
149
150 ctx->is224 = is224;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100151
152 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000153}
154
Jaeden Amero041039f2018-02-19 15:28:08 +0000155#if !defined(MBEDTLS_DEPRECATED_REMOVED)
156void mbedtls_sha256_starts( mbedtls_sha256_context *ctx,
157 int is224 )
158{
159 mbedtls_sha256_starts_ret( ctx, is224 );
160}
161#endif
162
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200163#if !defined(MBEDTLS_SHA256_PROCESS_ALT)
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200164static const uint32_t K[] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000165{
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200166 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,
167 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,
168 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,
169 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,
170 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,
171 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,
172 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,
173 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,
174 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,
175 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,
176 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,
177 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,
178 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,
179 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,
180 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,
181 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2,
182};
Paul Bakker5121ce52009-01-03 21:22:43 +0000183
Hanno Beckerd6028a12018-10-15 12:01:35 +0100184#define SHR(x,n) (((x) & 0xFFFFFFFF) >> (n))
185#define ROTR(x,n) (SHR(x,n) | ((x) << (32 - (n))))
Paul Bakker5121ce52009-01-03 21:22:43 +0000186
187#define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^ SHR(x, 3))
188#define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^ SHR(x,10))
189
190#define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22))
191#define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25))
192
Hanno Beckerd6028a12018-10-15 12:01:35 +0100193#define F0(x,y,z) (((x) & (y)) | ((z) & ((x) | (y))))
194#define F1(x,y,z) ((z) ^ ((x) & ((y) ^ (z))))
Paul Bakker5121ce52009-01-03 21:22:43 +0000195
196#define R(t) \
Hanno Beckerd6028a12018-10-15 12:01:35 +0100197 ( \
198 W[t] = S1(W[(t) - 2]) + W[(t) - 7] + \
199 S0(W[(t) - 15]) + W[(t) - 16] \
200 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000201
Hanno Beckerd6028a12018-10-15 12:01:35 +0100202#define P(a,b,c,d,e,f,g,h,x,K) \
203 do \
204 { \
Hanno Becker3ac21ac2018-10-26 09:13:26 +0100205 temp1 = (h) + S3(e) + F1((e),(f),(g)) + (K) + (x); \
206 temp2 = S2(a) + F0((a),(b),(c)); \
Hanno Beckerd6028a12018-10-15 12:01:35 +0100207 (d) += temp1; (h) = temp1 + temp2; \
208 } while( 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000209
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100210int mbedtls_internal_sha256_process( mbedtls_sha256_context *ctx,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100211 const unsigned char data[64] )
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200212{
213 uint32_t temp1, temp2, W[64];
214 uint32_t A[8];
215 unsigned int i;
Paul Bakker5121ce52009-01-03 21:22:43 +0000216
Hanno Becker8d215e72018-12-18 17:53:21 +0000217 SHA256_VALIDATE_RET( ctx != NULL );
218 SHA256_VALIDATE_RET( (const unsigned char *)data != NULL );
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +0000219
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200220 for( i = 0; i < 8; i++ )
221 A[i] = ctx->state[i];
222
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200223#if defined(MBEDTLS_SHA256_SMALLER)
224 for( i = 0; i < 64; i++ )
225 {
226 if( i < 16 )
227 GET_UINT32_BE( W[i], data, 4 * i );
228 else
229 R( i );
230
231 P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], W[i], K[i] );
232
233 temp1 = A[7]; A[7] = A[6]; A[6] = A[5]; A[5] = A[4]; A[4] = A[3];
234 A[3] = A[2]; A[2] = A[1]; A[1] = A[0]; A[0] = temp1;
235 }
236#else /* MBEDTLS_SHA256_SMALLER */
237 for( i = 0; i < 16; i++ )
238 GET_UINT32_BE( W[i], data, 4 * i );
239
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200240 for( i = 0; i < 16; i += 8 )
241 {
242 P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], W[i+0], K[i+0] );
243 P( A[7], A[0], A[1], A[2], A[3], A[4], A[5], A[6], W[i+1], K[i+1] );
244 P( A[6], A[7], A[0], A[1], A[2], A[3], A[4], A[5], W[i+2], K[i+2] );
245 P( A[5], A[6], A[7], A[0], A[1], A[2], A[3], A[4], W[i+3], K[i+3] );
246 P( A[4], A[5], A[6], A[7], A[0], A[1], A[2], A[3], W[i+4], K[i+4] );
247 P( A[3], A[4], A[5], A[6], A[7], A[0], A[1], A[2], W[i+5], K[i+5] );
248 P( A[2], A[3], A[4], A[5], A[6], A[7], A[0], A[1], W[i+6], K[i+6] );
249 P( A[1], A[2], A[3], A[4], A[5], A[6], A[7], A[0], W[i+7], K[i+7] );
250 }
251
252 for( i = 16; i < 64; i += 8 )
253 {
254 P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], R(i+0), K[i+0] );
255 P( A[7], A[0], A[1], A[2], A[3], A[4], A[5], A[6], R(i+1), K[i+1] );
256 P( A[6], A[7], A[0], A[1], A[2], A[3], A[4], A[5], R(i+2), K[i+2] );
257 P( A[5], A[6], A[7], A[0], A[1], A[2], A[3], A[4], R(i+3), K[i+3] );
258 P( A[4], A[5], A[6], A[7], A[0], A[1], A[2], A[3], R(i+4), K[i+4] );
259 P( A[3], A[4], A[5], A[6], A[7], A[0], A[1], A[2], R(i+5), K[i+5] );
260 P( A[2], A[3], A[4], A[5], A[6], A[7], A[0], A[1], R(i+6), K[i+6] );
261 P( A[1], A[2], A[3], A[4], A[5], A[6], A[7], A[0], R(i+7), K[i+7] );
262 }
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200263#endif /* MBEDTLS_SHA256_SMALLER */
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200264
265 for( i = 0; i < 8; i++ )
266 ctx->state[i] += A[i];
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100267
268 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000269}
Jaeden Amero041039f2018-02-19 15:28:08 +0000270
271#if !defined(MBEDTLS_DEPRECATED_REMOVED)
272void mbedtls_sha256_process( mbedtls_sha256_context *ctx,
273 const unsigned char data[64] )
274{
275 mbedtls_internal_sha256_process( ctx, data );
276}
277#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200278#endif /* !MBEDTLS_SHA256_PROCESS_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000279
280/*
281 * SHA-256 process buffer
282 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100283int mbedtls_sha256_update_ret( mbedtls_sha256_context *ctx,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100284 const unsigned char *input,
285 size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000286{
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100287 int ret;
Paul Bakker23986e52011-04-24 08:57:21 +0000288 size_t fill;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000289 uint32_t left;
Paul Bakker5121ce52009-01-03 21:22:43 +0000290
Hanno Becker8d215e72018-12-18 17:53:21 +0000291 SHA256_VALIDATE_RET( ctx != NULL );
292 SHA256_VALIDATE_RET( ilen == 0 || input != NULL );
Hanno Becker596e0142018-12-18 15:00:38 +0000293
Brian White12895d12014-04-11 11:29:42 -0400294 if( ilen == 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100295 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000296
297 left = ctx->total[0] & 0x3F;
298 fill = 64 - left;
299
Paul Bakker5c2364c2012-10-01 14:41:15 +0000300 ctx->total[0] += (uint32_t) ilen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000301 ctx->total[0] &= 0xFFFFFFFF;
302
Paul Bakker5c2364c2012-10-01 14:41:15 +0000303 if( ctx->total[0] < (uint32_t) ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000304 ctx->total[1]++;
305
306 if( left && ilen >= fill )
307 {
Paul Bakker3c2122f2013-06-24 19:03:14 +0200308 memcpy( (void *) (ctx->buffer + left), input, fill );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100309
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100310 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100311 return( ret );
312
Paul Bakker5121ce52009-01-03 21:22:43 +0000313 input += fill;
314 ilen -= fill;
315 left = 0;
316 }
317
318 while( ilen >= 64 )
319 {
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100320 if( ( ret = mbedtls_internal_sha256_process( ctx, input ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100321 return( ret );
322
Paul Bakker5121ce52009-01-03 21:22:43 +0000323 input += 64;
324 ilen -= 64;
325 }
326
327 if( ilen > 0 )
Paul Bakker3c2122f2013-06-24 19:03:14 +0200328 memcpy( (void *) (ctx->buffer + left), input, ilen );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100329
330 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000331}
332
Jaeden Amero041039f2018-02-19 15:28:08 +0000333#if !defined(MBEDTLS_DEPRECATED_REMOVED)
334void mbedtls_sha256_update( mbedtls_sha256_context *ctx,
335 const unsigned char *input,
336 size_t ilen )
337{
338 mbedtls_sha256_update_ret( ctx, input, ilen );
339}
340#endif
341
Paul Bakker5121ce52009-01-03 21:22:43 +0000342/*
343 * SHA-256 final digest
344 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100345int mbedtls_sha256_finish_ret( mbedtls_sha256_context *ctx,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100346 unsigned char output[32] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000347{
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100348 int ret;
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200349 uint32_t used;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000350 uint32_t high, low;
Paul Bakker5121ce52009-01-03 21:22:43 +0000351
Hanno Becker8d215e72018-12-18 17:53:21 +0000352 SHA256_VALIDATE_RET( ctx != NULL );
353 SHA256_VALIDATE_RET( (unsigned char *)output != NULL );
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +0000354
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200355 /*
356 * Add padding: 0x80 then 0x00 until 8 bytes remain for the length
357 */
358 used = ctx->total[0] & 0x3F;
359
360 ctx->buffer[used++] = 0x80;
361
362 if( used <= 56 )
363 {
364 /* Enough room for padding + length in current block */
365 memset( ctx->buffer + used, 0, 56 - used );
366 }
367 else
368 {
369 /* We'll need an extra block */
370 memset( ctx->buffer + used, 0, 64 - used );
371
372 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
373 return( ret );
374
375 memset( ctx->buffer, 0, 56 );
376 }
377
378 /*
379 * Add message length
380 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000381 high = ( ctx->total[0] >> 29 )
382 | ( ctx->total[1] << 3 );
383 low = ( ctx->total[0] << 3 );
384
Manuel Pégourié-Gonnard100c0572019-07-17 12:15:05 +0200385 sha256_put_uint32_be( high, ctx->buffer, 56 );
386 sha256_put_uint32_be( low, ctx->buffer, 60 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000387
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200388 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
Andres Amaya Garciaaa464ef2017-07-21 14:21:53 +0100389 return( ret );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100390
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200391 /*
392 * Output final state
393 */
Manuel Pégourié-Gonnard100c0572019-07-17 12:15:05 +0200394 sha256_put_uint32_be( ctx->state[0], output, 0 );
395 sha256_put_uint32_be( ctx->state[1], output, 4 );
396 sha256_put_uint32_be( ctx->state[2], output, 8 );
397 sha256_put_uint32_be( ctx->state[3], output, 12 );
398 sha256_put_uint32_be( ctx->state[4], output, 16 );
399 sha256_put_uint32_be( ctx->state[5], output, 20 );
400 sha256_put_uint32_be( ctx->state[6], output, 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000401
402 if( ctx->is224 == 0 )
Manuel Pégourié-Gonnard100c0572019-07-17 12:15:05 +0200403 sha256_put_uint32_be( ctx->state[7], output, 28 );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100404
405 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000406}
407
Jaeden Amero041039f2018-02-19 15:28:08 +0000408#if !defined(MBEDTLS_DEPRECATED_REMOVED)
409void mbedtls_sha256_finish( mbedtls_sha256_context *ctx,
410 unsigned char output[32] )
411{
412 mbedtls_sha256_finish_ret( ctx, output );
413}
414#endif
415
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200416#endif /* !MBEDTLS_SHA256_ALT */
Paul Bakker90995b52013-06-24 19:20:35 +0200417
Paul Bakker5121ce52009-01-03 21:22:43 +0000418/*
419 * output = SHA-256( input buffer )
420 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100421int mbedtls_sha256_ret( const unsigned char *input,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100422 size_t ilen,
423 unsigned char output[32],
424 int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000425{
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100426 int ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200427 mbedtls_sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000428
Hanno Becker8d215e72018-12-18 17:53:21 +0000429 SHA256_VALIDATE_RET( is224 == 0 || is224 == 1 );
430 SHA256_VALIDATE_RET( ilen == 0 || input != NULL );
431 SHA256_VALIDATE_RET( (unsigned char *)output != NULL );
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +0000432
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200433 mbedtls_sha256_init( &ctx );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100434
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100435 if( ( ret = mbedtls_sha256_starts_ret( &ctx, is224 ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100436 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100437
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100438 if( ( ret = mbedtls_sha256_update_ret( &ctx, input, ilen ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100439 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100440
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100441 if( ( ret = mbedtls_sha256_finish_ret( &ctx, output ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100442 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100443
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100444exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200445 mbedtls_sha256_free( &ctx );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100446
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100447 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000448}
449
Jaeden Amero041039f2018-02-19 15:28:08 +0000450#if !defined(MBEDTLS_DEPRECATED_REMOVED)
451void mbedtls_sha256( const unsigned char *input,
452 size_t ilen,
453 unsigned char output[32],
454 int is224 )
455{
456 mbedtls_sha256_ret( input, ilen, output, is224 );
457}
458#endif
459
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200460#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000461/*
462 * FIPS-180-2 test vectors
463 */
Manuel Pégourié-Gonnard28122e42015-03-11 09:13:42 +0000464static const unsigned char sha256_test_buf[3][57] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000465{
466 { "abc" },
467 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
468 { "" }
469};
470
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100471static const size_t sha256_test_buflen[3] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000472{
473 3, 56, 1000
474};
475
Paul Bakker9e36f042013-06-30 14:34:05 +0200476static const unsigned char sha256_test_sum[6][32] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000477{
478 /*
479 * SHA-224 test vectors
480 */
481 { 0x23, 0x09, 0x7D, 0x22, 0x34, 0x05, 0xD8, 0x22,
482 0x86, 0x42, 0xA4, 0x77, 0xBD, 0xA2, 0x55, 0xB3,
483 0x2A, 0xAD, 0xBC, 0xE4, 0xBD, 0xA0, 0xB3, 0xF7,
484 0xE3, 0x6C, 0x9D, 0xA7 },
485 { 0x75, 0x38, 0x8B, 0x16, 0x51, 0x27, 0x76, 0xCC,
486 0x5D, 0xBA, 0x5D, 0xA1, 0xFD, 0x89, 0x01, 0x50,
487 0xB0, 0xC6, 0x45, 0x5C, 0xB4, 0xF5, 0x8B, 0x19,
488 0x52, 0x52, 0x25, 0x25 },
489 { 0x20, 0x79, 0x46, 0x55, 0x98, 0x0C, 0x91, 0xD8,
490 0xBB, 0xB4, 0xC1, 0xEA, 0x97, 0x61, 0x8A, 0x4B,
491 0xF0, 0x3F, 0x42, 0x58, 0x19, 0x48, 0xB2, 0xEE,
492 0x4E, 0xE7, 0xAD, 0x67 },
493
494 /*
495 * SHA-256 test vectors
496 */
497 { 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA,
498 0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23,
499 0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C,
500 0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD },
501 { 0x24, 0x8D, 0x6A, 0x61, 0xD2, 0x06, 0x38, 0xB8,
502 0xE5, 0xC0, 0x26, 0x93, 0x0C, 0x3E, 0x60, 0x39,
503 0xA3, 0x3C, 0xE4, 0x59, 0x64, 0xFF, 0x21, 0x67,
504 0xF6, 0xEC, 0xED, 0xD4, 0x19, 0xDB, 0x06, 0xC1 },
505 { 0xCD, 0xC7, 0x6E, 0x5C, 0x99, 0x14, 0xFB, 0x92,
506 0x81, 0xA1, 0xC7, 0xE2, 0x84, 0xD7, 0x3E, 0x67,
507 0xF1, 0x80, 0x9A, 0x48, 0xA4, 0x97, 0x20, 0x0E,
508 0x04, 0x6D, 0x39, 0xCC, 0xC7, 0x11, 0x2C, 0xD0 }
509};
510
511/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000512 * Checkup routine
513 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200514int mbedtls_sha256_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000515{
Paul Bakker5b4af392014-06-26 12:09:34 +0200516 int i, j, k, buflen, ret = 0;
Russ Butlerbb83b422016-10-12 17:36:50 -0500517 unsigned char *buf;
Paul Bakker9e36f042013-06-30 14:34:05 +0200518 unsigned char sha256sum[32];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200519 mbedtls_sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000520
Russ Butlerbb83b422016-10-12 17:36:50 -0500521 buf = mbedtls_calloc( 1024, sizeof(unsigned char) );
522 if( NULL == buf )
523 {
524 if( verbose != 0 )
525 mbedtls_printf( "Buffer allocation failed\n" );
526
527 return( 1 );
528 }
529
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200530 mbedtls_sha256_init( &ctx );
Paul Bakker5b4af392014-06-26 12:09:34 +0200531
Paul Bakker5121ce52009-01-03 21:22:43 +0000532 for( i = 0; i < 6; i++ )
533 {
534 j = i % 3;
535 k = i < 3;
536
537 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200538 mbedtls_printf( " SHA-%d test #%d: ", 256 - k * 32, j + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000539
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100540 if( ( ret = mbedtls_sha256_starts_ret( &ctx, k ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100541 goto fail;
Paul Bakker5121ce52009-01-03 21:22:43 +0000542
543 if( j == 2 )
544 {
545 memset( buf, 'a', buflen = 1000 );
546
547 for( j = 0; j < 1000; j++ )
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100548 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100549 ret = mbedtls_sha256_update_ret( &ctx, buf, buflen );
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100550 if( ret != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100551 goto fail;
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100552 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100553
Paul Bakker5121ce52009-01-03 21:22:43 +0000554 }
555 else
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100556 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100557 ret = mbedtls_sha256_update_ret( &ctx, sha256_test_buf[j],
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100558 sha256_test_buflen[j] );
559 if( ret != 0 )
560 goto fail;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100561 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000562
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100563 if( ( ret = mbedtls_sha256_finish_ret( &ctx, sha256sum ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100564 goto fail;
565
Paul Bakker5121ce52009-01-03 21:22:43 +0000566
Paul Bakker9e36f042013-06-30 14:34:05 +0200567 if( memcmp( sha256sum, sha256_test_sum[i], 32 - k * 4 ) != 0 )
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100568 {
569 ret = 1;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100570 goto fail;
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100571 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000572
573 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200574 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000575 }
576
577 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200578 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000579
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100580 goto exit;
581
582fail:
583 if( verbose != 0 )
584 mbedtls_printf( "failed\n" );
585
Paul Bakker5b4af392014-06-26 12:09:34 +0200586exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200587 mbedtls_sha256_free( &ctx );
Russ Butlerbb83b422016-10-12 17:36:50 -0500588 mbedtls_free( buf );
Paul Bakker5b4af392014-06-26 12:09:34 +0200589
590 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000591}
592
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200593#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000594
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200595#endif /* MBEDTLS_SHA256_C */