UNPKG

blake2s

Version:

port of Dmitry Chestnykh's blake2s-js to node style

1,367 lines (1,334 loc) 33.6 kB
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(''); } }