From 731295e355fcfb5292c042068a7e74aefe59f3fa Mon Sep 17 00:00:00 2001 From: Chen Yi-Cyuan Date: Wed, 4 Mar 2015 21:16:06 +0800 Subject: [PATCH] * Support ArrayBuffer input. * Improve performance. --- CHANGELOG.md | 5 +++++ README.md | 2 +- bower.json | 2 +- build/sha1.min.js | 13 +++++++------ package.json | 2 +- src/sha1.js | 31 ++++++++++++++++++++----------- tests/test.js | 7 +++++++ 7 files changed, 42 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bf66ce4..0d6107e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +# v0.3.0 / 2015-03-04 + +* Support ArrayBuffer input. +* Improve performance. + # v0.2.0 / 2015-02-16 * Support byte array input. diff --git a/README.md b/README.md index 4f79680..5e07dfa 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ Output 7be2d2d20c106eee0836c9bc2b939890a78e8fb3 -It also supports byte Array or Uint8Array input: +It also supports byte `Array`, `Uint8Array`, `ArrayBuffer` input: Code ```JavaScript diff --git a/bower.json b/bower.json index 403d6d4..72fc168 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "js-sha1", - "version": "0.2.0", + "version": "0.3.0", "main": ["build/sha1.min.js"], "ignore": [ "samples", diff --git a/build/sha1.min.js b/build/sha1.min.js index eca2be5..50e0a75 100644 --- a/build/sha1.min.js +++ b/build/sha1.min.js @@ -1,6 +1,7 @@ -(function(x,C){"undefined"!=typeof module&&(x=global);var v="undefined"!=typeof Uint8Array,k="0123456789abcdef".split(""),B=[-2147483648,8388608,32768,128],w=[24,16,8,0],b=[];Array.prototype.__ARRAY__=!0;v&&(Uint8Array.prototype.__ARRAY__=!0);v=function(y){var n,p,q,r,t,m=0,x=!1,a,l,h,u=0,v=0,A=0,z=y.length;n=1732584193;p=4023233417;q=2562383102;r=271733878;t=3285377520;do{b[0]=m;b[16]=b[1]=b[2]=b[3]=b[4]=b[5]=b[6]=b[7]=b[8]=b[9]=b[10]=b[11]=b[12]=b[13]=b[14]=b[15]=0;if(y.__ARRAY__)for(a=v;u -a;++u)b[a>>2]|=y[u]<a;++u)m=y.charCodeAt(u),128>m?b[a>>2]|=m<m?b[a>>2]|=(192|m>>6)<m||57344<=m?b[a>>2]|=(224|m>>12)<>2]|=(240|m>>18)<>2]|=(128|m>>12&63)<>2]|=(128|m>>6&63)<>2]|=(128|m&63)<>2]|=B[a&3],++u);m=b[16];u>z&&56>a&&(b[15]=A<<3,x=!0);for(h=16;80>h;++h)a=b[h-3]^b[h-8]^b[h-14]^b[h-16],b[h]= -a<<1|a>>>31;var c=n,d=p,e=q,f=r,g=t;for(h=0;20>h;h+=5)l=d&e|~d&f,a=c<<5|c>>>27,g=a+l+g+1518500249+b[h]<<0,d=d<<30|d>>>2,l=c&d|~c&e,a=g<<5|g>>>27,f=a+l+f+1518500249+b[h+1]<<0,c=c<<30|c>>>2,l=g&c|~g&d,a=f<<5|f>>>27,e=a+l+e+1518500249+b[h+2]<<0,g=g<<30|g>>>2,l=f&g|~f&c,a=e<<5|e>>>27,d=a+l+d+1518500249+b[h+3]<<0,f=f<<30|f>>>2,l=e&f|~e&g,a=d<<5|d>>>27,c=a+l+c+1518500249+b[h+4]<<0,e=e<<30|e>>>2;for(;40>h;h+=5)l=d^e^f,a=c<<5|c>>>27,g=a+l+g+1859775393+b[h]<<0,d=d<<30|d>>>2,l=c^d^e,a=g<<5|g>>>27,f=a+l+f+1859775393+ -b[h+1]<<0,c=c<<30|c>>>2,l=g^c^d,a=f<<5|f>>>27,e=a+l+e+1859775393+b[h+2]<<0,g=g<<30|g>>>2,l=f^g^c,a=e<<5|e>>>27,d=a+l+d+1859775393+b[h+3]<<0,f=f<<30|f>>>2,l=e^f^g,a=d<<5|d>>>27,c=a+l+c+1859775393+b[h+4]<<0,e=e<<30|e>>>2;for(;60>h;h+=5)l=d&e|d&f|e&f,a=c<<5|c>>>27,g=a+l+g-1894007588+b[h]<<0,d=d<<30|d>>>2,l=c&d|c&e|d&e,a=g<<5|g>>>27,f=a+l+f-1894007588+b[h+1]<<0,c=c<<30|c>>>2,l=g&c|g&d|c&d,a=f<<5|f>>>27,e=a+l+e-1894007588+b[h+2]<<0,g=g<<30|g>>>2,l=f&g|f&c|g&c,a=e<<5|e>>>27,d=a+l+d-1894007588+b[h+3]<<0, -f=f<<30|f>>>2,l=e&f|e&g|f&g,a=d<<5|d>>>27,c=a+l+c-1894007588+b[h+4]<<0,e=e<<30|e>>>2;for(;80>h;h+=5)l=d^e^f,a=c<<5|c>>>27,g=a+l+g-899497514+b[h]<<0,d=d<<30|d>>>2,l=c^d^e,a=g<<5|g>>>27,f=a+l+f-899497514+b[h+1]<<0,c=c<<30|c>>>2,l=g^c^d,a=f<<5|f>>>27,e=a+l+e-899497514+b[h+2]<<0,g=g<<30|g>>>2,l=f^g^c,a=e<<5|e>>>27,d=a+l+d-899497514+b[h+3]<<0,f=f<<30|f>>>2,l=e^f^g,a=d<<5|d>>>27,c=a+l+c-899497514+b[h+4]<<0,e=e<<30|e>>>2;n=n+c<<0;p=p+d<<0;q=q+e<<0;r=r+f<<0;t=t+g<<0}while(!x);return k[n>>28&15]+k[n>>24&15]+ -k[n>>20&15]+k[n>>16&15]+k[n>>12&15]+k[n>>8&15]+k[n>>4&15]+k[n&15]+k[p>>28&15]+k[p>>24&15]+k[p>>20&15]+k[p>>16&15]+k[p>>12&15]+k[p>>8&15]+k[p>>4&15]+k[p&15]+k[q>>28&15]+k[q>>24&15]+k[q>>20&15]+k[q>>16&15]+k[q>>12&15]+k[q>>8&15]+k[q>>4&15]+k[q&15]+k[r>>28&15]+k[r>>24&15]+k[r>>20&15]+k[r>>16&15]+k[r>>12&15]+k[r>>8&15]+k[r>>4&15]+k[r&15]+k[t>>28&15]+k[t>>24&15]+k[t>>20&15]+k[t>>16&15]+k[t>>12&15]+k[t>>8&15]+k[t>>4&15]+k[t&15]};x.JS_SHA1_TEST||"undefined"==typeof module?x&&(x.sha1=v):module.exports=v})(this); +(function(x,F){"undefined"!=typeof module&&(x=global);var k="0123456789abcdef".split(""),C=[-2147483648,8388608,32768,128],v=[24,16,8,0],b=[],D=function(w){var x="string"!=typeof w;x&&w.constructor==ArrayBuffer&&(w=new Uint8Array(w));var n,p,q,r,t,m=0,y=!1,a,l,h,u=0,z=0,B=0,A=w.length;n=1732584193;p=4023233417;q=2562383102;r=271733878;t=3285377520;do{b[0]=m;b[16]=b[1]=b[2]=b[3]=b[4]=b[5]=b[6]=b[7]=b[8]=b[9]=b[10]=b[11]=b[12]=b[13]=b[14]=b[15]=0;if(x)for(a=z;ua;++u)b[a>>2]|=w[u]<a;++u)m=w.charCodeAt(u),128>m?b[a>>2]|=m<m?b[a>>2]|=(192|m>>6)<m||57344<=m?b[a>>2]|=(224|m>>12)<>2]|=(240|m>>18)<>2]|=(128|m>>12&63)<>2]|=(128|m>>6&63)<>2]|=(128|m&63)<>2]|=C[a&3],++u);m=b[16];u>A&&56>a&&(b[15]=B<<3,y=!0);for(h=16;80>h;++h)a=b[h-3]^b[h-8]^b[h-14]^b[h-16],b[h]=a<<1|a>>>31;var c=n,d=p,e=q,f=r,g=t;for(h= +0;20>h;h+=5)l=d&e|~d&f,a=c<<5|c>>>27,g=a+l+g+1518500249+b[h]<<0,d=d<<30|d>>>2,l=c&d|~c&e,a=g<<5|g>>>27,f=a+l+f+1518500249+b[h+1]<<0,c=c<<30|c>>>2,l=g&c|~g&d,a=f<<5|f>>>27,e=a+l+e+1518500249+b[h+2]<<0,g=g<<30|g>>>2,l=f&g|~f&c,a=e<<5|e>>>27,d=a+l+d+1518500249+b[h+3]<<0,f=f<<30|f>>>2,l=e&f|~e&g,a=d<<5|d>>>27,c=a+l+c+1518500249+b[h+4]<<0,e=e<<30|e>>>2;for(;40>h;h+=5)l=d^e^f,a=c<<5|c>>>27,g=a+l+g+1859775393+b[h]<<0,d=d<<30|d>>>2,l=c^d^e,a=g<<5|g>>>27,f=a+l+f+1859775393+b[h+1]<<0,c=c<<30|c>>>2,l=g^c^d, +a=f<<5|f>>>27,e=a+l+e+1859775393+b[h+2]<<0,g=g<<30|g>>>2,l=f^g^c,a=e<<5|e>>>27,d=a+l+d+1859775393+b[h+3]<<0,f=f<<30|f>>>2,l=e^f^g,a=d<<5|d>>>27,c=a+l+c+1859775393+b[h+4]<<0,e=e<<30|e>>>2;for(;60>h;h+=5)l=d&e|d&f|e&f,a=c<<5|c>>>27,g=a+l+g-1894007588+b[h]<<0,d=d<<30|d>>>2,l=c&d|c&e|d&e,a=g<<5|g>>>27,f=a+l+f-1894007588+b[h+1]<<0,c=c<<30|c>>>2,l=g&c|g&d|c&d,a=f<<5|f>>>27,e=a+l+e-1894007588+b[h+2]<<0,g=g<<30|g>>>2,l=f&g|f&c|g&c,a=e<<5|e>>>27,d=a+l+d-1894007588+b[h+3]<<0,f=f<<30|f>>>2,l=e&f|e&g|f&g,a=d<< +5|d>>>27,c=a+l+c-1894007588+b[h+4]<<0,e=e<<30|e>>>2;for(;80>h;h+=5)l=d^e^f,a=c<<5|c>>>27,g=a+l+g-899497514+b[h]<<0,d=d<<30|d>>>2,l=c^d^e,a=g<<5|g>>>27,f=a+l+f-899497514+b[h+1]<<0,c=c<<30|c>>>2,l=g^c^d,a=f<<5|f>>>27,e=a+l+e-899497514+b[h+2]<<0,g=g<<30|g>>>2,l=f^g^c,a=e<<5|e>>>27,d=a+l+d-899497514+b[h+3]<<0,f=f<<30|f>>>2,l=e^f^g,a=d<<5|d>>>27,c=a+l+c-899497514+b[h+4]<<0,e=e<<30|e>>>2;n=n+c<<0;p=p+d<<0;q=q+e<<0;r=r+f<<0;t=t+g<<0}while(!y);return k[n>>28&15]+k[n>>24&15]+k[n>>20&15]+k[n>>16&15]+k[n>>12& +15]+k[n>>8&15]+k[n>>4&15]+k[n&15]+k[p>>28&15]+k[p>>24&15]+k[p>>20&15]+k[p>>16&15]+k[p>>12&15]+k[p>>8&15]+k[p>>4&15]+k[p&15]+k[q>>28&15]+k[q>>24&15]+k[q>>20&15]+k[q>>16&15]+k[q>>12&15]+k[q>>8&15]+k[q>>4&15]+k[q&15]+k[r>>28&15]+k[r>>24&15]+k[r>>20&15]+k[r>>16&15]+k[r>>12&15]+k[r>>8&15]+k[r>>4&15]+k[r&15]+k[t>>28&15]+k[t>>24&15]+k[t>>20&15]+k[t>>16&15]+k[t>>12&15]+k[t>>8&15]+k[t>>4&15]+k[t&15]};if(x.JS_SHA1_TEST||"undefined"==typeof module)x&&(x.sha1=D);else{var y=require("crypto"),E=require("buffer").Buffer; +module.exports=function(b){if("string"==typeof b)return y.createHash("sha1").update(b,"utf8").digest("hex");b.constructor==ArrayBuffer&&(b=new Uint8Array(b));return y.createHash("sha1").update(new E(b)).digest("hex")}}})(this); diff --git a/package.json b/package.json index abdfde4..25dc60d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "js-sha1", - "version": "0.2.0", + "version": "0.3.0", "description": "A simple SHA1 hash function for JavaScript supports UTF-8 encoding.", "main": "src/sha1.js", "devDependencies": { diff --git a/src/sha1.js b/src/sha1.js index 6c33be8..cbaadf7 100644 --- a/src/sha1.js +++ b/src/sha1.js @@ -1,5 +1,5 @@ /* - * js-sha1 v0.2.0 + * js-sha1 v0.3.0 * https://github.com/emn178/js-sha1 * * Copyright 2014-2015, emn178@gmail.com @@ -14,19 +14,18 @@ if(NODE_JS) { root = global; } - var TYPED_ARRAY = typeof(Uint8Array) != 'undefined'; var HEX_CHARS = '0123456789abcdef'.split(''); var EXTRA = [-2147483648, 8388608, 32768, 128]; var SHIFT = [24, 16, 8, 0]; var blocks = []; - Array.prototype.__ARRAY__ = true; - if(TYPED_ARRAY) { - Uint8Array.prototype.__ARRAY__ = true; - } - var sha1 = function(message) { + var notString = typeof(message) != 'string'; + if(notString && message.constructor == ArrayBuffer) { + message = new Uint8Array(message); + } + var h0, h1, h2, h3, h4, block = 0, code, end = false, t, f, i, j, index = 0, start = 0, bytes = 0, length = message.length; @@ -42,7 +41,7 @@ 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(message.__ARRAY__) { + if(notString) { for (i = start;index < length && i < 64; ++index) { blocks[i >> 2] |= message[index] << SHIFT[i++ & 3]; } @@ -223,9 +222,19 @@ }; if(!root.JS_SHA1_TEST && typeof(module) != 'undefined') { - module.exports = sha1; - } - else if(root) { + var crypto = require('crypto'); + var Buffer = require('buffer').Buffer; + + module.exports = function(message) { + if(typeof(message) == 'string') { + return crypto.createHash('sha1').update(message, 'utf8').digest('hex'); + } + if(message.constructor == ArrayBuffer) { + message = new Uint8Array(message); + } + return crypto.createHash('sha1').update(new Buffer(message)).digest('hex'); + }; + } else if(root) { root.sha1 = sha1; } }(this)); diff --git a/tests/test.js b/tests/test.js index 94e4dd4..1bea771 100644 --- a/tests/test.js +++ b/tests/test.js @@ -56,5 +56,12 @@ expect(sha1(new Uint8Array([]))).to.be('da39a3ee5e6b4b0d3255bfef95601890afd80709'); }); }); + + describe('ArrayBuffer', function() { + it('should be successful', function() { + expect(sha1(new ArrayBuffer(0))).to.be('da39a3ee5e6b4b0d3255bfef95601890afd80709'); + expect(sha1(new ArrayBuffer(1))).to.be('5ba93c9db0cff93f52b521d7420e43f6eda2784f'); + }); + }); }); })(sha1);