Comparing version
{ | ||
"name": "js-md4", | ||
"version": "0.2.0", | ||
"version": "0.3.0", | ||
"main": ["src/md4.js"], | ||
@@ -5,0 +5,0 @@ "ignore": [ |
@@ -1,10 +0,10 @@ | ||
/* | ||
* js-md4 v0.2.0 | ||
* https://github.com/emn178/js-md4 | ||
/** | ||
* [js-md4]{@link https://github.com/emn178/js-md4} | ||
* | ||
* Copyright 2015, emn178@gmail.com | ||
* | ||
* @license under the MIT license: | ||
* http://www.opensource.org/licenses/MIT | ||
* @namespace md4 | ||
* @version 0.3.0 | ||
* @author Yi-Cyuan Chen [emn178@gmail.com] | ||
* @copyright Yi-Cyuan Chen 2015 | ||
* @license MIT | ||
*/ | ||
!function(e){"use strict";var r="object"==typeof process&&process.versions&&process.versions.node;r&&(e=global);var o,t=!e.JS_MD4_TEST&&"object"==typeof module&&module.exports,f="function"==typeof define&&define.amd,n=!e.JS_MD4_TEST&&"undefined"!=typeof ArrayBuffer,i="0123456789abcdef".split(""),s=[128,32768,8388608,-2147483648],a=[0,8,16,24],c=[];if(n){var d=new ArrayBuffer(68);o=new Uint8Array(d),c=new Uint32Array(d)}var u=function(e){var r="string"!=typeof e;r&&e.constructor==ArrayBuffer&&(e=new Uint8Array(e));var t,f,d,u,l,p,y,A,v,h,m,w,b,C,S=!0,T=!1,_=0,g=0,B=0,U=e.length||0;c[16]=0;do{if(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,r)if(n)for(C=g;U>_&&64>C;++_)o[C++]=e[_];else for(C=g;U>_&&64>C;++_)c[C>>2]|=e[_]<<a[3&C++];else if(n)for(C=g;U>_&&64>C;++_)b=e.charCodeAt(_),128>b?o[C++]=b:2048>b?(o[C++]=192|b>>6,o[C++]=128|63&b):55296>b||b>=57344?(o[C++]=224|b>>12,o[C++]=128|b>>6&63,o[C++]=128|63&b):(b=65536+((1023&b)<<10|1023&e.charCodeAt(++_)),o[C++]=240|b>>18,o[C++]=128|b>>12&63,o[C++]=128|b>>6&63,o[C++]=128|63&b);else for(C=g;U>_&&64>C;++_)b=e.charCodeAt(_),128>b?c[C>>2]|=b<<a[3&C++]:2048>b?(c[C>>2]|=(192|b>>6)<<a[3&C++],c[C>>2]|=(128|63&b)<<a[3&C++]):55296>b||b>=57344?(c[C>>2]|=(224|b>>12)<<a[3&C++],c[C>>2]|=(128|b>>6&63)<<a[3&C++],c[C>>2]|=(128|63&b)<<a[3&C++]):(b=65536+((1023&b)<<10|1023&e.charCodeAt(++_)),c[C>>2]|=(240|b>>18)<<a[3&C++],c[C>>2]|=(128|b>>12&63)<<a[3&C++],c[C>>2]|=(128|b>>6&63)<<a[3&C++],c[C>>2]|=(128|63&b)<<a[3&C++]);B+=C-g,g=C-64,_==U&&(c[C>>2]|=s[3&C],++_),_>U&&56>C&&(c[14]=B<<3,T=!0),S?(l=c[0]-1,l=l<<3|l>>>29,A=(4023233417&l|2562383102&~l)+c[1]+271733878,A=A<<7|A>>>25,y=(A&l|4023233417&~A)+c[2]-1732584194,y=y<<11|y>>>21,p=(y&A|~y&l)+c[3]-271733879,p=p<<19|p>>>13):(l=t,p=f,y=d,A=u,l+=(p&y|~p&A)+c[0],l=l<<3|l>>>29,A+=(l&p|~l&y)+c[1],A=A<<7|A>>>25,y+=(A&l|~A&p)+c[2],y=y<<11|y>>>21,p+=(y&A|~y&l)+c[3],p=p<<19|p>>>13),l+=(p&y|~p&A)+c[4],l=l<<3|l>>>29,A+=(l&p|~l&y)+c[5],A=A<<7|A>>>25,y+=(A&l|~A&p)+c[6],y=y<<11|y>>>21,p+=(y&A|~y&l)+c[7],p=p<<19|p>>>13,l+=(p&y|~p&A)+c[8],l=l<<3|l>>>29,A+=(l&p|~l&y)+c[9],A=A<<7|A>>>25,y+=(A&l|~A&p)+c[10],y=y<<11|y>>>21,p+=(y&A|~y&l)+c[11],p=p<<19|p>>>13,l+=(p&y|~p&A)+c[12],l=l<<3|l>>>29,A+=(l&p|~l&y)+c[13],A=A<<7|A>>>25,y+=(A&l|~A&p)+c[14],y=y<<11|y>>>21,p+=(y&A|~y&l)+c[15],p=p<<19|p>>>13,h=p&y,l+=(h|p&A|y&A)+c[0]+1518500249,l=l<<3|l>>>29,v=l&p,A+=(v|l&y|h)+c[4]+1518500249,A=A<<5|A>>>27,w=A&l,y+=(w|A&p|v)+c[8]+1518500249,y=y<<9|y>>>23,m=y&A,p+=(m|y&l|w)+c[12]+1518500249,p=p<<13|p>>>19,h=p&y,l+=(h|p&A|m)+c[1]+1518500249,l=l<<3|l>>>29,v=l&p,A+=(v|l&y|h)+c[5]+1518500249,A=A<<5|A>>>27,w=A&l,y+=(w|A&p|v)+c[9]+1518500249,y=y<<9|y>>>23,m=y&A,p+=(m|y&l|w)+c[13]+1518500249,p=p<<13|p>>>19,h=p&y,l+=(h|p&A|m)+c[2]+1518500249,l=l<<3|l>>>29,v=l&p,A+=(v|l&y|h)+c[6]+1518500249,A=A<<5|A>>>27,w=A&l,y+=(w|A&p|v)+c[10]+1518500249,y=y<<9|y>>>23,m=y&A,p+=(m|y&l|w)+c[14]+1518500249,p=p<<13|p>>>19,h=p&y,l+=(h|p&A|m)+c[3]+1518500249,l=l<<3|l>>>29,v=l&p,A+=(v|l&y|h)+c[7]+1518500249,A=A<<5|A>>>27,w=A&l,y+=(w|A&p|v)+c[11]+1518500249,y=y<<9|y>>>23,p+=(y&A|y&l|w)+c[15]+1518500249,p=p<<13|p>>>19,h=p^y,l+=(h^A)+c[0]+1859775393,l=l<<3|l>>>29,A+=(h^l)+c[8]+1859775393,A=A<<9|A>>>23,w=A^l,y+=(w^p)+c[4]+1859775393,y=y<<11|y>>>21,p+=(w^y)+c[12]+1859775393,p=p<<15|p>>>17,h=p^y,l+=(h^A)+c[2]+1859775393,l=l<<3|l>>>29,A+=(h^l)+c[10]+1859775393,A=A<<9|A>>>23,w=A^l,y+=(w^p)+c[6]+1859775393,y=y<<11|y>>>21,p+=(w^y)+c[14]+1859775393,p=p<<15|p>>>17,h=p^y,l+=(h^A)+c[1]+1859775393,l=l<<3|l>>>29,A+=(h^l)+c[9]+1859775393,A=A<<9|A>>>23,w=A^l,y+=(w^p)+c[5]+1859775393,y=y<<11|y>>>21,p+=(w^y)+c[13]+1859775393,p=p<<15|p>>>17,h=p^y,l+=(h^A)+c[3]+1859775393,l=l<<3|l>>>29,A+=(h^l)+c[11]+1859775393,A=A<<9|A>>>23,w=A^l,y+=(w^p)+c[7]+1859775393,y=y<<11|y>>>21,p+=(w^y)+c[15]+1859775393,p=p<<15|p>>>17,S?(t=l+1732584193<<0,f=p-271733879<<0,d=y-1732584194<<0,u=A+271733878<<0,S=!1):(t=t+l<<0,f=f+p<<0,d=d+y<<0,u=u+A<<0)}while(!T);return i[t>>4&15]+i[15&t]+i[t>>12&15]+i[t>>8&15]+i[t>>20&15]+i[t>>16&15]+i[t>>28&15]+i[t>>24&15]+i[f>>4&15]+i[15&f]+i[f>>12&15]+i[f>>8&15]+i[f>>20&15]+i[f>>16&15]+i[f>>28&15]+i[f>>24&15]+i[d>>4&15]+i[15&d]+i[d>>12&15]+i[d>>8&15]+i[d>>20&15]+i[d>>16&15]+i[d>>28&15]+i[d>>24&15]+i[u>>4&15]+i[15&u]+i[u>>12&15]+i[u>>8&15]+i[u>>20&15]+i[u>>16&15]+i[u>>28&15]+i[u>>24&15]};t?module.exports=u:(e.md4=u,f&&define(function(){return u}))}(this); | ||
!function(t){"use strict";function i(t){if(t)c[0]=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,this.blocks=c,this.buffer8=s;else if(n){var i=new ArrayBuffer(68);this.buffer8=new Uint8Array(i),this.blocks=new Uint32Array(i)}else this.blocks=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];this.h0=this.h1=this.h2=this.h3=this.start=this.bytes=0,this.finalized=this.hashed=!1,this.first=!0}var h="object"==typeof process&&process.versions&&process.versions.node;h&&(t=global);var s,e=!t.JS_MD4_TEST&&"object"==typeof module&&module.exports,r="function"==typeof define&&define.amd,n=!t.JS_MD4_TEST&&"undefined"!=typeof ArrayBuffer,o="0123456789abcdef".split(""),a=[128,32768,8388608,-2147483648],f=[0,8,16,24],u=["hex","array","digest","buffer"],c=[];if(n){var p=new ArrayBuffer(68);s=new Uint8Array(p),c=new Uint32Array(p)}var d=function(t){return function(h){return new i(!0).update(h)[t]()}},y=function(){var t=d("hex");t.create=function(){return new i},t.update=function(i){return t.create().update(i)};for(var h=0;h<u.length;++h){var s=u[h];t[s]=d(s)}return t};i.prototype.update=function(i){if(!this.finalized){var h="string"!=typeof i;h&&i.constructor==t.ArrayBuffer&&(i=new Uint8Array(i));for(var s,e,r=0,o=i.length||0,a=this.blocks,u=this.buffer8;o>r;){if(this.hashed&&(this.hashed=!1,a[0]=a[16],a[16]=a[1]=a[2]=a[3]=a[4]=a[5]=a[6]=a[7]=a[8]=a[9]=a[10]=a[11]=a[12]=a[13]=a[14]=a[15]=0),h)if(n)for(e=this.start;o>r&&64>e;++r)u[e++]=i[r];else for(e=this.start;o>r&&64>e;++r)a[e>>2]|=i[r]<<f[3&e++];else if(n)for(e=this.start;o>r&&64>e;++r)s=i.charCodeAt(r),128>s?u[e++]=s:2048>s?(u[e++]=192|s>>6,u[e++]=128|63&s):55296>s||s>=57344?(u[e++]=224|s>>12,u[e++]=128|s>>6&63,u[e++]=128|63&s):(s=65536+((1023&s)<<10|1023&i.charCodeAt(++r)),u[e++]=240|s>>18,u[e++]=128|s>>12&63,u[e++]=128|s>>6&63,u[e++]=128|63&s);else for(e=this.start;o>r&&64>e;++r)s=i.charCodeAt(r),128>s?a[e>>2]|=s<<f[3&e++]:2048>s?(a[e>>2]|=(192|s>>6)<<f[3&e++],a[e>>2]|=(128|63&s)<<f[3&e++]):55296>s||s>=57344?(a[e>>2]|=(224|s>>12)<<f[3&e++],a[e>>2]|=(128|s>>6&63)<<f[3&e++],a[e>>2]|=(128|63&s)<<f[3&e++]):(s=65536+((1023&s)<<10|1023&i.charCodeAt(++r)),a[e>>2]|=(240|s>>18)<<f[3&e++],a[e>>2]|=(128|s>>12&63)<<f[3&e++],a[e>>2]|=(128|s>>6&63)<<f[3&e++],a[e>>2]|=(128|63&s)<<f[3&e++]);this.lastByteIndex=e,this.bytes+=e-this.start,e>=64?(this.start=e-64,this.hash(),this.hashed=!0):this.start=e}return this}},i.prototype.finalize=function(){if(!this.finalized){this.finalized=!0;var t=this.blocks,i=this.lastByteIndex;t[i>>2]|=a[3&i],i>=56&&(this.hashed||this.hash(),t[0]=t[16],t[16]=t[1]=t[2]=t[3]=t[4]=t[5]=t[6]=t[7]=t[8]=t[9]=t[10]=t[11]=t[12]=t[13]=t[14]=t[15]=0),t[14]=this.bytes<<3,this.hash()}},i.prototype.hash=function(){var t,i,h,s,e,r,n,o,a=this.blocks;this.first?(t=a[0]-1,t=t<<3|t>>>29,s=(4023233417&t|2562383102&~t)+a[1]+271733878,s=s<<7|s>>>25,h=(s&t|4023233417&~s)+a[2]-1732584194,h=h<<11|h>>>21,i=(h&s|~h&t)+a[3]-271733879,i=i<<19|i>>>13):(t=this.h0,i=this.h1,h=this.h2,s=this.h3,t+=(i&h|~i&s)+a[0],t=t<<3|t>>>29,s+=(t&i|~t&h)+a[1],s=s<<7|s>>>25,h+=(s&t|~s&i)+a[2],h=h<<11|h>>>21,i+=(h&s|~h&t)+a[3],i=i<<19|i>>>13),t+=(i&h|~i&s)+a[4],t=t<<3|t>>>29,s+=(t&i|~t&h)+a[5],s=s<<7|s>>>25,h+=(s&t|~s&i)+a[6],h=h<<11|h>>>21,i+=(h&s|~h&t)+a[7],i=i<<19|i>>>13,t+=(i&h|~i&s)+a[8],t=t<<3|t>>>29,s+=(t&i|~t&h)+a[9],s=s<<7|s>>>25,h+=(s&t|~s&i)+a[10],h=h<<11|h>>>21,i+=(h&s|~h&t)+a[11],i=i<<19|i>>>13,t+=(i&h|~i&s)+a[12],t=t<<3|t>>>29,s+=(t&i|~t&h)+a[13],s=s<<7|s>>>25,h+=(s&t|~s&i)+a[14],h=h<<11|h>>>21,i+=(h&s|~h&t)+a[15],i=i<<19|i>>>13,r=i&h,t+=(r|i&s|h&s)+a[0]+1518500249,t=t<<3|t>>>29,e=t&i,s+=(e|t&h|r)+a[4]+1518500249,s=s<<5|s>>>27,o=s&t,h+=(o|s&i|e)+a[8]+1518500249,h=h<<9|h>>>23,n=h&s,i+=(n|h&t|o)+a[12]+1518500249,i=i<<13|i>>>19,r=i&h,t+=(r|i&s|n)+a[1]+1518500249,t=t<<3|t>>>29,e=t&i,s+=(e|t&h|r)+a[5]+1518500249,s=s<<5|s>>>27,o=s&t,h+=(o|s&i|e)+a[9]+1518500249,h=h<<9|h>>>23,n=h&s,i+=(n|h&t|o)+a[13]+1518500249,i=i<<13|i>>>19,r=i&h,t+=(r|i&s|n)+a[2]+1518500249,t=t<<3|t>>>29,e=t&i,s+=(e|t&h|r)+a[6]+1518500249,s=s<<5|s>>>27,o=s&t,h+=(o|s&i|e)+a[10]+1518500249,h=h<<9|h>>>23,n=h&s,i+=(n|h&t|o)+a[14]+1518500249,i=i<<13|i>>>19,r=i&h,t+=(r|i&s|n)+a[3]+1518500249,t=t<<3|t>>>29,e=t&i,s+=(e|t&h|r)+a[7]+1518500249,s=s<<5|s>>>27,o=s&t,h+=(o|s&i|e)+a[11]+1518500249,h=h<<9|h>>>23,i+=(h&s|h&t|o)+a[15]+1518500249,i=i<<13|i>>>19,r=i^h,t+=(r^s)+a[0]+1859775393,t=t<<3|t>>>29,s+=(r^t)+a[8]+1859775393,s=s<<9|s>>>23,o=s^t,h+=(o^i)+a[4]+1859775393,h=h<<11|h>>>21,i+=(o^h)+a[12]+1859775393,i=i<<15|i>>>17,r=i^h,t+=(r^s)+a[2]+1859775393,t=t<<3|t>>>29,s+=(r^t)+a[10]+1859775393,s=s<<9|s>>>23,o=s^t,h+=(o^i)+a[6]+1859775393,h=h<<11|h>>>21,i+=(o^h)+a[14]+1859775393,i=i<<15|i>>>17,r=i^h,t+=(r^s)+a[1]+1859775393,t=t<<3|t>>>29,s+=(r^t)+a[9]+1859775393,s=s<<9|s>>>23,o=s^t,h+=(o^i)+a[5]+1859775393,h=h<<11|h>>>21,i+=(o^h)+a[13]+1859775393,i=i<<15|i>>>17,r=i^h,t+=(r^s)+a[3]+1859775393,t=t<<3|t>>>29,s+=(r^t)+a[11]+1859775393,s=s<<9|s>>>23,o=s^t,h+=(o^i)+a[7]+1859775393,h=h<<11|h>>>21,i+=(o^h)+a[15]+1859775393,i=i<<15|i>>>17,this.first?(this.h0=t+1732584193<<0,this.h1=i-271733879<<0,this.h2=h-1732584194<<0,this.h3=s+271733878<<0,this.first=!1):(this.h0=this.h0+t<<0,this.h1=this.h1+i<<0,this.h2=this.h2+h<<0,this.h3=this.h3+s<<0)},i.prototype.hex=function(){this.finalize();var t=this.h0,i=this.h1,h=this.h2,s=this.h3;return o[t>>4&15]+o[15&t]+o[t>>12&15]+o[t>>8&15]+o[t>>20&15]+o[t>>16&15]+o[t>>28&15]+o[t>>24&15]+o[i>>4&15]+o[15&i]+o[i>>12&15]+o[i>>8&15]+o[i>>20&15]+o[i>>16&15]+o[i>>28&15]+o[i>>24&15]+o[h>>4&15]+o[15&h]+o[h>>12&15]+o[h>>8&15]+o[h>>20&15]+o[h>>16&15]+o[h>>28&15]+o[h>>24&15]+o[s>>4&15]+o[15&s]+o[s>>12&15]+o[s>>8&15]+o[s>>20&15]+o[s>>16&15]+o[s>>28&15]+o[s>>24&15]},i.prototype.toString=i.prototype.hex,i.prototype.digest=function(){this.finalize();var t=this.h0,i=this.h1,h=this.h2,s=this.h3;return[255&t,t>>8&255,t>>16&255,t>>24&255,255&i,i>>8&255,i>>16&255,i>>24&255,255&h,h>>8&255,h>>16&255,h>>24&255,255&s,s>>8&255,s>>16&255,s>>24&255]},i.prototype.array=i.prototype.digest,i.prototype.buffer=function(){this.finalize();var t=new ArrayBuffer(16),i=new Uint32Array(t);return i[0]=this.h0,i[1]=this.h1,i[2]=this.h2,i[3]=this.h3,t};var l=y();e?module.exports=l:(t.md4=l,r&&define(function(){return l}))}(this); |
@@ -0,1 +1,7 @@ | ||
# v0.3.0 / 2015-12-28 | ||
* Added support for update hash. | ||
* Added support for bytes array output. | ||
* Added support for ArrayBuffer output. | ||
# v0.2.0 / 2015-12-01 | ||
@@ -2,0 +8,0 @@ |
@@ -1,2 +0,2 @@ | ||
Copyright 2015 emn178@gmail.com | ||
Copyright 2015 Yi-Cyuan Chen | ||
@@ -3,0 +3,0 @@ Permission is hereby granted, free of charge, to any person obtaining |
{ | ||
"name": "js-md4", | ||
"version": "0.2.0", | ||
"version": "0.3.0", | ||
"description": "A simple MD4 hash function for JavaScript supports UTF-8 encoding.", | ||
@@ -9,2 +9,3 @@ "main": "src/md4.js", | ||
"jscoverage": "~0.5.9", | ||
"jsdoc": "^3.4.0", | ||
"mocha": "~2.3.4", | ||
@@ -17,3 +18,5 @@ "uglifyjs": "~2.4.10" | ||
"coveralls": "mocha tests/node-test.js -R mocha-lcov-reporter -r jscoverage | coveralls", | ||
"build": "uglifyjs src/md4.js --compress --mangle --comments --output build/md4.min.js" | ||
"doc": "rm -rf doc;jsdoc src README.md -d doc", | ||
"compress": "uglifyjs src/md4.js --compress --mangle --comments --output build/md4.min.js", | ||
"build": "npm run-script compress;npm run-script doc" | ||
}, | ||
@@ -20,0 +23,0 @@ "repository": { |
@@ -27,2 +27,5 @@ # js-md4 | ||
md4('Message to hash'); | ||
var hash = md4.create(); | ||
hash.update('Message to hash'); | ||
hash.hex(); | ||
``` | ||
@@ -33,63 +36,31 @@ If you use node.js, you should require the module first: | ||
``` | ||
## Example | ||
Code | ||
It supports AMD: | ||
```JavaScript | ||
md4(''); | ||
md4('The quick brown fox jumps over the lazy dog'); | ||
md4('The quick brown fox jumps over the lazy dog.'); | ||
require(['your/path/md4.js'], function(md4) { | ||
// ... | ||
}); | ||
``` | ||
Output | ||
[See document](https://emn178.github.com/js-md4/doc/) | ||
31d6cfe0d16ae931b73c59d7e0c089c0 | ||
1bee69a46ba811185c194762abaeae90 | ||
2812c6c7136898c51f6f6739ad08750e | ||
It also supports UTF-8 encoding: | ||
Code | ||
## Example | ||
```JavaScript | ||
md4('中文'); | ||
``` | ||
Output | ||
md4(''); // 31d6cfe0d16ae931b73c59d7e0c089c0 | ||
md4('The quick brown fox jumps over the lazy dog'); // 1bee69a46ba811185c194762abaeae90 | ||
md4('The quick brown fox jumps over the lazy dog.'); // 2812c6c7136898c51f6f6739ad08750e | ||
223088bf7bd45a16436b15360c5fc5a0 | ||
// It also supports UTF-8 encoding | ||
md4('中文'); // 223088bf7bd45a16436b15360c5fc5a0 | ||
It also supports byte `Array`, `Uint8Array`, `ArrayBuffer` input: | ||
// It also supports byte `Array`, `Uint8Array`, `ArrayBuffer` | ||
md4([]); // 31d6cfe0d16ae931b73c59d7e0c089c0 | ||
md4(new Uint8Array([])); // 31d6cfe0d16ae931b73c59d7e0c089c0 | ||
Code | ||
```JavaScript | ||
md4([]); | ||
md4(new Uint8Array([])); | ||
// Different output | ||
md4(''); // 31d6cfe0d16ae931b73c59d7e0c089c0 | ||
md4.hex(''); // 31d6cfe0d16ae931b73c59d7e0c089c0 | ||
md4.array(''); // [49, 214, 207, 224, 209, 106, 233, 49, 183, 60, 89, 215, 224, 192, 137, 192] | ||
md4.digest(''); // [49, 214, 207, 224, 209, 106, 233, 49, 183, 60, 89, 215, 224, 192, 137, 192] | ||
md4.buffer(''); // ArrayBuffer | ||
``` | ||
Output | ||
31d6cfe0d16ae931b73c59d7e0c089c0 | ||
31d6cfe0d16ae931b73c59d7e0c089c0 | ||
## Extensions | ||
### jQuery | ||
If you prefer jQuery style, you can add following code to add a jQuery extension. | ||
Code | ||
```JavaScript | ||
jQuery.md4 = md4 | ||
``` | ||
And then you could use like this: | ||
```JavaScript | ||
$.md4('message'); | ||
``` | ||
### Prototype | ||
If you prefer prototype style, you can add following code to add a prototype extension. | ||
Code | ||
```JavaScript | ||
String.prototype.md4 = function() { | ||
return md4(this); | ||
}; | ||
``` | ||
And then you could use like this: | ||
```JavaScript | ||
'message'.md4(); | ||
``` | ||
## License | ||
@@ -100,2 +71,2 @@ The project is released under the [MIT license](http://www.opensource.org/licenses/MIT). | ||
The project's website is located at https://github.com/emn178/js-md4 | ||
Author: emn178@gmail.com | ||
Author: Yi-Cyuan Chen |
611
src/md4.js
@@ -1,15 +0,15 @@ | ||
/* | ||
* js-md4 v0.2.0 | ||
* https://github.com/emn178/js-md4 | ||
/** | ||
* [js-md4]{@link https://github.com/emn178/js-md4} | ||
* | ||
* Copyright 2015, emn178@gmail.com | ||
* | ||
* @license under the MIT license: | ||
* http://www.opensource.org/licenses/MIT | ||
* @namespace md4 | ||
* @version 0.3.0 | ||
* @author Yi-Cyuan Chen [emn178@gmail.com] | ||
* @copyright Yi-Cyuan Chen 2015 | ||
* @license MIT | ||
*/ | ||
;(function(root) { | ||
(function (root) { | ||
'use strict'; | ||
var NODE_JS = typeof process == 'object' && process.versions && process.versions.node; | ||
if(NODE_JS) { | ||
if (NODE_JS) { | ||
root = global; | ||
@@ -24,5 +24,6 @@ } | ||
var SHIFT = [0, 8, 16, 24]; | ||
var OUTPUT_TYPES = ['hex', 'array', 'digest', 'buffer']; | ||
var blocks = [], buffer8; | ||
if(ARRAY_BUFFER) { | ||
if (ARRAY_BUFFER) { | ||
var buffer = new ArrayBuffer(68); | ||
@@ -33,25 +34,147 @@ buffer8 = new Uint8Array(buffer); | ||
var md4 = function(message) { | ||
var notString = typeof(message) != 'string'; | ||
if(notString && message.constructor == ArrayBuffer) { | ||
message = new Uint8Array(message); | ||
/** | ||
* @method hex | ||
* @memberof md4 | ||
* @description Output hash as hex string | ||
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash | ||
* @returns {String} Hex string | ||
* @example | ||
* md4.hex('The quick brown fox jumps over the lazy dog'); | ||
* // equal to | ||
* md4('The quick brown fox jumps over the lazy dog'); | ||
*/ | ||
/** | ||
* @method digest | ||
* @memberof md4 | ||
* @description Output hash as bytes array | ||
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash | ||
* @returns {Array} Bytes array | ||
* @example | ||
* md4.digest('The quick brown fox jumps over the lazy dog'); | ||
*/ | ||
/** | ||
* @method array | ||
* @memberof md4 | ||
* @description Output hash as bytes array | ||
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash | ||
* @returns {Array} Bytes array | ||
* @example | ||
* md4.array('The quick brown fox jumps over the lazy dog'); | ||
*/ | ||
/** | ||
* @method buffer | ||
* @memberof md4 | ||
* @description Output hash as ArrayBuffer | ||
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash | ||
* @returns {ArrayBuffer} ArrayBuffer | ||
* @example | ||
* md4.buffer('The quick brown fox jumps over the lazy dog'); | ||
*/ | ||
var createOutputMethod = function (outputType) { | ||
return function(message) { | ||
return new Md4(true).update(message)[outputType](); | ||
} | ||
}; | ||
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 || 0; | ||
/** | ||
* @method create | ||
* @memberof md4 | ||
* @description Create Md4 object | ||
* @returns {Md4} MD4 object. | ||
* @example | ||
* var hash = md4.create(); | ||
*/ | ||
/** | ||
* @method update | ||
* @memberof md4 | ||
* @description Create and update Md4 object | ||
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash | ||
* @returns {Md4} MD4 object. | ||
* @example | ||
* var hash = md4.update('The quick brown fox jumps over the lazy dog'); | ||
* // equal to | ||
* var hash = md4.create(); | ||
* hash.update('The quick brown fox jumps over the lazy dog'); | ||
*/ | ||
var createMethod = function () { | ||
var method = createOutputMethod('hex'); | ||
method.create = function () { | ||
return new Md4(); | ||
}; | ||
method.update = function (message) { | ||
return method.create().update(message); | ||
}; | ||
for (var i = 0;i < OUTPUT_TYPES.length;++i) { | ||
var type = OUTPUT_TYPES[i]; | ||
method[type] = createOutputMethod(type); | ||
} | ||
return method; | ||
}; | ||
blocks[16] = 0; | ||
do { | ||
blocks[0] = blocks[16]; | ||
blocks[16] = blocks[1] = blocks[2] = blocks[3] = | ||
/** | ||
* Md4 class | ||
* @class Md4 | ||
* @description This is internal class. | ||
* @see {@link md4.create} | ||
*/ | ||
function Md4(sharedMemory) { | ||
if (sharedMemory) { | ||
blocks[0] = blocks[16] = blocks[1] = blocks[2] = blocks[3] = | ||
blocks[4] = blocks[5] = blocks[6] = blocks[7] = | ||
blocks[8] = blocks[9] = blocks[10] = blocks[11] = | ||
blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0; | ||
if(notString) { | ||
if(ARRAY_BUFFER) { | ||
for (i = start;index < length && i < 64; ++index) { | ||
this.blocks = blocks; | ||
this.buffer8 = buffer8; | ||
} else { | ||
if (ARRAY_BUFFER) { | ||
var buffer = new ArrayBuffer(68); | ||
this.buffer8 = new Uint8Array(buffer); | ||
this.blocks = new Uint32Array(buffer); | ||
} else { | ||
this.blocks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; | ||
} | ||
} | ||
this.h0 = this.h1 = this.h2 = this.h3 = this.start = this.bytes = 0; | ||
this.finalized = this.hashed = false; | ||
this.first = true; | ||
} | ||
/** | ||
* @method update | ||
* @memberof Md4 | ||
* @instance | ||
* @description Update hash | ||
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash | ||
* @returns {Md4} MD4 object. | ||
* @see {@link md4.update} | ||
*/ | ||
Md4.prototype.update = function (message) { | ||
if (this.finalized) { | ||
return; | ||
} | ||
var notString = typeof(message) != 'string'; | ||
if(notString && message.constructor == root.ArrayBuffer) { | ||
message = new Uint8Array(message); | ||
} | ||
var code, index = 0, i, length = message.length || 0, blocks = this.blocks; | ||
var buffer8 = this.buffer8; | ||
while (index < length) { | ||
if (this.hashed) { | ||
this.hashed = false; | ||
blocks[0] = blocks[16]; | ||
blocks[16] = blocks[1] = blocks[2] = blocks[3] = | ||
blocks[4] = blocks[5] = blocks[6] = blocks[7] = | ||
blocks[8] = blocks[9] = blocks[10] = blocks[11] = | ||
blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0; | ||
} | ||
if (notString) { | ||
if (ARRAY_BUFFER) { | ||
for (i = this.start;index < length && i < 64; ++index) { | ||
buffer8[i++] = message[index]; | ||
} | ||
} else { | ||
for (i = start;index < length && i < 64; ++index) { | ||
for (i = this.start;index < length && i < 64; ++index) { | ||
blocks[i >> 2] |= message[index] << SHIFT[i++ & 3]; | ||
@@ -61,4 +184,4 @@ } | ||
} else { | ||
if(ARRAY_BUFFER) { | ||
for (i = start;index < length && i < 64; ++index) { | ||
if (ARRAY_BUFFER) { | ||
for (i = this.start;index < length && i < 64; ++index) { | ||
code = message.charCodeAt(index); | ||
@@ -83,3 +206,3 @@ if (code < 0x80) { | ||
} else { | ||
for (i = start;index < length && i < 64; ++index) { | ||
for (i = this.start;index < length && i < 64; ++index) { | ||
code = message.charCodeAt(index); | ||
@@ -105,164 +228,205 @@ if (code < 0x80) { | ||
} | ||
bytes += i - start; | ||
start = i - 64; | ||
if(index == length) { | ||
blocks[i >> 2] |= EXTRA[i & 3]; | ||
++index; | ||
this.lastByteIndex = i; | ||
this.bytes += i - this.start; | ||
if (i >= 64) { | ||
this.start = i - 64; | ||
this.hash(); | ||
this.hashed = true; | ||
} else { | ||
this.start = i; | ||
} | ||
if(index > length && i < 56) { | ||
blocks[14] = bytes << 3; | ||
end = true; | ||
} | ||
return this; | ||
}; | ||
Md4.prototype.finalize = function () { | ||
if (this.finalized) { | ||
return; | ||
} | ||
this.finalized = true; | ||
var blocks = this.blocks, i = this.lastByteIndex; | ||
blocks[i >> 2] |= EXTRA[i & 3]; | ||
if (i >= 56) { | ||
if (!this.hashed) { | ||
this.hash(); | ||
} | ||
blocks[0] = blocks[16]; | ||
blocks[16] = blocks[1] = blocks[2] = blocks[3] = | ||
blocks[4] = blocks[5] = blocks[6] = blocks[7] = | ||
blocks[8] = blocks[9] = blocks[10] = blocks[11] = | ||
blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0; | ||
} | ||
blocks[14] = this.bytes << 3; | ||
this.hash(); | ||
}; | ||
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]; | ||
Md4.prototype.hash = function () { | ||
var a, b, c, d, ab, bc, cd, da, blocks = this.blocks; | ||
if (this.first) { | ||
a = blocks[0] - 1; | ||
a = (a << 3) | (a >>> 29); | ||
d += ((a & b) | (~a & c)) + blocks[5]; | ||
d = ((a & 0xefcdab89) | (~a & 0x98badcfe)) + blocks[1] + 271733878; | ||
d = (d << 7) | (d >>> 25); | ||
c += ((d & a) | (~d & b)) + blocks[6]; | ||
c = ((d & a) | (~d & 0xefcdab89)) + blocks[2] - 1732584194; | ||
c = (c << 11) | (c >>> 21); | ||
b += ((c & d) | (~c & a)) + blocks[7]; | ||
b = ((c & d) | (~c & a)) + blocks[3] - 271733879; | ||
b = (b << 19) | (b >>> 13); | ||
a += ((b & c) | (~b & d)) + blocks[8]; | ||
} else { | ||
a = this.h0; | ||
b = this.h1; | ||
c = this.h2; | ||
d = this.h3; | ||
a += ((b & c) | (~b & d)) + blocks[0]; | ||
a = (a << 3) | (a >>> 29); | ||
d += ((a & b) | (~a & c)) + blocks[9]; | ||
d += ((a & b) | (~a & c)) + blocks[1]; | ||
d = (d << 7) | (d >>> 25); | ||
c += ((d & a) | (~d & b)) + blocks[10]; | ||
c += ((d & a) | (~d & b)) + blocks[2]; | ||
c = (c << 11) | (c >>> 21); | ||
b += ((c & d) | (~c & a)) + blocks[11]; | ||
b += ((c & d) | (~c & a)) + blocks[3]; | ||
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 += ((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); | ||
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); | ||
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); | ||
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); | ||
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); | ||
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 (this.first) { | ||
this.h0 = a + 1732584193 << 0; | ||
this.h1 = b - 271733879 << 0; | ||
this.h2 = c - 1732584194 << 0; | ||
this.h3 = d + 271733878 << 0; | ||
this.first = false; | ||
} else { | ||
this.h0 = this.h0 + a << 0; | ||
this.h1 = this.h1 + b << 0; | ||
this.h2 = this.h2 + c << 0; | ||
this.h3 = this.h3 + d << 0; | ||
} | ||
}; | ||
/** | ||
* @method hex | ||
* @memberof Md4 | ||
* @instance | ||
* @description Output hash as hex string | ||
* @returns {String} Hex string | ||
* @see {@link md4.hex} | ||
* @example | ||
* hash.hex(); | ||
*/ | ||
Md4.prototype.hex = function () { | ||
this.finalize(); | ||
var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3; | ||
return HEX_CHARS[(h0 >> 4) & 0x0F] + HEX_CHARS[h0 & 0x0F] + | ||
@@ -286,9 +450,96 @@ HEX_CHARS[(h0 >> 12) & 0x0F] + HEX_CHARS[(h0 >> 8) & 0x0F] + | ||
if(COMMON_JS) { | ||
module.exports = md4; | ||
/** | ||
* @method toString | ||
* @memberof Md4 | ||
* @instance | ||
* @description Output hash as hex string | ||
* @returns {String} Hex string | ||
* @see {@link md4.hex} | ||
* @example | ||
* hash.toString(); | ||
*/ | ||
Md4.prototype.toString = Md4.prototype.hex; | ||
/** | ||
* @method digest | ||
* @memberof Md4 | ||
* @instance | ||
* @description Output hash as bytes array | ||
* @returns {Array} Bytes array | ||
* @see {@link md4.digest} | ||
* @example | ||
* hash.digest(); | ||
*/ | ||
Md4.prototype.digest = function() { | ||
this.finalize(); | ||
var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3; | ||
return [ | ||
h0 & 0xFF, (h0 >> 8) & 0xFF, (h0 >> 16) & 0xFF, (h0 >> 24) & 0xFF, | ||
h1 & 0xFF, (h1 >> 8) & 0xFF, (h1 >> 16) & 0xFF, (h1 >> 24) & 0xFF, | ||
h2 & 0xFF, (h2 >> 8) & 0xFF, (h2 >> 16) & 0xFF, (h2 >> 24) & 0xFF, | ||
h3 & 0xFF, (h3 >> 8) & 0xFF, (h3 >> 16) & 0xFF, (h3 >> 24) & 0xFF | ||
]; | ||
}; | ||
/** | ||
* @method array | ||
* @memberof Md4 | ||
* @instance | ||
* @description Output hash as bytes array | ||
* @returns {Array} Bytes array | ||
* @see {@link md4.array} | ||
* @example | ||
* hash.array(); | ||
*/ | ||
Md4.prototype.array = Md4.prototype.digest; | ||
/** | ||
* @method buffer | ||
* @memberof Md4 | ||
* @instance | ||
* @description Output hash as ArrayBuffer | ||
* @returns {ArrayBuffer} ArrayBuffer | ||
* @see {@link md4.buffer} | ||
* @example | ||
* hash.buffer(); | ||
*/ | ||
Md4.prototype.buffer = function() { | ||
this.finalize(); | ||
var buffer = new ArrayBuffer(16); | ||
var blocks = new Uint32Array(buffer); | ||
blocks[0] = this.h0; | ||
blocks[1] = this.h1; | ||
blocks[2] = this.h2; | ||
blocks[3] = this.h3; | ||
return buffer; | ||
}; | ||
var exports = createMethod(); | ||
if (COMMON_JS) { | ||
module.exports = exports; | ||
} else { | ||
root.md4 = md4; | ||
if(AMD) { | ||
define(function() { | ||
return md4; | ||
/** | ||
* @method md4 | ||
* @description MD4 hash function, export to global in browsers. | ||
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash | ||
* @returns {String} md4 hashes | ||
* @example | ||
* md4(''); // 31d6cfe0d16ae931b73c59d7e0c089c0 | ||
* md4('The quick brown fox jumps over the lazy dog'); // 1bee69a46ba811185c194762abaeae90 | ||
* md4('The quick brown fox jumps over the lazy dog.'); // 2812c6c7136898c51f6f6739ad08750e | ||
* | ||
* // It also supports UTF-8 encoding | ||
* md4('中文'); // 223088bf7bd45a16436b15360c5fc5a0 | ||
* | ||
* // It also supports byte `Array`, `Uint8Array`, `ArrayBuffer` | ||
* md4([]); // 31d6cfe0d16ae931b73c59d7e0c089c0 | ||
* md4(new Uint8Array([])); // 31d6cfe0d16ae931b73c59d7e0c089c0 | ||
*/ | ||
root.md4 = exports; | ||
if (AMD) { | ||
define(function () { | ||
return exports; | ||
}); | ||
@@ -295,0 +546,0 @@ } |
@@ -0,0 +0,0 @@ md4 = require('../src/md4.js'); |
(function(md4) { | ||
Array.prototype.toHexString = ArrayBuffer.prototype.toHexString = function () { | ||
var array = new Uint8Array(this); | ||
var hex = ''; | ||
for (var i = 0;i < array.length;++i) { | ||
var c = array[i].toString('16'); | ||
hex += c.length == 1 ? '0' + c : c; | ||
} | ||
return hex; | ||
}; | ||
var testCases = { | ||
@@ -51,18 +61,118 @@ 'ascii': { | ||
describe('#md4', function() { | ||
for(var testCaseName in testCases) { | ||
(function(testCaseName) { | ||
var testCase = testCases[testCaseName]; | ||
context('when ' + testCaseName, function() { | ||
for(var hash in testCase) { | ||
(function(message, hash) { | ||
it('should be equal', function() { | ||
expect(md4(message)).to.be(hash); | ||
}); | ||
})(testCase[hash], hash); | ||
} | ||
}); | ||
})(testCaseName); | ||
var methods = [ | ||
{ | ||
name: 'md4', | ||
call: md4, | ||
}, | ||
{ | ||
name: 'md4.hex', | ||
call: md4.hex | ||
}, | ||
{ | ||
name: 'md4.array', | ||
call: function (message) { | ||
return md4.array(message).toHexString(); | ||
} | ||
}, | ||
{ | ||
name: 'md4.digest', | ||
call: function (message) { | ||
return md4.digest(message).toHexString(); | ||
} | ||
}, | ||
{ | ||
name: 'md4.buffer', | ||
call: function (message) { | ||
return md4.buffer(message).toHexString(); | ||
} | ||
} | ||
]; | ||
var classMethods = [ | ||
{ | ||
name: 'create', | ||
call: function (message) { | ||
return md4.create().update(message).toString(); | ||
} | ||
}, | ||
{ | ||
name: 'update', | ||
call: function (message) { | ||
return md4.update(message).toString(); | ||
} | ||
}, | ||
{ | ||
name: 'hex', | ||
call: function (message) { | ||
return md4.update(message).hex(); | ||
} | ||
}, | ||
{ | ||
name: 'array', | ||
call: function (message) { | ||
return md4.update(message).array().toHexString(); | ||
} | ||
}, | ||
{ | ||
name: 'digest', | ||
call: function (message) { | ||
return md4.update(message).digest().toHexString(); | ||
} | ||
}, | ||
{ | ||
name: 'buffer', | ||
call: function (message) { | ||
return md4.update(message).buffer().toHexString(); | ||
} | ||
}, | ||
{ | ||
name: 'finalize', | ||
call: function (message) { | ||
var hash = md4.update(message); | ||
hash.hex(); | ||
hash.update(message); | ||
return hash.hex(); | ||
} | ||
} | ||
]; | ||
methods.forEach(function (method) { | ||
describe('#' + method.name, function() { | ||
for(var testCaseName in testCases) { | ||
(function(testCaseName) { | ||
var testCase = testCases[testCaseName]; | ||
context('when ' + testCaseName, function() { | ||
for(var hash in testCase) { | ||
(function(message, hash) { | ||
it('should be equal', function() { | ||
expect(method.call(message)).to.be(hash); | ||
}); | ||
})(testCase[hash], hash); | ||
} | ||
}); | ||
})(testCaseName); | ||
} | ||
}); | ||
}); | ||
describe('Md4', function() { | ||
classMethods.forEach(function (method) { | ||
describe('#' + method.name, function() { | ||
for(var testCaseName in testCases) { | ||
(function(testCaseName) { | ||
var testCase = testCases[testCaseName]; | ||
context('when ' + testCaseName, function() { | ||
for(var hash in testCase) { | ||
(function(message, hash) { | ||
it('should be equal', function() { | ||
expect(method.call(message)).to.be(hash); | ||
}); | ||
})(testCase[hash], hash); | ||
} | ||
}); | ||
})(testCaseName); | ||
} | ||
}); | ||
}); | ||
}); | ||
})(md4); |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Mixed license
License(Experimental) Package contains multiple licenses.
Found 1 instance in 1 package
1115348
2606.83%44
158.82%1313
170.16%5
25%1
Infinity%70
-29.29%1
Infinity%