blob: 9d719b808a1f91788ae62dad31d458e562dabdf5 [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * FIPS-180-1 compliant SHA-1 implementation
3 *
Paul Bakker84f12b72010-07-18 10:13:04 +00004 * Copyright (C) 2006-2010, Brainspark B.V.
5 * Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
Paul Bakker77b385e2009-07-28 17:23:11 +00006 * All rights reserved.
Paul Bakkere0ccd0a2009-01-04 16:27:10 +00007 *
Paul Bakker5121ce52009-01-03 21:22:43 +00008 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License along
19 * with this program; if not, write to the Free Software Foundation, Inc.,
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 */
22/*
23 * The SHA-1 standard was published by NIST in 1993.
24 *
25 * http://www.itl.nist.gov/fipspubs/fip180-1.htm
26 */
27
Paul Bakker40e46942009-01-03 21:51:57 +000028#include "polarssl/config.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000029
Paul Bakker40e46942009-01-03 21:51:57 +000030#if defined(POLARSSL_SHA1_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000031
Paul Bakker40e46942009-01-03 21:51:57 +000032#include "polarssl/sha1.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000033
34#include <string.h>
35#include <stdio.h>
36
37/*
38 * 32-bit integer manipulation macros (big endian)
39 */
40#ifndef GET_ULONG_BE
41#define GET_ULONG_BE(n,b,i) \
42{ \
43 (n) = ( (unsigned long) (b)[(i) ] << 24 ) \
44 | ( (unsigned long) (b)[(i) + 1] << 16 ) \
45 | ( (unsigned long) (b)[(i) + 2] << 8 ) \
46 | ( (unsigned long) (b)[(i) + 3] ); \
47}
48#endif
49
50#ifndef PUT_ULONG_BE
51#define PUT_ULONG_BE(n,b,i) \
52{ \
53 (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
54 (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
55 (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
56 (b)[(i) + 3] = (unsigned char) ( (n) ); \
57}
58#endif
59
60/*
61 * SHA-1 context setup
62 */
63void sha1_starts( sha1_context *ctx )
64{
65 ctx->total[0] = 0;
66 ctx->total[1] = 0;
67
68 ctx->state[0] = 0x67452301;
69 ctx->state[1] = 0xEFCDAB89;
70 ctx->state[2] = 0x98BADCFE;
71 ctx->state[3] = 0x10325476;
72 ctx->state[4] = 0xC3D2E1F0;
73}
74
Paul Bakkerff60ee62010-03-16 21:09:09 +000075static void sha1_process( sha1_context *ctx, const unsigned char data[64] )
Paul Bakker5121ce52009-01-03 21:22:43 +000076{
77 unsigned long temp, W[16], A, B, C, D, E;
78
79 GET_ULONG_BE( W[ 0], data, 0 );
80 GET_ULONG_BE( W[ 1], data, 4 );
81 GET_ULONG_BE( W[ 2], data, 8 );
82 GET_ULONG_BE( W[ 3], data, 12 );
83 GET_ULONG_BE( W[ 4], data, 16 );
84 GET_ULONG_BE( W[ 5], data, 20 );
85 GET_ULONG_BE( W[ 6], data, 24 );
86 GET_ULONG_BE( W[ 7], data, 28 );
87 GET_ULONG_BE( W[ 8], data, 32 );
88 GET_ULONG_BE( W[ 9], data, 36 );
89 GET_ULONG_BE( W[10], data, 40 );
90 GET_ULONG_BE( W[11], data, 44 );
91 GET_ULONG_BE( W[12], data, 48 );
92 GET_ULONG_BE( W[13], data, 52 );
93 GET_ULONG_BE( W[14], data, 56 );
94 GET_ULONG_BE( W[15], data, 60 );
95
96#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))
97
98#define R(t) \
99( \
100 temp = W[(t - 3) & 0x0F] ^ W[(t - 8) & 0x0F] ^ \
101 W[(t - 14) & 0x0F] ^ W[ t & 0x0F], \
102 ( W[t & 0x0F] = S(temp,1) ) \
103)
104
105#define P(a,b,c,d,e,x) \
106{ \
107 e += S(a,5) + F(b,c,d) + K + x; b = S(b,30); \
108}
109
110 A = ctx->state[0];
111 B = ctx->state[1];
112 C = ctx->state[2];
113 D = ctx->state[3];
114 E = ctx->state[4];
115
116#define F(x,y,z) (z ^ (x & (y ^ z)))
117#define K 0x5A827999
118
119 P( A, B, C, D, E, W[0] );
120 P( E, A, B, C, D, W[1] );
121 P( D, E, A, B, C, W[2] );
122 P( C, D, E, A, B, W[3] );
123 P( B, C, D, E, A, W[4] );
124 P( A, B, C, D, E, W[5] );
125 P( E, A, B, C, D, W[6] );
126 P( D, E, A, B, C, W[7] );
127 P( C, D, E, A, B, W[8] );
128 P( B, C, D, E, A, W[9] );
129 P( A, B, C, D, E, W[10] );
130 P( E, A, B, C, D, W[11] );
131 P( D, E, A, B, C, W[12] );
132 P( C, D, E, A, B, W[13] );
133 P( B, C, D, E, A, W[14] );
134 P( A, B, C, D, E, W[15] );
135 P( E, A, B, C, D, R(16) );
136 P( D, E, A, B, C, R(17) );
137 P( C, D, E, A, B, R(18) );
138 P( B, C, D, E, A, R(19) );
139
140#undef K
141#undef F
142
143#define F(x,y,z) (x ^ y ^ z)
144#define K 0x6ED9EBA1
145
146 P( A, B, C, D, E, R(20) );
147 P( E, A, B, C, D, R(21) );
148 P( D, E, A, B, C, R(22) );
149 P( C, D, E, A, B, R(23) );
150 P( B, C, D, E, A, R(24) );
151 P( A, B, C, D, E, R(25) );
152 P( E, A, B, C, D, R(26) );
153 P( D, E, A, B, C, R(27) );
154 P( C, D, E, A, B, R(28) );
155 P( B, C, D, E, A, R(29) );
156 P( A, B, C, D, E, R(30) );
157 P( E, A, B, C, D, R(31) );
158 P( D, E, A, B, C, R(32) );
159 P( C, D, E, A, B, R(33) );
160 P( B, C, D, E, A, R(34) );
161 P( A, B, C, D, E, R(35) );
162 P( E, A, B, C, D, R(36) );
163 P( D, E, A, B, C, R(37) );
164 P( C, D, E, A, B, R(38) );
165 P( B, C, D, E, A, R(39) );
166
167#undef K
168#undef F
169
170#define F(x,y,z) ((x & y) | (z & (x | y)))
171#define K 0x8F1BBCDC
172
173 P( A, B, C, D, E, R(40) );
174 P( E, A, B, C, D, R(41) );
175 P( D, E, A, B, C, R(42) );
176 P( C, D, E, A, B, R(43) );
177 P( B, C, D, E, A, R(44) );
178 P( A, B, C, D, E, R(45) );
179 P( E, A, B, C, D, R(46) );
180 P( D, E, A, B, C, R(47) );
181 P( C, D, E, A, B, R(48) );
182 P( B, C, D, E, A, R(49) );
183 P( A, B, C, D, E, R(50) );
184 P( E, A, B, C, D, R(51) );
185 P( D, E, A, B, C, R(52) );
186 P( C, D, E, A, B, R(53) );
187 P( B, C, D, E, A, R(54) );
188 P( A, B, C, D, E, R(55) );
189 P( E, A, B, C, D, R(56) );
190 P( D, E, A, B, C, R(57) );
191 P( C, D, E, A, B, R(58) );
192 P( B, C, D, E, A, R(59) );
193
194#undef K
195#undef F
196
197#define F(x,y,z) (x ^ y ^ z)
198#define K 0xCA62C1D6
199
200 P( A, B, C, D, E, R(60) );
201 P( E, A, B, C, D, R(61) );
202 P( D, E, A, B, C, R(62) );
203 P( C, D, E, A, B, R(63) );
204 P( B, C, D, E, A, R(64) );
205 P( A, B, C, D, E, R(65) );
206 P( E, A, B, C, D, R(66) );
207 P( D, E, A, B, C, R(67) );
208 P( C, D, E, A, B, R(68) );
209 P( B, C, D, E, A, R(69) );
210 P( A, B, C, D, E, R(70) );
211 P( E, A, B, C, D, R(71) );
212 P( D, E, A, B, C, R(72) );
213 P( C, D, E, A, B, R(73) );
214 P( B, C, D, E, A, R(74) );
215 P( A, B, C, D, E, R(75) );
216 P( E, A, B, C, D, R(76) );
217 P( D, E, A, B, C, R(77) );
218 P( C, D, E, A, B, R(78) );
219 P( B, C, D, E, A, R(79) );
220
221#undef K
222#undef F
223
224 ctx->state[0] += A;
225 ctx->state[1] += B;
226 ctx->state[2] += C;
227 ctx->state[3] += D;
228 ctx->state[4] += E;
229}
230
231/*
232 * SHA-1 process buffer
233 */
Paul Bakkerff60ee62010-03-16 21:09:09 +0000234void sha1_update( sha1_context *ctx, const unsigned char *input, int ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000235{
236 int fill;
237 unsigned long left;
238
239 if( ilen <= 0 )
240 return;
241
242 left = ctx->total[0] & 0x3F;
243 fill = 64 - left;
244
245 ctx->total[0] += ilen;
246 ctx->total[0] &= 0xFFFFFFFF;
247
248 if( ctx->total[0] < (unsigned long) ilen )
249 ctx->total[1]++;
250
251 if( left && ilen >= fill )
252 {
253 memcpy( (void *) (ctx->buffer + left),
254 (void *) input, fill );
255 sha1_process( ctx, ctx->buffer );
256 input += fill;
257 ilen -= fill;
258 left = 0;
259 }
260
261 while( ilen >= 64 )
262 {
263 sha1_process( ctx, input );
264 input += 64;
265 ilen -= 64;
266 }
267
268 if( ilen > 0 )
269 {
270 memcpy( (void *) (ctx->buffer + left),
271 (void *) input, ilen );
272 }
273}
274
275static const unsigned char sha1_padding[64] =
276{
277 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
278 0, 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};
282
283/*
284 * SHA-1 final digest
285 */
286void sha1_finish( sha1_context *ctx, unsigned char output[20] )
287{
288 unsigned long last, padn;
289 unsigned long high, low;
290 unsigned char msglen[8];
291
292 high = ( ctx->total[0] >> 29 )
293 | ( ctx->total[1] << 3 );
294 low = ( ctx->total[0] << 3 );
295
296 PUT_ULONG_BE( high, msglen, 0 );
297 PUT_ULONG_BE( low, msglen, 4 );
298
299 last = ctx->total[0] & 0x3F;
300 padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
301
302 sha1_update( ctx, (unsigned char *) sha1_padding, padn );
303 sha1_update( ctx, msglen, 8 );
304
305 PUT_ULONG_BE( ctx->state[0], output, 0 );
306 PUT_ULONG_BE( ctx->state[1], output, 4 );
307 PUT_ULONG_BE( ctx->state[2], output, 8 );
308 PUT_ULONG_BE( ctx->state[3], output, 12 );
309 PUT_ULONG_BE( ctx->state[4], output, 16 );
310}
311
312/*
313 * output = SHA-1( input buffer )
314 */
Paul Bakkerff60ee62010-03-16 21:09:09 +0000315void sha1( const unsigned char *input, int ilen, unsigned char output[20] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000316{
317 sha1_context ctx;
318
319 sha1_starts( &ctx );
320 sha1_update( &ctx, input, ilen );
321 sha1_finish( &ctx, output );
322
323 memset( &ctx, 0, sizeof( sha1_context ) );
324}
325
326/*
327 * output = SHA-1( file contents )
328 */
Paul Bakkerff60ee62010-03-16 21:09:09 +0000329int sha1_file( const char *path, unsigned char output[20] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000330{
331 FILE *f;
332 size_t n;
333 sha1_context ctx;
334 unsigned char buf[1024];
335
336 if( ( f = fopen( path, "rb" ) ) == NULL )
337 return( 1 );
338
339 sha1_starts( &ctx );
340
341 while( ( n = fread( buf, 1, sizeof( buf ), f ) ) > 0 )
342 sha1_update( &ctx, buf, (int) n );
343
344 sha1_finish( &ctx, output );
345
346 memset( &ctx, 0, sizeof( sha1_context ) );
347
348 if( ferror( f ) != 0 )
349 {
350 fclose( f );
351 return( 2 );
352 }
353
354 fclose( f );
355 return( 0 );
356}
357
358/*
359 * SHA-1 HMAC context setup
360 */
Paul Bakkerff60ee62010-03-16 21:09:09 +0000361void sha1_hmac_starts( sha1_context *ctx, const unsigned char *key, int keylen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000362{
363 int i;
364 unsigned char sum[20];
365
366 if( keylen > 64 )
367 {
368 sha1( key, keylen, sum );
369 keylen = 20;
370 key = sum;
371 }
372
373 memset( ctx->ipad, 0x36, 64 );
374 memset( ctx->opad, 0x5C, 64 );
375
376 for( i = 0; i < keylen; i++ )
377 {
378 ctx->ipad[i] = (unsigned char)( ctx->ipad[i] ^ key[i] );
379 ctx->opad[i] = (unsigned char)( ctx->opad[i] ^ key[i] );
380 }
381
382 sha1_starts( ctx );
383 sha1_update( ctx, ctx->ipad, 64 );
384
385 memset( sum, 0, sizeof( sum ) );
386}
387
388/*
389 * SHA-1 HMAC process buffer
390 */
Paul Bakkerff60ee62010-03-16 21:09:09 +0000391void sha1_hmac_update( sha1_context *ctx, const unsigned char *input, int ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000392{
393 sha1_update( ctx, input, ilen );
394}
395
396/*
397 * SHA-1 HMAC final digest
398 */
399void sha1_hmac_finish( sha1_context *ctx, unsigned char output[20] )
400{
401 unsigned char tmpbuf[20];
402
403 sha1_finish( ctx, tmpbuf );
404 sha1_starts( ctx );
405 sha1_update( ctx, ctx->opad, 64 );
406 sha1_update( ctx, tmpbuf, 20 );
407 sha1_finish( ctx, output );
408
409 memset( tmpbuf, 0, sizeof( tmpbuf ) );
410}
411
412/*
Paul Bakker7d3b6612010-03-21 16:23:13 +0000413 * SHA1 HMAC context reset
414 */
415void sha1_hmac_reset( sha1_context *ctx )
416{
417 sha1_starts( ctx );
418 sha1_update( ctx, ctx->ipad, 64 );
419}
420
421/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000422 * output = HMAC-SHA-1( hmac key, input buffer )
423 */
Paul Bakkerff60ee62010-03-16 21:09:09 +0000424void sha1_hmac( const unsigned char *key, int keylen,
425 const unsigned char *input, int ilen,
Paul Bakker5121ce52009-01-03 21:22:43 +0000426 unsigned char output[20] )
427{
428 sha1_context ctx;
429
430 sha1_hmac_starts( &ctx, key, keylen );
431 sha1_hmac_update( &ctx, input, ilen );
432 sha1_hmac_finish( &ctx, output );
433
434 memset( &ctx, 0, sizeof( sha1_context ) );
435}
436
Paul Bakker40e46942009-01-03 21:51:57 +0000437#if defined(POLARSSL_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000438/*
439 * FIPS-180-1 test vectors
440 */
441static unsigned char sha1_test_buf[3][57] =
442{
443 { "abc" },
444 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
445 { "" }
446};
447
448static const int sha1_test_buflen[3] =
449{
450 3, 56, 1000
451};
452
453static const unsigned char sha1_test_sum[3][20] =
454{
455 { 0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, 0xBA, 0x3E,
456 0x25, 0x71, 0x78, 0x50, 0xC2, 0x6C, 0x9C, 0xD0, 0xD8, 0x9D },
457 { 0x84, 0x98, 0x3E, 0x44, 0x1C, 0x3B, 0xD2, 0x6E, 0xBA, 0xAE,
458 0x4A, 0xA1, 0xF9, 0x51, 0x29, 0xE5, 0xE5, 0x46, 0x70, 0xF1 },
459 { 0x34, 0xAA, 0x97, 0x3C, 0xD4, 0xC4, 0xDA, 0xA4, 0xF6, 0x1E,
460 0xEB, 0x2B, 0xDB, 0xAD, 0x27, 0x31, 0x65, 0x34, 0x01, 0x6F }
461};
462
463/*
464 * RFC 2202 test vectors
465 */
466static unsigned char sha1_hmac_test_key[7][26] =
467{
468 { "\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B"
469 "\x0B\x0B\x0B\x0B" },
470 { "Jefe" },
471 { "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
472 "\xAA\xAA\xAA\xAA" },
473 { "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10"
474 "\x11\x12\x13\x14\x15\x16\x17\x18\x19" },
475 { "\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C"
476 "\x0C\x0C\x0C\x0C" },
477 { "" }, /* 0xAA 80 times */
478 { "" }
479};
480
481static const int sha1_hmac_test_keylen[7] =
482{
483 20, 4, 20, 25, 20, 80, 80
484};
485
486static unsigned char sha1_hmac_test_buf[7][74] =
487{
488 { "Hi There" },
489 { "what do ya want for nothing?" },
490 { "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
491 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
492 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
493 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
494 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD" },
495 { "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
496 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
497 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
498 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
499 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD" },
500 { "Test With Truncation" },
501 { "Test Using Larger Than Block-Size Key - Hash Key First" },
502 { "Test Using Larger Than Block-Size Key and Larger"
503 " Than One Block-Size Data" }
504};
505
506static const int sha1_hmac_test_buflen[7] =
507{
508 8, 28, 50, 50, 20, 54, 73
509};
510
511static const unsigned char sha1_hmac_test_sum[7][20] =
512{
513 { 0xB6, 0x17, 0x31, 0x86, 0x55, 0x05, 0x72, 0x64, 0xE2, 0x8B,
514 0xC0, 0xB6, 0xFB, 0x37, 0x8C, 0x8E, 0xF1, 0x46, 0xBE, 0x00 },
515 { 0xEF, 0xFC, 0xDF, 0x6A, 0xE5, 0xEB, 0x2F, 0xA2, 0xD2, 0x74,
516 0x16, 0xD5, 0xF1, 0x84, 0xDF, 0x9C, 0x25, 0x9A, 0x7C, 0x79 },
517 { 0x12, 0x5D, 0x73, 0x42, 0xB9, 0xAC, 0x11, 0xCD, 0x91, 0xA3,
518 0x9A, 0xF4, 0x8A, 0xA1, 0x7B, 0x4F, 0x63, 0xF1, 0x75, 0xD3 },
519 { 0x4C, 0x90, 0x07, 0xF4, 0x02, 0x62, 0x50, 0xC6, 0xBC, 0x84,
520 0x14, 0xF9, 0xBF, 0x50, 0xC8, 0x6C, 0x2D, 0x72, 0x35, 0xDA },
521 { 0x4C, 0x1A, 0x03, 0x42, 0x4B, 0x55, 0xE0, 0x7F, 0xE7, 0xF2,
522 0x7B, 0xE1 },
523 { 0xAA, 0x4A, 0xE5, 0xE1, 0x52, 0x72, 0xD0, 0x0E, 0x95, 0x70,
524 0x56, 0x37, 0xCE, 0x8A, 0x3B, 0x55, 0xED, 0x40, 0x21, 0x12 },
525 { 0xE8, 0xE9, 0x9D, 0x0F, 0x45, 0x23, 0x7D, 0x78, 0x6D, 0x6B,
526 0xBA, 0xA7, 0x96, 0x5C, 0x78, 0x08, 0xBB, 0xFF, 0x1A, 0x91 }
527};
528
529/*
530 * Checkup routine
531 */
532int sha1_self_test( int verbose )
533{
534 int i, j, buflen;
535 unsigned char buf[1024];
536 unsigned char sha1sum[20];
537 sha1_context ctx;
538
539 /*
540 * SHA-1
541 */
542 for( i = 0; i < 3; i++ )
543 {
544 if( verbose != 0 )
545 printf( " SHA-1 test #%d: ", i + 1 );
546
547 sha1_starts( &ctx );
548
549 if( i == 2 )
550 {
551 memset( buf, 'a', buflen = 1000 );
552
553 for( j = 0; j < 1000; j++ )
554 sha1_update( &ctx, buf, buflen );
555 }
556 else
557 sha1_update( &ctx, sha1_test_buf[i],
558 sha1_test_buflen[i] );
559
560 sha1_finish( &ctx, sha1sum );
561
562 if( memcmp( sha1sum, sha1_test_sum[i], 20 ) != 0 )
563 {
564 if( verbose != 0 )
565 printf( "failed\n" );
566
567 return( 1 );
568 }
569
570 if( verbose != 0 )
571 printf( "passed\n" );
572 }
573
574 if( verbose != 0 )
575 printf( "\n" );
576
577 for( i = 0; i < 7; i++ )
578 {
579 if( verbose != 0 )
580 printf( " HMAC-SHA-1 test #%d: ", i + 1 );
581
582 if( i == 5 || i == 6 )
583 {
584 memset( buf, '\xAA', buflen = 80 );
585 sha1_hmac_starts( &ctx, buf, buflen );
586 }
587 else
588 sha1_hmac_starts( &ctx, sha1_hmac_test_key[i],
589 sha1_hmac_test_keylen[i] );
590
591 sha1_hmac_update( &ctx, sha1_hmac_test_buf[i],
592 sha1_hmac_test_buflen[i] );
593
594 sha1_hmac_finish( &ctx, sha1sum );
595
596 buflen = ( i == 4 ) ? 12 : 20;
597
598 if( memcmp( sha1sum, sha1_hmac_test_sum[i], buflen ) != 0 )
599 {
600 if( verbose != 0 )
601 printf( "failed\n" );
602
603 return( 1 );
604 }
605
606 if( verbose != 0 )
607 printf( "passed\n" );
608 }
609
610 if( verbose != 0 )
611 printf( "\n" );
612
613 return( 0 );
614}
615
616#endif
617
618#endif