12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- (function () {
- var C = typeof window === 'undefined' ? require('./Crypto').Crypto : window.Crypto;
- // Shortcuts
- var util = C.util;
- var charenc = C.charenc;
- var UTF8 = charenc.UTF8;
- var Binary = charenc.Binary; // Public API
- var SHA1 = (C.SHA1 = function (message, options) {
- var digestbytes = util.wordsToBytes(SHA1._sha1(message));
- return options && options.asBytes ? digestbytes : options && options.asString ? Binary.bytesToString(digestbytes) : util.bytesToHex(digestbytes);
- });
- // The core
- SHA1._sha1 = function (message) {
- // Convert to byte array
- if (message.constructor == String) {
- message = UTF8.stringToBytes(message);
- }
- /* else, assume byte array already */
- var m = util.bytesToWords(message);
- var l = message.length * 8;
- var w = [];
- var H0 = 1732584193;
- var H1 = -271733879;
- var H2 = -1732584194;
- var H3 = 271733878;
- var H4 = -1009589776; // Padding
- m[l >> 5] |= 128 << (24 - (l % 32));
- m[(((l + 64) >>> 9) << 4) + 15] = l;
- for (var i = 0; i < m.length; i += 16) {
- var a = H0;
- var b = H1;
- var c = H2;
- var d = H3;
- var e = H4;
- for (var j = 0; j < 80; j++) {
- if (j < 16) {
- w[j] = m[i + j];
- } else {
- var n = w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16];
- w[j] = (n << 1) | (n >>> 31);
- }
- var t =
- ((H0 << 5) | (H0 >>> 27)) +
- H4 +
- (w[j] >>> 0) +
- (j < 20
- ? ((H1 & H2) | (~H1 & H3)) + 1518500249
- : j < 40
- ? (H1 ^ H2 ^ H3) + 1859775393
- : j < 60
- ? ((H1 & H2) | (H1 & H3) | (H2 & H3)) - 1894007588
- : (H1 ^ H2 ^ H3) - 899497514);
- H4 = H3;
- H3 = H2;
- H2 = (H1 << 30) | (H1 >>> 2);
- H1 = H0;
- H0 = t;
- }
- H0 += a;
- H1 += b;
- H2 += c;
- H3 += d;
- H4 += e;
- }
- return [H0, H1, H2, H3, H4];
- };
- // Package private blocksize
- SHA1._blocksize = 16;
- SHA1._digestsize = 20;
- })();
|