blob: 0432ac832fcf244087a291d59cf1ff37daaf8c47 [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 Bakker9e36f042013-06-30 14:34:05 +0200276static const unsigned char sha256_padding[64] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000277{
278 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
279 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
280 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
281 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
282};
283
284/*
285 * SHA-256 final digest
286 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200287void mbedtls_sha256_finish( mbedtls_sha256_context *ctx, unsigned char output[32] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000288{
Paul Bakker5c2364c2012-10-01 14:41:15 +0000289 uint32_t last, padn;
290 uint32_t high, low;
Paul Bakker5121ce52009-01-03 21:22:43 +0000291 unsigned char msglen[8];
292
293 high = ( ctx->total[0] >> 29 )
294 | ( ctx->total[1] << 3 );
295 low = ( ctx->total[0] << 3 );
296
Paul Bakker5c2364c2012-10-01 14:41:15 +0000297 PUT_UINT32_BE( high, msglen, 0 );
298 PUT_UINT32_BE( low, msglen, 4 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000299
300 last = ctx->total[0] & 0x3F;
301 padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
302
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200303 mbedtls_sha256_update( ctx, sha256_padding, padn );
304 mbedtls_sha256_update( ctx, msglen, 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000305
Paul Bakker5c2364c2012-10-01 14:41:15 +0000306 PUT_UINT32_BE( ctx->state[0], output, 0 );
307 PUT_UINT32_BE( ctx->state[1], output, 4 );
308 PUT_UINT32_BE( ctx->state[2], output, 8 );
309 PUT_UINT32_BE( ctx->state[3], output, 12 );
310 PUT_UINT32_BE( ctx->state[4], output, 16 );
311 PUT_UINT32_BE( ctx->state[5], output, 20 );
312 PUT_UINT32_BE( ctx->state[6], output, 24 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000313
314 if( ctx->is224 == 0 )
Paul Bakker5c2364c2012-10-01 14:41:15 +0000315 PUT_UINT32_BE( ctx->state[7], output, 28 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000316}
317
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200318#endif /* !MBEDTLS_SHA256_ALT */
Paul Bakker90995b52013-06-24 19:20:35 +0200319
Paul Bakker5121ce52009-01-03 21:22:43 +0000320/*
321 * output = SHA-256( input buffer )
322 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200323void mbedtls_sha256( const unsigned char *input, size_t ilen,
Paul Bakker9e36f042013-06-30 14:34:05 +0200324 unsigned char output[32], int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000325{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200326 mbedtls_sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000327
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200328 mbedtls_sha256_init( &ctx );
329 mbedtls_sha256_starts( &ctx, is224 );
330 mbedtls_sha256_update( &ctx, input, ilen );
331 mbedtls_sha256_finish( &ctx, output );
332 mbedtls_sha256_free( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +0000333}
334
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200335#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000336/*
337 * FIPS-180-2 test vectors
338 */
Manuel Pégourié-Gonnard28122e42015-03-11 09:13:42 +0000339static const unsigned char sha256_test_buf[3][57] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000340{
341 { "abc" },
342 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
343 { "" }
344};
345
Paul Bakker9e36f042013-06-30 14:34:05 +0200346static const int sha256_test_buflen[3] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000347{
348 3, 56, 1000
349};
350
Paul Bakker9e36f042013-06-30 14:34:05 +0200351static const unsigned char sha256_test_sum[6][32] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000352{
353 /*
354 * SHA-224 test vectors
355 */
356 { 0x23, 0x09, 0x7D, 0x22, 0x34, 0x05, 0xD8, 0x22,
357 0x86, 0x42, 0xA4, 0x77, 0xBD, 0xA2, 0x55, 0xB3,
358 0x2A, 0xAD, 0xBC, 0xE4, 0xBD, 0xA0, 0xB3, 0xF7,
359 0xE3, 0x6C, 0x9D, 0xA7 },
360 { 0x75, 0x38, 0x8B, 0x16, 0x51, 0x27, 0x76, 0xCC,
361 0x5D, 0xBA, 0x5D, 0xA1, 0xFD, 0x89, 0x01, 0x50,
362 0xB0, 0xC6, 0x45, 0x5C, 0xB4, 0xF5, 0x8B, 0x19,
363 0x52, 0x52, 0x25, 0x25 },
364 { 0x20, 0x79, 0x46, 0x55, 0x98, 0x0C, 0x91, 0xD8,
365 0xBB, 0xB4, 0xC1, 0xEA, 0x97, 0x61, 0x8A, 0x4B,
366 0xF0, 0x3F, 0x42, 0x58, 0x19, 0x48, 0xB2, 0xEE,
367 0x4E, 0xE7, 0xAD, 0x67 },
368
369 /*
370 * SHA-256 test vectors
371 */
372 { 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA,
373 0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23,
374 0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C,
375 0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD },
376 { 0x24, 0x8D, 0x6A, 0x61, 0xD2, 0x06, 0x38, 0xB8,
377 0xE5, 0xC0, 0x26, 0x93, 0x0C, 0x3E, 0x60, 0x39,
378 0xA3, 0x3C, 0xE4, 0x59, 0x64, 0xFF, 0x21, 0x67,
379 0xF6, 0xEC, 0xED, 0xD4, 0x19, 0xDB, 0x06, 0xC1 },
380 { 0xCD, 0xC7, 0x6E, 0x5C, 0x99, 0x14, 0xFB, 0x92,
381 0x81, 0xA1, 0xC7, 0xE2, 0x84, 0xD7, 0x3E, 0x67,
382 0xF1, 0x80, 0x9A, 0x48, 0xA4, 0x97, 0x20, 0x0E,
383 0x04, 0x6D, 0x39, 0xCC, 0xC7, 0x11, 0x2C, 0xD0 }
384};
385
386/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000387 * Checkup routine
388 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200389int mbedtls_sha256_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000390{
Paul Bakker5b4af392014-06-26 12:09:34 +0200391 int i, j, k, buflen, ret = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000392 unsigned char buf[1024];
Paul Bakker9e36f042013-06-30 14:34:05 +0200393 unsigned char sha256sum[32];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200394 mbedtls_sha256_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000395
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200396 mbedtls_sha256_init( &ctx );
Paul Bakker5b4af392014-06-26 12:09:34 +0200397
Paul Bakker5121ce52009-01-03 21:22:43 +0000398 for( i = 0; i < 6; i++ )
399 {
400 j = i % 3;
401 k = i < 3;
402
403 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200404 mbedtls_printf( " SHA-%d test #%d: ", 256 - k * 32, j + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000405
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200406 mbedtls_sha256_starts( &ctx, k );
Paul Bakker5121ce52009-01-03 21:22:43 +0000407
408 if( j == 2 )
409 {
410 memset( buf, 'a', buflen = 1000 );
411
412 for( j = 0; j < 1000; j++ )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200413 mbedtls_sha256_update( &ctx, buf, buflen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000414 }
415 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200416 mbedtls_sha256_update( &ctx, sha256_test_buf[j],
Paul Bakker9e36f042013-06-30 14:34:05 +0200417 sha256_test_buflen[j] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000418
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200419 mbedtls_sha256_finish( &ctx, sha256sum );
Paul Bakker5121ce52009-01-03 21:22:43 +0000420
Paul Bakker9e36f042013-06-30 14:34:05 +0200421 if( memcmp( sha256sum, sha256_test_sum[i], 32 - k * 4 ) != 0 )
Manuel Pégourié-Gonnarda0d3a262014-04-11 15:31:02 +0200422 { // LCOV_EXCL_START
Paul Bakker5121ce52009-01-03 21:22:43 +0000423 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200424 mbedtls_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000425
Paul Bakker5b4af392014-06-26 12:09:34 +0200426 ret = 1;
427 goto exit;
Manuel Pégourié-Gonnarda0d3a262014-04-11 15:31:02 +0200428 } // LCOV_EXCL_STOP
Paul Bakker5121ce52009-01-03 21:22:43 +0000429
430 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200431 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000432 }
433
434 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200435 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000436
Paul Bakker5b4af392014-06-26 12:09:34 +0200437exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200438 mbedtls_sha256_free( &ctx );
Paul Bakker5b4af392014-06-26 12:09:34 +0200439
440 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000441}
442
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200443#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000444
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200445#endif /* MBEDTLS_SHA256_C */