1 /* 2 * SHA1 hash implementation and interface functions 3 * Copyright (c) 2003-2005, Jouni Malinen <j (at) w1.fi> 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License version 2 as 7 * published by the Free Software Foundation. 8 * 9 * Alternatively, this software may be distributed under the terms of BSD 10 * license. 11 * 12 * See README and COPYING for more details. 13 */ 14 15 #include "includes.h" 16 17 #include "common.h" 18 #include "sha1.h" 19 #include "md5.h" 20 #include "crypto.h" 21 22 23 /** 24 * hmac_sha1_vector - HMAC-SHA1 over data vector (RFC 2104) 25 * @key: Key for HMAC operations 26 * @key_len: Length of the key in bytes 27 * @num_elem: Number of elements in the data vector 28 * @addr: Pointers to the data areas 29 * @len: Lengths of the data blocks 30 * @mac: Buffer for the hash (20 bytes) 31 */ 32 void hmac_sha1_vector(const u8 *key, size_t key_len, size_t num_elem, 33 const u8 *addr[], const size_t *len, u8 *mac) 34 { 35 unsigned char k_pad[64]; /* padding - key XORd with ipad/opad */ 36 unsigned char tk[20]; 37 const u8 *_addr[6]; 38 size_t _len[6], i; 39 40 if (num_elem > 5) { 41 /* 42 * Fixed limit on the number of fragments to avoid having to 43 * allocate memory (which could fail). 44 */ 45 return; 46 } 47 48 /* if key is longer than 64 bytes reset it to key = SHA1(key) */ 49 if (key_len > 64) { 50 sha1_vector(1, &key, &key_len, tk); 51 key = tk; 52 key_len = 20; 53 } 54 55 /* the HMAC_SHA1 transform looks like: 56 * 57 * SHA1(K XOR opad, SHA1(K XOR ipad, text)) 58 * 59 * where K is an n byte key 60 * ipad is the byte 0x36 repeated 64 times 61 * opad is the byte 0x5c repeated 64 times 62 * and text is the data being protected */ 63 64 /* start out by storing key in ipad */ 65 os_memset(k_pad, 0, sizeof(k_pad)); 66 os_memcpy(k_pad, key, key_len); 67 /* XOR key with ipad values */ 68 for (i = 0; i < 64; i++) 69 k_pad[i] ^= 0x36; 70 71 /* perform inner SHA1 */ 72 _addr[0] = k_pad; 73 _len[0] = 64; 74 for (i = 0; i < num_elem; i++) { 75 _addr[i + 1] = addr[i]; 76 _len[i + 1] = len[i]; 77 } 78 sha1_vector(1 + num_elem, _addr, _len, mac); 79 80 os_memset(k_pad, 0, sizeof(k_pad)); 81 os_memcpy(k_pad, key, key_len); 82 /* XOR key with opad values */ 83 for (i = 0; i < 64; i++) 84 k_pad[i] ^= 0x5c; 85 86 /* perform outer SHA1 */ 87 _addr[0] = k_pad; 88 _len[0] = 64; 89 _addr[1] = mac; 90 _len[1] = SHA1_MAC_LEN; 91 sha1_vector(2, _addr, _len, mac); 92 } 93 94 95 /** 96 * hmac_sha1 - HMAC-SHA1 over data buffer (RFC 2104) 97 * @key: Key for HMAC operations 98 * @key_len: Length of the key in bytes 99 * @data: Pointers to the data area 100 * @data_len: Length of the data area 101 * @mac: Buffer for the hash (20 bytes) 102 */ 103 void hmac_sha1(const u8 *key, size_t key_len, const u8 *data, size_t data_len, 104 u8 *mac) 105 { 106 hmac_sha1_vector(key, key_len, 1, &data, &data_len, mac); 107 } 108 109 110 /** 111 * sha1_prf - SHA1-based Pseudo-Random Function (PRF) (IEEE 802.11i, 8.5.1.1) 112 * @key: Key for PRF 113 * @key_len: Length of the key in bytes 114 * @label: A unique label for each purpose of the PRF 115 * @data: Extra data to bind into the key 116 * @data_len: Length of the data 117 * @buf: Buffer for the generated pseudo-random key 118 * @buf_len: Number of bytes of key to generate 119 * 120 * This function is used to derive new, cryptographically separate keys from a 121 * given key (e.g., PMK in IEEE 802.11i). 122 */ 123 void sha1_prf(const u8 *key, size_t key_len, const char *label, 124 const u8 *data, size_t data_len, u8 *buf, size_t buf_len) 125 { 126 u8 zero = 0, counter = 0; 127 size_t pos, plen; 128 u8 hash[SHA1_MAC_LEN]; 129 size_t label_len = os_strlen(label); 130 const unsigned char *addr[4]; 131 size_t len[4]; 132 133 addr[0] = (u8 *) label; 134 len[0] = label_len; 135 addr[1] = &zero; 136 len[1] = 1; 137 addr[2] = data; 138 len[2] = data_len; 139 addr[3] = &counter; 140 len[3] = 1; 141 142 pos = 0; 143 while (pos < buf_len) { 144 plen = buf_len - pos; 145 if (plen >= SHA1_MAC_LEN) { 146 hmac_sha1_vector(key, key_len, 4, addr, len, 147 &buf[pos]); 148 pos += SHA1_MAC_LEN; 149 } else { 150 hmac_sha1_vector(key, key_len, 4, addr, len, 151 hash); 152 os_memcpy(&buf[pos], hash, plen); 153 break; 154 } 155 counter++; 156 } 157 } 158 159 160 /** 161 * sha1_t_prf - EAP-FAST Pseudo-Random Function (T-PRF) 162 * @key: Key for PRF 163 * @key_len: Length of the key in bytes 164 * @label: A unique label for each purpose of the PRF 165 * @seed: Seed value to bind into the key 166 * @seed_len: Length of the seed 167 * @buf: Buffer for the generated pseudo-random key 168 * @buf_len: Number of bytes of key to generate 169 * 170 * This function is used to derive new, cryptographically separate keys from a 171 * given key for EAP-FAST. T-PRF is defined in 172 * draft-cam-winget-eap-fast-02.txt, Appendix B. 173 */ 174 void sha1_t_prf(const u8 *key, size_t key_len, const char *label, 175 const u8 *seed, size_t seed_len, u8 *buf, size_t buf_len) 176 { 177 unsigned char counter = 0; 178 size_t pos, plen; 179 u8 hash[SHA1_MAC_LEN]; 180 size_t label_len = os_strlen(label); 181 u8 output_len[2]; 182 const unsigned char *addr[5]; 183 size_t len[5]; 184 185 addr[0] = hash; 186 len[0] = 0; 187 addr[1] = (unsigned char *) label; 188 len[1] = label_len + 1; 189 addr[2] = seed; 190 len[2] = seed_len; 191 addr[3] = output_len; 192 len[3] = 2; 193 addr[4] = &counter; 194 len[4] = 1; 195 196 output_len[0] = (buf_len >> 8) & 0xff; 197 output_len[1] = buf_len & 0xff; 198 pos = 0; 199 while (pos < buf_len) { 200 counter++; 201 plen = buf_len - pos; 202 hmac_sha1_vector(key, key_len, 5, addr, len, hash); 203 if (plen >= SHA1_MAC_LEN) { 204 os_memcpy(&buf[pos], hash, SHA1_MAC_LEN); 205 pos += SHA1_MAC_LEN; 206 } else { 207 os_memcpy(&buf[pos], hash, plen); 208 break; 209 } 210 len[0] = SHA1_MAC_LEN; 211 } 212 } 213 214 215 /** 216 * tls_prf - Pseudo-Random Function for TLS (TLS-PRF, RFC 2246) 217 * @secret: Key for PRF 218 * @secret_len: Length of the key in bytes 219 * @label: A unique label for each purpose of the PRF 220 * @seed: Seed value to bind into the key 221 * @seed_len: Length of the seed 222 * @out: Buffer for the generated pseudo-random key 223 * @outlen: Number of bytes of key to generate 224 * Returns: 0 on success, -1 on failure. 225 * 226 * This function is used to derive new, cryptographically separate keys from a 227 * given key in TLS. This PRF is defined in RFC 2246, Chapter 5. 228 */ 229 int tls_prf(const u8 *secret, size_t secret_len, const char *label, 230 const u8 *seed, size_t seed_len, u8 *out, size_t outlen) 231 { 232 size_t L_S1, L_S2, i; 233 const u8 *S1, *S2; 234 u8 A_MD5[MD5_MAC_LEN], A_SHA1[SHA1_MAC_LEN]; 235 u8 P_MD5[MD5_MAC_LEN], P_SHA1[SHA1_MAC_LEN]; 236 int MD5_pos, SHA1_pos; 237 const u8 *MD5_addr[3]; 238 size_t MD5_len[3]; 239 const unsigned char *SHA1_addr[3]; 240 size_t SHA1_len[3]; 241 242 if (secret_len & 1) 243 return -1; 244 245 MD5_addr[0] = A_MD5; 246 MD5_len[0] = MD5_MAC_LEN; 247 MD5_addr[1] = (unsigned char *) label; 248 MD5_len[1] = os_strlen(label); 249 MD5_addr[2] = seed; 250 MD5_len[2] = seed_len; 251 252 SHA1_addr[0] = A_SHA1; 253 SHA1_len[0] = SHA1_MAC_LEN; 254 SHA1_addr[1] = (unsigned char *) label; 255 SHA1_len[1] = os_strlen(label); 256 SHA1_addr[2] = seed; 257 SHA1_len[2] = seed_len; 258 259 /* RFC 2246, Chapter 5 260 * A(0) = seed, A(i) = HMAC(secret, A(i-1)) 261 * P_hash = HMAC(secret, A(1) + seed) + HMAC(secret, A(2) + seed) + .. 262 * PRF = P_MD5(S1, label + seed) XOR P_SHA-1(S2, label + seed) 263 */ 264 265 L_S1 = L_S2 = (secret_len + 1) / 2; 266 S1 = secret; 267 S2 = secret + L_S1; 268 if (secret_len & 1) { 269 /* The last byte of S1 will be shared with S2 */ 270 S2--; 271 } 272 273 hmac_md5_vector(S1, L_S1, 2, &MD5_addr[1], &MD5_len[1], A_MD5); 274 hmac_sha1_vector(S2, L_S2, 2, &SHA1_addr[1], &SHA1_len[1], A_SHA1); 275 276 MD5_pos = MD5_MAC_LEN; 277 SHA1_pos = SHA1_MAC_LEN; 278 for (i = 0; i < outlen; i++) { 279 if (MD5_pos == MD5_MAC_LEN) { 280 hmac_md5_vector(S1, L_S1, 3, MD5_addr, MD5_len, P_MD5); 281 MD5_pos = 0; 282 hmac_md5(S1, L_S1, A_MD5, MD5_MAC_LEN, A_MD5); 283 } 284 if (SHA1_pos == SHA1_MAC_LEN) { 285 hmac_sha1_vector(S2, L_S2, 3, SHA1_addr, SHA1_len, 286 P_SHA1); 287 SHA1_pos = 0; 288 hmac_sha1(S2, L_S2, A_SHA1, SHA1_MAC_LEN, A_SHA1); 289 } 290 291 out[i] = P_MD5[MD5_pos] ^ P_SHA1[SHA1_pos]; 292 293 MD5_pos++; 294 SHA1_pos++; 295 } 296 297 return 0; 298 } 299 300 301 static void pbkdf2_sha1_f(const char *passphrase, const char *ssid, 302 size_t ssid_len, int iterations, unsigned int count, 303 u8 *digest) 304 { 305 unsigned char tmp[SHA1_MAC_LEN], tmp2[SHA1_MAC_LEN]; 306 int i, j; 307 unsigned char count_buf[4]; 308 const u8 *addr[2]; 309 size_t len[2]; 310 size_t passphrase_len = os_strlen(passphrase); 311 312 addr[0] = (u8 *) ssid; 313 len[0] = ssid_len; 314 addr[1] = count_buf; 315 len[1] = 4; 316 317 /* F(P, S, c, i) = U1 xor U2 xor ... Uc 318 * U1 = PRF(P, S || i) 319 * U2 = PRF(P, U1) 320 * Uc = PRF(P, Uc-1) 321 */ 322 323 count_buf[0] = (count >> 24) & 0xff; 324 count_buf[1] = (count >> 16) & 0xff; 325 count_buf[2] = (count >> 8) & 0xff; 326 count_buf[3] = count & 0xff; 327 hmac_sha1_vector((u8 *) passphrase, passphrase_len, 2, addr, len, tmp); 328 os_memcpy(digest, tmp, SHA1_MAC_LEN); 329 330 for (i = 1; i < iterations; i++) { 331 hmac_sha1((u8 *) passphrase, passphrase_len, tmp, SHA1_MAC_LEN, 332 tmp2); 333 os_memcpy(tmp, tmp2, SHA1_MAC_LEN); 334 for (j = 0; j < SHA1_MAC_LEN; j++) 335 digest[j] ^= tmp2[j]; 336 } 337 } 338 339 340 /** 341 * pbkdf2_sha1 - SHA1-based key derivation function (PBKDF2) for IEEE 802.11i 342 * @passphrase: ASCII passphrase 343 * @ssid: SSID 344 * @ssid_len: SSID length in bytes 345 * @interations: Number of iterations to run 346 * @buf: Buffer for the generated key 347 * @buflen: Length of the buffer in bytes 348 * 349 * This function is used to derive PSK for WPA-PSK. For this protocol, 350 * iterations is set to 4096 and buflen to 32. This function is described in 351 * IEEE Std 802.11-2004, Clause H.4. The main construction is from PKCS#5 v2.0. 352 */ 353 void pbkdf2_sha1(const char *passphrase, const char *ssid, size_t ssid_len, 354 int iterations, u8 *buf, size_t buflen) 355 { 356 unsigned int count = 0; 357 unsigned char *pos = buf; 358 size_t left = buflen, plen; 359 unsigned char digest[SHA1_MAC_LEN]; 360 361 while (left > 0) { 362 count++; 363 pbkdf2_sha1_f(passphrase, ssid, ssid_len, iterations, count, 364 digest); 365 plen = left > SHA1_MAC_LEN ? SHA1_MAC_LEN : left; 366 os_memcpy(pos, digest, plen); 367 pos += plen; 368 left -= plen; 369 } 370 } 371 372 373 #ifdef INTERNAL_SHA1 374 375 struct SHA1Context { 376 u32 state[5]; 377 u32 count[2]; 378 unsigned char buffer[64]; 379 }; 380 381 typedef struct SHA1Context SHA1_CTX; 382 383 #ifndef CONFIG_CRYPTO_INTERNAL 384 static void SHA1Init(struct SHA1Context *context); 385 static void SHA1Update(struct SHA1Context *context, const void *data, u32 len); 386 static void SHA1Final(unsigned char digest[20], struct SHA1Context *context); 387 #endif /* CONFIG_CRYPTO_INTERNAL */ 388 static void SHA1Transform(u32 state[5], const unsigned char buffer[64]); 389 390 391 /** 392 * sha1_vector - SHA-1 hash for data vector 393 * @num_elem: Number of elements in the data vector 394 * @addr: Pointers to the data areas 395 * @len: Lengths of the data blocks 396 * @mac: Buffer for the hash 397 */ 398 void sha1_vector(size_t num_elem, const u8 *addr[], const size_t *len, 399 u8 *mac) 400 { 401 SHA1_CTX ctx; 402 size_t i; 403 404 SHA1Init(&ctx); 405 for (i = 0; i < num_elem; i++) 406 SHA1Update(&ctx, addr[i], len[i]); 407 SHA1Final(mac, &ctx); 408 } 409 410 411 int fips186_2_prf(const u8 *seed, size_t seed_len, u8 *x, size_t xlen) 412 { 413 u8 xkey[64]; 414 u32 t[5], _t[5]; 415 int i, j, m, k; 416 u8 *xpos = x; 417 u32 carry; 418 419 if (seed_len > sizeof(xkey)) 420 seed_len = sizeof(xkey); 421 422 /* FIPS 186-2 + change notice 1 */ 423 424 os_memcpy(xkey, seed, seed_len); 425 os_memset(xkey + seed_len, 0, 64 - seed_len); 426 t[0] = 0x67452301; 427 t[1] = 0xEFCDAB89; 428 t[2] = 0x98BADCFE; 429 t[3] = 0x10325476; 430 t[4] = 0xC3D2E1F0; 431 432 m = xlen / 40; 433 for (j = 0; j < m; j++) { 434 /* XSEED_j = 0 */ 435 for (i = 0; i < 2; i++) { 436 /* XVAL = (XKEY + XSEED_j) mod 2^b */ 437 438 /* w_i = G(t, XVAL) */ 439 os_memcpy(_t, t, 20); 440 SHA1Transform(_t, xkey); 441 _t[0] = host_to_be32(_t[0]); 442 _t[1] = host_to_be32(_t[1]); 443 _t[2] = host_to_be32(_t[2]); 444 _t[3] = host_to_be32(_t[3]); 445 _t[4] = host_to_be32(_t[4]); 446 os_memcpy(xpos, _t, 20); 447 448 /* XKEY = (1 + XKEY + w_i) mod 2^b */ 449 carry = 1; 450 for (k = 19; k >= 0; k--) { 451 carry += xkey[k] + xpos[k]; 452 xkey[k] = carry & 0xff; 453 carry >>= 8; 454 } 455 456 xpos += SHA1_MAC_LEN; 457 } 458 /* x_j = w_0|w_1 */ 459 } 460 461 return 0; 462 } 463 464 465 /* ===== start - public domain SHA1 implementation ===== */ 466 467 /* 468 SHA-1 in C 469 By Steve Reid <sreid (at) sea-to-sky.net> 470 100% Public Domain 471 472 ----------------- 473 Modified 7/98 474 By James H. Brown <jbrown (at) burgoyne.com> 475 Still 100% Public Domain 476 477 Corrected a problem which generated improper hash values on 16 bit machines 478 Routine SHA1Update changed from 479 void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned int 480 len) 481 to 482 void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned 483 long len) 484 485 The 'len' parameter was declared an int which works fine on 32 bit machines. 486 However, on 16 bit machines an int is too small for the shifts being done 487 against 488 it. This caused the hash function to generate incorrect values if len was 489 greater than 8191 (8K - 1) due to the 'len << 3' on line 3 of SHA1Update(). 490 491 Since the file IO in main() reads 16K at a time, any file 8K or larger would 492 be guaranteed to generate the wrong hash (e.g. Test Vector #3, a million 493 "a"s). 494 495 I also changed the declaration of variables i & j in SHA1Update to 496 unsigned long from unsigned int for the same reason. 497 498 These changes should make no difference to any 32 bit implementations since 499 an 500 int and a long are the same size in those environments. 501 502 -- 503 I also corrected a few compiler warnings generated by Borland C. 504 1. Added #include <process.h> for exit() prototype 505 2. Removed unused variable 'j' in SHA1Final 506 3. Changed exit(0) to return(0) at end of main. 507 508 ALL changes I made can be located by searching for comments containing 'JHB' 509 ----------------- 510 Modified 8/98 511 By Steve Reid <sreid (at) sea-to-sky.net> 512 Still 100% public domain 513 514 1- Removed #include <process.h> and used return() instead of exit() 515 2- Fixed overwriting of finalcount in SHA1Final() (discovered by Chris Hall) 516 3- Changed email address from steve (at) edmweb.com to sreid (at) sea-to-sky.net 517 518 ----------------- 519 Modified 4/01 520 By Saul Kravitz <Saul.Kravitz (at) celera.com> 521 Still 100% PD 522 Modified to run on Compaq Alpha hardware. 523 524 ----------------- 525 Modified 4/01 526 By Jouni Malinen <j (at) w1.fi> 527 Minor changes to match the coding style used in Dynamics. 528 529 Modified September 24, 2004 530 By Jouni Malinen <j (at) w1.fi> 531 Fixed alignment issue in SHA1Transform when SHA1HANDSOFF is defined. 532 533 */ 534 535 /* 536 Test Vectors (from FIPS PUB 180-1) 537 "abc" 538 A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D 539 "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" 540 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1 541 A million repetitions of "a" 542 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F 543 */ 544 545 #define SHA1HANDSOFF 546 547 #define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits)))) 548 549 /* blk0() and blk() perform the initial expand. */ 550 /* I got the idea of expanding during the round function from SSLeay */ 551 #ifndef WORDS_BIGENDIAN 552 #define blk0(i) (block->l[i] = (rol(block->l[i], 24) & 0xFF00FF00) | \ 553 (rol(block->l[i], 8) & 0x00FF00FF)) 554 #else 555 #define blk0(i) block->l[i] 556 #endif 557 #define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \ 558 block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1)) 559 560 /* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */ 561 #define R0(v,w,x,y,z,i) \ 562 z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \ 563 w = rol(w, 30); 564 #define R1(v,w,x,y,z,i) \ 565 z += ((w & (x ^ y)) ^ y) + blk(i) + 0x5A827999 + rol(v, 5); \ 566 w = rol(w, 30); 567 #define R2(v,w,x,y,z,i) \ 568 z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30); 569 #define R3(v,w,x,y,z,i) \ 570 z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \ 571 w = rol(w, 30); 572 #define R4(v,w,x,y,z,i) \ 573 z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \ 574 w=rol(w, 30); 575 576 577 #ifdef VERBOSE /* SAK */ 578 void SHAPrintContext(SHA1_CTX *context, char *msg) 579 { 580 printf("%s (%d,%d) %x %x %x %x %x\n", 581 msg, 582 context->count[0], context->count[1], 583 context->state[0], 584 context->state[1], 585 context->state[2], 586 context->state[3], 587 context->state[4]); 588 } 589 #endif 590 591 /* Hash a single 512-bit block. This is the core of the algorithm. */ 592 593 static void SHA1Transform(u32 state[5], const unsigned char buffer[64]) 594 { 595 u32 a, b, c, d, e; 596 typedef union { 597 unsigned char c[64]; 598 u32 l[16]; 599 } CHAR64LONG16; 600 CHAR64LONG16* block; 601 #ifdef SHA1HANDSOFF 602 u32 workspace[16]; 603 block = (CHAR64LONG16 *) workspace; 604 os_memcpy(block, buffer, 64); 605 #else 606 block = (CHAR64LONG16 *) buffer; 607 #endif 608 /* Copy context->state[] to working vars */ 609 a = state[0]; 610 b = state[1]; 611 c = state[2]; 612 d = state[3]; 613 e = state[4]; 614 /* 4 rounds of 20 operations each. Loop unrolled. */ 615 R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3); 616 R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7); 617 R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11); 618 R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15); 619 R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19); 620 R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23); 621 R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27); 622 R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31); 623 R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35); 624 R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39); 625 R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43); 626 R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47); 627 R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51); 628 R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55); 629 R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59); 630 R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63); 631 R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67); 632 R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71); 633 R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75); 634 R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79); 635 /* Add the working vars back into context.state[] */ 636 state[0] += a; 637 state[1] += b; 638 state[2] += c; 639 state[3] += d; 640 state[4] += e; 641 /* Wipe variables */ 642 a = b = c = d = e = 0; 643 #ifdef SHA1HANDSOFF 644 os_memset(block, 0, 64); 645 #endif 646 } 647 648 649 /* SHA1Init - Initialize new context */ 650 651 void SHA1Init(SHA1_CTX* context) 652 { 653 /* SHA1 initialization constants */ 654 context->state[0] = 0x67452301; 655 context->state[1] = 0xEFCDAB89; 656 context->state[2] = 0x98BADCFE; 657 context->state[3] = 0x10325476; 658 context->state[4] = 0xC3D2E1F0; 659 context->count[0] = context->count[1] = 0; 660 } 661 662 663 /* Run your data through this. */ 664 665 void SHA1Update(SHA1_CTX* context, const void *_data, u32 len) 666 { 667 u32 i, j; 668 const unsigned char *data = _data; 669 670 #ifdef VERBOSE 671 SHAPrintContext(context, "before"); 672 #endif 673 j = (context->count[0] >> 3) & 63; 674 if ((context->count[0] += len << 3) < (len << 3)) 675 context->count[1]++; 676 context->count[1] += (len >> 29); 677 if ((j + len) > 63) { 678 os_memcpy(&context->buffer[j], data, (i = 64-j)); 679 SHA1Transform(context->state, context->buffer); 680 for ( ; i + 63 < len; i += 64) { 681 SHA1Transform(context->state, &data[i]); 682 } 683 j = 0; 684 } 685 else i = 0; 686 os_memcpy(&context->buffer[j], &data[i], len - i); 687 #ifdef VERBOSE 688 SHAPrintContext(context, "after "); 689 #endif 690 } 691 692 693 /* Add padding and return the message digest. */ 694 695 void SHA1Final(unsigned char digest[20], SHA1_CTX* context) 696 { 697 u32 i; 698 unsigned char finalcount[8]; 699 700 for (i = 0; i < 8; i++) { 701 finalcount[i] = (unsigned char) 702 ((context->count[(i >= 4 ? 0 : 1)] >> 703 ((3-(i & 3)) * 8) ) & 255); /* Endian independent */ 704 } 705 SHA1Update(context, (unsigned char *) "\200", 1); 706 while ((context->count[0] & 504) != 448) { 707 SHA1Update(context, (unsigned char *) "\0", 1); 708 } 709 SHA1Update(context, finalcount, 8); /* Should cause a SHA1Transform() 710 */ 711 for (i = 0; i < 20; i++) { 712 digest[i] = (unsigned char) 713 ((context->state[i >> 2] >> ((3 - (i & 3)) * 8)) & 714 255); 715 } 716 /* Wipe variables */ 717 i = 0; 718 os_memset(context->buffer, 0, 64); 719 os_memset(context->state, 0, 20); 720 os_memset(context->count, 0, 8); 721 os_memset(finalcount, 0, 8); 722 } 723 724 /* ===== end - public domain SHA1 implementation ===== */ 725 726 #endif /* INTERNAL_SHA1 */ 727