blob: db675efd1bab572fc791420fe2ea2700329d0189 [file] [log] [blame]
Jens Wiklander817466c2018-05-22 13:49:31 +02001/*
2 * FIPS-180-2 compliant SHA-256 implementation
3 *
Jerome Forissier79013242021-07-28 10:24:04 +02004 * Copyright The Mbed TLS Contributors
5 * SPDX-License-Identifier: Apache-2.0
Jens Wiklander817466c2018-05-22 13:49:31 +02006 *
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.
Jens Wiklander817466c2018-05-22 13:49:31 +020018 */
19/*
20 * The SHA-256 Secure Hash Standard was published by NIST in 2002.
21 *
22 * http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf
23 */
24
Jerome Forissier79013242021-07-28 10:24:04 +020025#include "common.h"
Jens Wiklander817466c2018-05-22 13:49:31 +020026
27#if defined(MBEDTLS_SHA256_C)
28
29#include "mbedtls/sha256.h"
Jens Wiklander3d3b0592019-03-20 15:30:29 +010030#include "mbedtls/platform_util.h"
Jerome Forissier11fa71b2020-04-20 17:17:56 +020031#include "mbedtls/error.h"
Jens Wiklander817466c2018-05-22 13:49:31 +020032
33#include <string.h>
34
35#if defined(MBEDTLS_SELF_TEST)
36#if defined(MBEDTLS_PLATFORM_C)
37#include "mbedtls/platform.h"
38#else
39#include <stdio.h>
40#include <stdlib.h>
41#define mbedtls_printf printf
42#define mbedtls_calloc calloc
43#define mbedtls_free free
44#endif /* MBEDTLS_PLATFORM_C */
45#endif /* MBEDTLS_SELF_TEST */
46
Jens Wiklander3d3b0592019-03-20 15:30:29 +010047#define SHA256_VALIDATE_RET(cond) \
48 MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_SHA256_BAD_INPUT_DATA )
49#define SHA256_VALIDATE(cond) MBEDTLS_INTERNAL_VALIDATE( cond )
Jens Wiklander817466c2018-05-22 13:49:31 +020050
Jens Wiklander3d3b0592019-03-20 15:30:29 +010051#if !defined(MBEDTLS_SHA256_ALT)
Jens Wiklander817466c2018-05-22 13:49:31 +020052
Jens Wiklander817466c2018-05-22 13:49:31 +020053void mbedtls_sha256_init( mbedtls_sha256_context *ctx )
54{
Jens Wiklander3d3b0592019-03-20 15:30:29 +010055 SHA256_VALIDATE( ctx != NULL );
56
Jens Wiklander817466c2018-05-22 13:49:31 +020057 memset( ctx, 0, sizeof( mbedtls_sha256_context ) );
58}
59
60void mbedtls_sha256_free( mbedtls_sha256_context *ctx )
61{
62 if( ctx == NULL )
63 return;
64
Jens Wiklander3d3b0592019-03-20 15:30:29 +010065 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_sha256_context ) );
Jens Wiklander817466c2018-05-22 13:49:31 +020066}
67
68void mbedtls_sha256_clone( mbedtls_sha256_context *dst,
69 const mbedtls_sha256_context *src )
70{
Jens Wiklander3d3b0592019-03-20 15:30:29 +010071 SHA256_VALIDATE( dst != NULL );
72 SHA256_VALIDATE( src != NULL );
73
Jens Wiklander817466c2018-05-22 13:49:31 +020074 *dst = *src;
75}
76
77/*
78 * SHA-256 context setup
79 */
Jens Wiklander3d3b0592019-03-20 15:30:29 +010080int mbedtls_sha256_starts_ret( mbedtls_sha256_context *ctx, int is224 )
Jens Wiklander817466c2018-05-22 13:49:31 +020081{
Jens Wiklander3d3b0592019-03-20 15:30:29 +010082 SHA256_VALIDATE_RET( ctx != NULL );
83 SHA256_VALIDATE_RET( is224 == 0 || is224 == 1 );
84
Jens Wiklander817466c2018-05-22 13:49:31 +020085 ctx->total[0] = 0;
86 ctx->total[1] = 0;
87
88 if( is224 == 0 )
89 {
90 /* SHA-256 */
91 ctx->state[0] = 0x6A09E667;
92 ctx->state[1] = 0xBB67AE85;
93 ctx->state[2] = 0x3C6EF372;
94 ctx->state[3] = 0xA54FF53A;
95 ctx->state[4] = 0x510E527F;
96 ctx->state[5] = 0x9B05688C;
97 ctx->state[6] = 0x1F83D9AB;
98 ctx->state[7] = 0x5BE0CD19;
99 }
100 else
101 {
102 /* SHA-224 */
103 ctx->state[0] = 0xC1059ED8;
104 ctx->state[1] = 0x367CD507;
105 ctx->state[2] = 0x3070DD17;
106 ctx->state[3] = 0xF70E5939;
107 ctx->state[4] = 0xFFC00B31;
108 ctx->state[5] = 0x68581511;
109 ctx->state[6] = 0x64F98FA7;
110 ctx->state[7] = 0xBEFA4FA4;
111 }
112
113 ctx->is224 = is224;
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100114
115 return( 0 );
Jens Wiklander817466c2018-05-22 13:49:31 +0200116}
117
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100118#if !defined(MBEDTLS_DEPRECATED_REMOVED)
119void mbedtls_sha256_starts( mbedtls_sha256_context *ctx,
120 int is224 )
121{
122 mbedtls_sha256_starts_ret( ctx, is224 );
123}
124#endif
125
Jens Wiklander817466c2018-05-22 13:49:31 +0200126#if !defined(MBEDTLS_SHA256_PROCESS_ALT)
127static const uint32_t K[] =
128{
129 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,
130 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,
131 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,
132 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,
133 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,
134 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,
135 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,
136 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,
137 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,
138 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,
139 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,
140 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,
141 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,
142 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,
143 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,
144 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2,
145};
146
Jerome Forissier5b25c762020-04-07 11:18:49 +0200147#define SHR(x,n) (((x) & 0xFFFFFFFF) >> (n))
148#define ROTR(x,n) (SHR(x,n) | ((x) << (32 - (n))))
Jens Wiklander817466c2018-05-22 13:49:31 +0200149
150#define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^ SHR(x, 3))
151#define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^ SHR(x,10))
152
153#define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22))
154#define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25))
155
Jerome Forissier5b25c762020-04-07 11:18:49 +0200156#define F0(x,y,z) (((x) & (y)) | ((z) & ((x) | (y))))
157#define F1(x,y,z) ((z) ^ ((x) & ((y) ^ (z))))
Jens Wiklander817466c2018-05-22 13:49:31 +0200158
Jerome Forissier79013242021-07-28 10:24:04 +0200159#define R(t) \
160 ( \
161 local.W[t] = S1(local.W[(t) - 2]) + local.W[(t) - 7] + \
162 S0(local.W[(t) - 15]) + local.W[(t) - 16] \
Jerome Forissier5b25c762020-04-07 11:18:49 +0200163 )
Jens Wiklander817466c2018-05-22 13:49:31 +0200164
Jerome Forissier79013242021-07-28 10:24:04 +0200165#define P(a,b,c,d,e,f,g,h,x,K) \
166 do \
167 { \
168 local.temp1 = (h) + S3(e) + F1((e),(f),(g)) + (K) + (x); \
169 local.temp2 = S2(a) + F0((a),(b),(c)); \
170 (d) += local.temp1; (h) = local.temp1 + local.temp2; \
Jerome Forissier5b25c762020-04-07 11:18:49 +0200171 } while( 0 )
Jens Wiklander817466c2018-05-22 13:49:31 +0200172
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100173int mbedtls_internal_sha256_process( mbedtls_sha256_context *ctx,
174 const unsigned char data[64] )
Jens Wiklander817466c2018-05-22 13:49:31 +0200175{
Jerome Forissier79013242021-07-28 10:24:04 +0200176 struct
177 {
178 uint32_t temp1, temp2, W[64];
179 uint32_t A[8];
180 } local;
181
Jens Wiklander817466c2018-05-22 13:49:31 +0200182 unsigned int i;
183
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100184 SHA256_VALIDATE_RET( ctx != NULL );
185 SHA256_VALIDATE_RET( (const unsigned char *)data != NULL );
186
Jens Wiklander817466c2018-05-22 13:49:31 +0200187 for( i = 0; i < 8; i++ )
Jerome Forissier79013242021-07-28 10:24:04 +0200188 local.A[i] = ctx->state[i];
Jens Wiklander817466c2018-05-22 13:49:31 +0200189
190#if defined(MBEDTLS_SHA256_SMALLER)
191 for( i = 0; i < 64; i++ )
192 {
193 if( i < 16 )
Jerome Forissier039e02d2022-08-09 17:10:15 +0200194 local.W[i] = MBEDTLS_GET_UINT32_BE( data, 4 * i );
Jens Wiklander817466c2018-05-22 13:49:31 +0200195 else
196 R( i );
197
Jerome Forissier79013242021-07-28 10:24:04 +0200198 P( local.A[0], local.A[1], local.A[2], local.A[3], local.A[4],
199 local.A[5], local.A[6], local.A[7], local.W[i], K[i] );
Jens Wiklander817466c2018-05-22 13:49:31 +0200200
Jerome Forissier79013242021-07-28 10:24:04 +0200201 local.temp1 = local.A[7]; local.A[7] = local.A[6];
202 local.A[6] = local.A[5]; local.A[5] = local.A[4];
203 local.A[4] = local.A[3]; local.A[3] = local.A[2];
204 local.A[2] = local.A[1]; local.A[1] = local.A[0];
205 local.A[0] = local.temp1;
Jens Wiklander817466c2018-05-22 13:49:31 +0200206 }
207#else /* MBEDTLS_SHA256_SMALLER */
208 for( i = 0; i < 16; i++ )
Jerome Forissier039e02d2022-08-09 17:10:15 +0200209 local.W[i] = MBEDTLS_GET_UINT32_BE( data, 4 * i );
Jens Wiklander817466c2018-05-22 13:49:31 +0200210
211 for( i = 0; i < 16; i += 8 )
212 {
Jerome Forissier79013242021-07-28 10:24:04 +0200213 P( local.A[0], local.A[1], local.A[2], local.A[3], local.A[4],
214 local.A[5], local.A[6], local.A[7], local.W[i+0], K[i+0] );
215 P( local.A[7], local.A[0], local.A[1], local.A[2], local.A[3],
216 local.A[4], local.A[5], local.A[6], local.W[i+1], K[i+1] );
217 P( local.A[6], local.A[7], local.A[0], local.A[1], local.A[2],
218 local.A[3], local.A[4], local.A[5], local.W[i+2], K[i+2] );
219 P( local.A[5], local.A[6], local.A[7], local.A[0], local.A[1],
220 local.A[2], local.A[3], local.A[4], local.W[i+3], K[i+3] );
221 P( local.A[4], local.A[5], local.A[6], local.A[7], local.A[0],
222 local.A[1], local.A[2], local.A[3], local.W[i+4], K[i+4] );
223 P( local.A[3], local.A[4], local.A[5], local.A[6], local.A[7],
224 local.A[0], local.A[1], local.A[2], local.W[i+5], K[i+5] );
225 P( local.A[2], local.A[3], local.A[4], local.A[5], local.A[6],
226 local.A[7], local.A[0], local.A[1], local.W[i+6], K[i+6] );
227 P( local.A[1], local.A[2], local.A[3], local.A[4], local.A[5],
228 local.A[6], local.A[7], local.A[0], local.W[i+7], K[i+7] );
Jens Wiklander817466c2018-05-22 13:49:31 +0200229 }
230
231 for( i = 16; i < 64; i += 8 )
232 {
Jerome Forissier79013242021-07-28 10:24:04 +0200233 P( local.A[0], local.A[1], local.A[2], local.A[3], local.A[4],
234 local.A[5], local.A[6], local.A[7], R(i+0), K[i+0] );
235 P( local.A[7], local.A[0], local.A[1], local.A[2], local.A[3],
236 local.A[4], local.A[5], local.A[6], R(i+1), K[i+1] );
237 P( local.A[6], local.A[7], local.A[0], local.A[1], local.A[2],
238 local.A[3], local.A[4], local.A[5], R(i+2), K[i+2] );
239 P( local.A[5], local.A[6], local.A[7], local.A[0], local.A[1],
240 local.A[2], local.A[3], local.A[4], R(i+3), K[i+3] );
241 P( local.A[4], local.A[5], local.A[6], local.A[7], local.A[0],
242 local.A[1], local.A[2], local.A[3], R(i+4), K[i+4] );
243 P( local.A[3], local.A[4], local.A[5], local.A[6], local.A[7],
244 local.A[0], local.A[1], local.A[2], R(i+5), K[i+5] );
245 P( local.A[2], local.A[3], local.A[4], local.A[5], local.A[6],
246 local.A[7], local.A[0], local.A[1], R(i+6), K[i+6] );
247 P( local.A[1], local.A[2], local.A[3], local.A[4], local.A[5],
248 local.A[6], local.A[7], local.A[0], R(i+7), K[i+7] );
Jens Wiklander817466c2018-05-22 13:49:31 +0200249 }
250#endif /* MBEDTLS_SHA256_SMALLER */
251
252 for( i = 0; i < 8; i++ )
Jerome Forissier79013242021-07-28 10:24:04 +0200253 ctx->state[i] += local.A[i];
254
255 /* Zeroise buffers and variables to clear sensitive data from memory. */
256 mbedtls_platform_zeroize( &local, sizeof( local ) );
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100257
258 return( 0 );
Jens Wiklander817466c2018-05-22 13:49:31 +0200259}
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100260
261#if !defined(MBEDTLS_DEPRECATED_REMOVED)
262void mbedtls_sha256_process( mbedtls_sha256_context *ctx,
263 const unsigned char data[64] )
264{
265 mbedtls_internal_sha256_process( ctx, data );
266}
267#endif
Jens Wiklander817466c2018-05-22 13:49:31 +0200268#endif /* !MBEDTLS_SHA256_PROCESS_ALT */
269
270/*
271 * SHA-256 process buffer
272 */
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100273int mbedtls_sha256_update_ret( mbedtls_sha256_context *ctx,
274 const unsigned char *input,
275 size_t ilen )
Jens Wiklander817466c2018-05-22 13:49:31 +0200276{
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200277 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jens Wiklander817466c2018-05-22 13:49:31 +0200278 size_t fill;
279 uint32_t left;
280
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100281 SHA256_VALIDATE_RET( ctx != NULL );
282 SHA256_VALIDATE_RET( ilen == 0 || input != NULL );
283
Jens Wiklander817466c2018-05-22 13:49:31 +0200284 if( ilen == 0 )
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100285 return( 0 );
Jens Wiklander817466c2018-05-22 13:49:31 +0200286
287 left = ctx->total[0] & 0x3F;
288 fill = 64 - left;
289
290 ctx->total[0] += (uint32_t) ilen;
291 ctx->total[0] &= 0xFFFFFFFF;
292
293 if( ctx->total[0] < (uint32_t) ilen )
294 ctx->total[1]++;
295
296 if( left && ilen >= fill )
297 {
298 memcpy( (void *) (ctx->buffer + left), input, fill );
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100299
300 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
301 return( ret );
302
Jens Wiklander817466c2018-05-22 13:49:31 +0200303 input += fill;
304 ilen -= fill;
305 left = 0;
306 }
307
308 while( ilen >= 64 )
309 {
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100310 if( ( ret = mbedtls_internal_sha256_process( ctx, input ) ) != 0 )
311 return( ret );
312
Jens Wiklander817466c2018-05-22 13:49:31 +0200313 input += 64;
314 ilen -= 64;
315 }
316
317 if( ilen > 0 )
318 memcpy( (void *) (ctx->buffer + left), input, ilen );
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100319
320 return( 0 );
Jens Wiklander817466c2018-05-22 13:49:31 +0200321}
322
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100323#if !defined(MBEDTLS_DEPRECATED_REMOVED)
324void mbedtls_sha256_update( mbedtls_sha256_context *ctx,
325 const unsigned char *input,
326 size_t ilen )
Jens Wiklander817466c2018-05-22 13:49:31 +0200327{
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100328 mbedtls_sha256_update_ret( ctx, input, ilen );
329}
330#endif
Jens Wiklander817466c2018-05-22 13:49:31 +0200331
332/*
333 * SHA-256 final digest
334 */
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100335int mbedtls_sha256_finish_ret( mbedtls_sha256_context *ctx,
336 unsigned char output[32] )
Jens Wiklander817466c2018-05-22 13:49:31 +0200337{
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200338 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100339 uint32_t used;
Jens Wiklander817466c2018-05-22 13:49:31 +0200340 uint32_t high, low;
Jens Wiklander817466c2018-05-22 13:49:31 +0200341
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100342 SHA256_VALIDATE_RET( ctx != NULL );
343 SHA256_VALIDATE_RET( (unsigned char *)output != NULL );
344
345 /*
346 * Add padding: 0x80 then 0x00 until 8 bytes remain for the length
347 */
348 used = ctx->total[0] & 0x3F;
349
350 ctx->buffer[used++] = 0x80;
351
352 if( used <= 56 )
353 {
354 /* Enough room for padding + length in current block */
355 memset( ctx->buffer + used, 0, 56 - used );
356 }
357 else
358 {
359 /* We'll need an extra block */
360 memset( ctx->buffer + used, 0, 64 - used );
361
362 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
363 return( ret );
364
365 memset( ctx->buffer, 0, 56 );
366 }
367
368 /*
369 * Add message length
370 */
Jens Wiklander817466c2018-05-22 13:49:31 +0200371 high = ( ctx->total[0] >> 29 )
372 | ( ctx->total[1] << 3 );
373 low = ( ctx->total[0] << 3 );
374
Jerome Forissier039e02d2022-08-09 17:10:15 +0200375 MBEDTLS_PUT_UINT32_BE( high, ctx->buffer, 56 );
376 MBEDTLS_PUT_UINT32_BE( low, ctx->buffer, 60 );
Jens Wiklander817466c2018-05-22 13:49:31 +0200377
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100378 if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 )
379 return( ret );
Jens Wiklander817466c2018-05-22 13:49:31 +0200380
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100381 /*
382 * Output final state
383 */
Jerome Forissier039e02d2022-08-09 17:10:15 +0200384 MBEDTLS_PUT_UINT32_BE( ctx->state[0], output, 0 );
385 MBEDTLS_PUT_UINT32_BE( ctx->state[1], output, 4 );
386 MBEDTLS_PUT_UINT32_BE( ctx->state[2], output, 8 );
387 MBEDTLS_PUT_UINT32_BE( ctx->state[3], output, 12 );
388 MBEDTLS_PUT_UINT32_BE( ctx->state[4], output, 16 );
389 MBEDTLS_PUT_UINT32_BE( ctx->state[5], output, 20 );
390 MBEDTLS_PUT_UINT32_BE( ctx->state[6], output, 24 );
Jens Wiklander817466c2018-05-22 13:49:31 +0200391
392 if( ctx->is224 == 0 )
Jerome Forissier039e02d2022-08-09 17:10:15 +0200393 MBEDTLS_PUT_UINT32_BE( ctx->state[7], output, 28 );
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100394
395 return( 0 );
Jens Wiklander817466c2018-05-22 13:49:31 +0200396}
397
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100398#if !defined(MBEDTLS_DEPRECATED_REMOVED)
399void mbedtls_sha256_finish( mbedtls_sha256_context *ctx,
400 unsigned char output[32] )
401{
402 mbedtls_sha256_finish_ret( ctx, output );
403}
404#endif
405
Jens Wiklander817466c2018-05-22 13:49:31 +0200406#endif /* !MBEDTLS_SHA256_ALT */
407
408/*
409 * output = SHA-256( input buffer )
410 */
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100411int mbedtls_sha256_ret( const unsigned char *input,
412 size_t ilen,
413 unsigned char output[32],
414 int is224 )
Jens Wiklander817466c2018-05-22 13:49:31 +0200415{
Jerome Forissier11fa71b2020-04-20 17:17:56 +0200416 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jens Wiklander817466c2018-05-22 13:49:31 +0200417 mbedtls_sha256_context ctx;
418
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100419 SHA256_VALIDATE_RET( is224 == 0 || is224 == 1 );
420 SHA256_VALIDATE_RET( ilen == 0 || input != NULL );
421 SHA256_VALIDATE_RET( (unsigned char *)output != NULL );
422
Jens Wiklander817466c2018-05-22 13:49:31 +0200423 mbedtls_sha256_init( &ctx );
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100424
425 if( ( ret = mbedtls_sha256_starts_ret( &ctx, is224 ) ) != 0 )
426 goto exit;
427
428 if( ( ret = mbedtls_sha256_update_ret( &ctx, input, ilen ) ) != 0 )
429 goto exit;
430
431 if( ( ret = mbedtls_sha256_finish_ret( &ctx, output ) ) != 0 )
432 goto exit;
433
434exit:
Jens Wiklander817466c2018-05-22 13:49:31 +0200435 mbedtls_sha256_free( &ctx );
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100436
437 return( ret );
Jens Wiklander817466c2018-05-22 13:49:31 +0200438}
439
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100440#if !defined(MBEDTLS_DEPRECATED_REMOVED)
441void mbedtls_sha256( const unsigned char *input,
442 size_t ilen,
443 unsigned char output[32],
444 int is224 )
445{
446 mbedtls_sha256_ret( input, ilen, output, is224 );
447}
448#endif
449
Jens Wiklander817466c2018-05-22 13:49:31 +0200450#if defined(MBEDTLS_SELF_TEST)
451/*
452 * FIPS-180-2 test vectors
453 */
454static const unsigned char sha256_test_buf[3][57] =
455{
456 { "abc" },
457 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
458 { "" }
459};
460
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100461static const size_t sha256_test_buflen[3] =
Jens Wiklander817466c2018-05-22 13:49:31 +0200462{
463 3, 56, 1000
464};
465
466static const unsigned char sha256_test_sum[6][32] =
467{
468 /*
469 * SHA-224 test vectors
470 */
471 { 0x23, 0x09, 0x7D, 0x22, 0x34, 0x05, 0xD8, 0x22,
472 0x86, 0x42, 0xA4, 0x77, 0xBD, 0xA2, 0x55, 0xB3,
473 0x2A, 0xAD, 0xBC, 0xE4, 0xBD, 0xA0, 0xB3, 0xF7,
474 0xE3, 0x6C, 0x9D, 0xA7 },
475 { 0x75, 0x38, 0x8B, 0x16, 0x51, 0x27, 0x76, 0xCC,
476 0x5D, 0xBA, 0x5D, 0xA1, 0xFD, 0x89, 0x01, 0x50,
477 0xB0, 0xC6, 0x45, 0x5C, 0xB4, 0xF5, 0x8B, 0x19,
478 0x52, 0x52, 0x25, 0x25 },
479 { 0x20, 0x79, 0x46, 0x55, 0x98, 0x0C, 0x91, 0xD8,
480 0xBB, 0xB4, 0xC1, 0xEA, 0x97, 0x61, 0x8A, 0x4B,
481 0xF0, 0x3F, 0x42, 0x58, 0x19, 0x48, 0xB2, 0xEE,
482 0x4E, 0xE7, 0xAD, 0x67 },
483
484 /*
485 * SHA-256 test vectors
486 */
487 { 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA,
488 0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23,
489 0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C,
490 0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD },
491 { 0x24, 0x8D, 0x6A, 0x61, 0xD2, 0x06, 0x38, 0xB8,
492 0xE5, 0xC0, 0x26, 0x93, 0x0C, 0x3E, 0x60, 0x39,
493 0xA3, 0x3C, 0xE4, 0x59, 0x64, 0xFF, 0x21, 0x67,
494 0xF6, 0xEC, 0xED, 0xD4, 0x19, 0xDB, 0x06, 0xC1 },
495 { 0xCD, 0xC7, 0x6E, 0x5C, 0x99, 0x14, 0xFB, 0x92,
496 0x81, 0xA1, 0xC7, 0xE2, 0x84, 0xD7, 0x3E, 0x67,
497 0xF1, 0x80, 0x9A, 0x48, 0xA4, 0x97, 0x20, 0x0E,
498 0x04, 0x6D, 0x39, 0xCC, 0xC7, 0x11, 0x2C, 0xD0 }
499};
500
501/*
502 * Checkup routine
503 */
504int mbedtls_sha256_self_test( int verbose )
505{
506 int i, j, k, buflen, ret = 0;
507 unsigned char *buf;
508 unsigned char sha256sum[32];
509 mbedtls_sha256_context ctx;
510
511 buf = mbedtls_calloc( 1024, sizeof(unsigned char) );
512 if( NULL == buf )
513 {
514 if( verbose != 0 )
515 mbedtls_printf( "Buffer allocation failed\n" );
516
517 return( 1 );
518 }
519
520 mbedtls_sha256_init( &ctx );
521
522 for( i = 0; i < 6; i++ )
523 {
524 j = i % 3;
525 k = i < 3;
526
527 if( verbose != 0 )
528 mbedtls_printf( " SHA-%d test #%d: ", 256 - k * 32, j + 1 );
529
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100530 if( ( ret = mbedtls_sha256_starts_ret( &ctx, k ) ) != 0 )
531 goto fail;
Jens Wiklander817466c2018-05-22 13:49:31 +0200532
533 if( j == 2 )
534 {
535 memset( buf, 'a', buflen = 1000 );
536
537 for( j = 0; j < 1000; j++ )
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100538 {
539 ret = mbedtls_sha256_update_ret( &ctx, buf, buflen );
540 if( ret != 0 )
541 goto fail;
542 }
543
Jens Wiklander817466c2018-05-22 13:49:31 +0200544 }
545 else
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100546 {
547 ret = mbedtls_sha256_update_ret( &ctx, sha256_test_buf[j],
548 sha256_test_buflen[j] );
549 if( ret != 0 )
550 goto fail;
551 }
Jens Wiklander817466c2018-05-22 13:49:31 +0200552
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100553 if( ( ret = mbedtls_sha256_finish_ret( &ctx, sha256sum ) ) != 0 )
554 goto fail;
555
Jens Wiklander817466c2018-05-22 13:49:31 +0200556
557 if( memcmp( sha256sum, sha256_test_sum[i], 32 - k * 4 ) != 0 )
558 {
Jens Wiklander817466c2018-05-22 13:49:31 +0200559 ret = 1;
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100560 goto fail;
Jens Wiklander817466c2018-05-22 13:49:31 +0200561 }
562
563 if( verbose != 0 )
564 mbedtls_printf( "passed\n" );
565 }
566
567 if( verbose != 0 )
568 mbedtls_printf( "\n" );
569
Jens Wiklander3d3b0592019-03-20 15:30:29 +0100570 goto exit;
571
572fail:
573 if( verbose != 0 )
574 mbedtls_printf( "failed\n" );
575
Jens Wiklander817466c2018-05-22 13:49:31 +0200576exit:
577 mbedtls_sha256_free( &ctx );
578 mbedtls_free( buf );
579
580 return( ret );
581}
582
583#endif /* MBEDTLS_SELF_TEST */
584
585#endif /* MBEDTLS_SHA256_C */