blob: 52145918b5f75fc86741945f56b7cbded8dd85ce [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 {
284 return( 0 );
285 }
Andrzej Kurekca609372020-07-08 03:19:02 -0400286 /* Free the ctx upon suspected FI */
287 mbedtls_sha256_free( ctx );
Andrzej Kurek78f77eb2020-06-04 08:09:53 -0400288 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Paul Bakker5121ce52009-01-03 21:22:43 +0000289}
Jaeden Amero041039f2018-02-19 15:28:08 +0000290
291#if !defined(MBEDTLS_DEPRECATED_REMOVED)
292void mbedtls_sha256_process( mbedtls_sha256_context *ctx,
293 const unsigned char data[64] )
294{
295 mbedtls_internal_sha256_process( ctx, data );
296}
297#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200298#endif /* !MBEDTLS_SHA256_PROCESS_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000299
300/*
301 * SHA-256 process buffer
302 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100303int mbedtls_sha256_update_ret( mbedtls_sha256_context *ctx,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100304 const unsigned char *input,
305 size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000306{
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100307 int ret;
Paul Bakker23986e52011-04-24 08:57:21 +0000308 size_t fill;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000309 uint32_t left;
Andrzej Kurek74f7d0f2020-07-06 14:28:12 -0400310 volatile const unsigned char *input_dup = input;
311 volatile size_t ilen_dup = ilen;
312 size_t ilen_change;
Hanno Becker8d215e72018-12-18 17:53:21 +0000313 SHA256_VALIDATE_RET( ctx != NULL );
314 SHA256_VALIDATE_RET( ilen == 0 || input != NULL );
Hanno Becker596e0142018-12-18 15:00:38 +0000315
Andrzej Kurek89173262020-07-15 18:51:40 -0400316 /* ilen_dup is used instead of ilen, to have it volatile for FI protection */
317 if( ilen_dup == 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100318 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000319
Andrzej Kurek89173262020-07-15 18:51:40 -0400320 if( ilen_dup > UINT32_MAX )
321 return( MBEDTLS_ERR_SHA256_BAD_INPUT_DATA );
322
Paul Bakker5121ce52009-01-03 21:22:43 +0000323 left = ctx->total[0] & 0x3F;
324 fill = 64 - left;
325
Andrzej Kurek89173262020-07-15 18:51:40 -0400326 ctx->total[0] += (uint32_t) ilen_dup;
Paul Bakker5121ce52009-01-03 21:22:43 +0000327
Andrzej Kurek89173262020-07-15 18:51:40 -0400328 if( ctx->total[0] < (uint32_t) ilen_dup )
Paul Bakker5121ce52009-01-03 21:22:43 +0000329 ctx->total[1]++;
330
Andrzej Kurek89173262020-07-15 18:51:40 -0400331 if( left && ilen_dup >= fill )
Paul Bakker5121ce52009-01-03 21:22:43 +0000332 {
Teppo Järvelin91d79382019-10-02 09:09:31 +0300333 mbedtls_platform_memcpy( (void *) (ctx->buffer + left), input, fill );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100334
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100335 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100336 return( ret );
337
Paul Bakker5121ce52009-01-03 21:22:43 +0000338 input += fill;
Andrzej Kurek89173262020-07-15 18:51:40 -0400339 ilen_dup -= fill;
Paul Bakker5121ce52009-01-03 21:22:43 +0000340 left = 0;
341 }
342
Andrzej Kurek89173262020-07-15 18:51:40 -0400343 while( ilen_dup >= 64 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000344 {
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100345 if( ( ret = mbedtls_internal_sha256_process( ctx, input ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100346 return( ret );
347
Paul Bakker5121ce52009-01-03 21:22:43 +0000348 input += 64;
Andrzej Kurek89173262020-07-15 18:51:40 -0400349 ilen_dup -= 64;
Paul Bakker5121ce52009-01-03 21:22:43 +0000350 }
351
Andrzej Kurek89173262020-07-15 18:51:40 -0400352 if( ilen_dup > 0 )
353 mbedtls_platform_memcpy( (void *) (ctx->buffer + left), input, ilen_dup );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100354
Andrzej Kurek89173262020-07-15 18:51:40 -0400355 /* Re-check ilen_dup to protect from a FI attack */
356 if( ilen_dup < 64 )
Andrzej Kurek78f77eb2020-06-04 08:09:53 -0400357 {
Andrzej Kurek74f7d0f2020-07-06 14:28:12 -0400358 /* Re-check that the calculated offsets are correct */
Andrzej Kurek89173262020-07-15 18:51:40 -0400359 ilen_change = ilen - ilen_dup;
Andrzej Kurek74f7d0f2020-07-06 14:28:12 -0400360 if( ( input_dup + ilen_change ) == input )
361 {
362 return( 0 );
363 }
Andrzej Kurek78f77eb2020-06-04 08:09:53 -0400364 }
Andrzej Kurekca609372020-07-08 03:19:02 -0400365 /* Free the ctx upon suspected FI */
366 mbedtls_sha256_free( ctx );
Andrzej Kurek78f77eb2020-06-04 08:09:53 -0400367 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Paul Bakker5121ce52009-01-03 21:22:43 +0000368}
369
Jaeden Amero041039f2018-02-19 15:28:08 +0000370#if !defined(MBEDTLS_DEPRECATED_REMOVED)
371void mbedtls_sha256_update( mbedtls_sha256_context *ctx,
372 const unsigned char *input,
373 size_t ilen )
374{
375 mbedtls_sha256_update_ret( ctx, input, ilen );
376}
377#endif
378
Paul Bakker5121ce52009-01-03 21:22:43 +0000379/*
380 * SHA-256 final digest
381 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100382int mbedtls_sha256_finish_ret( mbedtls_sha256_context *ctx,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100383 unsigned char output[32] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000384{
Arto Kinnunen9b3b1942019-09-09 17:02:35 +0300385 int ret, s_pos, o_pos;
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200386 uint32_t used;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000387 uint32_t high, low;
Jarno Lamsabb86c522020-01-07 13:33:45 +0200388 uint32_t offset = 0;
Andrzej Kurek89173262020-07-15 18:51:40 -0400389 volatile uint32_t flow_ctrl = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000390
Hanno Becker8d215e72018-12-18 17:53:21 +0000391 SHA256_VALIDATE_RET( ctx != NULL );
392 SHA256_VALIDATE_RET( (unsigned char *)output != NULL );
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +0000393
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200394 /*
395 * Add padding: 0x80 then 0x00 until 8 bytes remain for the length
396 */
397 used = ctx->total[0] & 0x3F;
398
399 ctx->buffer[used++] = 0x80;
Andrzej Kurek78f77eb2020-06-04 08:09:53 -0400400 flow_ctrl++;
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200401
402 if( used <= 56 )
403 {
404 /* Enough room for padding + length in current block */
Manuel Pégourié-Gonnard7a346b82019-10-02 14:47:01 +0200405 mbedtls_platform_memset( ctx->buffer + used, 0, 56 - used );
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200406 }
407 else
408 {
409 /* We'll need an extra block */
Manuel Pégourié-Gonnard7a346b82019-10-02 14:47:01 +0200410 mbedtls_platform_memset( ctx->buffer + used, 0, 64 - used );
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200411
412 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
413 return( ret );
414
Manuel Pégourié-Gonnard7a346b82019-10-02 14:47:01 +0200415 mbedtls_platform_memset( ctx->buffer, 0, 56 );
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200416 }
417
418 /*
419 * Add message length
420 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000421 high = ( ctx->total[0] >> 29 )
422 | ( ctx->total[1] << 3 );
423 low = ( ctx->total[0] << 3 );
424
Arto Kinnunen3d7439e2019-09-10 11:30:40 +0300425 (void)mbedtls_platform_put_uint32_be( ctx->buffer + 56, high );
426 (void)mbedtls_platform_put_uint32_be( ctx->buffer + 60, low );
Andrzej Kurek78f77eb2020-06-04 08:09:53 -0400427 flow_ctrl++;
Paul Bakker5121ce52009-01-03 21:22:43 +0000428
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200429 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
Andres Amaya Garciaaa464ef2017-07-21 14:21:53 +0100430 return( ret );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100431
Manuel Pégourié-Gonnard1cc1fb02018-06-28 12:10:27 +0200432 /*
433 * Output final state
434 */
Jarno Lamsabb86c522020-01-07 13:33:45 +0200435 offset = mbedtls_platform_random_in_range(7);
Arto Kinnunen0b62ce82019-09-04 14:04:57 +0300436
Jarno Lamsabb86c522020-01-07 13:33:45 +0200437 mbedtls_platform_memset( output, 0, 32 );
438
439 for( s_pos = offset, o_pos = offset * 4; s_pos < 7;
440 s_pos++, o_pos += 4 )
Arto Kinnunen0b62ce82019-09-04 14:04:57 +0300441 {
Arto Kinnunen3d7439e2019-09-10 11:30:40 +0300442 (void)mbedtls_platform_put_uint32_be( &output[o_pos],
Jarno Lamsabb86c522020-01-07 13:33:45 +0200443 ctx->state[s_pos] );
Andrzej Kurek78f77eb2020-06-04 08:09:53 -0400444 flow_ctrl++;
Arto Kinnunen0b62ce82019-09-04 14:04:57 +0300445 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000446
Manuel Pégourié-Gonnard8463d292019-07-16 14:39:55 +0200447#if !defined(MBEDTLS_SHA256_NO_SHA224)
Paul Bakker5121ce52009-01-03 21:22:43 +0000448 if( ctx->is224 == 0 )
Manuel Pégourié-Gonnard8463d292019-07-16 14:39:55 +0200449#endif
Arto Kinnunen3d7439e2019-09-10 11:30:40 +0300450 (void)mbedtls_platform_put_uint32_be( &output[28], ctx->state[7] );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100451
Jarno Lamsabb86c522020-01-07 13:33:45 +0200452 for( s_pos = 0, o_pos = 0; s_pos < (int)offset; s_pos++, o_pos += 4 )
453 {
454 (void)mbedtls_platform_put_uint32_be( &output[o_pos],
455 ctx->state[s_pos] );
Andrzej Kurek78f77eb2020-06-04 08:09:53 -0400456 flow_ctrl++;
Jarno Lamsabb86c522020-01-07 13:33:45 +0200457 }
Andrzej Kurek78f77eb2020-06-04 08:09:53 -0400458 /* flow ctrl was incremented twice and then 7 times in two loops */
459 if( flow_ctrl == 9 )
460 {
461 return( 0 );
462 }
Andrzej Kurekca609372020-07-08 03:19:02 -0400463 /* Free the ctx and clear output upon suspected FI */
464 mbedtls_sha256_free( ctx );
465 mbedtls_platform_memset( output, 0, 32 );
Andrzej Kurek78f77eb2020-06-04 08:09:53 -0400466 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Paul Bakker5121ce52009-01-03 21:22:43 +0000467}
468
Jaeden Amero041039f2018-02-19 15:28:08 +0000469#if !defined(MBEDTLS_DEPRECATED_REMOVED)
470void mbedtls_sha256_finish( mbedtls_sha256_context *ctx,
471 unsigned char output[32] )
472{
473 mbedtls_sha256_finish_ret( ctx, output );
474}
475#endif
476
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200477#endif /* !MBEDTLS_SHA256_ALT */
Paul Bakker90995b52013-06-24 19:20:35 +0200478
Paul Bakker5121ce52009-01-03 21:22:43 +0000479/*
480 * output = SHA-256( input buffer )
481 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100482int mbedtls_sha256_ret( const unsigned char *input,
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100483 size_t ilen,
484 unsigned char output[32],
485 int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000486{
Andrzej Kurek74f7d0f2020-07-06 14:28:12 -0400487 int ret = MBEDTLS_ERR_PLATFORM_FAULT_DETECTED;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200488 mbedtls_sha256_context ctx;
Andrzej Kurek74f7d0f2020-07-06 14:28:12 -0400489 volatile const unsigned char *input_dup = input;
490 volatile size_t ilen_dup = ilen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000491
Hanno Becker8d215e72018-12-18 17:53:21 +0000492 SHA256_VALIDATE_RET( is224 == 0 || is224 == 1 );
493 SHA256_VALIDATE_RET( ilen == 0 || input != NULL );
494 SHA256_VALIDATE_RET( (unsigned char *)output != NULL );
Andres Amaya Garcia79e593f2018-12-09 20:41:20 +0000495
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200496 mbedtls_sha256_init( &ctx );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100497
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100498 if( ( ret = mbedtls_sha256_starts_ret( &ctx, is224 ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100499 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100500
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100501 if( ( ret = mbedtls_sha256_update_ret( &ctx, input, ilen ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100502 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100503
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100504 if( ( ret = mbedtls_sha256_finish_ret( &ctx, output ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100505 goto exit;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100506
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100507exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200508 mbedtls_sha256_free( &ctx );
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100509
Andrzej Kurek74f7d0f2020-07-06 14:28:12 -0400510 if( input_dup == input && ilen_dup == ilen )
511 {
512 return( ret );
513 }
Andrzej Kurekca609372020-07-08 03:19:02 -0400514 mbedtls_platform_memset( output, 0, 32 );
Andrzej Kurek74f7d0f2020-07-06 14:28:12 -0400515 return( MBEDTLS_ERR_PLATFORM_FAULT_DETECTED );
Paul Bakker5121ce52009-01-03 21:22:43 +0000516}
517
Jaeden Amero041039f2018-02-19 15:28:08 +0000518#if !defined(MBEDTLS_DEPRECATED_REMOVED)
519void mbedtls_sha256( const unsigned char *input,
520 size_t ilen,
521 unsigned char output[32],
522 int is224 )
523{
524 mbedtls_sha256_ret( input, ilen, output, is224 );
525}
526#endif
527
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200528#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000529/*
530 * FIPS-180-2 test vectors
531 */
Manuel Pégourié-Gonnard28122e42015-03-11 09:13:42 +0000532static const unsigned char sha256_test_buf[3][57] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000533{
534 { "abc" },
535 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
536 { "" }
537};
538
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100539static const size_t sha256_test_buflen[3] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000540{
541 3, 56, 1000
542};
543
Manuel Pégourié-Gonnardabebdd12019-07-16 15:37:56 +0200544static const unsigned char sha256_test_sum[][32] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000545{
Manuel Pégourié-Gonnardabebdd12019-07-16 15:37:56 +0200546#if !defined(MBEDTLS_SHA256_NO_SHA224)
Paul Bakker5121ce52009-01-03 21:22:43 +0000547 /*
548 * SHA-224 test vectors
549 */
550 { 0x23, 0x09, 0x7D, 0x22, 0x34, 0x05, 0xD8, 0x22,
551 0x86, 0x42, 0xA4, 0x77, 0xBD, 0xA2, 0x55, 0xB3,
552 0x2A, 0xAD, 0xBC, 0xE4, 0xBD, 0xA0, 0xB3, 0xF7,
553 0xE3, 0x6C, 0x9D, 0xA7 },
554 { 0x75, 0x38, 0x8B, 0x16, 0x51, 0x27, 0x76, 0xCC,
555 0x5D, 0xBA, 0x5D, 0xA1, 0xFD, 0x89, 0x01, 0x50,
556 0xB0, 0xC6, 0x45, 0x5C, 0xB4, 0xF5, 0x8B, 0x19,
557 0x52, 0x52, 0x25, 0x25 },
558 { 0x20, 0x79, 0x46, 0x55, 0x98, 0x0C, 0x91, 0xD8,
559 0xBB, 0xB4, 0xC1, 0xEA, 0x97, 0x61, 0x8A, 0x4B,
560 0xF0, 0x3F, 0x42, 0x58, 0x19, 0x48, 0xB2, 0xEE,
561 0x4E, 0xE7, 0xAD, 0x67 },
Manuel Pégourié-Gonnardabebdd12019-07-16 15:37:56 +0200562#endif /* !MBEDTLS_SHA256_NO_SHA224 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000563
564 /*
565 * SHA-256 test vectors
566 */
567 { 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA,
568 0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23,
569 0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C,
570 0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD },
571 { 0x24, 0x8D, 0x6A, 0x61, 0xD2, 0x06, 0x38, 0xB8,
572 0xE5, 0xC0, 0x26, 0x93, 0x0C, 0x3E, 0x60, 0x39,
573 0xA3, 0x3C, 0xE4, 0x59, 0x64, 0xFF, 0x21, 0x67,
574 0xF6, 0xEC, 0xED, 0xD4, 0x19, 0xDB, 0x06, 0xC1 },
575 { 0xCD, 0xC7, 0x6E, 0x5C, 0x99, 0x14, 0xFB, 0x92,
576 0x81, 0xA1, 0xC7, 0xE2, 0x84, 0xD7, 0x3E, 0x67,
577 0xF1, 0x80, 0x9A, 0x48, 0xA4, 0x97, 0x20, 0x0E,
578 0x04, 0x6D, 0x39, 0xCC, 0xC7, 0x11, 0x2C, 0xD0 }
579};
580
Manuel Pégourié-Gonnardabebdd12019-07-16 15:37:56 +0200581#define SHA256_TEST_SUM_N \
582 ( sizeof( sha256_test_sum ) / sizeof( sha256_test_sum[0] ) )
583
Paul Bakker5121ce52009-01-03 21:22:43 +0000584/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000585 * Checkup routine
586 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200587int mbedtls_sha256_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000588{
Paul Bakker5b4af392014-06-26 12:09:34 +0200589 int i, j, k, buflen, ret = 0;
Russ Butlerbb83b422016-10-12 17:36:50 -0500590 unsigned char *buf;
Paul Bakker9e36f042013-06-30 14:34:05 +0200591 unsigned char sha256sum[32];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200592 mbedtls_sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000593
Russ Butlerbb83b422016-10-12 17:36:50 -0500594 buf = mbedtls_calloc( 1024, sizeof(unsigned char) );
595 if( NULL == buf )
596 {
597 if( verbose != 0 )
598 mbedtls_printf( "Buffer allocation failed\n" );
599
600 return( 1 );
601 }
602
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200603 mbedtls_sha256_init( &ctx );
Paul Bakker5b4af392014-06-26 12:09:34 +0200604
Manuel Pégourié-Gonnardabebdd12019-07-16 15:37:56 +0200605 for( i = 0; i < (int) SHA256_TEST_SUM_N; i++ )
Paul Bakker5121ce52009-01-03 21:22:43 +0000606 {
607 j = i % 3;
Manuel Pégourié-Gonnardabebdd12019-07-16 15:37:56 +0200608#if !defined(MBEDTLS_SHA256_NO_SHA224)
Paul Bakker5121ce52009-01-03 21:22:43 +0000609 k = i < 3;
Manuel Pégourié-Gonnardabebdd12019-07-16 15:37:56 +0200610#else
611 k = 0;
612#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000613
614 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200615 mbedtls_printf( " SHA-%d test #%d: ", 256 - k * 32, j + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000616
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100617 if( ( ret = mbedtls_sha256_starts_ret( &ctx, k ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100618 goto fail;
Paul Bakker5121ce52009-01-03 21:22:43 +0000619
620 if( j == 2 )
621 {
Teppo Järvelind49d2b62019-10-30 13:48:12 +0200622 memset( buf, 'a', buflen = 1000 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000623
624 for( j = 0; j < 1000; j++ )
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100625 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100626 ret = mbedtls_sha256_update_ret( &ctx, buf, buflen );
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100627 if( ret != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100628 goto fail;
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100629 }
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100630
Paul Bakker5121ce52009-01-03 21:22:43 +0000631 }
632 else
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100633 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100634 ret = mbedtls_sha256_update_ret( &ctx, sha256_test_buf[j],
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100635 sha256_test_buflen[j] );
636 if( ret != 0 )
637 goto fail;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100638 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000639
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100640 if( ( ret = mbedtls_sha256_finish_ret( &ctx, sha256sum ) ) != 0 )
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100641 goto fail;
642
Paul Bakker5121ce52009-01-03 21:22:43 +0000643
Paul Bakker9e36f042013-06-30 14:34:05 +0200644 if( memcmp( sha256sum, sha256_test_sum[i], 32 - k * 4 ) != 0 )
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100645 {
646 ret = 1;
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100647 goto fail;
Andres Amaya Garcia6a3f3052017-07-20 14:18:54 +0100648 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000649
650 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200651 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000652 }
653
654 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200655 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000656
Andres Amaya Garcia72a7f532017-05-02 11:38:47 +0100657 goto exit;
658
659fail:
660 if( verbose != 0 )
661 mbedtls_printf( "failed\n" );
662
Paul Bakker5b4af392014-06-26 12:09:34 +0200663exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200664 mbedtls_sha256_free( &ctx );
Russ Butlerbb83b422016-10-12 17:36:50 -0500665 mbedtls_free( buf );
Paul Bakker5b4af392014-06-26 12:09:34 +0200666
667 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000668}
669
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200670#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000671
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200672#endif /* MBEDTLS_SHA256_C */