1 /* 2 * Heiko Schocher, DENX Software Engineering, hs@denx.de. 3 * based on: 4 * FIPS-180-1 compliant SHA-1 implementation 5 * 6 * Copyright (C) 2003-2006 Christophe Devine 7 * 8 * This library is free software; you can redistribute it and/or 9 * modify it under the terms of the GNU Lesser General Public 10 * License, version 2.1 as published by the Free Software Foundation. 11 * 12 * This library is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with this library; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 20 * 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 28 #ifndef _CRT_SECURE_NO_DEPRECATE 29 #define _CRT_SECURE_NO_DEPRECATE 1 30 #endif 31 32 #ifndef USE_HOSTCC 33 #include <common.h> 34 #include <linux/string.h> 35 #else 36 #include <string.h> 37 #endif /* USE_HOSTCC */ 38 #include <watchdog.h> 39 #include <u-boot/sha1.h> 40 41 /* 42 * 32-bit integer manipulation macros (big endian) 43 */ 44 #ifndef GET_UINT32_BE 45 #define GET_UINT32_BE(n,b,i) { \ 46 (n) = ( (unsigned long) (b)[(i) ] << 24 ) \ 47 | ( (unsigned long) (b)[(i) + 1] << 16 ) \ 48 | ( (unsigned long) (b)[(i) + 2] << 8 ) \ 49 | ( (unsigned long) (b)[(i) + 3] ); \ 50 } 51 #endif 52 #ifndef PUT_UINT32_BE 53 #define PUT_UINT32_BE(n,b,i) { \ 54 (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \ 55 (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \ 56 (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \ 57 (b)[(i) + 3] = (unsigned char) ( (n) ); \ 58 } 59 #endif 60 61 /* 62 * SHA-1 context setup 63 */ 64 void sha1_starts (sha1_context * ctx) 65 { 66 ctx->total[0] = 0; 67 ctx->total[1] = 0; 68 69 ctx->state[0] = 0x67452301; 70 ctx->state[1] = 0xEFCDAB89; 71 ctx->state[2] = 0x98BADCFE; 72 ctx->state[3] = 0x10325476; 73 ctx->state[4] = 0xC3D2E1F0; 74 } 75 76 static void sha1_process(sha1_context *ctx, const unsigned char data[64]) 77 { 78 unsigned long temp, W[16], A, B, C, D, E; 79 80 GET_UINT32_BE (W[0], data, 0); 81 GET_UINT32_BE (W[1], data, 4); 82 GET_UINT32_BE (W[2], data, 8); 83 GET_UINT32_BE (W[3], data, 12); 84 GET_UINT32_BE (W[4], data, 16); 85 GET_UINT32_BE (W[5], data, 20); 86 GET_UINT32_BE (W[6], data, 24); 87 GET_UINT32_BE (W[7], data, 28); 88 GET_UINT32_BE (W[8], data, 32); 89 GET_UINT32_BE (W[9], data, 36); 90 GET_UINT32_BE (W[10], data, 40); 91 GET_UINT32_BE (W[11], data, 44); 92 GET_UINT32_BE (W[12], data, 48); 93 GET_UINT32_BE (W[13], data, 52); 94 GET_UINT32_BE (W[14], data, 56); 95 GET_UINT32_BE (W[15], data, 60); 96 97 #define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n))) 98 99 #define R(t) ( \ 100 temp = W[(t - 3) & 0x0F] ^ W[(t - 8) & 0x0F] ^ \ 101 W[(t - 14) & 0x0F] ^ W[ t & 0x0F], \ 102 ( W[t & 0x0F] = S(temp,1) ) \ 103 ) 104 105 #define P(a,b,c,d,e,x) { \ 106 e += S(a,5) + F(b,c,d) + K + x; b = S(b,30); \ 107 } 108 109 A = ctx->state[0]; 110 B = ctx->state[1]; 111 C = ctx->state[2]; 112 D = ctx->state[3]; 113 E = ctx->state[4]; 114 115 #define F(x,y,z) (z ^ (x & (y ^ z))) 116 #define K 0x5A827999 117 118 P (A, B, C, D, E, W[0]); 119 P (E, A, B, C, D, W[1]); 120 P (D, E, A, B, C, W[2]); 121 P (C, D, E, A, B, W[3]); 122 P (B, C, D, E, A, W[4]); 123 P (A, B, C, D, E, W[5]); 124 P (E, A, B, C, D, W[6]); 125 P (D, E, A, B, C, W[7]); 126 P (C, D, E, A, B, W[8]); 127 P (B, C, D, E, A, W[9]); 128 P (A, B, C, D, E, W[10]); 129 P (E, A, B, C, D, W[11]); 130 P (D, E, A, B, C, W[12]); 131 P (C, D, E, A, B, W[13]); 132 P (B, C, D, E, A, W[14]); 133 P (A, B, C, D, E, W[15]); 134 P (E, A, B, C, D, R (16)); 135 P (D, E, A, B, C, R (17)); 136 P (C, D, E, A, B, R (18)); 137 P (B, C, D, E, A, R (19)); 138 139 #undef K 140 #undef F 141 142 #define F(x,y,z) (x ^ y ^ z) 143 #define K 0x6ED9EBA1 144 145 P (A, B, C, D, E, R (20)); 146 P (E, A, B, C, D, R (21)); 147 P (D, E, A, B, C, R (22)); 148 P (C, D, E, A, B, R (23)); 149 P (B, C, D, E, A, R (24)); 150 P (A, B, C, D, E, R (25)); 151 P (E, A, B, C, D, R (26)); 152 P (D, E, A, B, C, R (27)); 153 P (C, D, E, A, B, R (28)); 154 P (B, C, D, E, A, R (29)); 155 P (A, B, C, D, E, R (30)); 156 P (E, A, B, C, D, R (31)); 157 P (D, E, A, B, C, R (32)); 158 P (C, D, E, A, B, R (33)); 159 P (B, C, D, E, A, R (34)); 160 P (A, B, C, D, E, R (35)); 161 P (E, A, B, C, D, R (36)); 162 P (D, E, A, B, C, R (37)); 163 P (C, D, E, A, B, R (38)); 164 P (B, C, D, E, A, R (39)); 165 166 #undef K 167 #undef F 168 169 #define F(x,y,z) ((x & y) | (z & (x | y))) 170 #define K 0x8F1BBCDC 171 172 P (A, B, C, D, E, R (40)); 173 P (E, A, B, C, D, R (41)); 174 P (D, E, A, B, C, R (42)); 175 P (C, D, E, A, B, R (43)); 176 P (B, C, D, E, A, R (44)); 177 P (A, B, C, D, E, R (45)); 178 P (E, A, B, C, D, R (46)); 179 P (D, E, A, B, C, R (47)); 180 P (C, D, E, A, B, R (48)); 181 P (B, C, D, E, A, R (49)); 182 P (A, B, C, D, E, R (50)); 183 P (E, A, B, C, D, R (51)); 184 P (D, E, A, B, C, R (52)); 185 P (C, D, E, A, B, R (53)); 186 P (B, C, D, E, A, R (54)); 187 P (A, B, C, D, E, R (55)); 188 P (E, A, B, C, D, R (56)); 189 P (D, E, A, B, C, R (57)); 190 P (C, D, E, A, B, R (58)); 191 P (B, C, D, E, A, R (59)); 192 193 #undef K 194 #undef F 195 196 #define F(x,y,z) (x ^ y ^ z) 197 #define K 0xCA62C1D6 198 199 P (A, B, C, D, E, R (60)); 200 P (E, A, B, C, D, R (61)); 201 P (D, E, A, B, C, R (62)); 202 P (C, D, E, A, B, R (63)); 203 P (B, C, D, E, A, R (64)); 204 P (A, B, C, D, E, R (65)); 205 P (E, A, B, C, D, R (66)); 206 P (D, E, A, B, C, R (67)); 207 P (C, D, E, A, B, R (68)); 208 P (B, C, D, E, A, R (69)); 209 P (A, B, C, D, E, R (70)); 210 P (E, A, B, C, D, R (71)); 211 P (D, E, A, B, C, R (72)); 212 P (C, D, E, A, B, R (73)); 213 P (B, C, D, E, A, R (74)); 214 P (A, B, C, D, E, R (75)); 215 P (E, A, B, C, D, R (76)); 216 P (D, E, A, B, C, R (77)); 217 P (C, D, E, A, B, R (78)); 218 P (B, C, D, E, A, R (79)); 219 220 #undef K 221 #undef F 222 223 ctx->state[0] += A; 224 ctx->state[1] += B; 225 ctx->state[2] += C; 226 ctx->state[3] += D; 227 ctx->state[4] += E; 228 } 229 230 /* 231 * SHA-1 process buffer 232 */ 233 void sha1_update(sha1_context *ctx, const unsigned char *input, 234 unsigned int ilen) 235 { 236 int fill; 237 unsigned long left; 238 239 if (ilen <= 0) 240 return; 241 242 left = ctx->total[0] & 0x3F; 243 fill = 64 - left; 244 245 ctx->total[0] += ilen; 246 ctx->total[0] &= 0xFFFFFFFF; 247 248 if (ctx->total[0] < (unsigned long) ilen) 249 ctx->total[1]++; 250 251 if (left && ilen >= fill) { 252 memcpy ((void *) (ctx->buffer + left), (void *) input, fill); 253 sha1_process (ctx, ctx->buffer); 254 input += fill; 255 ilen -= fill; 256 left = 0; 257 } 258 259 while (ilen >= 64) { 260 sha1_process (ctx, input); 261 input += 64; 262 ilen -= 64; 263 } 264 265 if (ilen > 0) { 266 memcpy ((void *) (ctx->buffer + left), (void *) input, ilen); 267 } 268 } 269 270 static const unsigned char sha1_padding[64] = { 271 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 272 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 273 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 274 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 275 }; 276 277 /* 278 * SHA-1 final digest 279 */ 280 void sha1_finish (sha1_context * ctx, unsigned char output[20]) 281 { 282 unsigned long last, padn; 283 unsigned long high, low; 284 unsigned char msglen[8]; 285 286 high = (ctx->total[0] >> 29) 287 | (ctx->total[1] << 3); 288 low = (ctx->total[0] << 3); 289 290 PUT_UINT32_BE (high, msglen, 0); 291 PUT_UINT32_BE (low, msglen, 4); 292 293 last = ctx->total[0] & 0x3F; 294 padn = (last < 56) ? (56 - last) : (120 - last); 295 296 sha1_update (ctx, (unsigned char *) sha1_padding, padn); 297 sha1_update (ctx, msglen, 8); 298 299 PUT_UINT32_BE (ctx->state[0], output, 0); 300 PUT_UINT32_BE (ctx->state[1], output, 4); 301 PUT_UINT32_BE (ctx->state[2], output, 8); 302 PUT_UINT32_BE (ctx->state[3], output, 12); 303 PUT_UINT32_BE (ctx->state[4], output, 16); 304 } 305 306 /* 307 * Output = SHA-1( input buffer ) 308 */ 309 void sha1_csum(const unsigned char *input, unsigned int ilen, 310 unsigned char *output) 311 { 312 sha1_context ctx; 313 314 sha1_starts (&ctx); 315 sha1_update (&ctx, input, ilen); 316 sha1_finish (&ctx, output); 317 } 318 319 /* 320 * Output = SHA-1( input buffer ). Trigger the watchdog every 'chunk_sz' 321 * bytes of input processed. 322 */ 323 void sha1_csum_wd(const unsigned char *input, unsigned int ilen, 324 unsigned char *output, unsigned int chunk_sz) 325 { 326 sha1_context ctx; 327 #if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG) 328 const unsigned char *end, *curr; 329 int chunk; 330 #endif 331 332 sha1_starts (&ctx); 333 334 #if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG) 335 curr = input; 336 end = input + ilen; 337 while (curr < end) { 338 chunk = end - curr; 339 if (chunk > chunk_sz) 340 chunk = chunk_sz; 341 sha1_update (&ctx, curr, chunk); 342 curr += chunk; 343 WATCHDOG_RESET (); 344 } 345 #else 346 sha1_update (&ctx, input, ilen); 347 #endif 348 349 sha1_finish (&ctx, output); 350 } 351 352 /* 353 * Output = HMAC-SHA-1( input buffer, hmac key ) 354 */ 355 void sha1_hmac(const unsigned char *key, int keylen, 356 const unsigned char *input, unsigned int ilen, 357 unsigned char *output) 358 { 359 int i; 360 sha1_context ctx; 361 unsigned char k_ipad[64]; 362 unsigned char k_opad[64]; 363 unsigned char tmpbuf[20]; 364 365 memset (k_ipad, 0x36, 64); 366 memset (k_opad, 0x5C, 64); 367 368 for (i = 0; i < keylen; i++) { 369 if (i >= 64) 370 break; 371 372 k_ipad[i] ^= key[i]; 373 k_opad[i] ^= key[i]; 374 } 375 376 sha1_starts (&ctx); 377 sha1_update (&ctx, k_ipad, 64); 378 sha1_update (&ctx, input, ilen); 379 sha1_finish (&ctx, tmpbuf); 380 381 sha1_starts (&ctx); 382 sha1_update (&ctx, k_opad, 64); 383 sha1_update (&ctx, tmpbuf, 20); 384 sha1_finish (&ctx, output); 385 386 memset (k_ipad, 0, 64); 387 memset (k_opad, 0, 64); 388 memset (tmpbuf, 0, 20); 389 memset (&ctx, 0, sizeof (sha1_context)); 390 } 391 392 static const char _sha1_src[] = "_sha1_src"; 393 394 #ifdef SELF_TEST 395 /* 396 * FIPS-180-1 test vectors 397 */ 398 static const char sha1_test_str[3][57] = { 399 {"abc"}, 400 {"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"}, 401 {""} 402 }; 403 404 static const unsigned char sha1_test_sum[3][20] = { 405 {0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, 0xBA, 0x3E, 406 0x25, 0x71, 0x78, 0x50, 0xC2, 0x6C, 0x9C, 0xD0, 0xD8, 0x9D}, 407 {0x84, 0x98, 0x3E, 0x44, 0x1C, 0x3B, 0xD2, 0x6E, 0xBA, 0xAE, 408 0x4A, 0xA1, 0xF9, 0x51, 0x29, 0xE5, 0xE5, 0x46, 0x70, 0xF1}, 409 {0x34, 0xAA, 0x97, 0x3C, 0xD4, 0xC4, 0xDA, 0xA4, 0xF6, 0x1E, 410 0xEB, 0x2B, 0xDB, 0xAD, 0x27, 0x31, 0x65, 0x34, 0x01, 0x6F} 411 }; 412 413 /* 414 * Checkup routine 415 */ 416 int sha1_self_test (void) 417 { 418 int i, j; 419 unsigned char buf[1000]; 420 unsigned char sha1sum[20]; 421 sha1_context ctx; 422 423 for (i = 0; i < 3; i++) { 424 printf (" SHA-1 test #%d: ", i + 1); 425 426 sha1_starts (&ctx); 427 428 if (i < 2) 429 sha1_update (&ctx, (unsigned char *) sha1_test_str[i], 430 strlen (sha1_test_str[i])); 431 else { 432 memset (buf, 'a', 1000); 433 for (j = 0; j < 1000; j++) 434 sha1_update (&ctx, buf, 1000); 435 } 436 437 sha1_finish (&ctx, sha1sum); 438 439 if (memcmp (sha1sum, sha1_test_sum[i], 20) != 0) { 440 printf ("failed\n"); 441 return (1); 442 } 443 444 printf ("passed\n"); 445 } 446 447 printf ("\n"); 448 return (0); 449 } 450 #else 451 int sha1_self_test (void) 452 { 453 return (0); 454 } 455 #endif 456