blob: 0038cad329adda8d00fa9d48d7f09e9486aeea64 [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>
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020044#define mbedtls_printf printf
45#endif /* MBEDTLS_PLATFORM_C */
46#endif /* MBEDTLS_SELF_TEST */
Paul Bakker7dc4c442014-02-01 22:50:26 +010047
Manuel Pégourié-Gonnard8b2641d2015-08-27 20:03:46 +020048#if !defined(MBEDTLS_SHA256_ALT)
49
Paul Bakker34617722014-06-13 17:20:13 +020050/* Implementation that should never be optimized out by the compiler */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020051static void mbedtls_zeroize( void *v, size_t n ) {
Paul Bakker34617722014-06-13 17:20:13 +020052 volatile unsigned char *p = v; while( n-- ) *p++ = 0;
53}
54
Paul Bakker5121ce52009-01-03 21:22:43 +000055/*
56 * 32-bit integer manipulation macros (big endian)
57 */
Paul Bakker5c2364c2012-10-01 14:41:15 +000058#ifndef GET_UINT32_BE
59#define GET_UINT32_BE(n,b,i) \
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +020060do { \
Paul Bakker5c2364c2012-10-01 14:41:15 +000061 (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
62 | ( (uint32_t) (b)[(i) + 1] << 16 ) \
63 | ( (uint32_t) (b)[(i) + 2] << 8 ) \
64 | ( (uint32_t) (b)[(i) + 3] ); \
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +020065} while( 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +000066#endif
67
Paul Bakker5c2364c2012-10-01 14:41:15 +000068#ifndef PUT_UINT32_BE
69#define PUT_UINT32_BE(n,b,i) \
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +020070do { \
Paul Bakker5121ce52009-01-03 21:22:43 +000071 (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
72 (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
73 (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
74 (b)[(i) + 3] = (unsigned char) ( (n) ); \
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +020075} while( 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +000076#endif
77
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020078void mbedtls_sha256_init( mbedtls_sha256_context *ctx )
Paul Bakker5b4af392014-06-26 12:09:34 +020079{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020080 memset( ctx, 0, sizeof( mbedtls_sha256_context ) );
Paul Bakker5b4af392014-06-26 12:09:34 +020081}
82
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020083void mbedtls_sha256_free( mbedtls_sha256_context *ctx )
Paul Bakker5b4af392014-06-26 12:09:34 +020084{
85 if( ctx == NULL )
86 return;
87
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020088 mbedtls_zeroize( ctx, sizeof( mbedtls_sha256_context ) );
Paul Bakker5b4af392014-06-26 12:09:34 +020089}
90
Manuel Pégourié-Gonnard16d412f2015-07-06 15:26:26 +020091void mbedtls_sha256_clone( mbedtls_sha256_context *dst,
92 const mbedtls_sha256_context *src )
93{
94 *dst = *src;
95}
96
Paul Bakker5121ce52009-01-03 21:22:43 +000097/*
98 * SHA-256 context setup
99 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200100void mbedtls_sha256_starts( mbedtls_sha256_context *ctx, int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000101{
102 ctx->total[0] = 0;
103 ctx->total[1] = 0;
104
105 if( is224 == 0 )
106 {
107 /* SHA-256 */
108 ctx->state[0] = 0x6A09E667;
109 ctx->state[1] = 0xBB67AE85;
110 ctx->state[2] = 0x3C6EF372;
111 ctx->state[3] = 0xA54FF53A;
112 ctx->state[4] = 0x510E527F;
113 ctx->state[5] = 0x9B05688C;
114 ctx->state[6] = 0x1F83D9AB;
115 ctx->state[7] = 0x5BE0CD19;
116 }
117 else
118 {
119 /* SHA-224 */
120 ctx->state[0] = 0xC1059ED8;
121 ctx->state[1] = 0x367CD507;
122 ctx->state[2] = 0x3070DD17;
123 ctx->state[3] = 0xF70E5939;
124 ctx->state[4] = 0xFFC00B31;
125 ctx->state[5] = 0x68581511;
126 ctx->state[6] = 0x64F98FA7;
127 ctx->state[7] = 0xBEFA4FA4;
128 }
129
130 ctx->is224 = is224;
131}
132
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200133#if !defined(MBEDTLS_SHA256_PROCESS_ALT)
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200134static const uint32_t K[] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000135{
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200136 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,
137 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,
138 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,
139 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,
140 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,
141 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,
142 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,
143 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,
144 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,
145 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,
146 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,
147 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,
148 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,
149 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,
150 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,
151 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2,
152};
Paul Bakker5121ce52009-01-03 21:22:43 +0000153
154#define SHR(x,n) ((x & 0xFFFFFFFF) >> n)
155#define ROTR(x,n) (SHR(x,n) | (x << (32 - n)))
156
157#define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^ SHR(x, 3))
158#define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^ SHR(x,10))
159
160#define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22))
161#define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25))
162
163#define F0(x,y,z) ((x & y) | (z & (x | y)))
164#define F1(x,y,z) (z ^ (x & (y ^ z)))
165
166#define R(t) \
167( \
168 W[t] = S1(W[t - 2]) + W[t - 7] + \
169 S0(W[t - 15]) + W[t - 16] \
170)
171
172#define P(a,b,c,d,e,f,g,h,x,K) \
173{ \
174 temp1 = h + S3(e) + F1(e,f,g) + K + x; \
175 temp2 = S2(a) + F0(a,b,c); \
176 d += temp1; h = temp1 + temp2; \
177}
178
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200179void mbedtls_sha256_process( mbedtls_sha256_context *ctx, const unsigned char data[64] )
180{
181 uint32_t temp1, temp2, W[64];
182 uint32_t A[8];
183 unsigned int i;
Paul Bakker5121ce52009-01-03 21:22:43 +0000184
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200185 for( i = 0; i < 8; i++ )
186 A[i] = ctx->state[i];
187
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200188#if defined(MBEDTLS_SHA256_SMALLER)
189 for( i = 0; i < 64; i++ )
190 {
191 if( i < 16 )
192 GET_UINT32_BE( W[i], data, 4 * i );
193 else
194 R( i );
195
196 P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], W[i], K[i] );
197
198 temp1 = A[7]; A[7] = A[6]; A[6] = A[5]; A[5] = A[4]; A[4] = A[3];
199 A[3] = A[2]; A[2] = A[1]; A[1] = A[0]; A[0] = temp1;
200 }
201#else /* MBEDTLS_SHA256_SMALLER */
202 for( i = 0; i < 16; i++ )
203 GET_UINT32_BE( W[i], data, 4 * i );
204
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200205 for( i = 0; i < 16; i += 8 )
206 {
207 P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], W[i+0], K[i+0] );
208 P( A[7], A[0], A[1], A[2], A[3], A[4], A[5], A[6], W[i+1], K[i+1] );
209 P( A[6], A[7], A[0], A[1], A[2], A[3], A[4], A[5], W[i+2], K[i+2] );
210 P( A[5], A[6], A[7], A[0], A[1], A[2], A[3], A[4], W[i+3], K[i+3] );
211 P( A[4], A[5], A[6], A[7], A[0], A[1], A[2], A[3], W[i+4], K[i+4] );
212 P( A[3], A[4], A[5], A[6], A[7], A[0], A[1], A[2], W[i+5], K[i+5] );
213 P( A[2], A[3], A[4], A[5], A[6], A[7], A[0], A[1], W[i+6], K[i+6] );
214 P( A[1], A[2], A[3], A[4], A[5], A[6], A[7], A[0], W[i+7], K[i+7] );
215 }
216
217 for( i = 16; i < 64; i += 8 )
218 {
219 P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], R(i+0), K[i+0] );
220 P( A[7], A[0], A[1], A[2], A[3], A[4], A[5], A[6], R(i+1), K[i+1] );
221 P( A[6], A[7], A[0], A[1], A[2], A[3], A[4], A[5], R(i+2), K[i+2] );
222 P( A[5], A[6], A[7], A[0], A[1], A[2], A[3], A[4], R(i+3), K[i+3] );
223 P( A[4], A[5], A[6], A[7], A[0], A[1], A[2], A[3], R(i+4), K[i+4] );
224 P( A[3], A[4], A[5], A[6], A[7], A[0], A[1], A[2], R(i+5), K[i+5] );
225 P( A[2], A[3], A[4], A[5], A[6], A[7], A[0], A[1], R(i+6), K[i+6] );
226 P( A[1], A[2], A[3], A[4], A[5], A[6], A[7], A[0], R(i+7), K[i+7] );
227 }
Manuel Pégourié-Gonnardeb0d8702015-05-28 12:54:04 +0200228#endif /* MBEDTLS_SHA256_SMALLER */
Manuel Pégourié-Gonnarda7a3a5f2015-05-28 12:14:49 +0200229
230 for( i = 0; i < 8; i++ )
231 ctx->state[i] += A[i];
Paul Bakker5121ce52009-01-03 21:22:43 +0000232}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200233#endif /* !MBEDTLS_SHA256_PROCESS_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000234
235/*
236 * SHA-256 process buffer
237 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200238void mbedtls_sha256_update( mbedtls_sha256_context *ctx, const unsigned char *input,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200239 size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000240{
Paul Bakker23986e52011-04-24 08:57:21 +0000241 size_t fill;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000242 uint32_t left;
Paul Bakker5121ce52009-01-03 21:22:43 +0000243
Brian White12895d12014-04-11 11:29:42 -0400244 if( ilen == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000245 return;
246
247 left = ctx->total[0] & 0x3F;
248 fill = 64 - left;
249
Paul Bakker5c2364c2012-10-01 14:41:15 +0000250 ctx->total[0] += (uint32_t) ilen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000251 ctx->total[0] &= 0xFFFFFFFF;
252
Paul Bakker5c2364c2012-10-01 14:41:15 +0000253 if( ctx->total[0] < (uint32_t) ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000254 ctx->total[1]++;
255
256 if( left && ilen >= fill )
257 {
Paul Bakker3c2122f2013-06-24 19:03:14 +0200258 memcpy( (void *) (ctx->buffer + left), input, fill );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200259 mbedtls_sha256_process( ctx, ctx->buffer );
Paul Bakker5121ce52009-01-03 21:22:43 +0000260 input += fill;
261 ilen -= fill;
262 left = 0;
263 }
264
265 while( ilen >= 64 )
266 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200267 mbedtls_sha256_process( ctx, input );
Paul Bakker5121ce52009-01-03 21:22:43 +0000268 input += 64;
269 ilen -= 64;
270 }
271
272 if( ilen > 0 )
Paul Bakker3c2122f2013-06-24 19:03:14 +0200273 memcpy( (void *) (ctx->buffer + left), input, ilen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000274}
275
Paul Bakker5121ce52009-01-03 21:22:43 +0000276/*
277 * SHA-256 final digest
278 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200279void mbedtls_sha256_finish( mbedtls_sha256_context *ctx, unsigned char output[32] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000280{
Manuel Pégourié-Gonnard69675d02018-06-28 12:10:27 +0200281 uint32_t used;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000282 uint32_t high, low;
Paul Bakker5121ce52009-01-03 21:22:43 +0000283
Manuel Pégourié-Gonnard69675d02018-06-28 12:10:27 +0200284 /*
285 * Add padding: 0x80 then 0x00 until 8 bytes remain for the length
286 */
287 used = ctx->total[0] & 0x3F;
288
289 ctx->buffer[used++] = 0x80;
290
291 if( used <= 56 )
292 {
293 /* Enough room for padding + length in current block */
294 memset( ctx->buffer + used, 0, 56 - used );
295 }
296 else
297 {
298 /* We'll need an extra block */
299 memset( ctx->buffer + used, 0, 64 - used );
300
301 mbedtls_sha256_process( ctx, ctx->buffer );
302
303 memset( ctx->buffer, 0, 56 );
304 }
305
306 /*
307 * Add message length
308 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000309 high = ( ctx->total[0] >> 29 )
310 | ( ctx->total[1] << 3 );
311 low = ( ctx->total[0] << 3 );
312
Manuel Pégourié-Gonnard69675d02018-06-28 12:10:27 +0200313 PUT_UINT32_BE( high, ctx->buffer, 56 );
314 PUT_UINT32_BE( low, ctx->buffer, 60 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000315
Manuel Pégourié-Gonnard69675d02018-06-28 12:10:27 +0200316 mbedtls_sha256_process( ctx, ctx->buffer );
Paul Bakker5121ce52009-01-03 21:22:43 +0000317
Manuel Pégourié-Gonnard69675d02018-06-28 12:10:27 +0200318 /*
319 * Output final state
320 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000321 PUT_UINT32_BE( ctx->state[0], output, 0 );
322 PUT_UINT32_BE( ctx->state[1], output, 4 );
323 PUT_UINT32_BE( ctx->state[2], output, 8 );
324 PUT_UINT32_BE( ctx->state[3], output, 12 );
325 PUT_UINT32_BE( ctx->state[4], output, 16 );
326 PUT_UINT32_BE( ctx->state[5], output, 20 );
327 PUT_UINT32_BE( ctx->state[6], output, 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000328
329 if( ctx->is224 == 0 )
Paul Bakker5c2364c2012-10-01 14:41:15 +0000330 PUT_UINT32_BE( ctx->state[7], output, 28 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000331}
332
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200333#endif /* !MBEDTLS_SHA256_ALT */
Paul Bakker90995b52013-06-24 19:20:35 +0200334
Paul Bakker5121ce52009-01-03 21:22:43 +0000335/*
336 * output = SHA-256( input buffer )
337 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200338void mbedtls_sha256( const unsigned char *input, size_t ilen,
Paul Bakker9e36f042013-06-30 14:34:05 +0200339 unsigned char output[32], int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000340{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200341 mbedtls_sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000342
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200343 mbedtls_sha256_init( &ctx );
344 mbedtls_sha256_starts( &ctx, is224 );
345 mbedtls_sha256_update( &ctx, input, ilen );
346 mbedtls_sha256_finish( &ctx, output );
347 mbedtls_sha256_free( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +0000348}
349
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200350#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000351/*
352 * FIPS-180-2 test vectors
353 */
Manuel Pégourié-Gonnard28122e42015-03-11 09:13:42 +0000354static const unsigned char sha256_test_buf[3][57] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000355{
356 { "abc" },
357 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
358 { "" }
359};
360
Paul Bakker9e36f042013-06-30 14:34:05 +0200361static const int sha256_test_buflen[3] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000362{
363 3, 56, 1000
364};
365
Paul Bakker9e36f042013-06-30 14:34:05 +0200366static const unsigned char sha256_test_sum[6][32] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000367{
368 /*
369 * SHA-224 test vectors
370 */
371 { 0x23, 0x09, 0x7D, 0x22, 0x34, 0x05, 0xD8, 0x22,
372 0x86, 0x42, 0xA4, 0x77, 0xBD, 0xA2, 0x55, 0xB3,
373 0x2A, 0xAD, 0xBC, 0xE4, 0xBD, 0xA0, 0xB3, 0xF7,
374 0xE3, 0x6C, 0x9D, 0xA7 },
375 { 0x75, 0x38, 0x8B, 0x16, 0x51, 0x27, 0x76, 0xCC,
376 0x5D, 0xBA, 0x5D, 0xA1, 0xFD, 0x89, 0x01, 0x50,
377 0xB0, 0xC6, 0x45, 0x5C, 0xB4, 0xF5, 0x8B, 0x19,
378 0x52, 0x52, 0x25, 0x25 },
379 { 0x20, 0x79, 0x46, 0x55, 0x98, 0x0C, 0x91, 0xD8,
380 0xBB, 0xB4, 0xC1, 0xEA, 0x97, 0x61, 0x8A, 0x4B,
381 0xF0, 0x3F, 0x42, 0x58, 0x19, 0x48, 0xB2, 0xEE,
382 0x4E, 0xE7, 0xAD, 0x67 },
383
384 /*
385 * SHA-256 test vectors
386 */
387 { 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA,
388 0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23,
389 0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C,
390 0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD },
391 { 0x24, 0x8D, 0x6A, 0x61, 0xD2, 0x06, 0x38, 0xB8,
392 0xE5, 0xC0, 0x26, 0x93, 0x0C, 0x3E, 0x60, 0x39,
393 0xA3, 0x3C, 0xE4, 0x59, 0x64, 0xFF, 0x21, 0x67,
394 0xF6, 0xEC, 0xED, 0xD4, 0x19, 0xDB, 0x06, 0xC1 },
395 { 0xCD, 0xC7, 0x6E, 0x5C, 0x99, 0x14, 0xFB, 0x92,
396 0x81, 0xA1, 0xC7, 0xE2, 0x84, 0xD7, 0x3E, 0x67,
397 0xF1, 0x80, 0x9A, 0x48, 0xA4, 0x97, 0x20, 0x0E,
398 0x04, 0x6D, 0x39, 0xCC, 0xC7, 0x11, 0x2C, 0xD0 }
399};
400
401/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000402 * Checkup routine
403 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200404int mbedtls_sha256_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000405{
Paul Bakker5b4af392014-06-26 12:09:34 +0200406 int i, j, k, buflen, ret = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000407 unsigned char buf[1024];
Paul Bakker9e36f042013-06-30 14:34:05 +0200408 unsigned char sha256sum[32];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200409 mbedtls_sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000410
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200411 mbedtls_sha256_init( &ctx );
Paul Bakker5b4af392014-06-26 12:09:34 +0200412
Paul Bakker5121ce52009-01-03 21:22:43 +0000413 for( i = 0; i < 6; i++ )
414 {
415 j = i % 3;
416 k = i < 3;
417
418 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200419 mbedtls_printf( " SHA-%d test #%d: ", 256 - k * 32, j + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000420
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200421 mbedtls_sha256_starts( &ctx, k );
Paul Bakker5121ce52009-01-03 21:22:43 +0000422
423 if( j == 2 )
424 {
425 memset( buf, 'a', buflen = 1000 );
426
427 for( j = 0; j < 1000; j++ )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200428 mbedtls_sha256_update( &ctx, buf, buflen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000429 }
430 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200431 mbedtls_sha256_update( &ctx, sha256_test_buf[j],
Paul Bakker9e36f042013-06-30 14:34:05 +0200432 sha256_test_buflen[j] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000433
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200434 mbedtls_sha256_finish( &ctx, sha256sum );
Paul Bakker5121ce52009-01-03 21:22:43 +0000435
Paul Bakker9e36f042013-06-30 14:34:05 +0200436 if( memcmp( sha256sum, sha256_test_sum[i], 32 - k * 4 ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000437 {
438 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200439 mbedtls_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000440
Paul Bakker5b4af392014-06-26 12:09:34 +0200441 ret = 1;
442 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +0000443 }
444
445 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200446 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000447 }
448
449 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200450 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000451
Paul Bakker5b4af392014-06-26 12:09:34 +0200452exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200453 mbedtls_sha256_free( &ctx );
Paul Bakker5b4af392014-06-26 12:09:34 +0200454
455 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000456}
457
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200458#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000459
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200460#endif /* MBEDTLS_SHA256_C */