blob: 69b270558406a709bfa48a8de6df2caa359aed6a [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * FIPS-180-1 compliant SHA-1 implementation
3 *
Manuel Pégourié-Gonnarda658a402015-01-23 09:45:19 +00004 * Copyright (C) 2006-2014, ARM Limited, All Rights Reserved
Paul Bakkerb96f1542010-07-18 20:36:00 +00005 *
Manuel Pégourié-Gonnard085ab042015-01-23 11:06:27 +00006 * This file is part of mbed TLS (https://www.polarssl.org)
Paul Bakkerb96f1542010-07-18 20:36:00 +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
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020028#if !defined(POLARSSL_CONFIG_FILE)
Paul Bakker40e46942009-01-03 21:51:57 +000029#include "polarssl/config.h"
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020030#else
31#include POLARSSL_CONFIG_FILE
32#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000033
Paul Bakker40e46942009-01-03 21:51:57 +000034#if defined(POLARSSL_SHA1_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000035
Paul Bakker40e46942009-01-03 21:51:57 +000036#include "polarssl/sha1.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000037
Paul Bakker335db3f2011-04-25 15:28:35 +000038#if defined(POLARSSL_FS_IO) || defined(POLARSSL_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +000039#include <stdio.h>
Paul Bakker335db3f2011-04-25 15:28:35 +000040#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000041
Paul Bakker7dc4c442014-02-01 22:50:26 +010042#if defined(POLARSSL_PLATFORM_C)
43#include "polarssl/platform.h"
44#else
45#define polarssl_printf printf
46#endif
47
Paul Bakker34617722014-06-13 17:20:13 +020048/* Implementation that should never be optimized out by the compiler */
49static void polarssl_zeroize( void *v, size_t n ) {
50 volatile unsigned char *p = v; while( n-- ) *p++ = 0;
51}
52
Paul Bakker90995b52013-06-24 19:20:35 +020053#if !defined(POLARSSL_SHA1_ALT)
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) \
Paul Bakker5121ce52009-01-03 21:22:43 +000060{ \
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] ); \
Paul Bakker5121ce52009-01-03 21:22:43 +000065}
66#endif
67
Paul Bakker5c2364c2012-10-01 14:41:15 +000068#ifndef PUT_UINT32_BE
69#define PUT_UINT32_BE(n,b,i) \
Paul Bakker5121ce52009-01-03 21:22:43 +000070{ \
71 (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) ); \
75}
76#endif
77
Paul Bakker5b4af392014-06-26 12:09:34 +020078void sha1_init( sha1_context *ctx )
79{
80 memset( ctx, 0, sizeof( sha1_context ) );
81}
82
83void sha1_free( sha1_context *ctx )
84{
85 if( ctx == NULL )
86 return;
87
88 polarssl_zeroize( ctx, sizeof( sha1_context ) );
89}
90
Paul Bakker5121ce52009-01-03 21:22:43 +000091/*
92 * SHA-1 context setup
93 */
94void sha1_starts( sha1_context *ctx )
95{
96 ctx->total[0] = 0;
97 ctx->total[1] = 0;
98
99 ctx->state[0] = 0x67452301;
100 ctx->state[1] = 0xEFCDAB89;
101 ctx->state[2] = 0x98BADCFE;
102 ctx->state[3] = 0x10325476;
103 ctx->state[4] = 0xC3D2E1F0;
104}
105
Paul Bakkere47b34b2013-02-27 14:48:00 +0100106void sha1_process( sha1_context *ctx, const unsigned char data[64] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000107{
Paul Bakker5c2364c2012-10-01 14:41:15 +0000108 uint32_t temp, W[16], A, B, C, D, E;
Paul Bakker5121ce52009-01-03 21:22:43 +0000109
Paul Bakker5c2364c2012-10-01 14:41:15 +0000110 GET_UINT32_BE( W[ 0], data, 0 );
111 GET_UINT32_BE( W[ 1], data, 4 );
112 GET_UINT32_BE( W[ 2], data, 8 );
113 GET_UINT32_BE( W[ 3], data, 12 );
114 GET_UINT32_BE( W[ 4], data, 16 );
115 GET_UINT32_BE( W[ 5], data, 20 );
116 GET_UINT32_BE( W[ 6], data, 24 );
117 GET_UINT32_BE( W[ 7], data, 28 );
118 GET_UINT32_BE( W[ 8], data, 32 );
119 GET_UINT32_BE( W[ 9], data, 36 );
120 GET_UINT32_BE( W[10], data, 40 );
121 GET_UINT32_BE( W[11], data, 44 );
122 GET_UINT32_BE( W[12], data, 48 );
123 GET_UINT32_BE( W[13], data, 52 );
124 GET_UINT32_BE( W[14], data, 56 );
125 GET_UINT32_BE( W[15], data, 60 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000126
127#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))
128
129#define R(t) \
130( \
Paul Bakker66d5d072014-06-17 16:39:18 +0200131 temp = W[( t - 3 ) & 0x0F] ^ W[( t - 8 ) & 0x0F] ^ \
132 W[( t - 14 ) & 0x0F] ^ W[ t & 0x0F], \
Paul Bakker5121ce52009-01-03 21:22:43 +0000133 ( W[t & 0x0F] = S(temp,1) ) \
134)
135
136#define P(a,b,c,d,e,x) \
137{ \
138 e += S(a,5) + F(b,c,d) + K + x; b = S(b,30); \
139}
140
141 A = ctx->state[0];
142 B = ctx->state[1];
143 C = ctx->state[2];
144 D = ctx->state[3];
145 E = ctx->state[4];
146
147#define F(x,y,z) (z ^ (x & (y ^ z)))
148#define K 0x5A827999
149
150 P( A, B, C, D, E, W[0] );
151 P( E, A, B, C, D, W[1] );
152 P( D, E, A, B, C, W[2] );
153 P( C, D, E, A, B, W[3] );
154 P( B, C, D, E, A, W[4] );
155 P( A, B, C, D, E, W[5] );
156 P( E, A, B, C, D, W[6] );
157 P( D, E, A, B, C, W[7] );
158 P( C, D, E, A, B, W[8] );
159 P( B, C, D, E, A, W[9] );
160 P( A, B, C, D, E, W[10] );
161 P( E, A, B, C, D, W[11] );
162 P( D, E, A, B, C, W[12] );
163 P( C, D, E, A, B, W[13] );
164 P( B, C, D, E, A, W[14] );
165 P( A, B, C, D, E, W[15] );
166 P( E, A, B, C, D, R(16) );
167 P( D, E, A, B, C, R(17) );
168 P( C, D, E, A, B, R(18) );
169 P( B, C, D, E, A, R(19) );
170
171#undef K
172#undef F
173
174#define F(x,y,z) (x ^ y ^ z)
175#define K 0x6ED9EBA1
176
177 P( A, B, C, D, E, R(20) );
178 P( E, A, B, C, D, R(21) );
179 P( D, E, A, B, C, R(22) );
180 P( C, D, E, A, B, R(23) );
181 P( B, C, D, E, A, R(24) );
182 P( A, B, C, D, E, R(25) );
183 P( E, A, B, C, D, R(26) );
184 P( D, E, A, B, C, R(27) );
185 P( C, D, E, A, B, R(28) );
186 P( B, C, D, E, A, R(29) );
187 P( A, B, C, D, E, R(30) );
188 P( E, A, B, C, D, R(31) );
189 P( D, E, A, B, C, R(32) );
190 P( C, D, E, A, B, R(33) );
191 P( B, C, D, E, A, R(34) );
192 P( A, B, C, D, E, R(35) );
193 P( E, A, B, C, D, R(36) );
194 P( D, E, A, B, C, R(37) );
195 P( C, D, E, A, B, R(38) );
196 P( B, C, D, E, A, R(39) );
197
198#undef K
199#undef F
200
201#define F(x,y,z) ((x & y) | (z & (x | y)))
202#define K 0x8F1BBCDC
203
204 P( A, B, C, D, E, R(40) );
205 P( E, A, B, C, D, R(41) );
206 P( D, E, A, B, C, R(42) );
207 P( C, D, E, A, B, R(43) );
208 P( B, C, D, E, A, R(44) );
209 P( A, B, C, D, E, R(45) );
210 P( E, A, B, C, D, R(46) );
211 P( D, E, A, B, C, R(47) );
212 P( C, D, E, A, B, R(48) );
213 P( B, C, D, E, A, R(49) );
214 P( A, B, C, D, E, R(50) );
215 P( E, A, B, C, D, R(51) );
216 P( D, E, A, B, C, R(52) );
217 P( C, D, E, A, B, R(53) );
218 P( B, C, D, E, A, R(54) );
219 P( A, B, C, D, E, R(55) );
220 P( E, A, B, C, D, R(56) );
221 P( D, E, A, B, C, R(57) );
222 P( C, D, E, A, B, R(58) );
223 P( B, C, D, E, A, R(59) );
224
225#undef K
226#undef F
227
228#define F(x,y,z) (x ^ y ^ z)
229#define K 0xCA62C1D6
230
231 P( A, B, C, D, E, R(60) );
232 P( E, A, B, C, D, R(61) );
233 P( D, E, A, B, C, R(62) );
234 P( C, D, E, A, B, R(63) );
235 P( B, C, D, E, A, R(64) );
236 P( A, B, C, D, E, R(65) );
237 P( E, A, B, C, D, R(66) );
238 P( D, E, A, B, C, R(67) );
239 P( C, D, E, A, B, R(68) );
240 P( B, C, D, E, A, R(69) );
241 P( A, B, C, D, E, R(70) );
242 P( E, A, B, C, D, R(71) );
243 P( D, E, A, B, C, R(72) );
244 P( C, D, E, A, B, R(73) );
245 P( B, C, D, E, A, R(74) );
246 P( A, B, C, D, E, R(75) );
247 P( E, A, B, C, D, R(76) );
248 P( D, E, A, B, C, R(77) );
249 P( C, D, E, A, B, R(78) );
250 P( B, C, D, E, A, R(79) );
251
252#undef K
253#undef F
254
255 ctx->state[0] += A;
256 ctx->state[1] += B;
257 ctx->state[2] += C;
258 ctx->state[3] += D;
259 ctx->state[4] += E;
260}
261
262/*
263 * SHA-1 process buffer
264 */
Paul Bakker23986e52011-04-24 08:57:21 +0000265void sha1_update( sha1_context *ctx, const unsigned char *input, size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000266{
Paul Bakker23986e52011-04-24 08:57:21 +0000267 size_t fill;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000268 uint32_t left;
Paul Bakker5121ce52009-01-03 21:22:43 +0000269
Brian White12895d12014-04-11 11:29:42 -0400270 if( ilen == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000271 return;
272
273 left = ctx->total[0] & 0x3F;
274 fill = 64 - left;
275
Paul Bakker5c2364c2012-10-01 14:41:15 +0000276 ctx->total[0] += (uint32_t) ilen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000277 ctx->total[0] &= 0xFFFFFFFF;
278
Paul Bakker5c2364c2012-10-01 14:41:15 +0000279 if( ctx->total[0] < (uint32_t) ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000280 ctx->total[1]++;
281
282 if( left && ilen >= fill )
283 {
Paul Bakker3c2122f2013-06-24 19:03:14 +0200284 memcpy( (void *) (ctx->buffer + left), input, fill );
Paul Bakker5121ce52009-01-03 21:22:43 +0000285 sha1_process( ctx, ctx->buffer );
286 input += fill;
287 ilen -= fill;
288 left = 0;
289 }
290
291 while( ilen >= 64 )
292 {
293 sha1_process( ctx, input );
294 input += 64;
295 ilen -= 64;
296 }
297
298 if( ilen > 0 )
Paul Bakker3c2122f2013-06-24 19:03:14 +0200299 memcpy( (void *) (ctx->buffer + left), input, ilen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000300}
301
302static const unsigned char sha1_padding[64] =
303{
304 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
305 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
306 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
307 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
308};
309
310/*
311 * SHA-1 final digest
312 */
313void sha1_finish( sha1_context *ctx, unsigned char output[20] )
314{
Paul Bakker5c2364c2012-10-01 14:41:15 +0000315 uint32_t last, padn;
316 uint32_t high, low;
Paul Bakker5121ce52009-01-03 21:22:43 +0000317 unsigned char msglen[8];
318
319 high = ( ctx->total[0] >> 29 )
320 | ( ctx->total[1] << 3 );
321 low = ( ctx->total[0] << 3 );
322
Paul Bakker5c2364c2012-10-01 14:41:15 +0000323 PUT_UINT32_BE( high, msglen, 0 );
324 PUT_UINT32_BE( low, msglen, 4 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000325
326 last = ctx->total[0] & 0x3F;
327 padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
328
Paul Bakker3c2122f2013-06-24 19:03:14 +0200329 sha1_update( ctx, sha1_padding, padn );
Paul Bakker5121ce52009-01-03 21:22:43 +0000330 sha1_update( ctx, msglen, 8 );
331
Paul Bakker5c2364c2012-10-01 14:41:15 +0000332 PUT_UINT32_BE( ctx->state[0], output, 0 );
333 PUT_UINT32_BE( ctx->state[1], output, 4 );
334 PUT_UINT32_BE( ctx->state[2], output, 8 );
335 PUT_UINT32_BE( ctx->state[3], output, 12 );
336 PUT_UINT32_BE( ctx->state[4], output, 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000337}
338
Paul Bakker90995b52013-06-24 19:20:35 +0200339#endif /* !POLARSSL_SHA1_ALT */
340
Paul Bakker5121ce52009-01-03 21:22:43 +0000341/*
342 * output = SHA-1( input buffer )
343 */
Paul Bakker23986e52011-04-24 08:57:21 +0000344void sha1( const unsigned char *input, size_t ilen, unsigned char output[20] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000345{
346 sha1_context ctx;
347
Paul Bakker5b4af392014-06-26 12:09:34 +0200348 sha1_init( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +0000349 sha1_starts( &ctx );
350 sha1_update( &ctx, input, ilen );
351 sha1_finish( &ctx, output );
Paul Bakker5b4af392014-06-26 12:09:34 +0200352 sha1_free( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +0000353}
354
Paul Bakker335db3f2011-04-25 15:28:35 +0000355#if defined(POLARSSL_FS_IO)
Paul Bakker5121ce52009-01-03 21:22:43 +0000356/*
357 * output = SHA-1( file contents )
358 */
Paul Bakkerff60ee62010-03-16 21:09:09 +0000359int sha1_file( const char *path, unsigned char output[20] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000360{
361 FILE *f;
362 size_t n;
363 sha1_context ctx;
364 unsigned char buf[1024];
365
366 if( ( f = fopen( path, "rb" ) ) == NULL )
Paul Bakker69e095c2011-12-10 21:55:01 +0000367 return( POLARSSL_ERR_SHA1_FILE_IO_ERROR );
Paul Bakker5121ce52009-01-03 21:22:43 +0000368
Paul Bakker5b4af392014-06-26 12:09:34 +0200369 sha1_init( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +0000370 sha1_starts( &ctx );
371
372 while( ( n = fread( buf, 1, sizeof( buf ), f ) ) > 0 )
Paul Bakker27fdf462011-06-09 13:55:13 +0000373 sha1_update( &ctx, buf, n );
Paul Bakker5121ce52009-01-03 21:22:43 +0000374
375 sha1_finish( &ctx, output );
Paul Bakker5b4af392014-06-26 12:09:34 +0200376 sha1_free( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +0000377
378 if( ferror( f ) != 0 )
379 {
380 fclose( f );
Paul Bakker69e095c2011-12-10 21:55:01 +0000381 return( POLARSSL_ERR_SHA1_FILE_IO_ERROR );
Paul Bakker5121ce52009-01-03 21:22:43 +0000382 }
383
384 fclose( f );
385 return( 0 );
386}
Paul Bakker335db3f2011-04-25 15:28:35 +0000387#endif /* POLARSSL_FS_IO */
Paul Bakker5121ce52009-01-03 21:22:43 +0000388
389/*
390 * SHA-1 HMAC context setup
391 */
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200392void sha1_hmac_starts( sha1_context *ctx, const unsigned char *key,
393 size_t keylen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000394{
Paul Bakker23986e52011-04-24 08:57:21 +0000395 size_t i;
Paul Bakker5121ce52009-01-03 21:22:43 +0000396 unsigned char sum[20];
397
398 if( keylen > 64 )
399 {
400 sha1( key, keylen, sum );
401 keylen = 20;
402 key = sum;
403 }
404
405 memset( ctx->ipad, 0x36, 64 );
406 memset( ctx->opad, 0x5C, 64 );
407
408 for( i = 0; i < keylen; i++ )
409 {
410 ctx->ipad[i] = (unsigned char)( ctx->ipad[i] ^ key[i] );
411 ctx->opad[i] = (unsigned char)( ctx->opad[i] ^ key[i] );
412 }
413
414 sha1_starts( ctx );
415 sha1_update( ctx, ctx->ipad, 64 );
416
Paul Bakker34617722014-06-13 17:20:13 +0200417 polarssl_zeroize( sum, sizeof( sum ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000418}
419
420/*
421 * SHA-1 HMAC process buffer
422 */
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200423void sha1_hmac_update( sha1_context *ctx, const unsigned char *input,
424 size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000425{
426 sha1_update( ctx, input, ilen );
427}
428
429/*
430 * SHA-1 HMAC final digest
431 */
432void sha1_hmac_finish( sha1_context *ctx, unsigned char output[20] )
433{
434 unsigned char tmpbuf[20];
435
436 sha1_finish( ctx, tmpbuf );
437 sha1_starts( ctx );
438 sha1_update( ctx, ctx->opad, 64 );
439 sha1_update( ctx, tmpbuf, 20 );
440 sha1_finish( ctx, output );
441
Paul Bakker34617722014-06-13 17:20:13 +0200442 polarssl_zeroize( tmpbuf, sizeof( tmpbuf ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000443}
444
445/*
Paul Bakker7d3b6612010-03-21 16:23:13 +0000446 * SHA1 HMAC context reset
447 */
448void sha1_hmac_reset( sha1_context *ctx )
449{
450 sha1_starts( ctx );
451 sha1_update( ctx, ctx->ipad, 64 );
452}
453
454/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000455 * output = HMAC-SHA-1( hmac key, input buffer )
456 */
Paul Bakker23986e52011-04-24 08:57:21 +0000457void sha1_hmac( const unsigned char *key, size_t keylen,
458 const unsigned char *input, size_t ilen,
Paul Bakker5121ce52009-01-03 21:22:43 +0000459 unsigned char output[20] )
460{
461 sha1_context ctx;
462
Paul Bakker5b4af392014-06-26 12:09:34 +0200463 sha1_init( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +0000464 sha1_hmac_starts( &ctx, key, keylen );
465 sha1_hmac_update( &ctx, input, ilen );
466 sha1_hmac_finish( &ctx, output );
Paul Bakker5b4af392014-06-26 12:09:34 +0200467 sha1_free( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +0000468}
469
Paul Bakker40e46942009-01-03 21:51:57 +0000470#if defined(POLARSSL_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000471/*
472 * FIPS-180-1 test vectors
473 */
Paul Bakker9af723c2014-05-01 13:03:14 +0200474static unsigned char sha1_test_buf[3][57] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000475{
476 { "abc" },
477 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
478 { "" }
479};
480
481static const int sha1_test_buflen[3] =
482{
483 3, 56, 1000
484};
485
486static const unsigned char sha1_test_sum[3][20] =
487{
488 { 0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, 0xBA, 0x3E,
489 0x25, 0x71, 0x78, 0x50, 0xC2, 0x6C, 0x9C, 0xD0, 0xD8, 0x9D },
490 { 0x84, 0x98, 0x3E, 0x44, 0x1C, 0x3B, 0xD2, 0x6E, 0xBA, 0xAE,
491 0x4A, 0xA1, 0xF9, 0x51, 0x29, 0xE5, 0xE5, 0x46, 0x70, 0xF1 },
492 { 0x34, 0xAA, 0x97, 0x3C, 0xD4, 0xC4, 0xDA, 0xA4, 0xF6, 0x1E,
493 0xEB, 0x2B, 0xDB, 0xAD, 0x27, 0x31, 0x65, 0x34, 0x01, 0x6F }
494};
495
496/*
497 * RFC 2202 test vectors
498 */
499static unsigned char sha1_hmac_test_key[7][26] =
500{
501 { "\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B"
502 "\x0B\x0B\x0B\x0B" },
503 { "Jefe" },
504 { "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
505 "\xAA\xAA\xAA\xAA" },
506 { "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10"
507 "\x11\x12\x13\x14\x15\x16\x17\x18\x19" },
508 { "\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C"
509 "\x0C\x0C\x0C\x0C" },
510 { "" }, /* 0xAA 80 times */
511 { "" }
512};
513
514static const int sha1_hmac_test_keylen[7] =
515{
516 20, 4, 20, 25, 20, 80, 80
517};
518
519static unsigned char sha1_hmac_test_buf[7][74] =
520{
521 { "Hi There" },
522 { "what do ya want for nothing?" },
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 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
527 "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD" },
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 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
532 "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD" },
533 { "Test With Truncation" },
534 { "Test Using Larger Than Block-Size Key - Hash Key First" },
535 { "Test Using Larger Than Block-Size Key and Larger"
536 " Than One Block-Size Data" }
537};
538
539static const int sha1_hmac_test_buflen[7] =
540{
541 8, 28, 50, 50, 20, 54, 73
542};
543
544static const unsigned char sha1_hmac_test_sum[7][20] =
545{
546 { 0xB6, 0x17, 0x31, 0x86, 0x55, 0x05, 0x72, 0x64, 0xE2, 0x8B,
547 0xC0, 0xB6, 0xFB, 0x37, 0x8C, 0x8E, 0xF1, 0x46, 0xBE, 0x00 },
548 { 0xEF, 0xFC, 0xDF, 0x6A, 0xE5, 0xEB, 0x2F, 0xA2, 0xD2, 0x74,
549 0x16, 0xD5, 0xF1, 0x84, 0xDF, 0x9C, 0x25, 0x9A, 0x7C, 0x79 },
550 { 0x12, 0x5D, 0x73, 0x42, 0xB9, 0xAC, 0x11, 0xCD, 0x91, 0xA3,
551 0x9A, 0xF4, 0x8A, 0xA1, 0x7B, 0x4F, 0x63, 0xF1, 0x75, 0xD3 },
552 { 0x4C, 0x90, 0x07, 0xF4, 0x02, 0x62, 0x50, 0xC6, 0xBC, 0x84,
553 0x14, 0xF9, 0xBF, 0x50, 0xC8, 0x6C, 0x2D, 0x72, 0x35, 0xDA },
554 { 0x4C, 0x1A, 0x03, 0x42, 0x4B, 0x55, 0xE0, 0x7F, 0xE7, 0xF2,
555 0x7B, 0xE1 },
556 { 0xAA, 0x4A, 0xE5, 0xE1, 0x52, 0x72, 0xD0, 0x0E, 0x95, 0x70,
557 0x56, 0x37, 0xCE, 0x8A, 0x3B, 0x55, 0xED, 0x40, 0x21, 0x12 },
558 { 0xE8, 0xE9, 0x9D, 0x0F, 0x45, 0x23, 0x7D, 0x78, 0x6D, 0x6B,
559 0xBA, 0xA7, 0x96, 0x5C, 0x78, 0x08, 0xBB, 0xFF, 0x1A, 0x91 }
560};
561
562/*
563 * Checkup routine
564 */
565int sha1_self_test( int verbose )
566{
Paul Bakker5b4af392014-06-26 12:09:34 +0200567 int i, j, buflen, ret = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000568 unsigned char buf[1024];
569 unsigned char sha1sum[20];
570 sha1_context ctx;
571
Paul Bakker5b4af392014-06-26 12:09:34 +0200572 sha1_init( &ctx );
573
Paul Bakker5121ce52009-01-03 21:22:43 +0000574 /*
575 * SHA-1
576 */
577 for( i = 0; i < 3; i++ )
578 {
579 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100580 polarssl_printf( " SHA-1 test #%d: ", i + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000581
582 sha1_starts( &ctx );
583
584 if( i == 2 )
585 {
586 memset( buf, 'a', buflen = 1000 );
587
588 for( j = 0; j < 1000; j++ )
589 sha1_update( &ctx, buf, buflen );
590 }
591 else
592 sha1_update( &ctx, sha1_test_buf[i],
593 sha1_test_buflen[i] );
594
595 sha1_finish( &ctx, sha1sum );
596
597 if( memcmp( sha1sum, sha1_test_sum[i], 20 ) != 0 )
598 {
599 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100600 polarssl_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000601
Paul Bakker5b4af392014-06-26 12:09:34 +0200602 ret = 1;
603 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +0000604 }
605
606 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100607 polarssl_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000608 }
609
610 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100611 polarssl_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000612
613 for( i = 0; i < 7; i++ )
614 {
615 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100616 polarssl_printf( " HMAC-SHA-1 test #%d: ", i + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000617
618 if( i == 5 || i == 6 )
619 {
620 memset( buf, '\xAA', buflen = 80 );
621 sha1_hmac_starts( &ctx, buf, buflen );
622 }
623 else
624 sha1_hmac_starts( &ctx, sha1_hmac_test_key[i],
625 sha1_hmac_test_keylen[i] );
626
627 sha1_hmac_update( &ctx, sha1_hmac_test_buf[i],
628 sha1_hmac_test_buflen[i] );
629
630 sha1_hmac_finish( &ctx, sha1sum );
631
632 buflen = ( i == 4 ) ? 12 : 20;
633
634 if( memcmp( sha1sum, sha1_hmac_test_sum[i], buflen ) != 0 )
635 {
636 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100637 polarssl_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000638
Paul Bakker5b4af392014-06-26 12:09:34 +0200639 ret = 1;
640 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +0000641 }
642
643 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100644 polarssl_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000645 }
646
647 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100648 polarssl_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000649
Paul Bakker5b4af392014-06-26 12:09:34 +0200650exit:
651 sha1_free( &ctx );
652
653 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000654}
655
Paul Bakker9af723c2014-05-01 13:03:14 +0200656#endif /* POLARSSL_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000657
Paul Bakker9af723c2014-05-01 13:03:14 +0200658#endif /* POLARSSL_SHA1_C */