sha1.js (3591B)
1 (function () { 2 // Shortcuts 3 var C = CryptoJS; 4 var C_lib = C.lib; 5 var WordArray = C_lib.WordArray; 6 var Hasher = C_lib.Hasher; 7 var C_algo = C.algo; 8 9 // Reusable object 10 var W = []; 11 12 /** 13 * SHA-1 hash algorithm. 14 */ 15 var SHA1 = C_algo.SHA1 = Hasher.extend({ 16 _doReset: function () { 17 this._hash = new WordArray.init([ 18 0x67452301, 0xefcdab89, 19 0x98badcfe, 0x10325476, 20 0xc3d2e1f0 21 ]); 22 }, 23 24 _doProcessBlock: function (M, offset) { 25 // Shortcut 26 var H = this._hash.words; 27 28 // Working variables 29 var a = H[0]; 30 var b = H[1]; 31 var c = H[2]; 32 var d = H[3]; 33 var e = H[4]; 34 35 // Computation 36 for (var i = 0; i < 80; i++) { 37 if (i < 16) { 38 W[i] = M[offset + i] | 0; 39 } else { 40 var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16]; 41 W[i] = (n << 1) | (n >>> 31); 42 } 43 44 var t = ((a << 5) | (a >>> 27)) + e + W[i]; 45 if (i < 20) { 46 t += ((b & c) | (~b & d)) + 0x5a827999; 47 } else if (i < 40) { 48 t += (b ^ c ^ d) + 0x6ed9eba1; 49 } else if (i < 60) { 50 t += ((b & c) | (b & d) | (c & d)) - 0x70e44324; 51 } else /* if (i < 80) */ { 52 t += (b ^ c ^ d) - 0x359d3e2a; 53 } 54 55 e = d; 56 d = c; 57 c = (b << 30) | (b >>> 2); 58 b = a; 59 a = t; 60 } 61 62 // Intermediate hash value 63 H[0] = (H[0] + a) | 0; 64 H[1] = (H[1] + b) | 0; 65 H[2] = (H[2] + c) | 0; 66 H[3] = (H[3] + d) | 0; 67 H[4] = (H[4] + e) | 0; 68 }, 69 70 _doFinalize: function () { 71 // Shortcuts 72 var data = this._data; 73 var dataWords = data.words; 74 75 var nBitsTotal = this._nDataBytes * 8; 76 var nBitsLeft = data.sigBytes * 8; 77 78 // Add padding 79 dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); 80 dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000); 81 dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal; 82 data.sigBytes = dataWords.length * 4; 83 84 // Hash final blocks 85 this._process(); 86 87 // Return final computed hash 88 return this._hash; 89 }, 90 91 clone: function () { 92 var clone = Hasher.clone.call(this); 93 clone._hash = this._hash.clone(); 94 95 return clone; 96 } 97 }); 98 99 /** 100 * Shortcut function to the hasher's object interface. 101 * 102 * @param {WordArray|string} message The message to hash. 103 * 104 * @return {WordArray} The hash. 105 * 106 * @static 107 * 108 * @example 109 * 110 * var hash = CryptoJS.SHA1('message'); 111 * var hash = CryptoJS.SHA1(wordArray); 112 */ 113 C.SHA1 = Hasher._createHelper(SHA1); 114 115 /** 116 * Shortcut function to the HMAC's object interface. 117 * 118 * @param {WordArray|string} message The message to hash. 119 * @param {WordArray|string} key The secret key. 120 * 121 * @return {WordArray} The HMAC. 122 * 123 * @static 124 * 125 * @example 126 * 127 * var hmac = CryptoJS.HmacSHA1(message, key); 128 */ 129 C.HmacSHA1 = Hasher._createHmacHelper(SHA1); 130 }());