Skip to content

Instantly share code, notes, and snippets.

@bluelovers
Last active August 29, 2015 14:27
Show Gist options
  • Save bluelovers/8dec6bd2da56457c8bf3 to your computer and use it in GitHub Desktop.
Save bluelovers/8dec6bd2da56457c8bf3 to your computer and use it in GitHub Desktop.
JS implementation of SHA-1
/**
* JS implementation of SHA-1
*
* http://stackoverflow.com/questions/539488/how-would-i-get-a-hash-value-of-a-users-file-with-javascript-or-flash
**/
(function(){
var sha1 = function (bytes) {
return sha_hexdigest(bytes);
};
return register('sha1', sha1);
function register(name, obj)
{
(function()
{
if (typeof module === 'object' && typeof module.exports === 'object')
{
module.exports = obj;
}
else if (typeof define === 'function' && define.amd)
{
//console.log(['define', name, obj]);
define(name, [], function()
{
return obj;
});
}
})();
(function(_old)
{
if (obj.noConflict === undefined)
{
obj.noConflict = function()
{
window[name] = _old;
return this;
};
}
window[name] = obj;
})(window[name]);
return obj;
};
function sha_hexdigest(bytes)
{
var digest = sha_bytes(sha_calculate(sha_ints(bytes), bytes.length * 8));
var digits = '0123456789abcdef';
var hex = '';
for (var i = 0; i < digest.length; i++)
{
var c = digest.charCodeAt(i);
hex += digits.charAt((c >> 4) & 0xF) + digits.charAt(c & 0xF);
}
return hex;
}
function sha_ints(bytes)
{
while (bytes.length % 4 != 0)
bytes += '\x00';
var ints = new Array();
for (var i = 0; i < bytes.length; i += 4)
{
ints[ints.length] = (
(bytes.charCodeAt(i) & 0xFF) << 24 | (bytes.charCodeAt(i + 1) & 0xFF) << 16 |
(bytes.charCodeAt(i + 2) & 0xFF) << 8 | (bytes.charCodeAt(i + 3) & 0xFF)
);
}
return ints;
}
function sha_bytes(ints)
{
var bytes = '';
for (var i = 0; i < ints.length; i++)
bytes += String.fromCharCode((ints[i] >> 24) & 0xFF, (ints[i] >> 16) & 0xFF, (ints[i] >> 8) & 0xFF, ints[i] & 0xFF)
return bytes;
}
function sha_calculate(ints, bitn)
{
while (ints.length * 32 <= bitn) ints[ints.length] = 0;
ints[ints.length - 1] |= 1 << (31 - bitn % 32)
while (ints.length % 16 != 14) ints[ints.length] = 0;
ints[ints.length] = Math.floor(bitn / 0x100000000);
ints[ints.length] = bitn & 0xFFFFFFFF;
var h0 = 1732584193,
h1 = -271733879,
h2 = -1732584194,
h3 = 271733878,
h4 = -1009589776;
var a, b, c, d, e, f, k, temp, w = new Array(80);
for (var inti = 0; inti < ints.length; inti += 16)
{
a = h0;
b = h1;
c = h2;
d = h3;
e = h4;
for (var i = 0; i < 16; i++) w[i] = ints[inti + i];
for (; i < 80; i++) w[i] = sha_rol(w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16], 1);
for (var i = 0; i < 80; i++)
{
switch (Math.floor(i / 20))
{
case 0:
f = sha_add(1518500249, (b & c) | ((~b) & d));
break;
case 1:
f = sha_add(1859775393, b ^ c ^ d);
break;
case 2:
f = sha_add(-1894007588, (b & c) | (b & d) | (c & d));
break;
case 3:
f = sha_add(-899497514, b ^ c ^ d);
break;
}
temp = sha_add(sha_add(sha_rol(a, 5), w[i]), sha_add(e, f));
e = d;
d = c;
c = b;
b = a;
a = temp;
c = sha_rol(c, 30);
}
h0 = sha_add(h0, a);
h1 = sha_add(h1, b);
h2 = sha_add(h2, c);
h3 = sha_add(h3, d);
h4 = sha_add(h4, e);
}
return new Array(h0, h1, h2, h3, h4);
}
function sha_add(a, b)
{
var lsw = (a & 0xFFFF) + (b & 0xFFFF);
var msw = (a >> 16) + (b >> 16) + (lsw >> 16);
return (msw << 16) | (lsw & 0xFFFF);
}
function sha_rol(n, bits)
{
return (n << bits) | (n >>> (32 - bits));
}
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment