SHA-1 in JS
JavaScript, SHA-1, hashing
Хеширование SHA-1.
String.prototype.SHA1 = function() {
var message = this.serialize(), data = [];
for (var i = 0; i < message.length - 3; i += 4) {
data.push(message.charCodeAt(i) << 24
| message.charCodeAt(i + 1) << 16
| message.charCodeAt(i + 2) << 8
| message.charCodeAt(i + 3));
}
switch(message.length % 4) {
case 0:
data.push(0x80000000);
break;
case 1:
data.push(message.charCodeAt(message.length - 1) << 24
| 0x800000);
break;
case 2:
data.push(message.charCodeAt(message.length - 2) << 24
| message.charCodeAt(message.length - 1) << 16
| 0x8000);
break;
case 3:
data.push(message.charCodeAt(message.length - 3) << 24
| message.charCodeAt(message.length - 2) << 16
| message.charCodeAt(message.length - 1) << 8
| 0x80);
}
while(data.length % 16 != 14) {
data.push(0);
}
data.push(message.length >>> 29);
data.push(message.length << 3 & 0xffffffff);
var h = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];
for (var i = 0; i < data.length; i += 16) {
var words = [];
for (var j = 0; j < 16; ++j) {
words[j] = data[i + j];
}
for (var j = 16; j < 80; ++j) {
words[j] = (words[j - 3] ^ words[j - 8] ^
words[j - 14] ^ words[j - 16]).rotl();
}
var a = h[0], b = h[1], c = h[2], d = h[3], e = h[4];
for (var j = 0; j < 20; ++j) {
var f = (a.rotl(5) + (b & c | ~b & d) + e +
words[j] + 0x5a827999);
e = d; d = c; c = b.rotl(30); b = a; a = f;
}
for (var j = 20; j < 40; ++j) {
var f = (a.rotl(5) + (b ^ c ^ d) + e +
words[j] + 0x6ed9eba1);
e = d; d = c; c = b.rotl(30); b = a; a = f;
}
for (var j = 40; j < 60; ++j) {
var f = (a.rotl(5) + (b & c | b & d | c & d) + e +
words[j] + 0x8f1bbcdc);
e = d; d = c; c = b.rotl(30); b = a; a = f;
}
for (var j = 60; j < 80; ++j) {
var f = (a.rotl(5) + (b ^ c ^ d) + e +
words[j] + 0xca62c1d6);
e = d; d = c; c = b.rotl(30); b = a; a = f;
}
h[0] += a; h[1] += b; h[2] += c; h[3] += d; h[4] += e;
}
var digest = '';
for (var i = 0; i < 5; ++i) {
for (var j = 7; j > -1; --j) {
digest += (h[i] >>> j * 4 & 0xf).toString(16);
}
}
return digest;
};
