* Add test cases.

* Improve performance.
This commit is contained in:
Chen Yi-Cyuan
2015-02-02 21:01:50 +08:00
parent 07821b3bac
commit 74024f2b93
9 changed files with 348 additions and 254 deletions
+300 -205
View File
@@ -1,5 +1,5 @@
/*
* js-sha512 v0.1.3
* js-sha512 v0.2.0
* https://github.com/emn178/js-sha512
*
* Copyright 2014-2015, emn178@gmail.com
@@ -17,125 +17,46 @@
var HEX_CHARS = '0123456789abcdef'.split('');
var SHIFT = [24, 16, 8, 0];
// Class Long
var Long = function(high, low) {
this.high = high << 0;
this.low = low << 0;
};
if(root.JS_SHA512_TEST) {
root.Long = Long;
}
Long.prototype.and = function(other) {
return new Long(this.high & other.high, this.low & other.low);
};
Long.prototype.xor = function(other) {
return new Long(this.high ^ other.high, this.low ^ other.low);
};
Long.prototype.not = function() {
return new Long(~this.high, ~this.low);
};
Long.prototype.shiftRightUnsigned = function(numBits) {
numBits &= 63;
if(numBits === 0) {
return new Long(this.high, this.low);
}
if(numBits < 32) {
return new Long(this.high >>> numBits, (this.low >>> numBits) | (this.high << (32 - numBits)));
} else if(numBits == 32) {
return new Long(0, this.high);
} else {
return new Long(0, this.high >>> (numBits - 32));
}
};
Long.prototype.rightRotate = function(numBits) {
numBits &= 63;
if(numBits === 0) {
return new Long(this.high, this.low);
}
if(numBits < 32) {
return new Long((this.high >>> numBits) | (this.low << (32 - numBits)), (this.low >>> numBits) | (this.high << (32 - numBits)));
} else if(numBits == 32) {
return new Long(this.low, this.high);
} else {
return new Long((this.low >>> (numBits - 32)) | (this.high << (64 - numBits)), (this.high >>> (numBits - 32)) | (this.low << (64 - numBits)));
}
};
Long.prototype.add = function(other) {
var a1 = this.low & 0xFFFF;
var a2 = this.low >>> 16;
var a3 = this.high & 0xFFFF;
var a4 = this.high >>> 16;
var b1 = other.low & 0xFFFF;
var b2 = other.low >>> 16;
var b3 = other.high & 0xFFFF;
var b4 = other.high >>> 16;
var c1 = a1 + b1;
var c2 = a2 + b2 + (c1 >>> 16);
var c3 = a3 + b3 + (c2 >>> 16);
var c4 = a4 + b4 + (c3 >>> 16);
return new Long((c4 << 16) | (c3 & 0xFFFF), (c2 << 16) | (c1 & 0xFFFF));
};
Long.prototype.toHexString = function() {
return HEX_CHARS[(this.high >> 28) & 0x0F] + HEX_CHARS[(this.high >> 24) & 0x0F] +
HEX_CHARS[(this.high >> 20) & 0x0F] + HEX_CHARS[(this.high >> 16) & 0x0F] +
HEX_CHARS[(this.high >> 12) & 0x0F] + HEX_CHARS[(this.high >> 8) & 0x0F] +
HEX_CHARS[(this.high >> 4) & 0x0F] + HEX_CHARS[this.high & 0x0F] +
HEX_CHARS[(this.low >> 28) & 0x0F] + HEX_CHARS[(this.low >> 24) & 0x0F] +
HEX_CHARS[(this.low >> 20) & 0x0F] + HEX_CHARS[(this.low >> 16) & 0x0F] +
HEX_CHARS[(this.low >> 12) & 0x0F] + HEX_CHARS[(this.low >> 8) & 0x0F] +
HEX_CHARS[(this.low >> 4) & 0x0F] + HEX_CHARS[this.low & 0x0F];
};
var K =[new Long(0x428A2F98, 0xD728AE22), new Long(0x71374491, 0x23EF65CD),
new Long(0xB5C0FBCF, 0xEC4D3B2F), new Long(0xE9B5DBA5, 0x8189DBBC),
new Long(0x3956C25B, 0xF348B538), new Long(0x59F111F1, 0xB605D019),
new Long(0x923F82A4, 0xAF194F9B), new Long(0xAB1C5ED5, 0xDA6D8118),
new Long(0xD807AA98, 0xA3030242), new Long(0x12835B01, 0x45706FBE),
new Long(0x243185BE, 0x4EE4B28C), new Long(0x550C7DC3, 0xD5FFB4E2),
new Long(0x72BE5D74, 0xF27B896F), new Long(0x80DEB1FE, 0x3B1696B1),
new Long(0x9BDC06A7, 0x25C71235), new Long(0xC19BF174, 0xCF692694),
new Long(0xE49B69C1, 0x9EF14AD2), new Long(0xEFBE4786, 0x384F25E3),
new Long(0x0FC19DC6, 0x8B8CD5B5), new Long(0x240CA1CC, 0x77AC9C65),
new Long(0x2DE92C6F, 0x592B0275), new Long(0x4A7484AA, 0x6EA6E483),
new Long(0x5CB0A9DC, 0xBD41FBD4), new Long(0x76F988DA, 0x831153B5),
new Long(0x983E5152, 0xEE66DFAB), new Long(0xA831C66D, 0x2DB43210),
new Long(0xB00327C8, 0x98FB213F), new Long(0xBF597FC7, 0xBEEF0EE4),
new Long(0xC6E00BF3, 0x3DA88FC2), new Long(0xD5A79147, 0x930AA725),
new Long(0x06CA6351, 0xE003826F), new Long(0x14292967, 0x0A0E6E70),
new Long(0x27B70A85, 0x46D22FFC), new Long(0x2E1B2138, 0x5C26C926),
new Long(0x4D2C6DFC, 0x5AC42AED), new Long(0x53380D13, 0x9D95B3DF),
new Long(0x650A7354, 0x8BAF63DE), new Long(0x766A0ABB, 0x3C77B2A8),
new Long(0x81C2C92E, 0x47EDAEE6), new Long(0x92722C85, 0x1482353B),
new Long(0xA2BFE8A1, 0x4CF10364), new Long(0xA81A664B, 0xBC423001),
new Long(0xC24B8B70, 0xD0F89791), new Long(0xC76C51A3, 0x0654BE30),
new Long(0xD192E819, 0xD6EF5218), new Long(0xD6990624, 0x5565A910),
new Long(0xF40E3585, 0x5771202A), new Long(0x106AA070, 0x32BBD1B8),
new Long(0x19A4C116, 0xB8D2D0C8), new Long(0x1E376C08, 0x5141AB53),
new Long(0x2748774C, 0xDF8EEB99), new Long(0x34B0BCB5, 0xE19B48A8),
new Long(0x391C0CB3, 0xC5C95A63), new Long(0x4ED8AA4A, 0xE3418ACB),
new Long(0x5B9CCA4F, 0x7763E373), new Long(0x682E6FF3, 0xD6B2B8A3),
new Long(0x748F82EE, 0x5DEFB2FC), new Long(0x78A5636F, 0x43172F60),
new Long(0x84C87814, 0xA1F0AB72), new Long(0x8CC70208, 0x1A6439EC),
new Long(0x90BEFFFA, 0x23631E28), new Long(0xA4506CEB, 0xDE82BDE9),
new Long(0xBEF9A3F7, 0xB2C67915), new Long(0xC67178F2, 0xE372532B),
new Long(0xCA273ECE, 0xEA26619C), new Long(0xD186B8C7, 0x21C0C207),
new Long(0xEADA7DD6, 0xCDE0EB1E), new Long(0xF57D4F7F, 0xEE6ED178),
new Long(0x06F067AA, 0x72176FBA), new Long(0x0A637DC5, 0xA2C898A6),
new Long(0x113F9804, 0xBEF90DAE), new Long(0x1B710B35, 0x131C471B),
new Long(0x28DB77F5, 0x23047D84), new Long(0x32CAAB7B, 0x40C72493),
new Long(0x3C9EBE0A, 0x15C9BEBC), new Long(0x431D67C4, 0x9C100D4C),
new Long(0x4CC5D4BE, 0xCB3E42B6), new Long(0x597F299C, 0xFC657E2A),
new Long(0x5FCB6FAB, 0x3AD6FAEC), new Long(0x6C44198C, 0x4A475817)];
var K =[0x428A2F98, 0xD728AE22, 0x71374491, 0x23EF65CD,
0xB5C0FBCF, 0xEC4D3B2F, 0xE9B5DBA5, 0x8189DBBC,
0x3956C25B, 0xF348B538, 0x59F111F1, 0xB605D019,
0x923F82A4, 0xAF194F9B, 0xAB1C5ED5, 0xDA6D8118,
0xD807AA98, 0xA3030242, 0x12835B01, 0x45706FBE,
0x243185BE, 0x4EE4B28C, 0x550C7DC3, 0xD5FFB4E2,
0x72BE5D74, 0xF27B896F, 0x80DEB1FE, 0x3B1696B1,
0x9BDC06A7, 0x25C71235, 0xC19BF174, 0xCF692694,
0xE49B69C1, 0x9EF14AD2, 0xEFBE4786, 0x384F25E3,
0x0FC19DC6, 0x8B8CD5B5, 0x240CA1CC, 0x77AC9C65,
0x2DE92C6F, 0x592B0275, 0x4A7484AA, 0x6EA6E483,
0x5CB0A9DC, 0xBD41FBD4, 0x76F988DA, 0x831153B5,
0x983E5152, 0xEE66DFAB, 0xA831C66D, 0x2DB43210,
0xB00327C8, 0x98FB213F, 0xBF597FC7, 0xBEEF0EE4,
0xC6E00BF3, 0x3DA88FC2, 0xD5A79147, 0x930AA725,
0x06CA6351, 0xE003826F, 0x14292967, 0x0A0E6E70,
0x27B70A85, 0x46D22FFC, 0x2E1B2138, 0x5C26C926,
0x4D2C6DFC, 0x5AC42AED, 0x53380D13, 0x9D95B3DF,
0x650A7354, 0x8BAF63DE, 0x766A0ABB, 0x3C77B2A8,
0x81C2C92E, 0x47EDAEE6, 0x92722C85, 0x1482353B,
0xA2BFE8A1, 0x4CF10364, 0xA81A664B, 0xBC423001,
0xC24B8B70, 0xD0F89791, 0xC76C51A3, 0x0654BE30,
0xD192E819, 0xD6EF5218, 0xD6990624, 0x5565A910,
0xF40E3585, 0x5771202A, 0x106AA070, 0x32BBD1B8,
0x19A4C116, 0xB8D2D0C8, 0x1E376C08, 0x5141AB53,
0x2748774C, 0xDF8EEB99, 0x34B0BCB5, 0xE19B48A8,
0x391C0CB3, 0xC5C95A63, 0x4ED8AA4A, 0xE3418ACB,
0x5B9CCA4F, 0x7763E373, 0x682E6FF3, 0xD6B2B8A3,
0x748F82EE, 0x5DEFB2FC, 0x78A5636F, 0x43172F60,
0x84C87814, 0xA1F0AB72, 0x8CC70208, 0x1A6439EC,
0x90BEFFFA, 0x23631E28, 0xA4506CEB, 0xDE82BDE9,
0xBEF9A3F7, 0xB2C67915, 0xC67178F2, 0xE372532B,
0xCA273ECE, 0xEA26619C, 0xD186B8C7, 0x21C0C207,
0xEADA7DD6, 0xCDE0EB1E, 0xF57D4F7F, 0xEE6ED178,
0x06F067AA, 0x72176FBA, 0x0A637DC5, 0xA2C898A6,
0x113F9804, 0xBEF90DAE, 0x1B710B35, 0x131C471B,
0x28DB77F5, 0x23047D84, 0x32CAAB7B, 0x40C72493,
0x3C9EBE0A, 0x15C9BEBC, 0x431D67C4, 0x9C100D4C,
0x4CC5D4BE, 0xCB3E42B6, 0x597F299C, 0xFC657E2A,
0x5FCB6FAB, 0x3AD6FAEC, 0x6C44198C, 0x4A475817];
var sha512 = function(message, asciiOnly) {
return sha2(message, 512, asciiOnly);
@@ -154,7 +75,8 @@
};
var sha2 = function(message, tbit, asciiOnly) {
var blocks, h0, h1, h2, h3, h4, h5, h6, h7;
var blocks, h0h, h0l, h1h, h1l, h2h, h2l, h3h, h3l,
h4h, h4l, h5h, h5l, h6h, h6l, h7h, h7l;
if(!asciiOnly && /[^\x00-\x7F]/.test(message)) {
blocks = getBlocksFromUtf8(message);
} else {
@@ -162,105 +84,286 @@
}
if(tbit == 512) {
h0 = new Long(0x6A09E667, 0xF3BCC908);
h1 = new Long(0xBB67AE85, 0x84CAA73B);
h2 = new Long(0x3C6EF372, 0xFE94F82B);
h3 = new Long(0xA54FF53A, 0x5F1D36F1);
h4 = new Long(0x510E527F, 0xADE682D1);
h5 = new Long(0x9B05688C, 0x2B3E6C1F);
h6 = new Long(0x1F83D9AB, 0xFB41BD6B);
h7 = new Long(0x5BE0CD19, 0x137E2179);
h0h = 0x6A09E667;
h0l = 0xF3BCC908;
h1h = 0xBB67AE85;
h1l = 0x84CAA73B;
h2h = 0x3C6EF372;
h2l = 0xFE94F82B;
h3h = 0xA54FF53A;
h3l = 0x5F1D36F1;
h4h = 0x510E527F;
h4l = 0xADE682D1;
h5h = 0x9B05688C;
h5l = 0x2B3E6C1F;
h6h = 0x1F83D9AB;
h6l = 0xFB41BD6B;
h7h = 0x5BE0CD19;
h7l = 0x137E2179;
} else if(tbit == 384) {
h0 = new Long(0xCBBB9D5D, 0xC1059ED8);
h1 = new Long(0x629A292A, 0x367CD507);
h2 = new Long(0x9159015A, 0x3070DD17);
h3 = new Long(0x152FECD8, 0xF70E5939);
h4 = new Long(0x67332667, 0xFFC00B31);
h5 = new Long(0x8EB44A87, 0x68581511);
h6 = new Long(0xDB0C2E0D, 0x64F98FA7);
h7 = new Long(0x47B5481D, 0xBEFA4FA4);
h0h = 0xCBBB9D5D;
h0l = 0xC1059ED8;
h1h = 0x629A292A;
h1l = 0x367CD507;
h2h = 0x9159015A;
h2l = 0x3070DD17;
h3h = 0x152FECD8;
h3l = 0xF70E5939;
h4h = 0x67332667;
h4l = 0xFFC00B31;
h5h = 0x8EB44A87;
h5l = 0x68581511;
h6h = 0xDB0C2E0D;
h6l = 0x64F98FA7;
h7h = 0x47B5481D;
h7l = 0xBEFA4FA4;
} else if(tbit == 256) {
h0 = new Long(0x22312194, 0xFC2BF72C);
h1 = new Long(0x9F555FA3, 0xC84C64C2);
h2 = new Long(0x2393B86B, 0x6F53B151);
h3 = new Long(0x96387719, 0x5940EABD);
h4 = new Long(0x96283EE2, 0xA88EFFE3);
h5 = new Long(0xBE5E1E25, 0x53863992);
h6 = new Long(0x2B0199FC, 0x2C85B8AA);
h7 = new Long(0x0EB72DDC, 0x81C52CA2);
h0h = 0x22312194;
h0l = 0xFC2BF72C;
h1h = 0x9F555FA3;
h1l = 0xC84C64C2;
h2h = 0x2393B86B;
h2l = 0x6F53B151;
h3h = 0x96387719;
h3l = 0x5940EABD;
h4h = 0x96283EE2;
h4l = 0xA88EFFE3;
h5h = 0xBE5E1E25;
h5l = 0x53863992;
h6h = 0x2B0199FC;
h6l = 0x2C85B8AA;
h7h = 0x0EB72DDC;
h7l = 0x81C52CA2;
} else if(tbit == 224) {
h0 = new Long(0x8C3D37C8, 0x19544DA2);
h1 = new Long(0x73E19966, 0x89DCD4D6);
h2 = new Long(0x1DFAB7AE, 0x32FF9C82);
h3 = new Long(0x679DD514, 0x582F9FCF);
h4 = new Long(0x0F6D2B69, 0x7BD44DA8);
h5 = new Long(0x77E36F73, 0x04C48942);
h6 = new Long(0x3F9D85A8, 0x6A1D36C8);
h7 = new Long(0x1112E6AD, 0x91D692A1);
h0h = 0x8C3D37C8;
h0l = 0x19544DA2;
h1h = 0x73E19966;
h1l = 0x89DCD4D6;
h2h = 0x1DFAB7AE;
h2l = 0x32FF9C82;
h3h = 0x679DD514;
h3l = 0x582F9FCF;
h4h = 0x0F6D2B69;
h4l = 0x7BD44DA8;
h5h = 0x77E36F73;
h5l = 0x04C48942;
h6h = 0x3F9D85A8;
h6l = 0x6A1D36C8;
h7h = 0x1112E6AD;
h7l = 0x91D692A1;
}
for(var i = 0, length = blocks.length;i < length;i += 16) {
var w = [], s0, s1, j;
for(j = 0;j < 16;++j) {
for(var i = 0, length = blocks.length;i < length;i += 32) {
var w = [], s0h, s0l, s1h, s1l, th, tl, c1, c2, c3, c4, j,
ah, al, bh, bl, ch, cl, dh, dl, eh, el, fh, fl, gh, gl, hh, hl,
majh, majl, t1h, t1l, t2h, t2l, chh, chl;
for(j = 0;j < 32;++j) {
w[j] = blocks[i + j];
}
for(j = 16;j < 80;++j) {
s0 = w[j - 15].rightRotate(1).xor(w[j - 15].rightRotate(8)).xor(w[j - 15].shiftRightUnsigned(7));
s1 = w[j - 2].rightRotate(19).xor(w[j - 2].rightRotate(61)).xor(w[j - 2].shiftRightUnsigned(6));
w[j] = w[j - 16].add(s0).add(w[j - 7]).add(s1);
for(j = 32;j < 160;j += 2) {
th = w[j - 30];
tl = w[j - 29];
s0h = ((th >>> 1) | (tl << 31)) ^ ((th >>> 8) | (tl << 24)) ^ (th >>> 7);
s0l = ((tl >>> 1) | (th << 31)) ^ ((tl >>> 8) | (th << 24)) ^ ((tl >>> 7) | th << 25);
th = w[j - 4];
tl = w[j - 3];
s1h = ((th >>> 19) | (tl << 13)) ^ ((tl >>> 29) | (th << 3)) ^ (th >>> 6);
s1l = ((tl >>> 19) | (th << 13)) ^ ((th >>> 29) | (tl << 3)) ^ ((tl >>> 6) | th << 26);
th = w[j - 32];
tl = w[j - 31];
c1 = (tl & 0xFFFF) + (s0l & 0xFFFF) + (s1l & 0xFFFF);
c2 = (tl >>> 16) + (s0l >>> 16) + (s1l >>> 16);
c3 = (th & 0xFFFF) + (s0h & 0xFFFF) + (s1h & 0xFFFF);
c4 = (th >>> 16) + (s0h >>> 16) + (s1h >>> 16);
th = w[j - 14];
tl = w[j - 13];
c1 += (tl & 0xFFFF);
c2 += (tl >>> 16) + (c1 >>> 16);
c3 += (th & 0xFFFF) + (c2 >>> 16);
c4 += (th >>> 16) + (c3 >>> 16);
w[j] = (c4 << 16) | (c3 & 0xFFFF);
w[j + 1] = (c2 << 16) | (c1 & 0xFFFF);
}
var a = h0;
var b = h1;
var c = h2;
var d = h3;
var e = h4;
var f = h5;
var g = h6;
var h = h7;
var maj, t1, t2, ch;
ah = h0h;
al = h0l;
bh = h1h;
bl = h1l;
ch = h2h;
cl = h2l;
dh = h3h;
dl = h3l;
eh = h4h;
el = h4l;
fh = h5h;
fl = h5l;
gh = h6h;
gl = h6l;
hh = h7h;
hl = h7l;
for(j = 0;j < 160;j += 2) {
s0h = ((ah >>> 28) | (al << 4)) ^ ((al >>> 2) | (ah << 30)) ^ ((al >>> 7) | (ah << 25));
s0l = ((al >>> 28) | (ah << 4)) ^ ((ah >>> 2) | (al << 30)) ^ ((ah >>> 7) | (al << 25));
for(j = 0;j < 80;++j) {
s0 = a.rightRotate(28).xor(a.rightRotate(34)).xor(a.rightRotate(39));
maj = a.and(b).xor(a.and(c)).xor(b.and(c));
t2 = s0.add(maj);
s1 = e.rightRotate(14).xor(e.rightRotate(18)).xor(e.rightRotate(41));
ch = e.and(f).xor(e.not().and(g));
t1 = h.add(s1).add(ch).add(K[j]).add(w[j]);
s1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((el >>> 9) | (eh << 23));
s1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((eh >>> 9) | (el << 23));
h = g;
g = f;
f = e;
e = d.add(t1);
d = c;
c = b;
b = a;
a = t1.add(t2);
majh = (ah & bh) ^ (ah & ch) ^ (bh & ch);
majl = (al & bl) ^ (al & cl) ^ (bl & cl);
c1 = (majl & 0xFFFF) + (s0l & 0xFFFF);
c2 = (majl >>> 16) + (s0l >>> 16) + (c1 >>> 16);
c3 = (majh & 0xFFFF) + (s0h & 0xFFFF) + (c2 >>> 16);
c4 = (majh >>> 16) + (s0h >>> 16) + (c3 >>> 16);
t2h = (c4 << 16) | (c3 & 0xFFFF);
t2l = (c2 << 16) | (c1 & 0xFFFF);
chh = (eh & fh) ^ (~eh & gh);
chl = (el & fl) ^ (~el & gl);
th = w[j];
tl = w[j + 1];
c1 = (tl & 0xFFFF) + (chl & 0xFFFF) + (s1l & 0xFFFF) + (hl & 0xFFFF);
c2 = (tl >>> 16) + (chl >>> 16) + (s1l >>> 16) + (hl >>> 16);
c3 = (th & 0xFFFF) + (chh & 0xFFFF) + (s1h & 0xFFFF) + (hh & 0xFFFF);
c4 = (th >>> 16) + (chh >>> 16) + (s1h >>> 16) + (hh >>> 16);
th = K[j];
tl = K[j + 1];
c1 += (tl & 0xFFFF);
c2 += (tl >>> 16) + (c1 >>> 16);
c3 += (th & 0xFFFF) + (c2 >>> 16);
c4 += (th >>> 16) + (c3 >>> 16);
t1h = (c4 << 16) | (c3 & 0xFFFF);
t1l = (c2 << 16) | (c1 & 0xFFFF);
hh = gh;
hl = gl;
gh = fh;
gl = fl;
fh = eh;
fl = el;
c1 = (dl & 0xFFFF) + (t1l & 0xFFFF);
c2 = (dl >>> 16) + (t1l >>> 16) + (c1 >>> 16);
c3 = (dh & 0xFFFF) + (t1h & 0xFFFF) + (c2 >>> 16);
c4 = (dh >>> 16) + (t1h >>> 16) + (c3 >>> 16);
eh = (c4 << 16) | (c3 & 0xFFFF);
el = (c2 << 16) | (c1 & 0xFFFF);
dh = ch;
dl = cl;
ch = bh;
cl = bl;
bh = ah;
bl = al;
c1 = (t2l & 0xFFFF) + (t1l & 0xFFFF);
c2 = (t2l >>> 16) + (t1l >>> 16) + (c1 >>> 16);
c3 = (t2h & 0xFFFF) + (t1h & 0xFFFF) + (c2 >>> 16);
c4 = (t2h >>> 16) + (t1h >>> 16) + (c3 >>> 16);
ah = (c4 << 16) | (c3 & 0xFFFF);
al = (c2 << 16) | (c1 & 0xFFFF);
}
h0 = h0.add(a);
h1 = h1.add(b);
h2 = h2.add(c);
h3 = h3.add(d);
h4 = h4.add(e);
h5 = h5.add(f);
h6 = h6.add(g);
h7 = h7.add(h);
c1 = (h0l & 0xFFFF) + (al & 0xFFFF);
c2 = (h0l >>> 16) + (al >>> 16) + (c1 >>> 16);
c3 = (h0h & 0xFFFF) + (ah & 0xFFFF) + (c2 >>> 16);
c4 = (h0h >>> 16) + (ah >>> 16) + (c3 >>> 16);
h0h = (c4 << 16) | (c3 & 0xFFFF);
h0l = (c2 << 16) | (c1 & 0xFFFF);
c1 = (h1l & 0xFFFF) + (bl & 0xFFFF);
c2 = (h1l >>> 16) + (bl >>> 16) + (c1 >>> 16);
c3 = (h1h & 0xFFFF) + (bh & 0xFFFF) + (c2 >>> 16);
c4 = (h1h >>> 16) + (bh >>> 16) + (c3 >>> 16);
h1h = (c4 << 16) | (c3 & 0xFFFF);
h1l = (c2 << 16) | (c1 & 0xFFFF);
c1 = (h2l & 0xFFFF) + (cl & 0xFFFF);
c2 = (h2l >>> 16) + (cl >>> 16) + (c1 >>> 16);
c3 = (h2h & 0xFFFF) + (ch & 0xFFFF) + (c2 >>> 16);
c4 = (h2h >>> 16) + (ch >>> 16) + (c3 >>> 16);
h2h = (c4 << 16) | (c3 & 0xFFFF);
h2l = (c2 << 16) | (c1 & 0xFFFF);
c1 = (h3l & 0xFFFF) + (dl & 0xFFFF);
c2 = (h3l >>> 16) + (dl >>> 16) + (c1 >>> 16);
c3 = (h3h & 0xFFFF) + (dh & 0xFFFF) + (c2 >>> 16);
c4 = (h3h >>> 16) + (dh >>> 16) + (c3 >>> 16);
h3h = (c4 << 16) | (c3 & 0xFFFF);
h3l = (c2 << 16) | (c1 & 0xFFFF);
c1 = (h4l & 0xFFFF) + (el & 0xFFFF);
c2 = (h4l >>> 16) + (el >>> 16) + (c1 >>> 16);
c3 = (h4h & 0xFFFF) + (eh & 0xFFFF) + (c2 >>> 16);
c4 = (h4h >>> 16) + (eh >>> 16) + (c3 >>> 16);
h4h = (c4 << 16) | (c3 & 0xFFFF);
h4l = (c2 << 16) | (c1 & 0xFFFF);
c1 = (h5l & 0xFFFF) + (fl & 0xFFFF);
c2 = (h5l >>> 16) + (fl >>> 16) + (c1 >>> 16);
c3 = (h5h & 0xFFFF) + (fh & 0xFFFF) + (c2 >>> 16);
c4 = (h5h >>> 16) + (fh >>> 16) + (c3 >>> 16);
h5h = (c4 << 16) | (c3 & 0xFFFF);
h5l = (c2 << 16) | (c1 & 0xFFFF);
c1 = (h6l & 0xFFFF) + (gl & 0xFFFF);
c2 = (h6l >>> 16) + (gl >>> 16) + (c1 >>> 16);
c3 = (h6h & 0xFFFF) + (gh & 0xFFFF) + (c2 >>> 16);
c4 = (h6h >>> 16) + (gh >>> 16) + (c3 >>> 16);
h6h = (c4 << 16) | (c3 & 0xFFFF);
h6l = (c2 << 16) | (c1 & 0xFFFF);
c1 = (h7l & 0xFFFF) + (hl & 0xFFFF);
c2 = (h7l >>> 16) + (hl >>> 16) + (c1 >>> 16);
c3 = (h7h & 0xFFFF) + (hh & 0xFFFF) + (c2 >>> 16);
c4 = (h7h >>> 16) + (hh >>> 16) + (c3 >>> 16);
h7h = (c4 << 16) | (c3 & 0xFFFF);
h7l = (c2 << 16) | (c1 & 0xFFFF);
}
var hex = h0.toHexString() + h1.toHexString() + h2.toHexString() + h3.toHexString();
var hex = toHexString(h0h) + toHexString(h0l) + toHexString(h1h) + toHexString(h1l) +
toHexString(h2h) + toHexString(h2l) + toHexString(h3h) + toHexString(h3l);
if(tbit == 224) {
return hex.substr(0, hex.length - 8);
}
if(tbit >= 384) {
hex += h4.toHexString() + h5.toHexString();
hex += toHexString(h4h) + toHexString(h4l) + toHexString(h5h) + toHexString(h5l);
}
if(tbit == 512) {
hex += h6.toHexString() + h7.toHexString();
hex += toHexString(h6h) + toHexString(h6l) + toHexString(h7h) + toHexString(h7l);
}
return hex;
};
var toHexString = function(v) {
return HEX_CHARS[(v >> 28) & 0x0F] + HEX_CHARS[(v >> 24) & 0x0F] +
HEX_CHARS[(v >> 20) & 0x0F] + HEX_CHARS[(v >> 16) & 0x0F] +
HEX_CHARS[(v >> 12) & 0x0F] + HEX_CHARS[(v >> 8) & 0x0F] +
HEX_CHARS[(v >> 4) & 0x0F] + HEX_CHARS[v & 0x0F];
};
var getBytesFromUtf8 = function(str) {
var bytes = [], index = 0;
for (var i = 0;i < str.length; i++) {
@@ -299,11 +402,7 @@
}
blocks[i >> 2] |= 0x80 << SHIFT[i & 3];
blocks[blockCount - 1] = length << 3; // length * 8
var blocks64 = [];
for(i = 0;i < blockCount;i += 2) {
blocks64[i >> 1] = new Long(blocks[i], blocks[i + 1]);
}
return blocks64;
return blocks;
};
var getBlocksFromUtf8 = function(message) {
@@ -320,11 +419,7 @@
}
blocks[i >> 2] |= 0x80 << SHIFT[i & 3];
blocks[blockCount - 1] = length << 3; // length * 8
var blocks64 = [];
for(i = 0;i < blockCount;i += 2) {
blocks64[i >> 1] = new Long(blocks[i], blocks[i + 1]);
}
return blocks64;
return blocks;
};
if(!root.JS_SHA512_TEST && NODE_JS) {