Created
April 4, 2016 20:36
-
-
Save reganstarr/d9c766f23c317b65de1d614d992d8fbe to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function sha1 (str) { | |
// discuss at: http://phpjs.org/functions/sha1/ | |
// original by: Webtoolkit.info (http://www.webtoolkit.info/) | |
// improved by: Michael White (http://getsprink.com) | |
// improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) | |
// input by: Brett Zamir (http://brett-zamir.me) | |
// example 1: sha1('Kevin van Zonneveld'); | |
// returns 1: '54916d2e62f65b3afa6e192e6a601cdbe5cb5897' | |
var rotate_left = function (n, s) { | |
var t4 = (n << s) | (n >>> (32 - s)) | |
return t4 | |
} | |
/* var lsb_hex = function (val) { | |
// Not in use; needed? | |
var str=""; | |
var i; | |
var vh; | |
var vl; | |
for ( i=0; i<=6; i+=2 ) { | |
vh = (val>>>(i*4+4))&0x0f; | |
vl = (val>>>(i*4))&0x0f; | |
str += vh.toString(16) + vl.toString(16); | |
} | |
return str; | |
};*/ | |
var cvt_hex = function (val) { | |
var str = '' | |
var i | |
var v | |
for (i = 7; i >= 0; i--) { | |
v = (val >>> (i * 4)) & 0x0f | |
str += v.toString(16) | |
} | |
return str | |
} | |
var blockstart | |
var i, j | |
var W = new Array(80) | |
var H0 = 0x67452301 | |
var H1 = 0xEFCDAB89 | |
var H2 = 0x98BADCFE | |
var H3 = 0x10325476 | |
var H4 = 0xC3D2E1F0 | |
var A, B, C, D, E | |
var temp | |
// utf8_encode | |
str = unescape(encodeURIComponent(str)) | |
var str_len = str.length | |
var word_array = [] | |
for (i = 0; i < str_len - 3; i += 4) { | |
j = str.charCodeAt(i) << 24 | str.charCodeAt(i + 1) << 16 | str.charCodeAt(i + 2) << 8 | str.charCodeAt(i + 3) | |
word_array.push(j) | |
} | |
switch (str_len % 4) { | |
case 0: | |
i = 0x080000000 | |
break | |
case 1: | |
i = str.charCodeAt(str_len - 1) << 24 | 0x0800000 | |
break | |
case 2: | |
i = str.charCodeAt(str_len - 2) << 24 | str.charCodeAt(str_len - 1) << 16 | 0x08000 | |
break | |
case 3: | |
i = str.charCodeAt(str_len - 3) << 24 | str.charCodeAt(str_len - 2) << 16 | str.charCodeAt(str_len - 1) << | |
8 | 0x80 | |
break | |
} | |
word_array.push(i) | |
while ((word_array.length % 16) != 14) { | |
word_array.push(0) | |
} | |
word_array.push(str_len >>> 29) | |
word_array.push((str_len << 3) & 0x0ffffffff) | |
for (blockstart = 0; blockstart < word_array.length; blockstart += 16) { | |
for (i = 0; i < 16; i++) { | |
W[i] = word_array[blockstart + i] | |
} | |
for (i = 16; i <= 79; i++) { | |
W[i] = rotate_left(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1) | |
} | |
A = H0 | |
B = H1 | |
C = H2 | |
D = H3 | |
E = H4 | |
for (i = 0; i <= 19; i++) { | |
temp = (rotate_left(A, 5) + ((B & C) | (~B & D)) + E + W[i] + 0x5A827999) & 0x0ffffffff | |
E = D | |
D = C | |
C = rotate_left(B, 30) | |
B = A | |
A = temp | |
} | |
for (i = 20; i <= 39; i++) { | |
temp = (rotate_left(A, 5) + (B ^ C ^ D) + E + W[i] + 0x6ED9EBA1) & 0x0ffffffff | |
E = D | |
D = C | |
C = rotate_left(B, 30) | |
B = A | |
A = temp | |
} | |
for (i = 40; i <= 59; i++) { | |
temp = (rotate_left(A, 5) + ((B & C) | (B & D) | (C & D)) + E + W[i] + 0x8F1BBCDC) & 0x0ffffffff | |
E = D | |
D = C | |
C = rotate_left(B, 30) | |
B = A | |
A = temp | |
} | |
for (i = 60; i <= 79; i++) { | |
temp = (rotate_left(A, 5) + (B ^ C ^ D) + E + W[i] + 0xCA62C1D6) & 0x0ffffffff | |
E = D | |
D = C | |
C = rotate_left(B, 30) | |
B = A | |
A = temp | |
} | |
H0 = (H0 + A) & 0x0ffffffff | |
H1 = (H1 + B) & 0x0ffffffff | |
H2 = (H2 + C) & 0x0ffffffff | |
H3 = (H3 + D) & 0x0ffffffff | |
H4 = (H4 + E) & 0x0ffffffff | |
} | |
temp = cvt_hex(H0) + cvt_hex(H1) + cvt_hex(H2) + cvt_hex(H3) + cvt_hex(H4) | |
return temp.toLowerCase() | |
} | |
var string = "This string is about to be encoded with sha1"; | |
var encodedString = sha1(string); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment