From 8c5a5a99e4291ad8d90923211a6879c16703faa1 Mon Sep 17 00:00:00 2001 From: Chen Yi-Cyuan Date: Sun, 1 Mar 2015 14:20:03 +0800 Subject: [PATCH] Improve performance. --- CHANGELOG.md | 4 + bower.json | 2 +- build/md4.min.js | 25 +++-- package.json | 2 +- src/md4.js | 239 +++++++++++++++++++++++++++++------------------ 5 files changed, 172 insertions(+), 100 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 18e2537..5660c6c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# v0.1.1 / 2015-03-01 + +Improve performance. + # v0.1.0 / 2015-03-01 Initial release diff --git a/bower.json b/bower.json index 7b99925..0138028 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "js-md4", - "version": "0.1.0", + "version": "0.1.1", "main": ["build/md4.min.js"], "ignore": [ "samples", diff --git a/build/md4.min.js b/build/md4.min.js index 6fadf5c..662a001 100644 --- a/build/md4.min.js +++ b/build/md4.min.js @@ -1,7 +1,18 @@ -(function(r,C){function n(c,d){return c<>>32-d}function p(c,d,h,k,l,b){return n(c+(d&h|~d&k)+l,b)}function q(c,d,h,k,l,b){return n(c+(d&h|d&k|h&k)+l+1518500249,b)}var w="undefined"!=typeof module;w&&(r=global,r.JS_MD4_TEST&&(r.navigator={userAgent:"Firefox"}));var A=(r.JS_MD4_TEST||!w)&&-1!=navigator.userAgent.indexOf("Firefox"),z=!r.JS_MD4_TEST&&"undefined"!=typeof ArrayBuffer,d="0123456789abcdef".split(""),B=[128,32768,8388608,-2147483648],x=[0,8,16,24],c=[],v;if(z){var u=new ArrayBuffer(68); -v=new Uint8Array(u);c=new Uint32Array(u)}u=function(g){var m,h,k,l,b,a,e,f,r=!1,t=0,u=0,w=0,y=g.length;m=1732584193;h=4023233417;k=2562383102;l=271733878;c[16]=0;do{c[0]=c[16];c[16]=c[1]=c[2]=c[3]=c[4]=c[5]=c[6]=c[7]=c[8]=c[9]=c[10]=c[11]=c[12]=c[13]=c[14]=c[15]=0;if(z)for(a=u;ta;++t)b=g.charCodeAt(t),128>b?v[a++]=b:(2048>b?v[a++]=192|b>>6:(55296>b||57344<=b?v[a++]=224|b>>12:(b=65536+((b&1023)<<10|g.charCodeAt(++t)&1023),v[a++]=240|b>>18,v[a++]=128|b>>12&63),v[a++]=128|b>>6&63),v[a++]=128| -b&63);else for(a=u;ta;++t)b=g.charCodeAt(t),128>b?c[a>>2]|=b<b?c[a>>2]|=(192|b>>6)<b||57344<=b?c[a>>2]|=(224|b>>12)<>2]|=(240|b>>18)<>2]|=(128|b>>12&63)<>2]|=(128|b>>6&63)<>2]|=(128|b&63)<>2]|=B[a&3],++t);t>y&&56>a&&(c[14]=w<<3,r=!0);b=m;a=h;e=k;f=l;b=p(b,a,e,f,c[0],3);f=p(f,b,a,e,c[1],7);e=p(e,f,b,a,c[2],11);a=p(a,e,f, -b,c[3],19);b=p(b,a,e,f,c[4],3);f=p(f,b,a,e,c[5],7);e=p(e,f,b,a,c[6],11);a=p(a,e,f,b,c[7],19);b=p(b,a,e,f,c[8],3);f=p(f,b,a,e,c[9],7);e=p(e,f,b,a,c[10],11);a=p(a,e,f,b,c[11],19);b=p(b,a,e,f,c[12],3);f=p(f,b,a,e,c[13],7);e=p(e,f,b,a,c[14],11);a=p(a,e,f,b,c[15],19);b=q(b,a,e,f,c[0],3);f=q(f,b,a,e,c[4],5);e=q(e,f,b,a,c[8],9);a=q(a,e,f,b,c[12],13);b=q(b,a,e,f,c[1],3);f=q(f,b,a,e,c[5],5);e=q(e,f,b,a,c[9],9);a=q(a,e,f,b,c[13],13);b=q(b,a,e,f,c[2],3);f=q(f,b,a,e,c[6],5);e=q(e,f,b,a,c[10],9);a=q(a,e,f,b,c[14], -13);b=q(b,a,e,f,c[3],3);f=q(f,b,a,e,c[7],5);e=q(e,f,b,a,c[11],9);a=q(a,e,f,b,c[15],13);b=n(b+(a^e^f)+c[0]+1859775393,3);f=n(f+(b^a^e)+c[8]+1859775393,9);e=n(e+(f^b^a)+c[4]+1859775393,11);a=n(a+(e^f^b)+c[12]+1859775393,15);b=n(b+(a^e^f)+c[2]+1859775393,3);f=n(f+(b^a^e)+c[10]+1859775393,9);e=n(e+(f^b^a)+c[6]+1859775393,11);a=n(a+(e^f^b)+c[14]+1859775393,15);b=n(b+(a^e^f)+c[1]+1859775393,3);f=n(f+(b^a^e)+c[9]+1859775393,9);e=n(e+(f^b^a)+c[5]+1859775393,11);a=n(a+(e^f^b)+c[13]+1859775393,15);b=n(b+(a^ -e^f)+c[3]+1859775393,3);f=n(f+(b^a^e)+c[11]+1859775393,9);e=n(e+(f^b^a)+c[7]+1859775393,11);a=n(a+(e^f^b)+c[15]+1859775393,15);m=m+b<<0;h=h+a<<0;k=k+e<<0;l=l+f<<0}while(!r);return A?(g=d[m>>4&15]+d[m&15],g+=d[m>>12&15]+d[m>>8&15],g+=d[m>>20&15]+d[m>>16&15],g+=d[m>>28&15]+d[m>>24&15],g+=d[h>>4&15]+d[h&15],g+=d[h>>12&15]+d[h>>8&15],g+=d[h>>20&15]+d[h>>16&15],g+=d[h>>28&15]+d[h>>24&15],g+=d[k>>4&15]+d[k&15],g+=d[k>>12&15]+d[k>>8&15],g+=d[k>>20&15]+d[k>>16&15],g+=d[k>>28&15]+d[k>>24&15],g+=d[l>>4&15]+ -d[l&15],g+=d[l>>12&15]+d[l>>8&15],g+=d[l>>20&15]+d[l>>16&15],g+=d[l>>28&15]+d[l>>24&15]):d[m>>4&15]+d[m&15]+d[m>>12&15]+d[m>>8&15]+d[m>>20&15]+d[m>>16&15]+d[m>>28&15]+d[m>>24&15]+d[h>>4&15]+d[h&15]+d[h>>12&15]+d[h>>8&15]+d[h>>20&15]+d[h>>16&15]+d[h>>28&15]+d[h>>24&15]+d[k>>4&15]+d[k&15]+d[k>>12&15]+d[k>>8&15]+d[k>>20&15]+d[k>>16&15]+d[k>>28&15]+d[k>>24&15]+d[l>>4&15]+d[l&15]+d[l>>12&15]+d[l>>8&15]+d[l>>20&15]+d[l>>16&15]+d[l>>28&15]+d[l>>24&15]};!r.JS_MD4_TEST&&w?module.exports=u:r&&(r.md4=u)})(this); +/* + * js-md4 v0.1.1 + * https://github.com/emn178/js-md4 + * + * Copyright 2015, emn178@gmail.com + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ +(function(q,C){var v="undefined"!=typeof module;v&&(q=global,q.JS_MD4_TEST&&(q.navigator={userAgent:"Firefox"}));var A=(q.JS_MD4_TEST||!v)&&-1!=navigator.userAgent.indexOf("Firefox"),z=!q.JS_MD4_TEST&&"undefined"!=typeof ArrayBuffer,f="0123456789abcdef".split(""),B=[128,32768,8388608,-2147483648],w=[0,8,16,24],e=[],t;if(z){var u=new ArrayBuffer(68);t=new Uint8Array(u);e=new Uint32Array(u)}u=function(h){var l,m,n,p,b,a,d,c,k,g,q=!0,u=!1,r=0,x=0,v=0,y=h.length;e[16]=0;do{e[0]=e[16];e[16]=e[1]=e[2]= +e[3]=e[4]=e[5]=e[6]=e[7]=e[8]=e[9]=e[10]=e[11]=e[12]=e[13]=e[14]=e[15]=0;if(z)for(a=x;ra;++r)b=h.charCodeAt(r),128>b?t[a++]=b:(2048>b?t[a++]=192|b>>6:(55296>b||57344<=b?t[a++]=224|b>>12:(b=65536+((b&1023)<<10|h.charCodeAt(++r)&1023),t[a++]=240|b>>18,t[a++]=128|b>>12&63),t[a++]=128|b>>6&63),t[a++]=128|b&63);else for(a=x;ra;++r)b=h.charCodeAt(r),128>b?e[a>>2]|=b<b?e[a>>2]|=(192|b>>6)<b||57344<=b?e[a>>2]|=(224|b>>12)<>2]|=(240|b>>18)<>2]|=(128|b>>12&63)<>2]|=(128|b>>6&63)<>2]|=(128|b&63)<>2]|=B[a&3],++r);r>y&&56>a&&(e[14]=v<<3,u=!0);q?(b=e[0]-1,b=b<<3|b>>>29,c=(b&4023233417|~b&2562383102)+e[1]+271733878,c=c<<7|c>>>25,d=(c&b|~c&4023233417)+e[2]-1732584194,d=d<<11|d>>>21,a=(d&c|~d&b)+e[3]-271733879):(b=l,a=m,d=n,c=p,b+=(a&d|~a&c)+e[0],b=b<<3|b>>>29,c+=(b&a|~b&d)+e[1],c=c<<7|c>>>25,d+=(c&b|~c&a)+e[2],d=d<<11|d>>>21,a+=(d&c| +~d&b)+e[3]);a=a<<19|a>>>13;b+=(a&d|~a&c)+e[4];b=b<<3|b>>>29;c+=(b&a|~b&d)+e[5];c=c<<7|c>>>25;d+=(c&b|~c&a)+e[6];d=d<<11|d>>>21;a+=(d&c|~d&b)+e[7];a=a<<19|a>>>13;b+=(a&d|~a&c)+e[8];b=b<<3|b>>>29;c+=(b&a|~b&d)+e[9];c=c<<7|c>>>25;d+=(c&b|~c&a)+e[10];d=d<<11|d>>>21;a+=(d&c|~d&b)+e[11];a=a<<19|a>>>13;b+=(a&d|~a&c)+e[12];b=b<<3|b>>>29;c+=(b&a|~b&d)+e[13];c=c<<7|c>>>25;d+=(c&b|~c&a)+e[14];d=d<<11|d>>>21;a+=(d&c|~d&b)+e[15];a=a<<19|a>>>13;g=a&d;b+=(g|a&c|d&c)+e[0]+1518500249;b=b<<3|b>>>29;k=b&a;c+=(k|b&d| +g)+e[4]+1518500249;c=c<<5|c>>>27;g=c&b;d+=(g|c&a|k)+e[8]+1518500249;d=d<<9|d>>>23;k=d&c;a+=(k|d&b|g)+e[12]+1518500249;a=a<<13|a>>>19;g=a&d;b+=(g|a&c|k)+e[1]+1518500249;b=b<<3|b>>>29;k=b&a;c+=(k|b&d|g)+e[5]+1518500249;c=c<<5|c>>>27;g=c&b;d+=(g|c&a|k)+e[9]+1518500249;d=d<<9|d>>>23;k=d&c;a+=(k|d&b|g)+e[13]+1518500249;a=a<<13|a>>>19;g=a&d;b+=(g|a&c|k)+e[2]+1518500249;b=b<<3|b>>>29;k=b&a;c+=(k|b&d|g)+e[6]+1518500249;c=c<<5|c>>>27;g=c&b;d+=(g|c&a|k)+e[10]+1518500249;d=d<<9|d>>>23;k=d&c;a+=(k|d&b|g)+e[14]+ +1518500249;a=a<<13|a>>>19;g=a&d;b+=(g|a&c|k)+e[3]+1518500249;b=b<<3|b>>>29;k=b&a;c+=(k|b&d|g)+e[7]+1518500249;c=c<<5|c>>>27;g=c&b;d+=(g|c&a|k)+e[11]+1518500249;d=d<<9|d>>>23;a+=(d&c|d&b|g)+e[15]+1518500249;a=a<<13|a>>>19;g=a^d;b+=(g^c)+e[0]+1859775393;b=b<<3|b>>>29;c+=(g^b)+e[8]+1859775393;c=c<<9|c>>>23;g=c^b;d+=(g^a)+e[4]+1859775393;d=d<<11|d>>>21;a+=(g^d)+e[12]+1859775393;a=a<<15|a>>>17;g=a^d;b+=(g^c)+e[2]+1859775393;b=b<<3|b>>>29;c+=(g^b)+e[10]+1859775393;c=c<<9|c>>>23;g=c^b;d+=(g^a)+e[6]+1859775393; +d=d<<11|d>>>21;a+=(g^d)+e[14]+1859775393;a=a<<15|a>>>17;g=a^d;b+=(g^c)+e[1]+1859775393;b=b<<3|b>>>29;c+=(g^b)+e[9]+1859775393;c=c<<9|c>>>23;g=c^b;d+=(g^a)+e[5]+1859775393;d=d<<11|d>>>21;a+=(g^d)+e[13]+1859775393;a=a<<15|a>>>17;g=a^d;b+=(g^c)+e[3]+1859775393;b=b<<3|b>>>29;c+=(g^b)+e[11]+1859775393;c=c<<9|c>>>23;g=c^b;d+=(g^a)+e[7]+1859775393;d=d<<11|d>>>21;a+=(g^d)+e[15]+1859775393;a=a<<15|a>>>17;q?(l=b+1732584193<<0,m=a-271733879<<0,n=d-1732584194<<0,p=c+271733878<<0,q=!1):(l=l+b<<0,m=m+a<<0,n=n+ +d<<0,p=p+c<<0)}while(!u);return A?(h=f[l>>4&15]+f[l&15],h+=f[l>>12&15]+f[l>>8&15],h+=f[l>>20&15]+f[l>>16&15],h+=f[l>>28&15]+f[l>>24&15],h+=f[m>>4&15]+f[m&15],h+=f[m>>12&15]+f[m>>8&15],h+=f[m>>20&15]+f[m>>16&15],h+=f[m>>28&15]+f[m>>24&15],h+=f[n>>4&15]+f[n&15],h+=f[n>>12&15]+f[n>>8&15],h+=f[n>>20&15]+f[n>>16&15],h+=f[n>>28&15]+f[n>>24&15],h+=f[p>>4&15]+f[p&15],h+=f[p>>12&15]+f[p>>8&15],h+=f[p>>20&15]+f[p>>16&15],h+=f[p>>28&15]+f[p>>24&15]):f[l>>4&15]+f[l&15]+f[l>>12&15]+f[l>>8&15]+f[l>>20&15]+f[l>> +16&15]+f[l>>28&15]+f[l>>24&15]+f[m>>4&15]+f[m&15]+f[m>>12&15]+f[m>>8&15]+f[m>>20&15]+f[m>>16&15]+f[m>>28&15]+f[m>>24&15]+f[n>>4&15]+f[n&15]+f[n>>12&15]+f[n>>8&15]+f[n>>20&15]+f[n>>16&15]+f[n>>28&15]+f[n>>24&15]+f[p>>4&15]+f[p&15]+f[p>>12&15]+f[p>>8&15]+f[p>>20&15]+f[p>>16&15]+f[p>>28&15]+f[p>>24&15]};!q.JS_MD4_TEST&&v?module.exports=u:q&&(q.md4=u)})(this); diff --git a/package.json b/package.json index f5358ed..911b4f2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "js-md4", - "version": "0.1.0", + "version": "0.1.1", "description": "A simple MD4 hash function for JavaScript supports UTF-8 encoding.", "main": "src/md4.js", "devDependencies": { diff --git a/src/md4.js b/src/md4.js index 18bc561..9e8f814 100644 --- a/src/md4.js +++ b/src/md4.js @@ -1,5 +1,5 @@ /* - * js-md4 v0.1.0 + * js-md4 v0.1.1 * https://github.com/emn178/js-md4 * * Copyright 2015, emn178@gmail.com @@ -31,13 +31,9 @@ } var md4 = function(message) { - var h0, h1, h2, h3, a, b, c, d, code, end = false, + var h0, h1, h2, h3, a, b, c, d, ab, bc, cd, da, code, first = true, end = false, index = 0, i, start = 0, bytes = 0, length = message.length; - h0 = 0x67452301; - h1 = 0xefcdab89; - h2 = 0x98badcfe; - h3 = 0x10325476; blocks[16] = 0; do { blocks[0] = blocks[16]; @@ -97,66 +93,155 @@ end = true; } - a = h0; - b = h1; - c = h2; - d = h3; - - a = r1(a, b, c, d, blocks[0], 3); - d = r1(d, a, b, c, blocks[1], 7); - c = r1(c, d, a, b, blocks[2], 11); - b = r1(b, c, d, a, blocks[3], 19); - a = r1(a, b, c, d, blocks[4], 3); - d = r1(d, a, b, c, blocks[5], 7); - c = r1(c, d, a, b, blocks[6], 11); - b = r1(b, c, d, a, blocks[7], 19); - a = r1(a, b, c, d, blocks[8], 3); - d = r1(d, a, b, c, blocks[9], 7); - c = r1(c, d, a, b, blocks[10], 11); - b = r1(b, c, d, a, blocks[11], 19); - a = r1(a, b, c, d, blocks[12], 3); - d = r1(d, a, b, c, blocks[13], 7); - c = r1(c, d, a, b, blocks[14], 11); - b = r1(b, c, d, a, blocks[15], 19); + if(first) { + a = blocks[0] - 1; + a = (a << 3) | (a >>> 29); + d = ((a & 0xefcdab89) | (~a & 0x98badcfe)) + blocks[1] + 271733878; + d = (d << 7) | (d >>> 25); + c = ((d & a) | (~d & 0xefcdab89)) + blocks[2] - 1732584194; + c = (c << 11) | (c >>> 21); + b = ((c & d) | (~c & a)) + blocks[3] - 271733879; + b = (b << 19) | (b >>> 13); + } else { + a = h0; + b = h1; + c = h2; + d = h3; + a += ((b & c) | (~b & d)) + blocks[0]; + a = (a << 3) | (a >>> 29); + d += ((a & b) | (~a & c)) + blocks[1]; + d = (d << 7) | (d >>> 25); + c += ((d & a) | (~d & b)) + blocks[2]; + c = (c << 11) | (c >>> 21); + b += ((c & d) | (~c & a)) + blocks[3]; + b = (b << 19) | (b >>> 13); + } + a += ((b & c) | (~b & d)) + blocks[4]; + a = (a << 3) | (a >>> 29); + d += ((a & b) | (~a & c)) + blocks[5]; + d = (d << 7) | (d >>> 25); + c += ((d & a) | (~d & b)) + blocks[6]; + c = (c << 11) | (c >>> 21); + b += ((c & d) | (~c & a)) + blocks[7]; + b = (b << 19) | (b >>> 13); + a += ((b & c) | (~b & d)) + blocks[8]; + a = (a << 3) | (a >>> 29); + d += ((a & b) | (~a & c)) + blocks[9]; + d = (d << 7) | (d >>> 25); + c += ((d & a) | (~d & b)) + blocks[10]; + c = (c << 11) | (c >>> 21); + b += ((c & d) | (~c & a)) + blocks[11]; + b = (b << 19) | (b >>> 13); + a += ((b & c) | (~b & d)) + blocks[12]; + a = (a << 3) | (a >>> 29); + d += ((a & b) | (~a & c)) + blocks[13]; + d = (d << 7) | (d >>> 25); + c += ((d & a) | (~d & b)) + blocks[14]; + c = (c << 11) | (c >>> 21); + b += ((c & d) | (~c & a)) + blocks[15]; + b = (b << 19) | (b >>> 13); - a = r2(a, b, c, d, blocks[0], 3); - d = r2(d, a, b, c, blocks[4], 5); - c = r2(c, d, a, b, blocks[8], 9); - b = r2(b, c, d, a, blocks[12], 13); - a = r2(a, b, c, d, blocks[1], 3); - d = r2(d, a, b, c, blocks[5], 5); - c = r2(c, d, a, b, blocks[9], 9); - b = r2(b, c, d, a, blocks[13], 13); - a = r2(a, b, c, d, blocks[2], 3); - d = r2(d, a, b, c, blocks[6], 5); - c = r2(c, d, a, b, blocks[10], 9); - b = r2(b, c, d, a, blocks[14], 13); - a = r2(a, b, c, d, blocks[3], 3); - d = r2(d, a, b, c, blocks[7], 5); - c = r2(c, d, a, b, blocks[11], 9); - b = r2(b, c, d, a, blocks[15], 13); + bc = b & c; + a += (bc | (b & d) | (c & d)) + blocks[0] + 1518500249; + a = (a << 3) | (a >>> 29); + ab = a & b; + d += (ab | (a & c) | bc) + blocks[4] + 1518500249; + d = (d << 5) | (d >>> 27); + da = d & a; + c += (da | (d & b) | ab) + blocks[8] + 1518500249; + c = (c << 9) | (c >>> 23); + cd = c & d; + b += (cd | (c & a) | da) + blocks[12] + 1518500249; + b = (b << 13) | (b >>> 19); + bc = b & c; + a += (bc | (b & d) | cd) + blocks[1] + 1518500249; + a = (a << 3) | (a >>> 29); + ab = a & b; + d += (ab | (a & c) | bc) + blocks[5] + 1518500249; + d = (d << 5) | (d >>> 27); + da = d & a; + c += (da | (d & b) | ab) + blocks[9] + 1518500249; + c = (c << 9) | (c >>> 23); + cd = c & d; + b += (cd | (c & a) | da) + blocks[13] + 1518500249; + b = (b << 13) | (b >>> 19); + bc = b & c; + a += (bc | (b & d) | cd) + blocks[2] + 1518500249; + a = (a << 3) | (a >>> 29); + ab = a & b; + d += (ab | (a & c) | bc) + blocks[6] + 1518500249; + d = (d << 5) | (d >>> 27); + da = d & a; + c += (da | (d & b) | ab) + blocks[10] + 1518500249; + c = (c << 9) | (c >>> 23); + cd = c & d; + b += (cd | (c & a) | da) + blocks[14] + 1518500249; + b = (b << 13) | (b >>> 19); + bc = b & c; + a += (bc | (b & d) | cd) + blocks[3] + 1518500249; + a = (a << 3) | (a >>> 29); + ab = a & b; + d += (ab | (a & c) | bc) + blocks[7] + 1518500249; + d = (d << 5) | (d >>> 27); + da = d & a; + c += (da | (d & b) | ab) + blocks[11] + 1518500249; + c = (c << 9) | (c >>> 23); + b += ((c & d) | (c & a) | da) + blocks[15] + 1518500249; + b = (b << 13) | (b >>> 19); - a = r3(a, b, c, d, blocks[0], 3); - d = r3(d, a, b, c, blocks[8], 9); - c = r3(c, d, a, b, blocks[4], 11); - b = r3(b, c, d, a, blocks[12], 15); - a = r3(a, b, c, d, blocks[2], 3); - d = r3(d, a, b, c, blocks[10], 9); - c = r3(c, d, a, b, blocks[6], 11); - b = r3(b, c, d, a, blocks[14], 15); - a = r3(a, b, c, d, blocks[1], 3); - d = r3(d, a, b, c, blocks[9], 9); - c = r3(c, d, a, b, blocks[5], 11); - b = r3(b, c, d, a, blocks[13], 15); - a = r3(a, b, c, d, blocks[3], 3); - d = r3(d, a, b, c, blocks[11], 9); - c = r3(c, d, a, b, blocks[7], 11); - b = r3(b, c, d, a, blocks[15], 15); + bc = b ^ c; + a += (bc ^ d) + blocks[0] + 1859775393; + a = (a << 3) | (a >>> 29); + d += (bc ^ a) + blocks[8] + 1859775393; + d = (d << 9) | (d >>> 23); + da = d ^ a; + c += (da ^ b) + blocks[4] + 1859775393; + c = (c << 11) | (c >>> 21); + b += (da ^ c) + blocks[12] + 1859775393; + b = (b << 15) | (b >>> 17); + bc = b ^ c; + a += (bc ^ d) + blocks[2] + 1859775393; + a = (a << 3) | (a >>> 29); + d += (bc ^ a) + blocks[10] + 1859775393; + d = (d << 9) | (d >>> 23); + da = d ^ a; + c += (da ^ b) + blocks[6] + 1859775393; + c = (c << 11) | (c >>> 21); + b += (da ^ c) + blocks[14] + 1859775393; + b = (b << 15) | (b >>> 17); + bc = b ^ c; + a += (bc ^ d) + blocks[1] + 1859775393; + a = (a << 3) | (a >>> 29); + d += (bc ^ a) + blocks[9] + 1859775393; + d = (d << 9) | (d >>> 23); + da = d ^ a; + c += (da ^ b) + blocks[5] + 1859775393; + c = (c << 11) | (c >>> 21); + b += (da ^ c) + blocks[13] + 1859775393; + b = (b << 15) | (b >>> 17); + bc = b ^ c; + a += (bc ^ d) + blocks[3] + 1859775393; + a = (a << 3) | (a >>> 29); + d += (bc ^ a) + blocks[11] + 1859775393; + d = (d << 9) | (d >>> 23); + da = d ^ a; + c += (da ^ b) + blocks[7] + 1859775393; + c = (c << 11) | (c >>> 21); + b += (da ^ c) + blocks[15] + 1859775393; + b = (b << 15) | (b >>> 17); - h0 = h0 + a << 0; - h1 = h1 + b << 0; - h2 = h2 + c << 0; - h3 = h3 + d << 0; + if(first) { + h0 = a + 1732584193 << 0; + h1 = b - 271733879 << 0; + h2 = c - 1732584194 << 0; + h3 = d + 271733878 << 0; + first = false; + } else { + h0 = h0 + a << 0; + h1 = h1 + b << 0; + h2 = h2 + c << 0; + h3 = h3 + d << 0; + } } while(!end); if(FIREFOX) { @@ -197,34 +282,6 @@ } }; - function rotate(num, cnt) { - return (num << cnt) | (num >>> (32 - cnt)); - } - - function f(x, y, z) { - return (x & y) | (~x & z); - } - - function g(x, y, z) { - return (x & y) | (x & z) | (y & z); - } - - function h(x, y, z) { - return x ^ y ^ z; - } - - function r1(a, b, c, d, x, s) { - return rotate((a + f(b, c, d) + x), s); - } - - function r2(a, b, c, d, x, s) { - return rotate((a + g(b, c, d) + x + 0x5A827999), s); - } - - function r3(a, b, c, d, x, s) { - return rotate((a + h(b, c, d) + x + 0x6ED9EBA1), s); - } - if(!root.JS_MD4_TEST && NODE_JS) { module.exports = md4; } else if(root) {