blob: c2a20d2cc68f2da36828c1717e6ee126a890a280 [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"
Andrzej Kurek78f77eb2020-06-04 08:09:53 -040037#include "mbedtls/platform.h"
Andrzej Kurek89173262020-07-15 18:51:40 -040038#include <stdint.h>
Paul Bakker5121ce52009-01-03 21:22:43 +000039
Rich Evans00ab4702015-02-06 13:43:58 +000040#include <string.h>
41
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020042#if defined(MBEDTLS_SELF_TEST)
43#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000044#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010045#else
Rich Evans00ab4702015-02-06 13:43:58 +000046#include <stdio.h>
Russ Butlerbb83b422016-10-12 17:36:50 -050047#include <stdlib.h>
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020048#define mbedtls_printf printf
Russ Butlerbb83b422016-10-12 17:36:50 -050049#define mbedtls_calloc calloc
50#define mbedtls_free free
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020051#endif /* MBEDTLS_PLATFORM_C */
52#endif /* MBEDTLS_SELF_TEST */
Paul Bakker7dc4c442014-02-01 22:50:26 +010053
Hanno Becker2f6de422018-12-20 10:22:32 +000054#define SHA256_VALIDATE_RET(cond) \
55 MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_SHA256_BAD_INPUT_DATA )
56#define SHA256_VALIDATE(cond) MBEDTLS_INTERNAL_VALIDATE( cond )
57
Manuel Pégourié-Gonnard8b2641d2015-08-27 20:03:46 +020058#if !defined(MBEDTLS_SHA256_ALT)
59
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020060void mbedtls_sha256_init( mbedtls_sha256_context *ctx )
Paul Bakker5b4af392014-06-26 12:09:34 +020061{
Hanno Becker8d215e72018-12-18 17:53:21 +000062 SHA256_VALIDATE( ctx != NULL );
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +000063
Manuel Pégourié-Gonnard99419332019-10-03 10:40:57 +020064 memset( ctx, 0, sizeof( mbedtls_sha256_context ) );
Paul Bakker5b4af392014-06-26 12:09:34 +020065}
66
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020067void mbedtls_sha256_free( mbedtls_sha256_context *ctx )
Paul Bakker5b4af392014-06-26 12:09:34 +020068{
69 if( ctx == NULL )
70 return;
71
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050072 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_sha256_context ) );
Paul Bakker5b4af392014-06-26 12:09:34 +020073}
74
Manuel Pégourié-Gonnard16d412f2015-07-06 15:26:26 +020075void mbedtls_sha256_clone( mbedtls_sha256_context *dst,
76 const mbedtls_sha256_context *src )
77{
Hanno Becker8d215e72018-12-18 17:53:21 +000078 SHA256_VALIDATE( dst != NULL );
79 SHA256_VALIDATE( src != NULL );
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +000080
Manuel Pégourié-Gonnard16d412f2015-07-06 15:26:26 +020081 *dst = *src;
82}
83
Paul Bakker5121ce52009-01-03 21:22:43 +000084/*
85 * SHA-256 context setup
86 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +010087int mbedtls_sha256_starts_ret( mbedtls_sha256_context *ctx, int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +000088{
Hanno Becker8d215e72018-12-18 17:53:21 +000089 SHA256_VALIDATE_RET( ctx != NULL );
Manuel Pégourié-Gonnardefd34482019-09-02 14:41:19 +020090#if defined(MBEDTLS_SHA256_NO_SHA224)
91 SHA256_VALIDATE_RET( is224 == 0 );
92 (void) is224;
93#else
Hanno Becker8d215e72018-12-18 17:53:21 +000094 SHA256_VALIDATE_RET( is224 == 0 || is224 == 1 );
Manuel Pégourié-Gonnardefd34482019-09-02 14:41:19 +020095#endif
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +000096
Paul Bakker5121ce52009-01-03 21:22:43 +000097 ctx->total[0] = 0;
98 ctx->total[1] = 0;
99
Manuel Pégourié-Gonnardefd34482019-09-02 14:41:19 +0200100#if !defined(MBEDTLS_SHA256_NO_SHA224)
101 ctx->is224 = is224;
102
103 if( is224 == 1 )
104 {
105 /* SHA-224 */
106 ctx->state[0] = 0xC1059ED8;
107 ctx->state[1] = 0x367CD507;
108 ctx->state[2] = 0x3070DD17;
109 ctx->state[3] = 0xF70E5939;
110 ctx->state[4] = 0xFFC00B31;
111 ctx->state[5] = 0x68581511;
112 ctx->state[6] = 0x64F98FA7;
113 ctx->state[7] = 0xBEFA4FA4;
114 }
115 else
116#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000117 {
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 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100128
129 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000130}
131
Jaeden Amero041039f2018-02-19 15:28:08 +0000132#if !defined(MBEDTLS_DEPRECATED_REMOVED)
133void mbedtls_sha256_starts( mbedtls_sha256_context *ctx,
134 int is224 )
135{
136 mbedtls_sha256_starts_ret( ctx, is224 );
137}
138#endif
139
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200140#if !defined(MBEDTLS_SHA256_PROCESS_ALT)
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200141static const uint32_t K[] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000142{
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200143 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,
144 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,
145 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,
146 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,
147 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,
148 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,
149 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,
150 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,
151 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,
152 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,
153 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,
154 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,
155 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,
156 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,
157 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,
158 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2,
159};
Paul Bakker5121ce52009-01-03 21:22:43 +0000160
Hanno Beckerd6028a12018-10-15 12:01:35 +0100161#define SHR(x,n) (((x) & 0xFFFFFFFF) >> (n))
162#define ROTR(x,n) (SHR(x,n) | ((x) << (32 - (n))))
Paul Bakker5121ce52009-01-03 21:22:43 +0000163
164#define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^ SHR(x, 3))
165#define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^ SHR(x,10))
166
167#define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22))
168#define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25))
169
Hanno Beckerd6028a12018-10-15 12:01:35 +0100170#define F0(x,y,z) (((x) & (y)) | ((z) & ((x) | (y))))
171#define F1(x,y,z) ((z) ^ ((x) & ((y) ^ (z))))
Paul Bakker5121ce52009-01-03 21:22:43 +0000172
173#define R(t) \
Hanno Beckerd6028a12018-10-15 12:01:35 +0100174 ( \
175 W[t] = S1(W[(t) - 2]) + W[(t) - 7] + \
176 S0(W[(t) - 15]) + W[(t) - 16] \
177 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000178
Hanno Beckerd6028a12018-10-15 12:01:35 +0100179#define P(a,b,c,d,e,f,g,h,x,K) \
180 do \
181 { \
Hanno Becker3ac21ac2018-10-26 09:13:26 +0100182 temp1 = (h) + S3(e) + F1((e),(f),(g)) + (K) + (x); \
183 temp2 = S2(a) + F0((a),(b),(c)); \
Hanno Beckerd6028a12018-10-15 12:01:35 +0100184 (d) += temp1; (h) = temp1 + temp2; \
185 } while( 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000186
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100187int mbedtls_internal_sha256_process( mbedtls_sha256_context *ctx,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100188 const unsigned char data[64] )
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200189{
190 uint32_t temp1, temp2, W[64];
191 uint32_t A[8];
Andrzej Kurek89173262020-07-15 18:51:40 -0400192 volatile uint32_t flow_ctrl = 0;
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200193 unsigned int i;
Paul Bakker5121ce52009-01-03 21:22:43 +0000194
Hanno Becker8d215e72018-12-18 17:53:21 +0000195 SHA256_VALIDATE_RET( ctx != NULL );
196 SHA256_VALIDATE_RET( (const unsigned char *)data != NULL );
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +0000197
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200198 for( i = 0; i < 8; i++ )
199 A[i] = ctx->state[i];
200
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200201#if defined(MBEDTLS_SHA256_SMALLER)
Jarno Lamsabb86c522020-01-07 13:33:45 +0200202 {
203 uint32_t offset = mbedtls_platform_random_in_range(16);
204 mbedtls_platform_memset( W, 0, sizeof( W ) );
205
206 for( i = offset; i < 16; i++ )
207 {
208 W[i] = (uint32_t)mbedtls_platform_get_uint32_be( &data[4 * i] );
Andrzej Kurek78f77eb2020-06-04 08:09:53 -0400209 flow_ctrl++;
Jarno Lamsabb86c522020-01-07 13:33:45 +0200210 }
211 for( i = 0; i < offset; i++ )
212 {
213 W[i] = (uint32_t)mbedtls_platform_get_uint32_be( &data[4 * i] );
Andrzej Kurek78f77eb2020-06-04 08:09:53 -0400214 flow_ctrl++;
Jarno Lamsabb86c522020-01-07 13:33:45 +0200215 }
216 }
217
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200218 for( i = 0; i < 64; i++ )
219 {
Jarno Lamsabb86c522020-01-07 13:33:45 +0200220 if( i >= 16 )
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200221 R( i );
222
223 P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], W[i], K[i] );
224
225 temp1 = A[7]; A[7] = A[6]; A[6] = A[5]; A[5] = A[4]; A[4] = A[3];
226 A[3] = A[2]; A[2] = A[1]; A[1] = A[0]; A[0] = temp1;
Andrzej Kurek78f77eb2020-06-04 08:09:53 -0400227 flow_ctrl++;
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200228 }
Andrzej Kurek78f77eb2020-06-04 08:09:53 -0400229
230 if( flow_ctrl != 80 )
231 {
232 return MBEDTLS_ERR_PLATFORM_FAULT_DETECTED;
233 }
234
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200235#else /* MBEDTLS_SHA256_SMALLER */
236 for( i = 0; i < 16; i++ )
Andrzej Kurek78f77eb2020-06-04 08:09:53 -0400237 {
Arto Kinnunen4f4849a2019-09-09 10:21:18 +0300238 W[i] = (uint32_t)mbedtls_platform_get_uint32_be( &data[4 * i] );
Andrzej Kurek78f77eb2020-06-04 08:09:53 -0400239 flow_ctrl++;
240 }
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200241
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200242 for( i = 0; i < 16; i += 8 )
243 {
244 P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], W[i+0], K[i+0] );
245 P( A[7], A[0], A[1], A[2], A[3], A[4], A[5], A[6], W[i+1], K[i+1] );
246 P( A[6], A[7], A[0], A[1], A[2], A[3], A[4], A[5], W[i+2], K[i+2] );
247 P( A[5], A[6], A[7], A[0], A[1], A[2], A[3], A[4], W[i+3], K[i+3] );
248 P( A[4], A[5], A[6], A[7], A[0], A[1], A[2], A[3], W[i+4], K[i+4] );
249 P( A[3], A[4], A[5], A[6], A[7], A[0], A[1], A[2], W[i+5], K[i+5] );
250 P( A[2], A[3], A[4], A[5], A[6], A[7], A[0], A[1], W[i+6], K[i+6] );
251 P( A[1], A[2], A[3], A[4], A[5], A[6], A[7], A[0], W[i+7], K[i+7] );
Andrzej Kurek78f77eb2020-06-04 08:09:53 -0400252 flow_ctrl++;
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200253 }
254
255 for( i = 16; i < 64; i += 8 )
256 {
257 P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], R(i+0), K[i+0] );
258 P( A[7], A[0], A[1], A[2], A[3], A[4], A[5], A[6], R(i+1), K[i+1] );
259 P( A[6], A[7], A[0], A[1], A[2], A[3], A[4], A[5], R(i+2), K[i+2] );
260 P( A[5], A[6], A[7], A[0], A[1], A[2], A[3], A[4], R(i+3), K[i+3] );
261 P( A[4], A[5], A[6], A[7], A[0], A[1], A[2], A[3], R(i+4), K[i+4] );
262 P( A[3], A[4], A[5], A[6], A[7], A[0], A[1], A[2], R(i+5), K[i+5] );
263 P( A[2], A[3], A[4], A[5], A[6], A[7], A[0], A[1], R(i+6), K[i+6] );
264 P( A[1], A[2], A[3], A[4], A[5], A[6], A[7], A[0], R(i+7), K[i+7] );
Andrzej Kurek78f77eb2020-06-04 08:09:53 -0400265 flow_ctrl++;
266 }
267
268 /* 16 from the first loop, 2 from the second and 6 from the third. */
269 if( flow_ctrl != 24 )
270 {
271 return MBEDTLS_ERR_PLATFORM_FAULT_DETECTED;
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200272 }
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200273#endif /* MBEDTLS_SHA256_SMALLER */
Andrzej Kurek78f77eb2020-06-04 08:09:53 -0400274 flow_ctrl = 0;
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200275
276 for( i = 0; i < 8; i++ )
Andrzej Kurek78f77eb2020-06-04 08:09:53 -0400277 {
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200278 ctx->state[i] += A[i];
Andrzej Kurek78f77eb2020-06-04 08:09:53 -0400279 flow_ctrl++;
280 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100281
Andrzej Kurek78f77eb2020-06-04 08:09:53 -0400282 if( flow_ctrl == 8 )
283 {
Andrzej Kurek9bc61192020-11-13 11:29:14 +0100284 mbedtls_platform_random_delay();
285 if( flow_ctrl == 8 )
286 return( 0 );
Andrzej Kurek78f77eb2020-06-04 08:09:53 -0400287 }
Andrzej Kurekca609372020-07-08 03:19:02 -0400288 /* Free the ctx upon suspected FI */
289 mbedtls_sha256_free( ctx );
Andrzej Kurek78f77eb2020-06-04 08:09:53 -0400290 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Paul Bakker5121ce52009-01-03 21:22:43 +0000291}
Jaeden Amero041039f2018-02-19 15:28:08 +0000292
293#if !defined(MBEDTLS_DEPRECATED_REMOVED)
294void mbedtls_sha256_process( mbedtls_sha256_context *ctx,
295 const unsigned char data[64] )
296{
297 mbedtls_internal_sha256_process( ctx, data );
298}
299#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200300#endif /* !MBEDTLS_SHA256_PROCESS_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000301
302/*
303 * SHA-256 process buffer
304 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100305int mbedtls_sha256_update_ret( mbedtls_sha256_context *ctx,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100306 const unsigned char *input,
307 size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000308{
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100309 int ret;
Paul Bakker23986e52011-04-24 08:57:21 +0000310 size_t fill;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000311 uint32_t left;
Andrzej Kurek74f7d0f2020-07-06 14:28:12 -0400312 volatile const unsigned char *input_dup = input;
313 volatile size_t ilen_dup = ilen;
314 size_t ilen_change;
Hanno Becker8d215e72018-12-18 17:53:21 +0000315 SHA256_VALIDATE_RET( ctx != NULL );
316 SHA256_VALIDATE_RET( ilen == 0 || input != NULL );
Hanno Becker596e0142018-12-18 15:00:38 +0000317
Andrzej Kurek89173262020-07-15 18:51:40 -0400318 /* ilen_dup is used instead of ilen, to have it volatile for FI protection */
319 if( ilen_dup == 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100320 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000321
Andrzej Kurek89173262020-07-15 18:51:40 -0400322 if( ilen_dup > UINT32_MAX )
323 return( MBEDTLS_ERR_SHA256_BAD_INPUT_DATA );
324
Paul Bakker5121ce52009-01-03 21:22:43 +0000325 left = ctx->total[0] & 0x3F;
326 fill = 64 - left;
327
Andrzej Kurek89173262020-07-15 18:51:40 -0400328 ctx->total[0] += (uint32_t) ilen_dup;
Paul Bakker5121ce52009-01-03 21:22:43 +0000329
Andrzej Kurek89173262020-07-15 18:51:40 -0400330 if( ctx->total[0] < (uint32_t) ilen_dup )
Paul Bakker5121ce52009-01-03 21:22:43 +0000331 ctx->total[1]++;
332
Andrzej Kurek89173262020-07-15 18:51:40 -0400333 if( left && ilen_dup >= fill )
Paul Bakker5121ce52009-01-03 21:22:43 +0000334 {
Teppo Järvelin91d79382019-10-02 09:09:31 +0300335 mbedtls_platform_memcpy( (void *) (ctx->buffer + left), input, fill );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100336
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100337 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100338 return( ret );
339
Paul Bakker5121ce52009-01-03 21:22:43 +0000340 input += fill;
Andrzej Kurek89173262020-07-15 18:51:40 -0400341 ilen_dup -= fill;
Paul Bakker5121ce52009-01-03 21:22:43 +0000342 left = 0;
343 }
344
Andrzej Kurek89173262020-07-15 18:51:40 -0400345 while( ilen_dup >= 64 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000346 {
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100347 if( ( ret = mbedtls_internal_sha256_process( ctx, input ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100348 return( ret );
349
Paul Bakker5121ce52009-01-03 21:22:43 +0000350 input += 64;
Andrzej Kurek89173262020-07-15 18:51:40 -0400351 ilen_dup -= 64;
Paul Bakker5121ce52009-01-03 21:22:43 +0000352 }
353
Andrzej Kurek89173262020-07-15 18:51:40 -0400354 if( ilen_dup > 0 )
355 mbedtls_platform_memcpy( (void *) (ctx->buffer + left), input, ilen_dup );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100356
Andrzej Kurek89173262020-07-15 18:51:40 -0400357 /* Re-check ilen_dup to protect from a FI attack */
358 if( ilen_dup < 64 )
Andrzej Kurek78f77eb2020-06-04 08:09:53 -0400359 {
Andrzej Kurek9bc61192020-11-13 11:29:14 +0100360 mbedtls_platform_random_delay();
Andrzej Kurek74f7d0f2020-07-06 14:28:12 -0400361 /* Re-check that the calculated offsets are correct */
Andrzej Kurek89173262020-07-15 18:51:40 -0400362 ilen_change = ilen - ilen_dup;
Andrzej Kurek74f7d0f2020-07-06 14:28:12 -0400363 if( ( input_dup + ilen_change ) == input )
364 {
365 return( 0 );
366 }
Andrzej Kurek78f77eb2020-06-04 08:09:53 -0400367 }
Andrzej Kurekca609372020-07-08 03:19:02 -0400368 /* Free the ctx upon suspected FI */
369 mbedtls_sha256_free( ctx );
Andrzej Kurek78f77eb2020-06-04 08:09:53 -0400370 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Paul Bakker5121ce52009-01-03 21:22:43 +0000371}
372
Jaeden Amero041039f2018-02-19 15:28:08 +0000373#if !defined(MBEDTLS_DEPRECATED_REMOVED)
374void mbedtls_sha256_update( mbedtls_sha256_context *ctx,
375 const unsigned char *input,
376 size_t ilen )
377{
378 mbedtls_sha256_update_ret( ctx, input, ilen );
379}
380#endif
381
Paul Bakker5121ce52009-01-03 21:22:43 +0000382/*
383 * SHA-256 final digest
384 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100385int mbedtls_sha256_finish_ret( mbedtls_sha256_context *ctx,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100386 unsigned char output[32] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000387{
Arto Kinnunen9b3b1942019-09-09 17:02:35 +0300388 int ret, s_pos, o_pos;
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200389 uint32_t used;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000390 uint32_t high, low;
Jarno Lamsabb86c522020-01-07 13:33:45 +0200391 uint32_t offset = 0;
Andrzej Kurek89173262020-07-15 18:51:40 -0400392 volatile uint32_t flow_ctrl = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000393
Hanno Becker8d215e72018-12-18 17:53:21 +0000394 SHA256_VALIDATE_RET( ctx != NULL );
395 SHA256_VALIDATE_RET( (unsigned char *)output != NULL );
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +0000396
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200397 /*
398 * Add padding: 0x80 then 0x00 until 8 bytes remain for the length
399 */
400 used = ctx->total[0] & 0x3F;
401
402 ctx->buffer[used++] = 0x80;
Andrzej Kurek78f77eb2020-06-04 08:09:53 -0400403 flow_ctrl++;
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200404
405 if( used <= 56 )
406 {
407 /* Enough room for padding + length in current block */
Manuel Pégourié-Gonnard7a346b82019-10-02 14:47:01 +0200408 mbedtls_platform_memset( ctx->buffer + used, 0, 56 - used );
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200409 }
410 else
411 {
412 /* We'll need an extra block */
Manuel Pégourié-Gonnard7a346b82019-10-02 14:47:01 +0200413 mbedtls_platform_memset( ctx->buffer + used, 0, 64 - used );
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200414
415 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
416 return( ret );
417
Manuel Pégourié-Gonnard7a346b82019-10-02 14:47:01 +0200418 mbedtls_platform_memset( ctx->buffer, 0, 56 );
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200419 }
420
421 /*
422 * Add message length
423 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000424 high = ( ctx->total[0] >> 29 )
425 | ( ctx->total[1] << 3 );
426 low = ( ctx->total[0] << 3 );
427
Arto Kinnunen3d7439e2019-09-10 11:30:40 +0300428 (void)mbedtls_platform_put_uint32_be( ctx->buffer + 56, high );
429 (void)mbedtls_platform_put_uint32_be( ctx->buffer + 60, low );
Andrzej Kurek78f77eb2020-06-04 08:09:53 -0400430 flow_ctrl++;
Paul Bakker5121ce52009-01-03 21:22:43 +0000431
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200432 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
Andres Amaya Garciaaa464ef2017-07-21 14:21:53 +0100433 return( ret );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100434
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200435 /*
436 * Output final state
437 */
Jarno Lamsabb86c522020-01-07 13:33:45 +0200438 offset = mbedtls_platform_random_in_range(7);
Arto Kinnunen0b62ce82019-09-04 14:04:57 +0300439
Jarno Lamsabb86c522020-01-07 13:33:45 +0200440 mbedtls_platform_memset( output, 0, 32 );
441
442 for( s_pos = offset, o_pos = offset * 4; s_pos < 7;
443 s_pos++, o_pos += 4 )
Arto Kinnunen0b62ce82019-09-04 14:04:57 +0300444 {
Arto Kinnunen3d7439e2019-09-10 11:30:40 +0300445 (void)mbedtls_platform_put_uint32_be( &output[o_pos],
Jarno Lamsabb86c522020-01-07 13:33:45 +0200446 ctx->state[s_pos] );
Andrzej Kurek78f77eb2020-06-04 08:09:53 -0400447 flow_ctrl++;
Arto Kinnunen0b62ce82019-09-04 14:04:57 +0300448 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000449
Manuel Pégourié-Gonnard8463d292019-07-16 14:39:55 +0200450#if !defined(MBEDTLS_SHA256_NO_SHA224)
Paul Bakker5121ce52009-01-03 21:22:43 +0000451 if( ctx->is224 == 0 )
Manuel Pégourié-Gonnard8463d292019-07-16 14:39:55 +0200452#endif
Arto Kinnunen3d7439e2019-09-10 11:30:40 +0300453 (void)mbedtls_platform_put_uint32_be( &output[28], ctx->state[7] );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100454
Jarno Lamsabb86c522020-01-07 13:33:45 +0200455 for( s_pos = 0, o_pos = 0; s_pos < (int)offset; s_pos++, o_pos += 4 )
456 {
457 (void)mbedtls_platform_put_uint32_be( &output[o_pos],
458 ctx->state[s_pos] );
Andrzej Kurek78f77eb2020-06-04 08:09:53 -0400459 flow_ctrl++;
Jarno Lamsabb86c522020-01-07 13:33:45 +0200460 }
Andrzej Kurek78f77eb2020-06-04 08:09:53 -0400461 /* flow ctrl was incremented twice and then 7 times in two loops */
462 if( flow_ctrl == 9 )
463 {
Andrzej Kurek9bc61192020-11-13 11:29:14 +0100464 mbedtls_platform_random_delay();
465 if( flow_ctrl == 9 )
466 return( 0 );
Andrzej Kurek78f77eb2020-06-04 08:09:53 -0400467 }
Andrzej Kurekca609372020-07-08 03:19:02 -0400468 /* Free the ctx and clear output upon suspected FI */
469 mbedtls_sha256_free( ctx );
470 mbedtls_platform_memset( output, 0, 32 );
Andrzej Kurek78f77eb2020-06-04 08:09:53 -0400471 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Paul Bakker5121ce52009-01-03 21:22:43 +0000472}
473
Jaeden Amero041039f2018-02-19 15:28:08 +0000474#if !defined(MBEDTLS_DEPRECATED_REMOVED)
475void mbedtls_sha256_finish( mbedtls_sha256_context *ctx,
476 unsigned char output[32] )
477{
478 mbedtls_sha256_finish_ret( ctx, output );
479}
480#endif
481
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200482#endif /* !MBEDTLS_SHA256_ALT */
Paul Bakker90995b52013-06-24 19:20:35 +0200483
Paul Bakker5121ce52009-01-03 21:22:43 +0000484/*
485 * output = SHA-256( input buffer )
486 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100487int mbedtls_sha256_ret( const unsigned char *input,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100488 size_t ilen,
489 unsigned char output[32],
490 int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000491{
Andrzej Kurek74f7d0f2020-07-06 14:28:12 -0400492 int ret = MBEDTLS_ERR_PLATFORM_FAULT_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200493 mbedtls_sha256_context ctx;
Andrzej Kurek74f7d0f2020-07-06 14:28:12 -0400494 volatile const unsigned char *input_dup = input;
495 volatile size_t ilen_dup = ilen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000496
Hanno Becker8d215e72018-12-18 17:53:21 +0000497 SHA256_VALIDATE_RET( is224 == 0 || is224 == 1 );
498 SHA256_VALIDATE_RET( ilen == 0 || input != NULL );
499 SHA256_VALIDATE_RET( (unsigned char *)output != NULL );
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +0000500
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200501 mbedtls_sha256_init( &ctx );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100502
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100503 if( ( ret = mbedtls_sha256_starts_ret( &ctx, is224 ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100504 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100505
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100506 if( ( ret = mbedtls_sha256_update_ret( &ctx, input, ilen ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100507 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100508
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100509 if( ( ret = mbedtls_sha256_finish_ret( &ctx, output ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100510 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100511
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100512exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200513 mbedtls_sha256_free( &ctx );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100514
Andrzej Kurek74f7d0f2020-07-06 14:28:12 -0400515 if( input_dup == input && ilen_dup == ilen )
516 {
Andrzej Kurek9bc61192020-11-13 11:29:14 +0100517 mbedtls_platform_random_delay();
518 if( input_dup == input && ilen_dup == ilen )
519 return( ret );
Andrzej Kurek74f7d0f2020-07-06 14:28:12 -0400520 }
Andrzej Kurekca609372020-07-08 03:19:02 -0400521 mbedtls_platform_memset( output, 0, 32 );
Andrzej Kurek74f7d0f2020-07-06 14:28:12 -0400522 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Paul Bakker5121ce52009-01-03 21:22:43 +0000523}
524
Jaeden Amero041039f2018-02-19 15:28:08 +0000525#if !defined(MBEDTLS_DEPRECATED_REMOVED)
526void mbedtls_sha256( const unsigned char *input,
527 size_t ilen,
528 unsigned char output[32],
529 int is224 )
530{
531 mbedtls_sha256_ret( input, ilen, output, is224 );
532}
533#endif
534
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200535#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000536/*
537 * FIPS-180-2 test vectors
538 */
Manuel Pégourié-Gonnard28122e42015-03-11 09:13:42 +0000539static const unsigned char sha256_test_buf[3][57] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000540{
541 { "abc" },
542 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
543 { "" }
544};
545
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100546static const size_t sha256_test_buflen[3] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000547{
548 3, 56, 1000
549};
550
Manuel Pégourié-Gonnardabebdd12019-07-16 15:37:56 +0200551static const unsigned char sha256_test_sum[][32] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000552{
Manuel Pégourié-Gonnardabebdd12019-07-16 15:37:56 +0200553#if !defined(MBEDTLS_SHA256_NO_SHA224)
Paul Bakker5121ce52009-01-03 21:22:43 +0000554 /*
555 * SHA-224 test vectors
556 */
557 { 0x23, 0x09, 0x7D, 0x22, 0x34, 0x05, 0xD8, 0x22,
558 0x86, 0x42, 0xA4, 0x77, 0xBD, 0xA2, 0x55, 0xB3,
559 0x2A, 0xAD, 0xBC, 0xE4, 0xBD, 0xA0, 0xB3, 0xF7,
560 0xE3, 0x6C, 0x9D, 0xA7 },
561 { 0x75, 0x38, 0x8B, 0x16, 0x51, 0x27, 0x76, 0xCC,
562 0x5D, 0xBA, 0x5D, 0xA1, 0xFD, 0x89, 0x01, 0x50,
563 0xB0, 0xC6, 0x45, 0x5C, 0xB4, 0xF5, 0x8B, 0x19,
564 0x52, 0x52, 0x25, 0x25 },
565 { 0x20, 0x79, 0x46, 0x55, 0x98, 0x0C, 0x91, 0xD8,
566 0xBB, 0xB4, 0xC1, 0xEA, 0x97, 0x61, 0x8A, 0x4B,
567 0xF0, 0x3F, 0x42, 0x58, 0x19, 0x48, 0xB2, 0xEE,
568 0x4E, 0xE7, 0xAD, 0x67 },
Manuel Pégourié-Gonnardabebdd12019-07-16 15:37:56 +0200569#endif /* !MBEDTLS_SHA256_NO_SHA224 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000570
571 /*
572 * SHA-256 test vectors
573 */
574 { 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA,
575 0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23,
576 0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C,
577 0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD },
578 { 0x24, 0x8D, 0x6A, 0x61, 0xD2, 0x06, 0x38, 0xB8,
579 0xE5, 0xC0, 0x26, 0x93, 0x0C, 0x3E, 0x60, 0x39,
580 0xA3, 0x3C, 0xE4, 0x59, 0x64, 0xFF, 0x21, 0x67,
581 0xF6, 0xEC, 0xED, 0xD4, 0x19, 0xDB, 0x06, 0xC1 },
582 { 0xCD, 0xC7, 0x6E, 0x5C, 0x99, 0x14, 0xFB, 0x92,
583 0x81, 0xA1, 0xC7, 0xE2, 0x84, 0xD7, 0x3E, 0x67,
584 0xF1, 0x80, 0x9A, 0x48, 0xA4, 0x97, 0x20, 0x0E,
585 0x04, 0x6D, 0x39, 0xCC, 0xC7, 0x11, 0x2C, 0xD0 }
586};
587
Manuel Pégourié-Gonnardabebdd12019-07-16 15:37:56 +0200588#define SHA256_TEST_SUM_N \
589 ( sizeof( sha256_test_sum ) / sizeof( sha256_test_sum[0] ) )
590
Paul Bakker5121ce52009-01-03 21:22:43 +0000591/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000592 * Checkup routine
593 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200594int mbedtls_sha256_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000595{
Paul Bakker5b4af392014-06-26 12:09:34 +0200596 int i, j, k, buflen, ret = 0;
Russ Butlerbb83b422016-10-12 17:36:50 -0500597 unsigned char *buf;
Paul Bakker9e36f042013-06-30 14:34:05 +0200598 unsigned char sha256sum[32];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200599 mbedtls_sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000600
Russ Butlerbb83b422016-10-12 17:36:50 -0500601 buf = mbedtls_calloc( 1024, sizeof(unsigned char) );
602 if( NULL == buf )
603 {
604 if( verbose != 0 )
605 mbedtls_printf( "Buffer allocation failed\n" );
606
607 return( 1 );
608 }
609
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200610 mbedtls_sha256_init( &ctx );
Paul Bakker5b4af392014-06-26 12:09:34 +0200611
Manuel Pégourié-Gonnardabebdd12019-07-16 15:37:56 +0200612 for( i = 0; i < (int) SHA256_TEST_SUM_N; i++ )
Paul Bakker5121ce52009-01-03 21:22:43 +0000613 {
614 j = i % 3;
Manuel Pégourié-Gonnardabebdd12019-07-16 15:37:56 +0200615#if !defined(MBEDTLS_SHA256_NO_SHA224)
Paul Bakker5121ce52009-01-03 21:22:43 +0000616 k = i < 3;
Manuel Pégourié-Gonnardabebdd12019-07-16 15:37:56 +0200617#else
618 k = 0;
619#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000620
621 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200622 mbedtls_printf( " SHA-%d test #%d: ", 256 - k * 32, j + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000623
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100624 if( ( ret = mbedtls_sha256_starts_ret( &ctx, k ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100625 goto fail;
Paul Bakker5121ce52009-01-03 21:22:43 +0000626
627 if( j == 2 )
628 {
Teppo Järvelind49d2b62019-10-30 13:48:12 +0200629 memset( buf, 'a', buflen = 1000 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000630
631 for( j = 0; j < 1000; j++ )
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100632 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100633 ret = mbedtls_sha256_update_ret( &ctx, buf, buflen );
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100634 if( ret != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100635 goto fail;
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100636 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100637
Paul Bakker5121ce52009-01-03 21:22:43 +0000638 }
639 else
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100640 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100641 ret = mbedtls_sha256_update_ret( &ctx, sha256_test_buf[j],
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100642 sha256_test_buflen[j] );
643 if( ret != 0 )
644 goto fail;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100645 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000646
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100647 if( ( ret = mbedtls_sha256_finish_ret( &ctx, sha256sum ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100648 goto fail;
649
Paul Bakker5121ce52009-01-03 21:22:43 +0000650
Paul Bakker9e36f042013-06-30 14:34:05 +0200651 if( memcmp( sha256sum, sha256_test_sum[i], 32 - k * 4 ) != 0 )
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100652 {
653 ret = 1;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100654 goto fail;
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100655 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000656
657 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200658 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000659 }
660
661 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200662 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000663
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100664 goto exit;
665
666fail:
667 if( verbose != 0 )
668 mbedtls_printf( "failed\n" );
669
Paul Bakker5b4af392014-06-26 12:09:34 +0200670exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200671 mbedtls_sha256_free( &ctx );
Russ Butlerbb83b422016-10-12 17:36:50 -0500672 mbedtls_free( buf );
Paul Bakker5b4af392014-06-26 12:09:34 +0200673
674 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000675}
676
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200677#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000678
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200679#endif /* MBEDTLS_SHA256_C */