blob: f39bcbab6c0f583f4ec5c1a6bd6a90ddbcd82150 [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"
Paul Bakker5121ce52009-01-03 21:22:43 +000036
Rich Evans00ab4702015-02-06 13:43:58 +000037#include <string.h>
38
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020039#if defined(MBEDTLS_SELF_TEST)
40#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000041#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010042#else
Rich Evans00ab4702015-02-06 13:43:58 +000043#include <stdio.h>
Russ Butlerbb83b422016-10-12 17:36:50 -050044#include <stdlib.h>
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020045#define mbedtls_printf printf
Russ Butlerbb83b422016-10-12 17:36:50 -050046#define mbedtls_calloc calloc
47#define mbedtls_free free
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020048#endif /* MBEDTLS_PLATFORM_C */
49#endif /* MBEDTLS_SELF_TEST */
Paul Bakker7dc4c442014-02-01 22:50:26 +010050
Manuel Pégourié-Gonnard8b2641d2015-08-27 20:03:46 +020051#if !defined(MBEDTLS_SHA256_ALT)
52
Paul Bakker34617722014-06-13 17:20:13 +020053/* Implementation that should never be optimized out by the compiler */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020054static void mbedtls_zeroize( void *v, size_t n ) {
Paul Bakker34617722014-06-13 17:20:13 +020055 volatile unsigned char *p = v; while( n-- ) *p++ = 0;
56}
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{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020083 memset( ctx, 0, sizeof( mbedtls_sha256_context ) );
Paul Bakker5b4af392014-06-26 12:09:34 +020084}
85
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020086void mbedtls_sha256_free( mbedtls_sha256_context *ctx )
Paul Bakker5b4af392014-06-26 12:09:34 +020087{
88 if( ctx == NULL )
89 return;
90
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020091 mbedtls_zeroize( ctx, sizeof( mbedtls_sha256_context ) );
Paul Bakker5b4af392014-06-26 12:09:34 +020092}
93
Manuel Pégourié-Gonnard16d412f2015-07-06 15:26:26 +020094void mbedtls_sha256_clone( mbedtls_sha256_context *dst,
95 const mbedtls_sha256_context *src )
96{
97 *dst = *src;
98}
99
Paul Bakker5121ce52009-01-03 21:22:43 +0000100/*
101 * SHA-256 context setup
102 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100103int mbedtls_sha256_starts_ret( mbedtls_sha256_context *ctx, int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000104{
105 ctx->total[0] = 0;
106 ctx->total[1] = 0;
107
108 if( is224 == 0 )
109 {
110 /* SHA-256 */
111 ctx->state[0] = 0x6A09E667;
112 ctx->state[1] = 0xBB67AE85;
113 ctx->state[2] = 0x3C6EF372;
114 ctx->state[3] = 0xA54FF53A;
115 ctx->state[4] = 0x510E527F;
116 ctx->state[5] = 0x9B05688C;
117 ctx->state[6] = 0x1F83D9AB;
118 ctx->state[7] = 0x5BE0CD19;
119 }
120 else
121 {
122 /* SHA-224 */
123 ctx->state[0] = 0xC1059ED8;
124 ctx->state[1] = 0x367CD507;
125 ctx->state[2] = 0x3070DD17;
126 ctx->state[3] = 0xF70E5939;
127 ctx->state[4] = 0xFFC00B31;
128 ctx->state[5] = 0x68581511;
129 ctx->state[6] = 0x64F98FA7;
130 ctx->state[7] = 0xBEFA4FA4;
131 }
132
133 ctx->is224 = is224;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100134
135 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000136}
137
Jaeden Amero041039f2018-02-19 15:28:08 +0000138#if !defined(MBEDTLS_DEPRECATED_REMOVED)
139void mbedtls_sha256_starts( mbedtls_sha256_context *ctx,
140 int is224 )
141{
142 mbedtls_sha256_starts_ret( ctx, is224 );
143}
144#endif
145
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200146#if !defined(MBEDTLS_SHA256_PROCESS_ALT)
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200147static const uint32_t K[] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000148{
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200149 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,
150 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,
151 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,
152 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,
153 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,
154 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,
155 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,
156 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,
157 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,
158 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,
159 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,
160 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,
161 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,
162 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,
163 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,
164 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2,
165};
Paul Bakker5121ce52009-01-03 21:22:43 +0000166
167#define SHR(x,n) ((x & 0xFFFFFFFF) >> n)
168#define ROTR(x,n) (SHR(x,n) | (x << (32 - n)))
169
170#define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^ SHR(x, 3))
171#define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^ SHR(x,10))
172
173#define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22))
174#define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25))
175
176#define F0(x,y,z) ((x & y) | (z & (x | y)))
177#define F1(x,y,z) (z ^ (x & (y ^ z)))
178
179#define R(t) \
180( \
181 W[t] = S1(W[t - 2]) + W[t - 7] + \
182 S0(W[t - 15]) + W[t - 16] \
183)
184
185#define P(a,b,c,d,e,f,g,h,x,K) \
186{ \
187 temp1 = h + S3(e) + F1(e,f,g) + K + x; \
188 temp2 = S2(a) + F0(a,b,c); \
189 d += temp1; h = temp1 + temp2; \
190}
191
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100192int mbedtls_internal_sha256_process( mbedtls_sha256_context *ctx,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100193 const unsigned char data[64] )
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200194{
195 uint32_t temp1, temp2, W[64];
196 uint32_t A[8];
197 unsigned int i;
Paul Bakker5121ce52009-01-03 21:22:43 +0000198
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200199 for( i = 0; i < 8; i++ )
200 A[i] = ctx->state[i];
201
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200202#if defined(MBEDTLS_SHA256_SMALLER)
203 for( i = 0; i < 64; i++ )
204 {
205 if( i < 16 )
206 GET_UINT32_BE( W[i], data, 4 * i );
207 else
208 R( i );
209
210 P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], W[i], K[i] );
211
212 temp1 = A[7]; A[7] = A[6]; A[6] = A[5]; A[5] = A[4]; A[4] = A[3];
213 A[3] = A[2]; A[2] = A[1]; A[1] = A[0]; A[0] = temp1;
214 }
215#else /* MBEDTLS_SHA256_SMALLER */
216 for( i = 0; i < 16; i++ )
217 GET_UINT32_BE( W[i], data, 4 * i );
218
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200219 for( i = 0; i < 16; i += 8 )
220 {
221 P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], W[i+0], K[i+0] );
222 P( A[7], A[0], A[1], A[2], A[3], A[4], A[5], A[6], W[i+1], K[i+1] );
223 P( A[6], A[7], A[0], A[1], A[2], A[3], A[4], A[5], W[i+2], K[i+2] );
224 P( A[5], A[6], A[7], A[0], A[1], A[2], A[3], A[4], W[i+3], K[i+3] );
225 P( A[4], A[5], A[6], A[7], A[0], A[1], A[2], A[3], W[i+4], K[i+4] );
226 P( A[3], A[4], A[5], A[6], A[7], A[0], A[1], A[2], W[i+5], K[i+5] );
227 P( A[2], A[3], A[4], A[5], A[6], A[7], A[0], A[1], W[i+6], K[i+6] );
228 P( A[1], A[2], A[3], A[4], A[5], A[6], A[7], A[0], W[i+7], K[i+7] );
229 }
230
231 for( i = 16; i < 64; i += 8 )
232 {
233 P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], R(i+0), K[i+0] );
234 P( A[7], A[0], A[1], A[2], A[3], A[4], A[5], A[6], R(i+1), K[i+1] );
235 P( A[6], A[7], A[0], A[1], A[2], A[3], A[4], A[5], R(i+2), K[i+2] );
236 P( A[5], A[6], A[7], A[0], A[1], A[2], A[3], A[4], R(i+3), K[i+3] );
237 P( A[4], A[5], A[6], A[7], A[0], A[1], A[2], A[3], R(i+4), K[i+4] );
238 P( A[3], A[4], A[5], A[6], A[7], A[0], A[1], A[2], R(i+5), K[i+5] );
239 P( A[2], A[3], A[4], A[5], A[6], A[7], A[0], A[1], R(i+6), K[i+6] );
240 P( A[1], A[2], A[3], A[4], A[5], A[6], A[7], A[0], R(i+7), K[i+7] );
241 }
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200242#endif /* MBEDTLS_SHA256_SMALLER */
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200243
244 for( i = 0; i < 8; i++ )
245 ctx->state[i] += A[i];
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100246
247 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000248}
Jaeden Amero041039f2018-02-19 15:28:08 +0000249
250#if !defined(MBEDTLS_DEPRECATED_REMOVED)
251void mbedtls_sha256_process( mbedtls_sha256_context *ctx,
252 const unsigned char data[64] )
253{
254 mbedtls_internal_sha256_process( ctx, data );
255}
256#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200257#endif /* !MBEDTLS_SHA256_PROCESS_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000258
259/*
260 * SHA-256 process buffer
261 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100262int mbedtls_sha256_update_ret( mbedtls_sha256_context *ctx,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100263 const unsigned char *input,
264 size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000265{
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100266 int ret;
Paul Bakker23986e52011-04-24 08:57:21 +0000267 size_t fill;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000268 uint32_t left;
Paul Bakker5121ce52009-01-03 21:22:43 +0000269
Brian White12895d12014-04-11 11:29:42 -0400270 if( ilen == 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100271 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000272
273 left = ctx->total[0] & 0x3F;
274 fill = 64 - left;
275
Paul Bakker5c2364c2012-10-01 14:41:15 +0000276 ctx->total[0] += (uint32_t) ilen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000277 ctx->total[0] &= 0xFFFFFFFF;
278
Paul Bakker5c2364c2012-10-01 14:41:15 +0000279 if( ctx->total[0] < (uint32_t) ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000280 ctx->total[1]++;
281
282 if( left && ilen >= fill )
283 {
Paul Bakker3c2122f2013-06-24 19:03:14 +0200284 memcpy( (void *) (ctx->buffer + left), input, fill );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100285
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100286 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100287 return( ret );
288
Paul Bakker5121ce52009-01-03 21:22:43 +0000289 input += fill;
290 ilen -= fill;
291 left = 0;
292 }
293
294 while( ilen >= 64 )
295 {
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100296 if( ( ret = mbedtls_internal_sha256_process( ctx, input ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100297 return( ret );
298
Paul Bakker5121ce52009-01-03 21:22:43 +0000299 input += 64;
300 ilen -= 64;
301 }
302
303 if( ilen > 0 )
Paul Bakker3c2122f2013-06-24 19:03:14 +0200304 memcpy( (void *) (ctx->buffer + left), input, ilen );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100305
306 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000307}
308
Jaeden Amero041039f2018-02-19 15:28:08 +0000309#if !defined(MBEDTLS_DEPRECATED_REMOVED)
310void mbedtls_sha256_update( mbedtls_sha256_context *ctx,
311 const unsigned char *input,
312 size_t ilen )
313{
314 mbedtls_sha256_update_ret( ctx, input, ilen );
315}
316#endif
317
Paul Bakker9e36f042013-06-30 14:34:05 +0200318static const unsigned char sha256_padding[64] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000319{
320 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
321 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
322 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
323 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
324};
325
326/*
327 * SHA-256 final digest
328 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100329int mbedtls_sha256_finish_ret( mbedtls_sha256_context *ctx,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100330 unsigned char output[32] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000331{
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100332 int ret;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000333 uint32_t last, padn;
334 uint32_t high, low;
Paul Bakker5121ce52009-01-03 21:22:43 +0000335 unsigned char msglen[8];
336
337 high = ( ctx->total[0] >> 29 )
338 | ( ctx->total[1] << 3 );
339 low = ( ctx->total[0] << 3 );
340
Paul Bakker5c2364c2012-10-01 14:41:15 +0000341 PUT_UINT32_BE( high, msglen, 0 );
342 PUT_UINT32_BE( low, msglen, 4 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000343
344 last = ctx->total[0] & 0x3F;
345 padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
346
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100347 if( ( ret = mbedtls_sha256_update_ret( ctx, sha256_padding, padn ) ) != 0 )
Andres Amaya Garciaaa464ef2017-07-21 14:21:53 +0100348 return( ret );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100349
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100350 if( ( ret = mbedtls_sha256_update_ret( ctx, msglen, 8 ) ) != 0 )
Andres Amaya Garciaaa464ef2017-07-21 14:21:53 +0100351 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000352
Paul Bakker5c2364c2012-10-01 14:41:15 +0000353 PUT_UINT32_BE( ctx->state[0], output, 0 );
354 PUT_UINT32_BE( ctx->state[1], output, 4 );
355 PUT_UINT32_BE( ctx->state[2], output, 8 );
356 PUT_UINT32_BE( ctx->state[3], output, 12 );
357 PUT_UINT32_BE( ctx->state[4], output, 16 );
358 PUT_UINT32_BE( ctx->state[5], output, 20 );
359 PUT_UINT32_BE( ctx->state[6], output, 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000360
361 if( ctx->is224 == 0 )
Paul Bakker5c2364c2012-10-01 14:41:15 +0000362 PUT_UINT32_BE( ctx->state[7], output, 28 );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100363
364 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000365}
366
Jaeden Amero041039f2018-02-19 15:28:08 +0000367#if !defined(MBEDTLS_DEPRECATED_REMOVED)
368void mbedtls_sha256_finish( mbedtls_sha256_context *ctx,
369 unsigned char output[32] )
370{
371 mbedtls_sha256_finish_ret( ctx, output );
372}
373#endif
374
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200375#endif /* !MBEDTLS_SHA256_ALT */
Paul Bakker90995b52013-06-24 19:20:35 +0200376
Paul Bakker5121ce52009-01-03 21:22:43 +0000377/*
378 * output = SHA-256( input buffer )
379 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100380int mbedtls_sha256_ret( const unsigned char *input,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100381 size_t ilen,
382 unsigned char output[32],
383 int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000384{
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100385 int ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200386 mbedtls_sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000387
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200388 mbedtls_sha256_init( &ctx );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100389
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100390 if( ( ret = mbedtls_sha256_starts_ret( &ctx, is224 ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100391 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100392
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100393 if( ( ret = mbedtls_sha256_update_ret( &ctx, input, ilen ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100394 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100395
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100396 if( ( ret = mbedtls_sha256_finish_ret( &ctx, output ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100397 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100398
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100399exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200400 mbedtls_sha256_free( &ctx );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100401
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100402 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000403}
404
Jaeden Amero041039f2018-02-19 15:28:08 +0000405#if !defined(MBEDTLS_DEPRECATED_REMOVED)
406void mbedtls_sha256( const unsigned char *input,
407 size_t ilen,
408 unsigned char output[32],
409 int is224 )
410{
411 mbedtls_sha256_ret( input, ilen, output, is224 );
412}
413#endif
414
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200415#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000416/*
417 * FIPS-180-2 test vectors
418 */
Manuel Pégourié-Gonnard28122e42015-03-11 09:13:42 +0000419static const unsigned char sha256_test_buf[3][57] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000420{
421 { "abc" },
422 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
423 { "" }
424};
425
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100426static const size_t sha256_test_buflen[3] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000427{
428 3, 56, 1000
429};
430
Paul Bakker9e36f042013-06-30 14:34:05 +0200431static const unsigned char sha256_test_sum[6][32] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000432{
433 /*
434 * SHA-224 test vectors
435 */
436 { 0x23, 0x09, 0x7D, 0x22, 0x34, 0x05, 0xD8, 0x22,
437 0x86, 0x42, 0xA4, 0x77, 0xBD, 0xA2, 0x55, 0xB3,
438 0x2A, 0xAD, 0xBC, 0xE4, 0xBD, 0xA0, 0xB3, 0xF7,
439 0xE3, 0x6C, 0x9D, 0xA7 },
440 { 0x75, 0x38, 0x8B, 0x16, 0x51, 0x27, 0x76, 0xCC,
441 0x5D, 0xBA, 0x5D, 0xA1, 0xFD, 0x89, 0x01, 0x50,
442 0xB0, 0xC6, 0x45, 0x5C, 0xB4, 0xF5, 0x8B, 0x19,
443 0x52, 0x52, 0x25, 0x25 },
444 { 0x20, 0x79, 0x46, 0x55, 0x98, 0x0C, 0x91, 0xD8,
445 0xBB, 0xB4, 0xC1, 0xEA, 0x97, 0x61, 0x8A, 0x4B,
446 0xF0, 0x3F, 0x42, 0x58, 0x19, 0x48, 0xB2, 0xEE,
447 0x4E, 0xE7, 0xAD, 0x67 },
448
449 /*
450 * SHA-256 test vectors
451 */
452 { 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA,
453 0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23,
454 0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C,
455 0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD },
456 { 0x24, 0x8D, 0x6A, 0x61, 0xD2, 0x06, 0x38, 0xB8,
457 0xE5, 0xC0, 0x26, 0x93, 0x0C, 0x3E, 0x60, 0x39,
458 0xA3, 0x3C, 0xE4, 0x59, 0x64, 0xFF, 0x21, 0x67,
459 0xF6, 0xEC, 0xED, 0xD4, 0x19, 0xDB, 0x06, 0xC1 },
460 { 0xCD, 0xC7, 0x6E, 0x5C, 0x99, 0x14, 0xFB, 0x92,
461 0x81, 0xA1, 0xC7, 0xE2, 0x84, 0xD7, 0x3E, 0x67,
462 0xF1, 0x80, 0x9A, 0x48, 0xA4, 0x97, 0x20, 0x0E,
463 0x04, 0x6D, 0x39, 0xCC, 0xC7, 0x11, 0x2C, 0xD0 }
464};
465
466/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000467 * Checkup routine
468 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200469int mbedtls_sha256_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000470{
Paul Bakker5b4af392014-06-26 12:09:34 +0200471 int i, j, k, buflen, ret = 0;
Russ Butlerbb83b422016-10-12 17:36:50 -0500472 unsigned char *buf;
Paul Bakker9e36f042013-06-30 14:34:05 +0200473 unsigned char sha256sum[32];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200474 mbedtls_sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000475
Russ Butlerbb83b422016-10-12 17:36:50 -0500476 buf = mbedtls_calloc( 1024, sizeof(unsigned char) );
477 if( NULL == buf )
478 {
479 if( verbose != 0 )
480 mbedtls_printf( "Buffer allocation failed\n" );
481
482 return( 1 );
483 }
484
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200485 mbedtls_sha256_init( &ctx );
Paul Bakker5b4af392014-06-26 12:09:34 +0200486
Paul Bakker5121ce52009-01-03 21:22:43 +0000487 for( i = 0; i < 6; i++ )
488 {
489 j = i % 3;
490 k = i < 3;
491
492 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200493 mbedtls_printf( " SHA-%d test #%d: ", 256 - k * 32, j + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000494
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100495 if( ( ret = mbedtls_sha256_starts_ret( &ctx, k ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100496 goto fail;
Paul Bakker5121ce52009-01-03 21:22:43 +0000497
498 if( j == 2 )
499 {
500 memset( buf, 'a', buflen = 1000 );
501
502 for( j = 0; j < 1000; j++ )
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100503 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100504 ret = mbedtls_sha256_update_ret( &ctx, buf, buflen );
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100505 if( ret != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100506 goto fail;
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100507 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100508
Paul Bakker5121ce52009-01-03 21:22:43 +0000509 }
510 else
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100511 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100512 ret = mbedtls_sha256_update_ret( &ctx, sha256_test_buf[j],
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100513 sha256_test_buflen[j] );
514 if( ret != 0 )
515 goto fail;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100516 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000517
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100518 if( ( ret = mbedtls_sha256_finish_ret( &ctx, sha256sum ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100519 goto fail;
520
Paul Bakker5121ce52009-01-03 21:22:43 +0000521
Paul Bakker9e36f042013-06-30 14:34:05 +0200522 if( memcmp( sha256sum, sha256_test_sum[i], 32 - k * 4 ) != 0 )
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100523 {
524 ret = 1;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100525 goto fail;
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100526 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000527
528 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200529 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000530 }
531
532 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200533 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000534
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100535 goto exit;
536
537fail:
538 if( verbose != 0 )
539 mbedtls_printf( "failed\n" );
540
Paul Bakker5b4af392014-06-26 12:09:34 +0200541exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200542 mbedtls_sha256_free( &ctx );
Russ Butlerbb83b422016-10-12 17:36:50 -0500543 mbedtls_free( buf );
Paul Bakker5b4af392014-06-26 12:09:34 +0200544
545 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000546}
547
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200548#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000549
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200550#endif /* MBEDTLS_SHA256_C */