blob: f82a7aeb1674381fd1dccb28e666a76a450d65e4 [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * FIPS-180-2 compliant SHA-256 implementation
3 *
Paul Bakker83ded912010-03-21 17:46:26 +00004 * Copyright (C) 2006-2010, Paul Bakker <polarssl_maintainer at polarssl.org>
Paul Bakker77b385e2009-07-28 17:23:11 +00005 * All rights reserved.
Paul Bakkere0ccd0a2009-01-04 16:27:10 +00006 *
Paul Bakker5121ce52009-01-03 21:22:43 +00007 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License along
18 * with this program; if not, write to the Free Software Foundation, Inc.,
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 */
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
Paul Bakker40e46942009-01-03 21:51:57 +000027#include "polarssl/config.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000028
Paul Bakker40e46942009-01-03 21:51:57 +000029#if defined(POLARSSL_SHA2_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000030
Paul Bakker40e46942009-01-03 21:51:57 +000031#include "polarssl/sha2.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000032
33#include <string.h>
34#include <stdio.h>
35
36/*
37 * 32-bit integer manipulation macros (big endian)
38 */
39#ifndef GET_ULONG_BE
40#define GET_ULONG_BE(n,b,i) \
41{ \
42 (n) = ( (unsigned long) (b)[(i) ] << 24 ) \
43 | ( (unsigned long) (b)[(i) + 1] << 16 ) \
44 | ( (unsigned long) (b)[(i) + 2] << 8 ) \
45 | ( (unsigned long) (b)[(i) + 3] ); \
46}
47#endif
48
49#ifndef PUT_ULONG_BE
50#define PUT_ULONG_BE(n,b,i) \
51{ \
52 (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
53 (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
54 (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
55 (b)[(i) + 3] = (unsigned char) ( (n) ); \
56}
57#endif
58
59/*
60 * SHA-256 context setup
61 */
62void sha2_starts( sha2_context *ctx, int is224 )
63{
64 ctx->total[0] = 0;
65 ctx->total[1] = 0;
66
67 if( is224 == 0 )
68 {
69 /* SHA-256 */
70 ctx->state[0] = 0x6A09E667;
71 ctx->state[1] = 0xBB67AE85;
72 ctx->state[2] = 0x3C6EF372;
73 ctx->state[3] = 0xA54FF53A;
74 ctx->state[4] = 0x510E527F;
75 ctx->state[5] = 0x9B05688C;
76 ctx->state[6] = 0x1F83D9AB;
77 ctx->state[7] = 0x5BE0CD19;
78 }
79 else
80 {
81 /* SHA-224 */
82 ctx->state[0] = 0xC1059ED8;
83 ctx->state[1] = 0x367CD507;
84 ctx->state[2] = 0x3070DD17;
85 ctx->state[3] = 0xF70E5939;
86 ctx->state[4] = 0xFFC00B31;
87 ctx->state[5] = 0x68581511;
88 ctx->state[6] = 0x64F98FA7;
89 ctx->state[7] = 0xBEFA4FA4;
90 }
91
92 ctx->is224 = is224;
93}
94
Paul Bakkerff60ee62010-03-16 21:09:09 +000095static void sha2_process( sha2_context *ctx, const unsigned char data[64] )
Paul Bakker5121ce52009-01-03 21:22:43 +000096{
97 unsigned long temp1, temp2, W[64];
98 unsigned long A, B, C, D, E, F, G, H;
99
100 GET_ULONG_BE( W[ 0], data, 0 );
101 GET_ULONG_BE( W[ 1], data, 4 );
102 GET_ULONG_BE( W[ 2], data, 8 );
103 GET_ULONG_BE( W[ 3], data, 12 );
104 GET_ULONG_BE( W[ 4], data, 16 );
105 GET_ULONG_BE( W[ 5], data, 20 );
106 GET_ULONG_BE( W[ 6], data, 24 );
107 GET_ULONG_BE( W[ 7], data, 28 );
108 GET_ULONG_BE( W[ 8], data, 32 );
109 GET_ULONG_BE( W[ 9], data, 36 );
110 GET_ULONG_BE( W[10], data, 40 );
111 GET_ULONG_BE( W[11], data, 44 );
112 GET_ULONG_BE( W[12], data, 48 );
113 GET_ULONG_BE( W[13], data, 52 );
114 GET_ULONG_BE( W[14], data, 56 );
115 GET_ULONG_BE( W[15], data, 60 );
116
117#define SHR(x,n) ((x & 0xFFFFFFFF) >> n)
118#define ROTR(x,n) (SHR(x,n) | (x << (32 - n)))
119
120#define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^ SHR(x, 3))
121#define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^ SHR(x,10))
122
123#define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22))
124#define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25))
125
126#define F0(x,y,z) ((x & y) | (z & (x | y)))
127#define F1(x,y,z) (z ^ (x & (y ^ z)))
128
129#define R(t) \
130( \
131 W[t] = S1(W[t - 2]) + W[t - 7] + \
132 S0(W[t - 15]) + W[t - 16] \
133)
134
135#define P(a,b,c,d,e,f,g,h,x,K) \
136{ \
137 temp1 = h + S3(e) + F1(e,f,g) + K + x; \
138 temp2 = S2(a) + F0(a,b,c); \
139 d += temp1; h = temp1 + temp2; \
140}
141
142 A = ctx->state[0];
143 B = ctx->state[1];
144 C = ctx->state[2];
145 D = ctx->state[3];
146 E = ctx->state[4];
147 F = ctx->state[5];
148 G = ctx->state[6];
149 H = ctx->state[7];
150
151 P( A, B, C, D, E, F, G, H, W[ 0], 0x428A2F98 );
152 P( H, A, B, C, D, E, F, G, W[ 1], 0x71374491 );
153 P( G, H, A, B, C, D, E, F, W[ 2], 0xB5C0FBCF );
154 P( F, G, H, A, B, C, D, E, W[ 3], 0xE9B5DBA5 );
155 P( E, F, G, H, A, B, C, D, W[ 4], 0x3956C25B );
156 P( D, E, F, G, H, A, B, C, W[ 5], 0x59F111F1 );
157 P( C, D, E, F, G, H, A, B, W[ 6], 0x923F82A4 );
158 P( B, C, D, E, F, G, H, A, W[ 7], 0xAB1C5ED5 );
159 P( A, B, C, D, E, F, G, H, W[ 8], 0xD807AA98 );
160 P( H, A, B, C, D, E, F, G, W[ 9], 0x12835B01 );
161 P( G, H, A, B, C, D, E, F, W[10], 0x243185BE );
162 P( F, G, H, A, B, C, D, E, W[11], 0x550C7DC3 );
163 P( E, F, G, H, A, B, C, D, W[12], 0x72BE5D74 );
164 P( D, E, F, G, H, A, B, C, W[13], 0x80DEB1FE );
165 P( C, D, E, F, G, H, A, B, W[14], 0x9BDC06A7 );
166 P( B, C, D, E, F, G, H, A, W[15], 0xC19BF174 );
167 P( A, B, C, D, E, F, G, H, R(16), 0xE49B69C1 );
168 P( H, A, B, C, D, E, F, G, R(17), 0xEFBE4786 );
169 P( G, H, A, B, C, D, E, F, R(18), 0x0FC19DC6 );
170 P( F, G, H, A, B, C, D, E, R(19), 0x240CA1CC );
171 P( E, F, G, H, A, B, C, D, R(20), 0x2DE92C6F );
172 P( D, E, F, G, H, A, B, C, R(21), 0x4A7484AA );
173 P( C, D, E, F, G, H, A, B, R(22), 0x5CB0A9DC );
174 P( B, C, D, E, F, G, H, A, R(23), 0x76F988DA );
175 P( A, B, C, D, E, F, G, H, R(24), 0x983E5152 );
176 P( H, A, B, C, D, E, F, G, R(25), 0xA831C66D );
177 P( G, H, A, B, C, D, E, F, R(26), 0xB00327C8 );
178 P( F, G, H, A, B, C, D, E, R(27), 0xBF597FC7 );
179 P( E, F, G, H, A, B, C, D, R(28), 0xC6E00BF3 );
180 P( D, E, F, G, H, A, B, C, R(29), 0xD5A79147 );
181 P( C, D, E, F, G, H, A, B, R(30), 0x06CA6351 );
182 P( B, C, D, E, F, G, H, A, R(31), 0x14292967 );
183 P( A, B, C, D, E, F, G, H, R(32), 0x27B70A85 );
184 P( H, A, B, C, D, E, F, G, R(33), 0x2E1B2138 );
185 P( G, H, A, B, C, D, E, F, R(34), 0x4D2C6DFC );
186 P( F, G, H, A, B, C, D, E, R(35), 0x53380D13 );
187 P( E, F, G, H, A, B, C, D, R(36), 0x650A7354 );
188 P( D, E, F, G, H, A, B, C, R(37), 0x766A0ABB );
189 P( C, D, E, F, G, H, A, B, R(38), 0x81C2C92E );
190 P( B, C, D, E, F, G, H, A, R(39), 0x92722C85 );
191 P( A, B, C, D, E, F, G, H, R(40), 0xA2BFE8A1 );
192 P( H, A, B, C, D, E, F, G, R(41), 0xA81A664B );
193 P( G, H, A, B, C, D, E, F, R(42), 0xC24B8B70 );
194 P( F, G, H, A, B, C, D, E, R(43), 0xC76C51A3 );
195 P( E, F, G, H, A, B, C, D, R(44), 0xD192E819 );
196 P( D, E, F, G, H, A, B, C, R(45), 0xD6990624 );
197 P( C, D, E, F, G, H, A, B, R(46), 0xF40E3585 );
198 P( B, C, D, E, F, G, H, A, R(47), 0x106AA070 );
199 P( A, B, C, D, E, F, G, H, R(48), 0x19A4C116 );
200 P( H, A, B, C, D, E, F, G, R(49), 0x1E376C08 );
201 P( G, H, A, B, C, D, E, F, R(50), 0x2748774C );
202 P( F, G, H, A, B, C, D, E, R(51), 0x34B0BCB5 );
203 P( E, F, G, H, A, B, C, D, R(52), 0x391C0CB3 );
204 P( D, E, F, G, H, A, B, C, R(53), 0x4ED8AA4A );
205 P( C, D, E, F, G, H, A, B, R(54), 0x5B9CCA4F );
206 P( B, C, D, E, F, G, H, A, R(55), 0x682E6FF3 );
207 P( A, B, C, D, E, F, G, H, R(56), 0x748F82EE );
208 P( H, A, B, C, D, E, F, G, R(57), 0x78A5636F );
209 P( G, H, A, B, C, D, E, F, R(58), 0x84C87814 );
210 P( F, G, H, A, B, C, D, E, R(59), 0x8CC70208 );
211 P( E, F, G, H, A, B, C, D, R(60), 0x90BEFFFA );
212 P( D, E, F, G, H, A, B, C, R(61), 0xA4506CEB );
213 P( C, D, E, F, G, H, A, B, R(62), 0xBEF9A3F7 );
214 P( B, C, D, E, F, G, H, A, R(63), 0xC67178F2 );
215
216 ctx->state[0] += A;
217 ctx->state[1] += B;
218 ctx->state[2] += C;
219 ctx->state[3] += D;
220 ctx->state[4] += E;
221 ctx->state[5] += F;
222 ctx->state[6] += G;
223 ctx->state[7] += H;
224}
225
226/*
227 * SHA-256 process buffer
228 */
Paul Bakkerff60ee62010-03-16 21:09:09 +0000229void sha2_update( sha2_context *ctx, const unsigned char *input, int ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000230{
231 int fill;
232 unsigned long left;
233
234 if( ilen <= 0 )
235 return;
236
237 left = ctx->total[0] & 0x3F;
238 fill = 64 - left;
239
240 ctx->total[0] += ilen;
241 ctx->total[0] &= 0xFFFFFFFF;
242
243 if( ctx->total[0] < (unsigned long) ilen )
244 ctx->total[1]++;
245
246 if( left && ilen >= fill )
247 {
248 memcpy( (void *) (ctx->buffer + left),
249 (void *) input, fill );
250 sha2_process( ctx, ctx->buffer );
251 input += fill;
252 ilen -= fill;
253 left = 0;
254 }
255
256 while( ilen >= 64 )
257 {
258 sha2_process( ctx, input );
259 input += 64;
260 ilen -= 64;
261 }
262
263 if( ilen > 0 )
264 {
265 memcpy( (void *) (ctx->buffer + left),
266 (void *) input, ilen );
267 }
268}
269
270static const unsigned char sha2_padding[64] =
271{
272 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
273 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
274 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
275 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
276};
277
278/*
279 * SHA-256 final digest
280 */
281void sha2_finish( sha2_context *ctx, unsigned char output[32] )
282{
283 unsigned long last, padn;
284 unsigned long high, low;
285 unsigned char msglen[8];
286
287 high = ( ctx->total[0] >> 29 )
288 | ( ctx->total[1] << 3 );
289 low = ( ctx->total[0] << 3 );
290
291 PUT_ULONG_BE( high, msglen, 0 );
292 PUT_ULONG_BE( low, msglen, 4 );
293
294 last = ctx->total[0] & 0x3F;
295 padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
296
297 sha2_update( ctx, (unsigned char *) sha2_padding, padn );
298 sha2_update( ctx, msglen, 8 );
299
300 PUT_ULONG_BE( ctx->state[0], output, 0 );
301 PUT_ULONG_BE( ctx->state[1], output, 4 );
302 PUT_ULONG_BE( ctx->state[2], output, 8 );
303 PUT_ULONG_BE( ctx->state[3], output, 12 );
304 PUT_ULONG_BE( ctx->state[4], output, 16 );
305 PUT_ULONG_BE( ctx->state[5], output, 20 );
306 PUT_ULONG_BE( ctx->state[6], output, 24 );
307
308 if( ctx->is224 == 0 )
309 PUT_ULONG_BE( ctx->state[7], output, 28 );
310}
311
312/*
313 * output = SHA-256( input buffer )
314 */
Paul Bakkerff60ee62010-03-16 21:09:09 +0000315void sha2( const unsigned char *input, int ilen,
Paul Bakker5121ce52009-01-03 21:22:43 +0000316 unsigned char output[32], int is224 )
317{
318 sha2_context ctx;
319
320 sha2_starts( &ctx, is224 );
321 sha2_update( &ctx, input, ilen );
322 sha2_finish( &ctx, output );
323
324 memset( &ctx, 0, sizeof( sha2_context ) );
325}
326
327/*
328 * output = SHA-256( file contents )
329 */
Paul Bakkerff60ee62010-03-16 21:09:09 +0000330int sha2_file( const char *path, unsigned char output[32], int is224 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000331{
332 FILE *f;
333 size_t n;
334 sha2_context ctx;
335 unsigned char buf[1024];
336
337 if( ( f = fopen( path, "rb" ) ) == NULL )
338 return( 1 );
339
340 sha2_starts( &ctx, is224 );
341
342 while( ( n = fread( buf, 1, sizeof( buf ), f ) ) > 0 )
343 sha2_update( &ctx, buf, (int) n );
344
345 sha2_finish( &ctx, output );
346
347 memset( &ctx, 0, sizeof( sha2_context ) );
348
349 if( ferror( f ) != 0 )
350 {
351 fclose( f );
352 return( 2 );
353 }
354
355 fclose( f );
356 return( 0 );
357}
358
359/*
360 * SHA-256 HMAC context setup
361 */
Paul Bakkerff60ee62010-03-16 21:09:09 +0000362void sha2_hmac_starts( sha2_context *ctx, const unsigned char *key, int keylen,
Paul Bakker5121ce52009-01-03 21:22:43 +0000363 int is224 )
364{
365 int i;
366 unsigned char sum[32];
367
368 if( keylen > 64 )
369 {
370 sha2( key, keylen, sum, is224 );
371 keylen = ( is224 ) ? 28 : 32;
372 key = sum;
373 }
374
375 memset( ctx->ipad, 0x36, 64 );
376 memset( ctx->opad, 0x5C, 64 );
377
378 for( i = 0; i < keylen; i++ )
379 {
380 ctx->ipad[i] = (unsigned char)( ctx->ipad[i] ^ key[i] );
381 ctx->opad[i] = (unsigned char)( ctx->opad[i] ^ key[i] );
382 }
383
384 sha2_starts( ctx, is224 );
385 sha2_update( ctx, ctx->ipad, 64 );
386
387 memset( sum, 0, sizeof( sum ) );
388}
389
390/*
391 * SHA-256 HMAC process buffer
392 */
Paul Bakkerff60ee62010-03-16 21:09:09 +0000393void sha2_hmac_update( sha2_context *ctx, const unsigned char *input, int ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000394{
395 sha2_update( ctx, input, ilen );
396}
397
398/*
399 * SHA-256 HMAC final digest
400 */
401void sha2_hmac_finish( sha2_context *ctx, unsigned char output[32] )
402{
403 int is224, hlen;
404 unsigned char tmpbuf[32];
405
406 is224 = ctx->is224;
407 hlen = ( is224 == 0 ) ? 32 : 28;
408
409 sha2_finish( ctx, tmpbuf );
410 sha2_starts( ctx, is224 );
411 sha2_update( ctx, ctx->opad, 64 );
412 sha2_update( ctx, tmpbuf, hlen );
413 sha2_finish( ctx, output );
414
415 memset( tmpbuf, 0, sizeof( tmpbuf ) );
416}
417
418/*
Paul Bakker7d3b6612010-03-21 16:23:13 +0000419 * SHA-256 HMAC context reset
420 */
421void sha2_hmac_reset( sha2_context *ctx )
422{
423 sha2_starts( ctx, ctx->is224 );
424 sha2_update( ctx, ctx->ipad, 64 );
425}
426
427/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000428 * output = HMAC-SHA-256( hmac key, input buffer )
429 */
Paul Bakkerff60ee62010-03-16 21:09:09 +0000430void sha2_hmac( const unsigned char *key, int keylen,
431 const unsigned char *input, int ilen,
Paul Bakker5121ce52009-01-03 21:22:43 +0000432 unsigned char output[32], int is224 )
433{
434 sha2_context ctx;
435
436 sha2_hmac_starts( &ctx, key, keylen, is224 );
437 sha2_hmac_update( &ctx, input, ilen );
438 sha2_hmac_finish( &ctx, output );
439
440 memset( &ctx, 0, sizeof( sha2_context ) );
441}
442
Paul Bakker40e46942009-01-03 21:51:57 +0000443#if defined(POLARSSL_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000444/*
445 * FIPS-180-2 test vectors
446 */
447static unsigned char sha2_test_buf[3][57] =
448{
449 { "abc" },
450 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
451 { "" }
452};
453
454static const int sha2_test_buflen[3] =
455{
456 3, 56, 1000
457};
458
459static const unsigned char sha2_test_sum[6][32] =
460{
461 /*
462 * SHA-224 test vectors
463 */
464 { 0x23, 0x09, 0x7D, 0x22, 0x34, 0x05, 0xD8, 0x22,
465 0x86, 0x42, 0xA4, 0x77, 0xBD, 0xA2, 0x55, 0xB3,
466 0x2A, 0xAD, 0xBC, 0xE4, 0xBD, 0xA0, 0xB3, 0xF7,
467 0xE3, 0x6C, 0x9D, 0xA7 },
468 { 0x75, 0x38, 0x8B, 0x16, 0x51, 0x27, 0x76, 0xCC,
469 0x5D, 0xBA, 0x5D, 0xA1, 0xFD, 0x89, 0x01, 0x50,
470 0xB0, 0xC6, 0x45, 0x5C, 0xB4, 0xF5, 0x8B, 0x19,
471 0x52, 0x52, 0x25, 0x25 },
472 { 0x20, 0x79, 0x46, 0x55, 0x98, 0x0C, 0x91, 0xD8,
473 0xBB, 0xB4, 0xC1, 0xEA, 0x97, 0x61, 0x8A, 0x4B,
474 0xF0, 0x3F, 0x42, 0x58, 0x19, 0x48, 0xB2, 0xEE,
475 0x4E, 0xE7, 0xAD, 0x67 },
476
477 /*
478 * SHA-256 test vectors
479 */
480 { 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA,
481 0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23,
482 0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C,
483 0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD },
484 { 0x24, 0x8D, 0x6A, 0x61, 0xD2, 0x06, 0x38, 0xB8,
485 0xE5, 0xC0, 0x26, 0x93, 0x0C, 0x3E, 0x60, 0x39,
486 0xA3, 0x3C, 0xE4, 0x59, 0x64, 0xFF, 0x21, 0x67,
487 0xF6, 0xEC, 0xED, 0xD4, 0x19, 0xDB, 0x06, 0xC1 },
488 { 0xCD, 0xC7, 0x6E, 0x5C, 0x99, 0x14, 0xFB, 0x92,
489 0x81, 0xA1, 0xC7, 0xE2, 0x84, 0xD7, 0x3E, 0x67,
490 0xF1, 0x80, 0x9A, 0x48, 0xA4, 0x97, 0x20, 0x0E,
491 0x04, 0x6D, 0x39, 0xCC, 0xC7, 0x11, 0x2C, 0xD0 }
492};
493
494/*
495 * RFC 4231 test vectors
496 */
497static unsigned char sha2_hmac_test_key[7][26] =
498{
499 { "\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B"
500 "\x0B\x0B\x0B\x0B" },
501 { "Jefe" },
502 { "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
503 "\xAA\xAA\xAA\xAA" },
504 { "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10"
505 "\x11\x12\x13\x14\x15\x16\x17\x18\x19" },
506 { "\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C"
507 "\x0C\x0C\x0C\x0C" },
508 { "" }, /* 0xAA 131 times */
509 { "" }
510};
511
512static const int sha2_hmac_test_keylen[7] =
513{
514 20, 4, 20, 25, 20, 131, 131
515};
516
517static unsigned char sha2_hmac_test_buf[7][153] =
518{
519 { "Hi There" },
520 { "what do ya want for nothing?" },
521 { "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
522 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
523 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
524 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
525 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD" },
526 { "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
527 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
528 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
529 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
530 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD" },
531 { "Test With Truncation" },
532 { "Test Using Larger Than Block-Size Key - Hash Key First" },
533 { "This is a test using a larger than block-size key "
534 "and a larger than block-size data. The key needs to "
535 "be hashed before being used by the HMAC algorithm." }
536};
537
538static const int sha2_hmac_test_buflen[7] =
539{
540 8, 28, 50, 50, 20, 54, 152
541};
542
543static const unsigned char sha2_hmac_test_sum[14][32] =
544{
545 /*
546 * HMAC-SHA-224 test vectors
547 */
548 { 0x89, 0x6F, 0xB1, 0x12, 0x8A, 0xBB, 0xDF, 0x19,
549 0x68, 0x32, 0x10, 0x7C, 0xD4, 0x9D, 0xF3, 0x3F,
550 0x47, 0xB4, 0xB1, 0x16, 0x99, 0x12, 0xBA, 0x4F,
551 0x53, 0x68, 0x4B, 0x22 },
552 { 0xA3, 0x0E, 0x01, 0x09, 0x8B, 0xC6, 0xDB, 0xBF,
553 0x45, 0x69, 0x0F, 0x3A, 0x7E, 0x9E, 0x6D, 0x0F,
554 0x8B, 0xBE, 0xA2, 0xA3, 0x9E, 0x61, 0x48, 0x00,
555 0x8F, 0xD0, 0x5E, 0x44 },
556 { 0x7F, 0xB3, 0xCB, 0x35, 0x88, 0xC6, 0xC1, 0xF6,
557 0xFF, 0xA9, 0x69, 0x4D, 0x7D, 0x6A, 0xD2, 0x64,
558 0x93, 0x65, 0xB0, 0xC1, 0xF6, 0x5D, 0x69, 0xD1,
559 0xEC, 0x83, 0x33, 0xEA },
560 { 0x6C, 0x11, 0x50, 0x68, 0x74, 0x01, 0x3C, 0xAC,
561 0x6A, 0x2A, 0xBC, 0x1B, 0xB3, 0x82, 0x62, 0x7C,
562 0xEC, 0x6A, 0x90, 0xD8, 0x6E, 0xFC, 0x01, 0x2D,
563 0xE7, 0xAF, 0xEC, 0x5A },
564 { 0x0E, 0x2A, 0xEA, 0x68, 0xA9, 0x0C, 0x8D, 0x37,
565 0xC9, 0x88, 0xBC, 0xDB, 0x9F, 0xCA, 0x6F, 0xA8 },
566 { 0x95, 0xE9, 0xA0, 0xDB, 0x96, 0x20, 0x95, 0xAD,
567 0xAE, 0xBE, 0x9B, 0x2D, 0x6F, 0x0D, 0xBC, 0xE2,
568 0xD4, 0x99, 0xF1, 0x12, 0xF2, 0xD2, 0xB7, 0x27,
569 0x3F, 0xA6, 0x87, 0x0E },
570 { 0x3A, 0x85, 0x41, 0x66, 0xAC, 0x5D, 0x9F, 0x02,
571 0x3F, 0x54, 0xD5, 0x17, 0xD0, 0xB3, 0x9D, 0xBD,
572 0x94, 0x67, 0x70, 0xDB, 0x9C, 0x2B, 0x95, 0xC9,
573 0xF6, 0xF5, 0x65, 0xD1 },
574
575 /*
576 * HMAC-SHA-256 test vectors
577 */
578 { 0xB0, 0x34, 0x4C, 0x61, 0xD8, 0xDB, 0x38, 0x53,
579 0x5C, 0xA8, 0xAF, 0xCE, 0xAF, 0x0B, 0xF1, 0x2B,
580 0x88, 0x1D, 0xC2, 0x00, 0xC9, 0x83, 0x3D, 0xA7,
581 0x26, 0xE9, 0x37, 0x6C, 0x2E, 0x32, 0xCF, 0xF7 },
582 { 0x5B, 0xDC, 0xC1, 0x46, 0xBF, 0x60, 0x75, 0x4E,
583 0x6A, 0x04, 0x24, 0x26, 0x08, 0x95, 0x75, 0xC7,
584 0x5A, 0x00, 0x3F, 0x08, 0x9D, 0x27, 0x39, 0x83,
585 0x9D, 0xEC, 0x58, 0xB9, 0x64, 0xEC, 0x38, 0x43 },
586 { 0x77, 0x3E, 0xA9, 0x1E, 0x36, 0x80, 0x0E, 0x46,
587 0x85, 0x4D, 0xB8, 0xEB, 0xD0, 0x91, 0x81, 0xA7,
588 0x29, 0x59, 0x09, 0x8B, 0x3E, 0xF8, 0xC1, 0x22,
589 0xD9, 0x63, 0x55, 0x14, 0xCE, 0xD5, 0x65, 0xFE },
590 { 0x82, 0x55, 0x8A, 0x38, 0x9A, 0x44, 0x3C, 0x0E,
591 0xA4, 0xCC, 0x81, 0x98, 0x99, 0xF2, 0x08, 0x3A,
592 0x85, 0xF0, 0xFA, 0xA3, 0xE5, 0x78, 0xF8, 0x07,
593 0x7A, 0x2E, 0x3F, 0xF4, 0x67, 0x29, 0x66, 0x5B },
594 { 0xA3, 0xB6, 0x16, 0x74, 0x73, 0x10, 0x0E, 0xE0,
595 0x6E, 0x0C, 0x79, 0x6C, 0x29, 0x55, 0x55, 0x2B },
596 { 0x60, 0xE4, 0x31, 0x59, 0x1E, 0xE0, 0xB6, 0x7F,
597 0x0D, 0x8A, 0x26, 0xAA, 0xCB, 0xF5, 0xB7, 0x7F,
598 0x8E, 0x0B, 0xC6, 0x21, 0x37, 0x28, 0xC5, 0x14,
599 0x05, 0x46, 0x04, 0x0F, 0x0E, 0xE3, 0x7F, 0x54 },
600 { 0x9B, 0x09, 0xFF, 0xA7, 0x1B, 0x94, 0x2F, 0xCB,
601 0x27, 0x63, 0x5F, 0xBC, 0xD5, 0xB0, 0xE9, 0x44,
602 0xBF, 0xDC, 0x63, 0x64, 0x4F, 0x07, 0x13, 0x93,
603 0x8A, 0x7F, 0x51, 0x53, 0x5C, 0x3A, 0x35, 0xE2 }
604};
605
606/*
607 * Checkup routine
608 */
609int sha2_self_test( int verbose )
610{
611 int i, j, k, buflen;
612 unsigned char buf[1024];
613 unsigned char sha2sum[32];
614 sha2_context ctx;
615
616 for( i = 0; i < 6; i++ )
617 {
618 j = i % 3;
619 k = i < 3;
620
621 if( verbose != 0 )
622 printf( " SHA-%d test #%d: ", 256 - k * 32, j + 1 );
623
624 sha2_starts( &ctx, k );
625
626 if( j == 2 )
627 {
628 memset( buf, 'a', buflen = 1000 );
629
630 for( j = 0; j < 1000; j++ )
631 sha2_update( &ctx, buf, buflen );
632 }
633 else
634 sha2_update( &ctx, sha2_test_buf[j],
635 sha2_test_buflen[j] );
636
637 sha2_finish( &ctx, sha2sum );
638
639 if( memcmp( sha2sum, sha2_test_sum[i], 32 - k * 4 ) != 0 )
640 {
641 if( verbose != 0 )
642 printf( "failed\n" );
643
644 return( 1 );
645 }
646
647 if( verbose != 0 )
648 printf( "passed\n" );
649 }
650
651 if( verbose != 0 )
652 printf( "\n" );
653
654 for( i = 0; i < 14; i++ )
655 {
656 j = i % 7;
657 k = i < 7;
658
659 if( verbose != 0 )
660 printf( " HMAC-SHA-%d test #%d: ", 256 - k * 32, j + 1 );
661
662 if( j == 5 || j == 6 )
663 {
664 memset( buf, '\xAA', buflen = 131 );
665 sha2_hmac_starts( &ctx, buf, buflen, k );
666 }
667 else
668 sha2_hmac_starts( &ctx, sha2_hmac_test_key[j],
669 sha2_hmac_test_keylen[j], k );
670
671 sha2_hmac_update( &ctx, sha2_hmac_test_buf[j],
672 sha2_hmac_test_buflen[j] );
673
674 sha2_hmac_finish( &ctx, sha2sum );
675
676 buflen = ( j == 4 ) ? 16 : 32 - k * 4;
677
678 if( memcmp( sha2sum, sha2_hmac_test_sum[i], buflen ) != 0 )
679 {
680 if( verbose != 0 )
681 printf( "failed\n" );
682
683 return( 1 );
684 }
685
686 if( verbose != 0 )
687 printf( "passed\n" );
688 }
689
690 if( verbose != 0 )
691 printf( "\n" );
692
693 return( 0 );
694}
695
696#endif
697
698#endif