blake2s
Version:
port of Dmitry Chestnykh's blake2s-js to node style
1,367 lines (1,334 loc) • 33.6 kB
text/typescript
class BLAKE2s {
private h : number[]; // hash state
private t0 : number; // counter
private t1 : number;
private f0 : number; // finalization flags
private f1 : number;
private x : number[]; // buffer for unprocessed data
private nx : number; // number of bytes in buffer
private result : number[]; // digest
private isFinished = false;
private digestLength = 32; // default digest length
public blockLength = 64;
private iv = [
0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,
0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19
];
private load32(p : number[], pos : number) : number {
return ((p[pos] & 0xff) | ((p[pos+1]&0xff)<<8) | ((p[pos+2]&0xff)<<16) | ((p[pos+3]&0xff)<<24))>>>0;
}
private store32(p : number[], pos : number, v : number) {
p[pos] = (v>>>0) & 0xff;
p[pos+1] = (v>>>8) & 0xff;
p[pos+2] = (v>>>16) & 0xff;
p[pos+3] = (v>>>24) & 0xff;
}
constructor(digestLength : number = 32, key? : any) {
//TODO tree mode.
if (digestLength <= 0) {
digestLength = this.digestLength;
} else if (digestLength > 32) {
throw 'digestLength is too large';
}
var keyLength = 0;
if (typeof key == 'string') {
key = this.stringToUtf8Array(key);
keyLength = key.length;
} else if (typeof key == 'object') {
keyLength = key.length;
}
if (keyLength > 32) {
throw 'key too long';
}
var param = [digestLength & 0xff, keyLength, 1, 1];
this.h = this.iv.slice(0);
// XOR part of parameter block.
this.h[0] ^= this.load32(param, 0);
this.x = new Array(64);
this.t0 = 0;
this.t1 = 0;
this.f0 = 0;
this.f1 = 0;
this.nx = 0;
this.digestLength = digestLength;
if (keyLength > 0) {
for (var i = 0; i < keyLength; i++) {
this.x[i] = key[i];
}
for (var i = keyLength; i < 64; i++) {
this.x[i] = 0;
}
this.nx = 64;
}
}
private processBlock(length : number) {
this.t0 += length;
if (this.t0 != this.t0>>>0) {
this.t0 = 0;
this.t1++;
}
var v0 = this.h[0],
v1 = this.h[1],
v2 = this.h[2],
v3 = this.h[3],
v4 = this.h[4],
v5 = this.h[5],
v6 = this.h[6],
v7 = this.h[7],
v8 = this.iv[0],
v9 = this.iv[1],
v10 = this.iv[2],
v11 = this.iv[3],
v12 = this.iv[4] ^ this.t0,
v13 = this.iv[5] ^ this.t1,
v14 = this.iv[6] ^ this.f0,
v15 = this.iv[7] ^ this.f1;
var m0 = this.load32(this.x, 0),
m1 = this.load32(this.x, 4),
m2 = this.load32(this.x, 8),
m3 = this.load32(this.x, 12),
m4 = this.load32(this.x, 16),
m5 = this.load32(this.x, 20),
m6 = this.load32(this.x, 24),
m7 = this.load32(this.x, 28),
m8 = this.load32(this.x, 32),
m9 = this.load32(this.x, 36),
m10 = this.load32(this.x, 40),
m11 = this.load32(this.x, 44),
m12 = this.load32(this.x, 48),
m13 = this.load32(this.x, 52),
m14 = this.load32(this.x, 56),
m15 = this.load32(this.x, 60);
// Round 1.
v0 += m0;
v0 += v4;
v12 ^= v0;
v12 = v12<<(32-16) | v12>>>16;
v8 += v12;
v4 ^= v8;
v4 = v4<<(32-12) | v4>>>12;
v1 += m2;
v1 += v5;
v13 ^= v1;
v13 = v13<<(32-16) | v13>>>16;
v9 += v13;
v5 ^= v9;
v5 = v5<<(32-12) | v5>>>12;
v2 += m4;
v2 += v6;
v14 ^= v2;
v14 = v14<<(32-16) | v14>>>16;
v10 += v14;
v6 ^= v10;
v6 = v6<<(32-12) | v6>>>12;
v3 += m6;
v3 += v7;
v15 ^= v3;
v15 = v15<<(32-16) | v15>>>16;
v11 += v15;
v7 ^= v11;
v7 = v7<<(32-12) | v7>>>12;
v2 += m5;
v2 += v6;
v14 ^= v2;
v14 = v14<<(32-8) | v14>>>8;
v10 += v14;
v6 ^= v10;
v6 = v6<<(32-7) | v6>>>7;
v3 += m7;
v3 += v7;
v15 ^= v3;
v15 = v15<<(32-8) | v15>>>8;
v11 += v15;
v7 ^= v11;
v7 = v7<<(32-7) | v7>>>7;
v1 += m3;
v1 += v5;
v13 ^= v1;
v13 = v13<<(32-8) | v13>>>8;
v9 += v13;
v5 ^= v9;
v5 = v5<<(32-7) | v5>>>7;
v0 += m1;
v0 += v4;
v12 ^= v0;
v12 = v12<<(32-8) | v12>>>8;
v8 += v12;
v4 ^= v8;
v4 = v4<<(32-7) | v4>>>7;
v0 += m8;
v0 += v5;
v15 ^= v0;
v15 = v15<<(32-16) | v15>>>16;
v10 += v15;
v5 ^= v10;
v5 = v5<<(32-12) | v5>>>12;
v1 += m10;
v1 += v6;
v12 ^= v1;
v12 = v12<<(32-16) | v12>>>16;
v11 += v12;
v6 ^= v11;
v6 = v6<<(32-12) | v6>>>12;
v2 += m12;
v2 += v7;
v13 ^= v2;
v13 = v13<<(32-16) | v13>>>16;
v8 += v13;
v7 ^= v8;
v7 = v7<<(32-12) | v7>>>12;
v3 += m14;
v3 += v4;
v14 ^= v3;
v14 = v14<<(32-16) | v14>>>16;
v9 += v14;
v4 ^= v9;
v4 = v4<<(32-12) | v4>>>12;
v2 += m13;
v2 += v7;
v13 ^= v2;
v13 = v13<<(32-8) | v13>>>8;
v8 += v13;
v7 ^= v8;
v7 = v7<<(32-7) | v7>>>7;
v3 += m15;
v3 += v4;
v14 ^= v3;
v14 = v14<<(32-8) | v14>>>8;
v9 += v14;
v4 ^= v9;
v4 = v4<<(32-7) | v4>>>7;
v1 += m11;
v1 += v6;
v12 ^= v1;
v12 = v12<<(32-8) | v12>>>8;
v11 += v12;
v6 ^= v11;
v6 = v6<<(32-7) | v6>>>7;
v0 += m9;
v0 += v5;
v15 ^= v0;
v15 = v15<<(32-8) | v15>>>8;
v10 += v15;
v5 ^= v10;
v5 = v5<<(32-7) | v5>>>7;
// Round 2.
v0 += m14;
v0 += v4;
v12 ^= v0;
v12 = v12<<(32-16) | v12>>>16;
v8 += v12;
v4 ^= v8;
v4 = v4<<(32-12) | v4>>>12;
v1 += m4;
v1 += v5;
v13 ^= v1;
v13 = v13<<(32-16) | v13>>>16;
v9 += v13;
v5 ^= v9;
v5 = v5<<(32-12) | v5>>>12;
v2 += m9;
v2 += v6;
v14 ^= v2;
v14 = v14<<(32-16) | v14>>>16;
v10 += v14;
v6 ^= v10;
v6 = v6<<(32-12) | v6>>>12;
v3 += m13;
v3 += v7;
v15 ^= v3;
v15 = v15<<(32-16) | v15>>>16;
v11 += v15;
v7 ^= v11;
v7 = v7<<(32-12) | v7>>>12;
v2 += m15;
v2 += v6;
v14 ^= v2;
v14 = v14<<(32-8) | v14>>>8;
v10 += v14;
v6 ^= v10;
v6 = v6<<(32-7) | v6>>>7;
v3 += m6;
v3 += v7;
v15 ^= v3;
v15 = v15<<(32-8) | v15>>>8;
v11 += v15;
v7 ^= v11;
v7 = v7<<(32-7) | v7>>>7;
v1 += m8;
v1 += v5;
v13 ^= v1;
v13 = v13<<(32-8) | v13>>>8;
v9 += v13;
v5 ^= v9;
v5 = v5<<(32-7) | v5>>>7;
v0 += m10;
v0 += v4;
v12 ^= v0;
v12 = v12<<(32-8) | v12>>>8;
v8 += v12;
v4 ^= v8;
v4 = v4<<(32-7) | v4>>>7;
v0 += m1;
v0 += v5;
v15 ^= v0;
v15 = v15<<(32-16) | v15>>>16;
v10 += v15;
v5 ^= v10;
v5 = v5<<(32-12) | v5>>>12;
v1 += m0;
v1 += v6;
v12 ^= v1;
v12 = v12<<(32-16) | v12>>>16;
v11 += v12;
v6 ^= v11;
v6 = v6<<(32-12) | v6>>>12;
v2 += m11;
v2 += v7;
v13 ^= v2;
v13 = v13<<(32-16) | v13>>>16;
v8 += v13;
v7 ^= v8;
v7 = v7<<(32-12) | v7>>>12;
v3 += m5;
v3 += v4;
v14 ^= v3;
v14 = v14<<(32-16) | v14>>>16;
v9 += v14;
v4 ^= v9;
v4 = v4<<(32-12) | v4>>>12;
v2 += m7;
v2 += v7;
v13 ^= v2;
v13 = v13<<(32-8) | v13>>>8;
v8 += v13;
v7 ^= v8;
v7 = v7<<(32-7) | v7>>>7;
v3 += m3;
v3 += v4;
v14 ^= v3;
v14 = v14<<(32-8) | v14>>>8;
v9 += v14;
v4 ^= v9;
v4 = v4<<(32-7) | v4>>>7;
v1 += m2;
v1 += v6;
v12 ^= v1;
v12 = v12<<(32-8) | v12>>>8;
v11 += v12;
v6 ^= v11;
v6 = v6<<(32-7) | v6>>>7;
v0 += m12;
v0 += v5;
v15 ^= v0;
v15 = v15<<(32-8) | v15>>>8;
v10 += v15;
v5 ^= v10;
v5 = v5<<(32-7) | v5>>>7;
// Round 3.
v0 += m11;
v0 += v4;
v12 ^= v0;
v12 = v12<<(32-16) | v12>>>16;
v8 += v12;
v4 ^= v8;
v4 = v4<<(32-12) | v4>>>12;
v1 += m12;
v1 += v5;
v13 ^= v1;
v13 = v13<<(32-16) | v13>>>16;
v9 += v13;
v5 ^= v9;
v5 = v5<<(32-12) | v5>>>12;
v2 += m5;
v2 += v6;
v14 ^= v2;
v14 = v14<<(32-16) | v14>>>16;
v10 += v14;
v6 ^= v10;
v6 = v6<<(32-12) | v6>>>12;
v3 += m15;
v3 += v7;
v15 ^= v3;
v15 = v15<<(32-16) | v15>>>16;
v11 += v15;
v7 ^= v11;
v7 = v7<<(32-12) | v7>>>12;
v2 += m2;
v2 += v6;
v14 ^= v2;
v14 = v14<<(32-8) | v14>>>8;
v10 += v14;
v6 ^= v10;
v6 = v6<<(32-7) | v6>>>7;
v3 += m13;
v3 += v7;
v15 ^= v3;
v15 = v15<<(32-8) | v15>>>8;
v11 += v15;
v7 ^= v11;
v7 = v7<<(32-7) | v7>>>7;
v1 += m0;
v1 += v5;
v13 ^= v1;
v13 = v13<<(32-8) | v13>>>8;
v9 += v13;
v5 ^= v9;
v5 = v5<<(32-7) | v5>>>7;
v0 += m8;
v0 += v4;
v12 ^= v0;
v12 = v12<<(32-8) | v12>>>8;
v8 += v12;
v4 ^= v8;
v4 = v4<<(32-7) | v4>>>7;
v0 += m10;
v0 += v5;
v15 ^= v0;
v15 = v15<<(32-16) | v15>>>16;
v10 += v15;
v5 ^= v10;
v5 = v5<<(32-12) | v5>>>12;
v1 += m3;
v1 += v6;
v12 ^= v1;
v12 = v12<<(32-16) | v12>>>16;
v11 += v12;
v6 ^= v11;
v6 = v6<<(32-12) | v6>>>12;
v2 += m7;
v2 += v7;
v13 ^= v2;
v13 = v13<<(32-16) | v13>>>16;
v8 += v13;
v7 ^= v8;
v7 = v7<<(32-12) | v7>>>12;
v3 += m9;
v3 += v4;
v14 ^= v3;
v14 = v14<<(32-16) | v14>>>16;
v9 += v14;
v4 ^= v9;
v4 = v4<<(32-12) | v4>>>12;
v2 += m1;
v2 += v7;
v13 ^= v2;
v13 = v13<<(32-8) | v13>>>8;
v8 += v13;
v7 ^= v8;
v7 = v7<<(32-7) | v7>>>7;
v3 += m4;
v3 += v4;
v14 ^= v3;
v14 = v14<<(32-8) | v14>>>8;
v9 += v14;
v4 ^= v9;
v4 = v4<<(32-7) | v4>>>7;
v1 += m6;
v1 += v6;
v12 ^= v1;
v12 = v12<<(32-8) | v12>>>8;
v11 += v12;
v6 ^= v11;
v6 = v6<<(32-7) | v6>>>7;
v0 += m14;
v0 += v5;
v15 ^= v0;
v15 = v15<<(32-8) | v15>>>8;
v10 += v15;
v5 ^= v10;
v5 = v5<<(32-7) | v5>>>7;
// Round 4.
v0 += m7;
v0 += v4;
v12 ^= v0;
v12 = v12<<(32-16) | v12>>>16;
v8 += v12;
v4 ^= v8;
v4 = v4<<(32-12) | v4>>>12;
v1 += m3;
v1 += v5;
v13 ^= v1;
v13 = v13<<(32-16) | v13>>>16;
v9 += v13;
v5 ^= v9;
v5 = v5<<(32-12) | v5>>>12;
v2 += m13;
v2 += v6;
v14 ^= v2;
v14 = v14<<(32-16) | v14>>>16;
v10 += v14;
v6 ^= v10;
v6 = v6<<(32-12) | v6>>>12;
v3 += m11;
v3 += v7;
v15 ^= v3;
v15 = v15<<(32-16) | v15>>>16;
v11 += v15;
v7 ^= v11;
v7 = v7<<(32-12) | v7>>>12;
v2 += m12;
v2 += v6;
v14 ^= v2;
v14 = v14<<(32-8) | v14>>>8;
v10 += v14;
v6 ^= v10;
v6 = v6<<(32-7) | v6>>>7;
v3 += m14;
v3 += v7;
v15 ^= v3;
v15 = v15<<(32-8) | v15>>>8;
v11 += v15;
v7 ^= v11;
v7 = v7<<(32-7) | v7>>>7;
v1 += m1;
v1 += v5;
v13 ^= v1;
v13 = v13<<(32-8) | v13>>>8;
v9 += v13;
v5 ^= v9;
v5 = v5<<(32-7) | v5>>>7;
v0 += m9;
v0 += v4;
v12 ^= v0;
v12 = v12<<(32-8) | v12>>>8;
v8 += v12;
v4 ^= v8;
v4 = v4<<(32-7) | v4>>>7;
v0 += m2;
v0 += v5;
v15 ^= v0;
v15 = v15<<(32-16) | v15>>>16;
v10 += v15;
v5 ^= v10;
v5 = v5<<(32-12) | v5>>>12;
v1 += m5;
v1 += v6;
v12 ^= v1;
v12 = v12<<(32-16) | v12>>>16;
v11 += v12;
v6 ^= v11;
v6 = v6<<(32-12) | v6>>>12;
v2 += m4;
v2 += v7;
v13 ^= v2;
v13 = v13<<(32-16) | v13>>>16;
v8 += v13;
v7 ^= v8;
v7 = v7<<(32-12) | v7>>>12;
v3 += m15;
v3 += v4;
v14 ^= v3;
v14 = v14<<(32-16) | v14>>>16;
v9 += v14;
v4 ^= v9;
v4 = v4<<(32-12) | v4>>>12;
v2 += m0;
v2 += v7;
v13 ^= v2;
v13 = v13<<(32-8) | v13>>>8;
v8 += v13;
v7 ^= v8;
v7 = v7<<(32-7) | v7>>>7;
v3 += m8;
v3 += v4;
v14 ^= v3;
v14 = v14<<(32-8) | v14>>>8;
v9 += v14;
v4 ^= v9;
v4 = v4<<(32-7) | v4>>>7;
v1 += m10;
v1 += v6;
v12 ^= v1;
v12 = v12<<(32-8) | v12>>>8;
v11 += v12;
v6 ^= v11;
v6 = v6<<(32-7) | v6>>>7;
v0 += m6;
v0 += v5;
v15 ^= v0;
v15 = v15<<(32-8) | v15>>>8;
v10 += v15;
v5 ^= v10;
v5 = v5<<(32-7) | v5>>>7;
// Round 5.
v0 += m9;
v0 += v4;
v12 ^= v0;
v12 = v12<<(32-16) | v12>>>16;
v8 += v12;
v4 ^= v8;
v4 = v4<<(32-12) | v4>>>12;
v1 += m5;
v1 += v5;
v13 ^= v1;
v13 = v13<<(32-16) | v13>>>16;
v9 += v13;
v5 ^= v9;
v5 = v5<<(32-12) | v5>>>12;
v2 += m2;
v2 += v6;
v14 ^= v2;
v14 = v14<<(32-16) | v14>>>16;
v10 += v14;
v6 ^= v10;
v6 = v6<<(32-12) | v6>>>12;
v3 += m10;
v3 += v7;
v15 ^= v3;
v15 = v15<<(32-16) | v15>>>16;
v11 += v15;
v7 ^= v11;
v7 = v7<<(32-12) | v7>>>12;
v2 += m4;
v2 += v6;
v14 ^= v2;
v14 = v14<<(32-8) | v14>>>8;
v10 += v14;
v6 ^= v10;
v6 = v6<<(32-7) | v6>>>7;
v3 += m15;
v3 += v7;
v15 ^= v3;
v15 = v15<<(32-8) | v15>>>8;
v11 += v15;
v7 ^= v11;
v7 = v7<<(32-7) | v7>>>7;
v1 += m7;
v1 += v5;
v13 ^= v1;
v13 = v13<<(32-8) | v13>>>8;
v9 += v13;
v5 ^= v9;
v5 = v5<<(32-7) | v5>>>7;
v0 += m0;
v0 += v4;
v12 ^= v0;
v12 = v12<<(32-8) | v12>>>8;
v8 += v12;
v4 ^= v8;
v4 = v4<<(32-7) | v4>>>7;
v0 += m14;
v0 += v5;
v15 ^= v0;
v15 = v15<<(32-16) | v15>>>16;
v10 += v15;
v5 ^= v10;
v5 = v5<<(32-12) | v5>>>12;
v1 += m11;
v1 += v6;
v12 ^= v1;
v12 = v12<<(32-16) | v12>>>16;
v11 += v12;
v6 ^= v11;
v6 = v6<<(32-12) | v6>>>12;
v2 += m6;
v2 += v7;
v13 ^= v2;
v13 = v13<<(32-16) | v13>>>16;
v8 += v13;
v7 ^= v8;
v7 = v7<<(32-12) | v7>>>12;
v3 += m3;
v3 += v4;
v14 ^= v3;
v14 = v14<<(32-16) | v14>>>16;
v9 += v14;
v4 ^= v9;
v4 = v4<<(32-12) | v4>>>12;
v2 += m8;
v2 += v7;
v13 ^= v2;
v13 = v13<<(32-8) | v13>>>8;
v8 += v13;
v7 ^= v8;
v7 = v7<<(32-7) | v7>>>7;
v3 += m13;
v3 += v4;
v14 ^= v3;
v14 = v14<<(32-8) | v14>>>8;
v9 += v14;
v4 ^= v9;
v4 = v4<<(32-7) | v4>>>7;
v1 += m12;
v1 += v6;
v12 ^= v1;
v12 = v12<<(32-8) | v12>>>8;
v11 += v12;
v6 ^= v11;
v6 = v6<<(32-7) | v6>>>7;
v0 += m1;
v0 += v5;
v15 ^= v0;
v15 = v15<<(32-8) | v15>>>8;
v10 += v15;
v5 ^= v10;
v5 = v5<<(32-7) | v5>>>7;
// Round 6.
v0 += m2;
v0 += v4;
v12 ^= v0;
v12 = v12<<(32-16) | v12>>>16;
v8 += v12;
v4 ^= v8;
v4 = v4<<(32-12) | v4>>>12;
v1 += m6;
v1 += v5;
v13 ^= v1;
v13 = v13<<(32-16) | v13>>>16;
v9 += v13;
v5 ^= v9;
v5 = v5<<(32-12) | v5>>>12;
v2 += m0;
v2 += v6;
v14 ^= v2;
v14 = v14<<(32-16) | v14>>>16;
v10 += v14;
v6 ^= v10;
v6 = v6<<(32-12) | v6>>>12;
v3 += m8;
v3 += v7;
v15 ^= v3;
v15 = v15<<(32-16) | v15>>>16;
v11 += v15;
v7 ^= v11;
v7 = v7<<(32-12) | v7>>>12;
v2 += m11;
v2 += v6;
v14 ^= v2;
v14 = v14<<(32-8) | v14>>>8;
v10 += v14;
v6 ^= v10;
v6 = v6<<(32-7) | v6>>>7;
v3 += m3;
v3 += v7;
v15 ^= v3;
v15 = v15<<(32-8) | v15>>>8;
v11 += v15;
v7 ^= v11;
v7 = v7<<(32-7) | v7>>>7;
v1 += m10;
v1 += v5;
v13 ^= v1;
v13 = v13<<(32-8) | v13>>>8;
v9 += v13;
v5 ^= v9;
v5 = v5<<(32-7) | v5>>>7;
v0 += m12;
v0 += v4;
v12 ^= v0;
v12 = v12<<(32-8) | v12>>>8;
v8 += v12;
v4 ^= v8;
v4 = v4<<(32-7) | v4>>>7;
v0 += m4;
v0 += v5;
v15 ^= v0;
v15 = v15<<(32-16) | v15>>>16;
v10 += v15;
v5 ^= v10;
v5 = v5<<(32-12) | v5>>>12;
v1 += m7;
v1 += v6;
v12 ^= v1;
v12 = v12<<(32-16) | v12>>>16;
v11 += v12;
v6 ^= v11;
v6 = v6<<(32-12) | v6>>>12;
v2 += m15;
v2 += v7;
v13 ^= v2;
v13 = v13<<(32-16) | v13>>>16;
v8 += v13;
v7 ^= v8;
v7 = v7<<(32-12) | v7>>>12;
v3 += m1;
v3 += v4;
v14 ^= v3;
v14 = v14<<(32-16) | v14>>>16;
v9 += v14;
v4 ^= v9;
v4 = v4<<(32-12) | v4>>>12;
v2 += m14;
v2 += v7;
v13 ^= v2;
v13 = v13<<(32-8) | v13>>>8;
v8 += v13;
v7 ^= v8;
v7 = v7<<(32-7) | v7>>>7;
v3 += m9;
v3 += v4;
v14 ^= v3;
v14 = v14<<(32-8) | v14>>>8;
v9 += v14;
v4 ^= v9;
v4 = v4<<(32-7) | v4>>>7;
v1 += m5;
v1 += v6;
v12 ^= v1;
v12 = v12<<(32-8) | v12>>>8;
v11 += v12;
v6 ^= v11;
v6 = v6<<(32-7) | v6>>>7;
v0 += m13;
v0 += v5;
v15 ^= v0;
v15 = v15<<(32-8) | v15>>>8;
v10 += v15;
v5 ^= v10;
v5 = v5<<(32-7) | v5>>>7;
// Round 7.
v0 += m12;
v0 += v4;
v12 ^= v0;
v12 = v12<<(32-16) | v12>>>16;
v8 += v12;
v4 ^= v8;
v4 = v4<<(32-12) | v4>>>12;
v1 += m1;
v1 += v5;
v13 ^= v1;
v13 = v13<<(32-16) | v13>>>16;
v9 += v13;
v5 ^= v9;
v5 = v5<<(32-12) | v5>>>12;
v2 += m14;
v2 += v6;
v14 ^= v2;
v14 = v14<<(32-16) | v14>>>16;
v10 += v14;
v6 ^= v10;
v6 = v6<<(32-12) | v6>>>12;
v3 += m4;
v3 += v7;
v15 ^= v3;
v15 = v15<<(32-16) | v15>>>16;
v11 += v15;
v7 ^= v11;
v7 = v7<<(32-12) | v7>>>12;
v2 += m13;
v2 += v6;
v14 ^= v2;
v14 = v14<<(32-8) | v14>>>8;
v10 += v14;
v6 ^= v10;
v6 = v6<<(32-7) | v6>>>7;
v3 += m10;
v3 += v7;
v15 ^= v3;
v15 = v15<<(32-8) | v15>>>8;
v11 += v15;
v7 ^= v11;
v7 = v7<<(32-7) | v7>>>7;
v1 += m15;
v1 += v5;
v13 ^= v1;
v13 = v13<<(32-8) | v13>>>8;
v9 += v13;
v5 ^= v9;
v5 = v5<<(32-7) | v5>>>7;
v0 += m5;
v0 += v4;
v12 ^= v0;
v12 = v12<<(32-8) | v12>>>8;
v8 += v12;
v4 ^= v8;
v4 = v4<<(32-7) | v4>>>7;
v0 += m0;
v0 += v5;
v15 ^= v0;
v15 = v15<<(32-16) | v15>>>16;
v10 += v15;
v5 ^= v10;
v5 = v5<<(32-12) | v5>>>12;
v1 += m6;
v1 += v6;
v12 ^= v1;
v12 = v12<<(32-16) | v12>>>16;
v11 += v12;
v6 ^= v11;
v6 = v6<<(32-12) | v6>>>12;
v2 += m9;
v2 += v7;
v13 ^= v2;
v13 = v13<<(32-16) | v13>>>16;
v8 += v13;
v7 ^= v8;
v7 = v7<<(32-12) | v7>>>12;
v3 += m8;
v3 += v4;
v14 ^= v3;
v14 = v14<<(32-16) | v14>>>16;
v9 += v14;
v4 ^= v9;
v4 = v4<<(32-12) | v4>>>12;
v2 += m2;
v2 += v7;
v13 ^= v2;
v13 = v13<<(32-8) | v13>>>8;
v8 += v13;
v7 ^= v8;
v7 = v7<<(32-7) | v7>>>7;
v3 += m11;
v3 += v4;
v14 ^= v3;
v14 = v14<<(32-8) | v14>>>8;
v9 += v14;
v4 ^= v9;
v4 = v4<<(32-7) | v4>>>7;
v1 += m3;
v1 += v6;
v12 ^= v1;
v12 = v12<<(32-8) | v12>>>8;
v11 += v12;
v6 ^= v11;
v6 = v6<<(32-7) | v6>>>7;
v0 += m7;
v0 += v5;
v15 ^= v0;
v15 = v15<<(32-8) | v15>>>8;
v10 += v15;
v5 ^= v10;
v5 = v5<<(32-7) | v5>>>7;
// Round 8.
v0 += m13;
v0 += v4;
v12 ^= v0;
v12 = v12<<(32-16) | v12>>>16;
v8 += v12;
v4 ^= v8;
v4 = v4<<(32-12) | v4>>>12;
v1 += m7;
v1 += v5;
v13 ^= v1;
v13 = v13<<(32-16) | v13>>>16;
v9 += v13;
v5 ^= v9;
v5 = v5<<(32-12) | v5>>>12;
v2 += m12;
v2 += v6;
v14 ^= v2;
v14 = v14<<(32-16) | v14>>>16;
v10 += v14;
v6 ^= v10;
v6 = v6<<(32-12) | v6>>>12;
v3 += m3;
v3 += v7;
v15 ^= v3;
v15 = v15<<(32-16) | v15>>>16;
v11 += v15;
v7 ^= v11;
v7 = v7<<(32-12) | v7>>>12;
v2 += m1;
v2 += v6;
v14 ^= v2;
v14 = v14<<(32-8) | v14>>>8;
v10 += v14;
v6 ^= v10;
v6 = v6<<(32-7) | v6>>>7;
v3 += m9;
v3 += v7;
v15 ^= v3;
v15 = v15<<(32-8) | v15>>>8;
v11 += v15;
v7 ^= v11;
v7 = v7<<(32-7) | v7>>>7;
v1 += m14;
v1 += v5;
v13 ^= v1;
v13 = v13<<(32-8) | v13>>>8;
v9 += v13;
v5 ^= v9;
v5 = v5<<(32-7) | v5>>>7;
v0 += m11;
v0 += v4;
v12 ^= v0;
v12 = v12<<(32-8) | v12>>>8;
v8 += v12;
v4 ^= v8;
v4 = v4<<(32-7) | v4>>>7;
v0 += m5;
v0 += v5;
v15 ^= v0;
v15 = v15<<(32-16) | v15>>>16;
v10 += v15;
v5 ^= v10;
v5 = v5<<(32-12) | v5>>>12;
v1 += m15;
v1 += v6;
v12 ^= v1;
v12 = v12<<(32-16) | v12>>>16;
v11 += v12;
v6 ^= v11;
v6 = v6<<(32-12) | v6>>>12;
v2 += m8;
v2 += v7;
v13 ^= v2;
v13 = v13<<(32-16) | v13>>>16;
v8 += v13;
v7 ^= v8;
v7 = v7<<(32-12) | v7>>>12;
v3 += m2;
v3 += v4;
v14 ^= v3;
v14 = v14<<(32-16) | v14>>>16;
v9 += v14;
v4 ^= v9;
v4 = v4<<(32-12) | v4>>>12;
v2 += m6;
v2 += v7;
v13 ^= v2;
v13 = v13<<(32-8) | v13>>>8;
v8 += v13;
v7 ^= v8;
v7 = v7<<(32-7) | v7>>>7;
v3 += m10;
v3 += v4;
v14 ^= v3;
v14 = v14<<(32-8) | v14>>>8;
v9 += v14;
v4 ^= v9;
v4 = v4<<(32-7) | v4>>>7;
v1 += m4;
v1 += v6;
v12 ^= v1;
v12 = v12<<(32-8) | v12>>>8;
v11 += v12;
v6 ^= v11;
v6 = v6<<(32-7) | v6>>>7;
v0 += m0;
v0 += v5;
v15 ^= v0;
v15 = v15<<(32-8) | v15>>>8;
v10 += v15;
v5 ^= v10;
v5 = v5<<(32-7) | v5>>>7;
// Round 9.
v0 += m6;
v0 += v4;
v12 ^= v0;
v12 = v12<<(32-16) | v12>>>16;
v8 += v12;
v4 ^= v8;
v4 = v4<<(32-12) | v4>>>12;
v1 += m14;
v1 += v5;
v13 ^= v1;
v13 = v13<<(32-16) | v13>>>16;
v9 += v13;
v5 ^= v9;
v5 = v5<<(32-12) | v5>>>12;
v2 += m11;
v2 += v6;
v14 ^= v2;
v14 = v14<<(32-16) | v14>>>16;
v10 += v14;
v6 ^= v10;
v6 = v6<<(32-12) | v6>>>12;
v3 += m0;
v3 += v7;
v15 ^= v3;
v15 = v15<<(32-16) | v15>>>16;
v11 += v15;
v7 ^= v11;
v7 = v7<<(32-12) | v7>>>12;
v2 += m3;
v2 += v6;
v14 ^= v2;
v14 = v14<<(32-8) | v14>>>8;
v10 += v14;
v6 ^= v10;
v6 = v6<<(32-7) | v6>>>7;
v3 += m8;
v3 += v7;
v15 ^= v3;
v15 = v15<<(32-8) | v15>>>8;
v11 += v15;
v7 ^= v11;
v7 = v7<<(32-7) | v7>>>7;
v1 += m9;
v1 += v5;
v13 ^= v1;
v13 = v13<<(32-8) | v13>>>8;
v9 += v13;
v5 ^= v9;
v5 = v5<<(32-7) | v5>>>7;
v0 += m15;
v0 += v4;
v12 ^= v0;
v12 = v12<<(32-8) | v12>>>8;
v8 += v12;
v4 ^= v8;
v4 = v4<<(32-7) | v4>>>7;
v0 += m12;
v0 += v5;
v15 ^= v0;
v15 = v15<<(32-16) | v15>>>16;
v10 += v15;
v5 ^= v10;
v5 = v5<<(32-12) | v5>>>12;
v1 += m13;
v1 += v6;
v12 ^= v1;
v12 = v12<<(32-16) | v12>>>16;
v11 += v12;
v6 ^= v11;
v6 = v6<<(32-12) | v6>>>12;
v2 += m1;
v2 += v7;
v13 ^= v2;
v13 = v13<<(32-16) | v13>>>16;
v8 += v13;
v7 ^= v8;
v7 = v7<<(32-12) | v7>>>12;
v3 += m10;
v3 += v4;
v14 ^= v3;
v14 = v14<<(32-16) | v14>>>16;
v9 += v14;
v4 ^= v9;
v4 = v4<<(32-12) | v4>>>12;
v2 += m4;
v2 += v7;
v13 ^= v2;
v13 = v13<<(32-8) | v13>>>8;
v8 += v13;
v7 ^= v8;
v7 = v7<<(32-7) | v7>>>7;
v3 += m5;
v3 += v4;
v14 ^= v3;
v14 = v14<<(32-8) | v14>>>8;
v9 += v14;
v4 ^= v9;
v4 = v4<<(32-7) | v4>>>7;
v1 += m7;
v1 += v6;
v12 ^= v1;
v12 = v12<<(32-8) | v12>>>8;
v11 += v12;
v6 ^= v11;
v6 = v6<<(32-7) | v6>>>7;
v0 += m2;
v0 += v5;
v15 ^= v0;
v15 = v15<<(32-8) | v15>>>8;
v10 += v15;
v5 ^= v10;
v5 = v5<<(32-7) | v5>>>7;
// Round 10.
v0 += m10;
v0 += v4;
v12 ^= v0;
v12 = v12<<(32-16) | v12>>>16;
v8 += v12;
v4 ^= v8;
v4 = v4<<(32-12) | v4>>>12;
v1 += m8;
v1 += v5;
v13 ^= v1;
v13 = v13<<(32-16) | v13>>>16;
v9 += v13;
v5 ^= v9;
v5 = v5<<(32-12) | v5>>>12;
v2 += m7;
v2 += v6;
v14 ^= v2;
v14 = v14<<(32-16) | v14>>>16;
v10 += v14;
v6 ^= v10;
v6 = v6<<(32-12) | v6>>>12;
v3 += m1;
v3 += v7;
v15 ^= v3;
v15 = v15<<(32-16) | v15>>>16;
v11 += v15;
v7 ^= v11;
v7 = v7<<(32-12) | v7>>>12;
v2 += m6;
v2 += v6;
v14 ^= v2;
v14 = v14<<(32-8) | v14>>>8;
v10 += v14;
v6 ^= v10;
v6 = v6<<(32-7) | v6>>>7;
v3 += m5;
v3 += v7;
v15 ^= v3;
v15 = v15<<(32-8) | v15>>>8;
v11 += v15;
v7 ^= v11;
v7 = v7<<(32-7) | v7>>>7;
v1 += m4;
v1 += v5;
v13 ^= v1;
v13 = v13<<(32-8) | v13>>>8;
v9 += v13;
v5 ^= v9;
v5 = v5<<(32-7) | v5>>>7;
v0 += m2;
v0 += v4;
v12 ^= v0;
v12 = v12<<(32-8) | v12>>>8;
v8 += v12;
v4 ^= v8;
v4 = v4<<(32-7) | v4>>>7;
v0 += m15;
v0 += v5;
v15 ^= v0;
v15 = v15<<(32-16) | v15>>>16;
v10 += v15;
v5 ^= v10;
v5 = v5<<(32-12) | v5>>>12;
v1 += m9;
v1 += v6;
v12 ^= v1;
v12 = v12<<(32-16) | v12>>>16;
v11 += v12;
v6 ^= v11;
v6 = v6<<(32-12) | v6>>>12;
v2 += m3;
v2 += v7;
v13 ^= v2;
v13 = v13<<(32-16) | v13>>>16;
v8 += v13;
v7 ^= v8;
v7 = v7<<(32-12) | v7>>>12;
v3 += m13;
v3 += v4;
v14 ^= v3;
v14 = v14<<(32-16) | v14>>>16;
v9 += v14;
v4 ^= v9;
v4 = v4<<(32-12) | v4>>>12;
v2 += m12;
v2 += v7;
v13 ^= v2;
v13 = v13<<(32-8) | v13>>>8;
v8 += v13;
v7 ^= v8;
v7 = v7<<(32-7) | v7>>>7;
v3 += m0;
v3 += v4;
v14 ^= v3;
v14 = v14<<(32-8) | v14>>>8;
v9 += v14;
v4 ^= v9;
v4 = v4<<(32-7) | v4>>>7;
v1 += m14;
v1 += v6;
v12 ^= v1;
v12 = v12<<(32-8) | v12>>>8;
v11 += v12;
v6 ^= v11;
v6 = (v6<<(32-7)) | (v6>>>7);
v0 += m11;
v0 += v5;
v15 ^= v0;
v15 = (v15<<(32-8)) | (v15>>>8);
v10 += v15;
v5 ^= v10;
v5 = (v5<<(32-7)) | (v5>>>7);
this.h[0] ^= v0 ^ v8;
this.h[1] ^= v1 ^ v9;
this.h[2] ^= v2 ^ v10;
this.h[3] ^= v3 ^ v11;
this.h[4] ^= v4 ^ v12;
this.h[5] ^= v5 ^ v13;
this.h[6] ^= v6 ^ v14;
this.h[7] ^= v7 ^ v15;
}
private stringToUtf8Array(s : string) : number[] {
var arr = [];
for (var i = 0; i < s.length; i++) {
var c = s.charCodeAt(i);
if (c < 128) {
arr.push(c);
} else if (c > 127 && c < 2048) {
arr.push((c>>6) | 192);
arr.push((c & 63) | 128);
} else {
arr.push((c>>12) | 224);
arr.push(((c>>6) & 63) | 128);
arr.push((c & 64) | 128);
}
}
return arr;
}
update(p : any, offset : number = 0, length : number = p.length) {
if (this.isFinished) {
throw 'update() after calling digest()';
}
if (typeof p == 'string') {
if (offset != 0) {
throw 'offset not supported for strings';
}
p = this.stringToUtf8Array(p);
length = p.length;
offset = 0;
} else if (typeof p != 'object') {
throw 'unsupported object: string or array required';
}
if (length == 0) {
return;
}
var left = 64 - this.nx;
if (length > left) {
// Process buffer.
for (var i = 0; i < left; i++) {
this.x[this.nx+i] = p[offset+i];
}
this.processBlock(64);
offset += left;
length -= left;
this.nx = 0;
}
while (length > 64) {
for (var i = 0; i < 64; i++) {
this.x[i] = p[offset+i];
}
this.processBlock(64);
offset += 64;
length -= 64;
this.nx = 0;
}
for (var i = 0; i < length; i++) {
this.x[this.nx+i] = p[offset+i];
}
this.nx += length;
}
digest() : number[] {
if (this.isFinished) {
return this.result;
}
// Pad buffer with zeros.
for (var i = this.nx; i < 64; i++) {
this.x[i] = 0;
}
// Set last block flag.
this.f0 = 0xffffffff;
//TODO in tree mode, set f1 to 0xffffffff.
this.processBlock(this.nx);
var out = new Array(32);
for (var i = 0; i < 8; i++) {
var h = this.h[i];
out[i*4+0] = (h>>>0) & 0xff;
out[i*4+1] = (h>>>8) & 0xff;
out[i*4+2] = (h>>>16) & 0xff;
out[i*4+3] = (h>>>24) & 0xff;
}
this.result = out.slice(0, this.digestLength);
this.isFinished = true;
return this.result;
}
hexDigest() : string {
var hex = ['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'];
var out = [];
var d = this.digest();
for (var i = 0; i < d.length; i++) {
out.push(hex[(d[i]>>4) & 0xf]);
out.push(hex[d[i] & 0xf]);
}
return out.join('');
}
}