Used in Live Traffic Update Nokia LCD Display Project

Fork of NetServices by Segundo Equipo

Committer:
rrajan8
Date:
Wed Mar 06 19:07:23 2013 +0000
Revision:
8:92b57208ab99
Parent:
0:ac1725ba162c
This project utilizes mbed's networking features to display live traffic updates on the Nokia LCD using the MapQuest API's Traffic Web Service.

Who changed what in which revision?

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