blob: 42557419b704040e06d8bd2b7d34fa48870761a2 [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * FIPS-180-1 compliant SHA-1 implementation
3 *
Paul Bakker530927b2015-02-13 14:24:10 +01004 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
Paul Bakkerb96f1542010-07-18 20:36:00 +00005 *
Manuel Pégourié-Gonnarde12abf92015-01-28 17:13:45 +00006 * This file is part of mbed TLS (https://polarssl.org)
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
Paul Bakker335db3f2011-04-25 15:28:35 +000034#if defined(POLARSSL_FS_IO) || defined(POLARSSL_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +000035#include <stdio.h>
Paul Bakker335db3f2011-04-25 15:28:35 +000036#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000037
Manuel Pégourié-Gonnardaa4e55b2015-08-31 11:22:01 +020038#if !defined(POLARSSL_SHA1_ALT)
39
Paul Bakker312da332014-06-13 17:20:13 +020040/* Implementation that should never be optimized out by the compiler */
41static void polarssl_zeroize( void *v, size_t n ) {
42 volatile unsigned char *p = v; while( n-- ) *p++ = 0;
43}
44
Paul Bakker5121ce52009-01-03 21:22:43 +000045/*
46 * 32-bit integer manipulation macros (big endian)
47 */
Paul Bakker5c2364c2012-10-01 14:41:15 +000048#ifndef GET_UINT32_BE
49#define GET_UINT32_BE(n,b,i) \
Paul Bakker5121ce52009-01-03 21:22:43 +000050{ \
Paul Bakker5c2364c2012-10-01 14:41:15 +000051 (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
52 | ( (uint32_t) (b)[(i) + 1] << 16 ) \
53 | ( (uint32_t) (b)[(i) + 2] << 8 ) \
54 | ( (uint32_t) (b)[(i) + 3] ); \
Paul Bakker5121ce52009-01-03 21:22:43 +000055}
56#endif
57
Paul Bakker5c2364c2012-10-01 14:41:15 +000058#ifndef PUT_UINT32_BE
59#define PUT_UINT32_BE(n,b,i) \
Paul Bakker5121ce52009-01-03 21:22:43 +000060{ \
61 (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
62 (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
63 (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
64 (b)[(i) + 3] = (unsigned char) ( (n) ); \
65}
66#endif
67
68/*
69 * SHA-1 context setup
70 */
71void sha1_starts( sha1_context *ctx )
72{
73 ctx->total[0] = 0;
74 ctx->total[1] = 0;
75
76 ctx->state[0] = 0x67452301;
77 ctx->state[1] = 0xEFCDAB89;
78 ctx->state[2] = 0x98BADCFE;
79 ctx->state[3] = 0x10325476;
80 ctx->state[4] = 0xC3D2E1F0;
81}
82
Paul Bakkere47b34b2013-02-27 14:48:00 +010083void sha1_process( sha1_context *ctx, const unsigned char data[64] )
Paul Bakker5121ce52009-01-03 21:22:43 +000084{
Paul Bakker5c2364c2012-10-01 14:41:15 +000085 uint32_t temp, W[16], A, B, C, D, E;
Paul Bakker5121ce52009-01-03 21:22:43 +000086
Paul Bakker5c2364c2012-10-01 14:41:15 +000087 GET_UINT32_BE( W[ 0], data, 0 );
88 GET_UINT32_BE( W[ 1], data, 4 );
89 GET_UINT32_BE( W[ 2], data, 8 );
90 GET_UINT32_BE( W[ 3], data, 12 );
91 GET_UINT32_BE( W[ 4], data, 16 );
92 GET_UINT32_BE( W[ 5], data, 20 );
93 GET_UINT32_BE( W[ 6], data, 24 );
94 GET_UINT32_BE( W[ 7], data, 28 );
95 GET_UINT32_BE( W[ 8], data, 32 );
96 GET_UINT32_BE( W[ 9], data, 36 );
97 GET_UINT32_BE( W[10], data, 40 );
98 GET_UINT32_BE( W[11], data, 44 );
99 GET_UINT32_BE( W[12], data, 48 );
100 GET_UINT32_BE( W[13], data, 52 );
101 GET_UINT32_BE( W[14], data, 56 );
102 GET_UINT32_BE( W[15], data, 60 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000103
104#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))
105
106#define R(t) \
107( \
108 temp = W[(t - 3) & 0x0F] ^ W[(t - 8) & 0x0F] ^ \
109 W[(t - 14) & 0x0F] ^ W[ t & 0x0F], \
110 ( W[t & 0x0F] = S(temp,1) ) \
111)
112
113#define P(a,b,c,d,e,x) \
114{ \
115 e += S(a,5) + F(b,c,d) + K + x; b = S(b,30); \
116}
117
118 A = ctx->state[0];
119 B = ctx->state[1];
120 C = ctx->state[2];
121 D = ctx->state[3];
122 E = ctx->state[4];
123
124#define F(x,y,z) (z ^ (x & (y ^ z)))
125#define K 0x5A827999
126
127 P( A, B, C, D, E, W[0] );
128 P( E, A, B, C, D, W[1] );
129 P( D, E, A, B, C, W[2] );
130 P( C, D, E, A, B, W[3] );
131 P( B, C, D, E, A, W[4] );
132 P( A, B, C, D, E, W[5] );
133 P( E, A, B, C, D, W[6] );
134 P( D, E, A, B, C, W[7] );
135 P( C, D, E, A, B, W[8] );
136 P( B, C, D, E, A, W[9] );
137 P( A, B, C, D, E, W[10] );
138 P( E, A, B, C, D, W[11] );
139 P( D, E, A, B, C, W[12] );
140 P( C, D, E, A, B, W[13] );
141 P( B, C, D, E, A, W[14] );
142 P( A, B, C, D, E, W[15] );
143 P( E, A, B, C, D, R(16) );
144 P( D, E, A, B, C, R(17) );
145 P( C, D, E, A, B, R(18) );
146 P( B, C, D, E, A, R(19) );
147
148#undef K
149#undef F
150
151#define F(x,y,z) (x ^ y ^ z)
152#define K 0x6ED9EBA1
153
154 P( A, B, C, D, E, R(20) );
155 P( E, A, B, C, D, R(21) );
156 P( D, E, A, B, C, R(22) );
157 P( C, D, E, A, B, R(23) );
158 P( B, C, D, E, A, R(24) );
159 P( A, B, C, D, E, R(25) );
160 P( E, A, B, C, D, R(26) );
161 P( D, E, A, B, C, R(27) );
162 P( C, D, E, A, B, R(28) );
163 P( B, C, D, E, A, R(29) );
164 P( A, B, C, D, E, R(30) );
165 P( E, A, B, C, D, R(31) );
166 P( D, E, A, B, C, R(32) );
167 P( C, D, E, A, B, R(33) );
168 P( B, C, D, E, A, R(34) );
169 P( A, B, C, D, E, R(35) );
170 P( E, A, B, C, D, R(36) );
171 P( D, E, A, B, C, R(37) );
172 P( C, D, E, A, B, R(38) );
173 P( B, C, D, E, A, R(39) );
174
175#undef K
176#undef F
177
178#define F(x,y,z) ((x & y) | (z & (x | y)))
179#define K 0x8F1BBCDC
180
181 P( A, B, C, D, E, R(40) );
182 P( E, A, B, C, D, R(41) );
183 P( D, E, A, B, C, R(42) );
184 P( C, D, E, A, B, R(43) );
185 P( B, C, D, E, A, R(44) );
186 P( A, B, C, D, E, R(45) );
187 P( E, A, B, C, D, R(46) );
188 P( D, E, A, B, C, R(47) );
189 P( C, D, E, A, B, R(48) );
190 P( B, C, D, E, A, R(49) );
191 P( A, B, C, D, E, R(50) );
192 P( E, A, B, C, D, R(51) );
193 P( D, E, A, B, C, R(52) );
194 P( C, D, E, A, B, R(53) );
195 P( B, C, D, E, A, R(54) );
196 P( A, B, C, D, E, R(55) );
197 P( E, A, B, C, D, R(56) );
198 P( D, E, A, B, C, R(57) );
199 P( C, D, E, A, B, R(58) );
200 P( B, C, D, E, A, R(59) );
201
202#undef K
203#undef F
204
205#define F(x,y,z) (x ^ y ^ z)
206#define K 0xCA62C1D6
207
208 P( A, B, C, D, E, R(60) );
209 P( E, A, B, C, D, R(61) );
210 P( D, E, A, B, C, R(62) );
211 P( C, D, E, A, B, R(63) );
212 P( B, C, D, E, A, R(64) );
213 P( A, B, C, D, E, R(65) );
214 P( E, A, B, C, D, R(66) );
215 P( D, E, A, B, C, R(67) );
216 P( C, D, E, A, B, R(68) );
217 P( B, C, D, E, A, R(69) );
218 P( A, B, C, D, E, R(70) );
219 P( E, A, B, C, D, R(71) );
220 P( D, E, A, B, C, R(72) );
221 P( C, D, E, A, B, R(73) );
222 P( B, C, D, E, A, R(74) );
223 P( A, B, C, D, E, R(75) );
224 P( E, A, B, C, D, R(76) );
225 P( D, E, A, B, C, R(77) );
226 P( C, D, E, A, B, R(78) );
227 P( B, C, D, E, A, R(79) );
228
229#undef K
230#undef F
231
232 ctx->state[0] += A;
233 ctx->state[1] += B;
234 ctx->state[2] += C;
235 ctx->state[3] += D;
236 ctx->state[4] += E;
237}
238
239/*
240 * SHA-1 process buffer
241 */
Paul Bakker23986e52011-04-24 08:57:21 +0000242void sha1_update( sha1_context *ctx, const unsigned char *input, size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000243{
Paul Bakker23986e52011-04-24 08:57:21 +0000244 size_t fill;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000245 uint32_t left;
Paul Bakker5121ce52009-01-03 21:22:43 +0000246
247 if( ilen <= 0 )
248 return;
249
250 left = ctx->total[0] & 0x3F;
251 fill = 64 - left;
252
Paul Bakker5c2364c2012-10-01 14:41:15 +0000253 ctx->total[0] += (uint32_t) ilen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000254 ctx->total[0] &= 0xFFFFFFFF;
255
Paul Bakker5c2364c2012-10-01 14:41:15 +0000256 if( ctx->total[0] < (uint32_t) ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000257 ctx->total[1]++;
258
259 if( left && ilen >= fill )
260 {
Paul Bakkereae09db2013-06-06 12:35:54 +0200261 memcpy( (void *) (ctx->buffer + left), input, fill );
Paul Bakker5121ce52009-01-03 21:22:43 +0000262 sha1_process( ctx, ctx->buffer );
263 input += fill;
264 ilen -= fill;
265 left = 0;
266 }
267
268 while( ilen >= 64 )
269 {
270 sha1_process( ctx, input );
271 input += 64;
272 ilen -= 64;
273 }
274
275 if( ilen > 0 )
Paul Bakkereae09db2013-06-06 12:35:54 +0200276 memcpy( (void *) (ctx->buffer + left), input, ilen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000277}
278
279static const unsigned char sha1_padding[64] =
280{
281 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
282 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
283 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
284 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
285};
286
287/*
288 * SHA-1 final digest
289 */
290void sha1_finish( sha1_context *ctx, unsigned char output[20] )
291{
Paul Bakker5c2364c2012-10-01 14:41:15 +0000292 uint32_t last, padn;
293 uint32_t high, low;
Paul Bakker5121ce52009-01-03 21:22:43 +0000294 unsigned char msglen[8];
295
296 high = ( ctx->total[0] >> 29 )
297 | ( ctx->total[1] << 3 );
298 low = ( ctx->total[0] << 3 );
299
Paul Bakker5c2364c2012-10-01 14:41:15 +0000300 PUT_UINT32_BE( high, msglen, 0 );
301 PUT_UINT32_BE( low, msglen, 4 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000302
303 last = ctx->total[0] & 0x3F;
304 padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
305
Paul Bakkereae09db2013-06-06 12:35:54 +0200306 sha1_update( ctx, sha1_padding, padn );
Paul Bakker5121ce52009-01-03 21:22:43 +0000307 sha1_update( ctx, msglen, 8 );
308
Paul Bakker5c2364c2012-10-01 14:41:15 +0000309 PUT_UINT32_BE( ctx->state[0], output, 0 );
310 PUT_UINT32_BE( ctx->state[1], output, 4 );
311 PUT_UINT32_BE( ctx->state[2], output, 8 );
312 PUT_UINT32_BE( ctx->state[3], output, 12 );
313 PUT_UINT32_BE( ctx->state[4], output, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000314}
315
Paul Bakker4087c472013-06-12 16:49:10 +0200316#endif /* !POLARSSL_SHA1_ALT */
317
Paul Bakker5121ce52009-01-03 21:22:43 +0000318/*
319 * output = SHA-1( input buffer )
320 */
Paul Bakker23986e52011-04-24 08:57:21 +0000321void sha1( const unsigned char *input, size_t ilen, unsigned char output[20] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000322{
323 sha1_context ctx;
324
325 sha1_starts( &ctx );
326 sha1_update( &ctx, input, ilen );
327 sha1_finish( &ctx, output );
328
Paul Bakker312da332014-06-13 17:20:13 +0200329 polarssl_zeroize( &ctx, sizeof( sha1_context ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000330}
331
Paul Bakker335db3f2011-04-25 15:28:35 +0000332#if defined(POLARSSL_FS_IO)
Paul Bakker5121ce52009-01-03 21:22:43 +0000333/*
334 * output = SHA-1( file contents )
335 */
Paul Bakkerff60ee62010-03-16 21:09:09 +0000336int sha1_file( const char *path, unsigned char output[20] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000337{
338 FILE *f;
339 size_t n;
340 sha1_context ctx;
341 unsigned char buf[1024];
342
343 if( ( f = fopen( path, "rb" ) ) == NULL )
Paul Bakker69e095c2011-12-10 21:55:01 +0000344 return( POLARSSL_ERR_SHA1_FILE_IO_ERROR );
Paul Bakker5121ce52009-01-03 21:22:43 +0000345
346 sha1_starts( &ctx );
347
348 while( ( n = fread( buf, 1, sizeof( buf ), f ) ) > 0 )
Paul Bakker27fdf462011-06-09 13:55:13 +0000349 sha1_update( &ctx, buf, n );
Paul Bakker5121ce52009-01-03 21:22:43 +0000350
351 sha1_finish( &ctx, output );
352
Paul Bakker312da332014-06-13 17:20:13 +0200353 polarssl_zeroize( &ctx, sizeof( sha1_context ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000354
355 if( ferror( f ) != 0 )
356 {
357 fclose( f );
Paul Bakker69e095c2011-12-10 21:55:01 +0000358 return( POLARSSL_ERR_SHA1_FILE_IO_ERROR );
Paul Bakker5121ce52009-01-03 21:22:43 +0000359 }
360
361 fclose( f );
362 return( 0 );
363}
Paul Bakker335db3f2011-04-25 15:28:35 +0000364#endif /* POLARSSL_FS_IO */
Paul Bakker5121ce52009-01-03 21:22:43 +0000365
366/*
367 * SHA-1 HMAC context setup
368 */
Paul Bakker23986e52011-04-24 08:57:21 +0000369void sha1_hmac_starts( sha1_context *ctx, const unsigned char *key, size_t keylen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000370{
Paul Bakker23986e52011-04-24 08:57:21 +0000371 size_t i;
Paul Bakker5121ce52009-01-03 21:22:43 +0000372 unsigned char sum[20];
373
374 if( keylen > 64 )
375 {
376 sha1( key, keylen, sum );
377 keylen = 20;
378 key = sum;
379 }
380
381 memset( ctx->ipad, 0x36, 64 );
382 memset( ctx->opad, 0x5C, 64 );
383
384 for( i = 0; i < keylen; i++ )
385 {
386 ctx->ipad[i] = (unsigned char)( ctx->ipad[i] ^ key[i] );
387 ctx->opad[i] = (unsigned char)( ctx->opad[i] ^ key[i] );
388 }
389
390 sha1_starts( ctx );
391 sha1_update( ctx, ctx->ipad, 64 );
392
Paul Bakker312da332014-06-13 17:20:13 +0200393 polarssl_zeroize( sum, sizeof( sum ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000394}
395
396/*
397 * SHA-1 HMAC process buffer
398 */
Paul Bakker23986e52011-04-24 08:57:21 +0000399void sha1_hmac_update( sha1_context *ctx, const unsigned char *input, size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000400{
401 sha1_update( ctx, input, ilen );
402}
403
404/*
405 * SHA-1 HMAC final digest
406 */
407void sha1_hmac_finish( sha1_context *ctx, unsigned char output[20] )
408{
409 unsigned char tmpbuf[20];
410
411 sha1_finish( ctx, tmpbuf );
412 sha1_starts( ctx );
413 sha1_update( ctx, ctx->opad, 64 );
414 sha1_update( ctx, tmpbuf, 20 );
415 sha1_finish( ctx, output );
416
Paul Bakker312da332014-06-13 17:20:13 +0200417 polarssl_zeroize( tmpbuf, sizeof( tmpbuf ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000418}
419
420/*
Paul Bakker7d3b6612010-03-21 16:23:13 +0000421 * SHA1 HMAC context reset
422 */
423void sha1_hmac_reset( sha1_context *ctx )
424{
425 sha1_starts( ctx );
426 sha1_update( ctx, ctx->ipad, 64 );
427}
428
429/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000430 * output = HMAC-SHA-1( hmac key, input buffer )
431 */
Paul Bakker23986e52011-04-24 08:57:21 +0000432void sha1_hmac( const unsigned char *key, size_t keylen,
433 const unsigned char *input, size_t ilen,
Paul Bakker5121ce52009-01-03 21:22:43 +0000434 unsigned char output[20] )
435{
436 sha1_context ctx;
437
438 sha1_hmac_starts( &ctx, key, keylen );
439 sha1_hmac_update( &ctx, input, ilen );
440 sha1_hmac_finish( &ctx, output );
441
Paul Bakker312da332014-06-13 17:20:13 +0200442 polarssl_zeroize( &ctx, sizeof( sha1_context ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000443}
444
Paul Bakker40e46942009-01-03 21:51:57 +0000445#if defined(POLARSSL_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000446/*
447 * FIPS-180-1 test vectors
448 */
449static unsigned char sha1_test_buf[3][57] =
450{
451 { "abc" },
452 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
453 { "" }
454};
455
456static const int sha1_test_buflen[3] =
457{
458 3, 56, 1000
459};
460
461static const unsigned char sha1_test_sum[3][20] =
462{
463 { 0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, 0xBA, 0x3E,
464 0x25, 0x71, 0x78, 0x50, 0xC2, 0x6C, 0x9C, 0xD0, 0xD8, 0x9D },
465 { 0x84, 0x98, 0x3E, 0x44, 0x1C, 0x3B, 0xD2, 0x6E, 0xBA, 0xAE,
466 0x4A, 0xA1, 0xF9, 0x51, 0x29, 0xE5, 0xE5, 0x46, 0x70, 0xF1 },
467 { 0x34, 0xAA, 0x97, 0x3C, 0xD4, 0xC4, 0xDA, 0xA4, 0xF6, 0x1E,
468 0xEB, 0x2B, 0xDB, 0xAD, 0x27, 0x31, 0x65, 0x34, 0x01, 0x6F }
469};
470
471/*
472 * RFC 2202 test vectors
473 */
474static unsigned char sha1_hmac_test_key[7][26] =
475{
476 { "\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B"
477 "\x0B\x0B\x0B\x0B" },
478 { "Jefe" },
479 { "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
480 "\xAA\xAA\xAA\xAA" },
481 { "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10"
482 "\x11\x12\x13\x14\x15\x16\x17\x18\x19" },
483 { "\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C"
484 "\x0C\x0C\x0C\x0C" },
485 { "" }, /* 0xAA 80 times */
486 { "" }
487};
488
489static const int sha1_hmac_test_keylen[7] =
490{
491 20, 4, 20, 25, 20, 80, 80
492};
493
494static unsigned char sha1_hmac_test_buf[7][74] =
495{
496 { "Hi There" },
497 { "what do ya want for nothing?" },
498 { "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
499 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
500 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
501 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
502 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD" },
503 { "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
504 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
505 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
506 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
507 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD" },
508 { "Test With Truncation" },
509 { "Test Using Larger Than Block-Size Key - Hash Key First" },
510 { "Test Using Larger Than Block-Size Key and Larger"
511 " Than One Block-Size Data" }
512};
513
514static const int sha1_hmac_test_buflen[7] =
515{
516 8, 28, 50, 50, 20, 54, 73
517};
518
519static const unsigned char sha1_hmac_test_sum[7][20] =
520{
521 { 0xB6, 0x17, 0x31, 0x86, 0x55, 0x05, 0x72, 0x64, 0xE2, 0x8B,
522 0xC0, 0xB6, 0xFB, 0x37, 0x8C, 0x8E, 0xF1, 0x46, 0xBE, 0x00 },
523 { 0xEF, 0xFC, 0xDF, 0x6A, 0xE5, 0xEB, 0x2F, 0xA2, 0xD2, 0x74,
524 0x16, 0xD5, 0xF1, 0x84, 0xDF, 0x9C, 0x25, 0x9A, 0x7C, 0x79 },
525 { 0x12, 0x5D, 0x73, 0x42, 0xB9, 0xAC, 0x11, 0xCD, 0x91, 0xA3,
526 0x9A, 0xF4, 0x8A, 0xA1, 0x7B, 0x4F, 0x63, 0xF1, 0x75, 0xD3 },
527 { 0x4C, 0x90, 0x07, 0xF4, 0x02, 0x62, 0x50, 0xC6, 0xBC, 0x84,
528 0x14, 0xF9, 0xBF, 0x50, 0xC8, 0x6C, 0x2D, 0x72, 0x35, 0xDA },
529 { 0x4C, 0x1A, 0x03, 0x42, 0x4B, 0x55, 0xE0, 0x7F, 0xE7, 0xF2,
530 0x7B, 0xE1 },
531 { 0xAA, 0x4A, 0xE5, 0xE1, 0x52, 0x72, 0xD0, 0x0E, 0x95, 0x70,
532 0x56, 0x37, 0xCE, 0x8A, 0x3B, 0x55, 0xED, 0x40, 0x21, 0x12 },
533 { 0xE8, 0xE9, 0x9D, 0x0F, 0x45, 0x23, 0x7D, 0x78, 0x6D, 0x6B,
534 0xBA, 0xA7, 0x96, 0x5C, 0x78, 0x08, 0xBB, 0xFF, 0x1A, 0x91 }
535};
536
537/*
538 * Checkup routine
539 */
540int sha1_self_test( int verbose )
541{
542 int i, j, buflen;
543 unsigned char buf[1024];
544 unsigned char sha1sum[20];
545 sha1_context ctx;
546
547 /*
548 * SHA-1
549 */
550 for( i = 0; i < 3; i++ )
551 {
552 if( verbose != 0 )
553 printf( " SHA-1 test #%d: ", i + 1 );
554
555 sha1_starts( &ctx );
556
557 if( i == 2 )
558 {
559 memset( buf, 'a', buflen = 1000 );
560
561 for( j = 0; j < 1000; j++ )
562 sha1_update( &ctx, buf, buflen );
563 }
564 else
565 sha1_update( &ctx, sha1_test_buf[i],
566 sha1_test_buflen[i] );
567
568 sha1_finish( &ctx, sha1sum );
569
570 if( memcmp( sha1sum, sha1_test_sum[i], 20 ) != 0 )
571 {
572 if( verbose != 0 )
573 printf( "failed\n" );
574
575 return( 1 );
576 }
577
578 if( verbose != 0 )
579 printf( "passed\n" );
580 }
581
582 if( verbose != 0 )
583 printf( "\n" );
584
585 for( i = 0; i < 7; i++ )
586 {
587 if( verbose != 0 )
588 printf( " HMAC-SHA-1 test #%d: ", i + 1 );
589
590 if( i == 5 || i == 6 )
591 {
592 memset( buf, '\xAA', buflen = 80 );
593 sha1_hmac_starts( &ctx, buf, buflen );
594 }
595 else
596 sha1_hmac_starts( &ctx, sha1_hmac_test_key[i],
597 sha1_hmac_test_keylen[i] );
598
599 sha1_hmac_update( &ctx, sha1_hmac_test_buf[i],
600 sha1_hmac_test_buflen[i] );
601
602 sha1_hmac_finish( &ctx, sha1sum );
603
604 buflen = ( i == 4 ) ? 12 : 20;
605
606 if( memcmp( sha1sum, sha1_hmac_test_sum[i], buflen ) != 0 )
607 {
608 if( verbose != 0 )
609 printf( "failed\n" );
610
611 return( 1 );
612 }
613
614 if( verbose != 0 )
615 printf( "passed\n" );
616 }
617
618 if( verbose != 0 )
619 printf( "\n" );
620
621 return( 0 );
622}
623
624#endif
625
626#endif