NetTribute library with debug turned on in FShandler Donatien Garner -> Segundo Equipo -> this version

Committer:
hexley
Date:
Fri Nov 19 01:54:45 2010 +0000
Revision:
0:281d6ff68967

        

Who changed what in which revision?

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