From 1ff17fbdd9ba2cda4397cf7e59d729cb040ac695 Mon Sep 17 00:00:00 2001 From: Chen Yi-Cyuan Date: Sat, 23 May 2015 10:06:36 +0800 Subject: [PATCH] Support ArrayBuffer input. --- .covignore | 1 + .npmignore | 3 + CHANGELOG.md | 4 ++ LICENSE.txt | 4 +- README.md | 2 +- bower.json | 4 +- build/sha256.min.js | 25 +++++--- package.json | 2 +- src/sha256.js | 14 ++--- tests/test.js | 150 +++++++++++++++++++++++--------------------- 10 files changed, 117 insertions(+), 92 deletions(-) create mode 100644 .npmignore diff --git a/.covignore b/.covignore index 016f806..8c36f6f 100644 --- a/.covignore +++ b/.covignore @@ -1 +1,2 @@ /tests/ +node_modules/ diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..a208bb2 --- /dev/null +++ b/.npmignore @@ -0,0 +1,3 @@ +covreporter +build +tests diff --git a/CHANGELOG.md b/CHANGELOG.md index 0c8aa5c..88fe72f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# v0.3.0 / 2015-05-23 + +* Support ArrayBuffer input. + # v0.2.3 / 2015-02-11 * Support byte array input. diff --git a/LICENSE.txt b/LICENSE.txt index 58074d3..aeb45cf 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,4 +1,6 @@ -Copyright 2014-2015 emn178@gmail.com +Copyright (c) 2015 Chen Yi-Cyuan + +MIT License Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the diff --git a/README.md b/README.md index a3772e5..8efc4a2 100644 --- a/README.md +++ b/README.md @@ -68,7 +68,7 @@ Output 72726d8818f693066ceb69afa364218b692e62ea92b385782363780f47529c21 dfbab71afdf54388af4d55f8bd3de8c9b15e0eb916bf9125f4a959d4 -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 cfae4ef..75aa6a7 100644 --- a/bower.json +++ b/bower.json @@ -1,7 +1,7 @@ { "name": "js-sha256", - "version": "0.2.3", - "main": ["build/sha256.min.js"], + "version": "0.3.0", + "main": ["src/sha256.js"], "ignore": [ "samples", "tests" diff --git a/build/sha256.min.js b/build/sha256.min.js index 249eb49..5ddc0f7 100644 --- a/build/sha256.min.js +++ b/build/sha256.min.js @@ -1,8 +1,17 @@ -(function(C,P){var J="undefined"!=typeof module;J&&(C=global);var H="undefined"!=typeof Uint8Array,a="0123456789abcdef".split(""),O=[-2147483648,8388608,32768,128],D=[24,16,8,0],K=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711, -113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],c=[];Array.prototype.__ARRAY__=!0;H&&(Uint8Array.prototype.__ARRAY__=!0);var H=function(a){return A(a,!0)},A=function(A,C){var f,n,p,q,r, -t,u,v,g,H=!0,J=!1,b,B=0,L=0,N=0,M=A.length,e,d,E,F,G,I;C?(f=3238371032,n=914150663,p=812702999,q=4144912697,r=4290775857,t=1750603025,u=1694076839,v=3204075428):(f=1779033703,n=3144134277,p=1013904242,q=2773480762,r=1359893119,t=2600822924,u=528734635,v=1541459225);g=0;do{c[0]=g;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(A.__ARRAY__)for(b=L;Bb;++B)c[b>>2]|=A[B]<b;++B)g=A.charCodeAt(B),128>g?c[b>>2]|=g<g?c[b>>2]|=(192|g>>6)<g||57344<=g?c[b>>2]|=(224|g>>12)<>2]|=(240|g>>18)<>2]|=(128|g>>12&63)<>2]|=(128|g>>6&63)<>2]|=(128|g&63)<>2]|=O[b&3],++B);g=c[16];B>M&&56>b&&(c[15]=N<<3,J=!0);var w=f,l=n,m=p,h=q,x=r,y=t,z=u,k=v;for(b=16;64>b;++b)d=c[b-15],e=(d>>>7|d<<25)^(d>>>18|d<<14)^d>>>3,d=c[b-2],d=(d>>>17|d<<15)^(d>>>19|d<<13)^d>>>10,c[b]=c[b- -16]+e+c[b-7]+d<<0;I=l&m;for(b=0;64>b;b+=4)H?(C?(G=300032,d=c[0]-1413257819,k=d-150054599<<0,h=d+24177077<<0):(G=704751109,d=c[0]-210244248,k=d-1521486534<<0,h=d+143694565<<0),H=!1):(e=(w>>>2|w<<30)^(w>>>13|w<<19)^(w>>>22|w<<10),d=(x>>>6|x<<26)^(x>>>11|x<<21)^(x>>>25|x<<7),G=w&l,E=G^w&m^I,F=x&y^~x&z,d=k+d+F+K[b]+c[b],e+=E,k=h+d<<0,h=d+e<<0),e=(h>>>2|h<<30)^(h>>>13|h<<19)^(h>>>22|h<<10),d=(k>>>6|k<<26)^(k>>>11|k<<21)^(k>>>25|k<<7),I=h&w,E=I^h&l^G,F=k&x^~k&y,d=z+d+F+K[b+1]+c[b+1],e+=E,z=m+d<<0,m=d+e<< -0,e=(m>>>2|m<<30)^(m>>>13|m<<19)^(m>>>22|m<<10),d=(z>>>6|z<<26)^(z>>>11|z<<21)^(z>>>25|z<<7),G=m&h,E=G^m&w^I,F=z&k^~z&x,d=y+d+F+K[b+2]+c[b+2],e+=E,y=l+d<<0,l=d+e<<0,e=(l>>>2|l<<30)^(l>>>13|l<<19)^(l>>>22|l<<10),d=(y>>>6|y<<26)^(y>>>11|y<<21)^(y>>>25|y<<7),I=l&m,E=I^l&h^G,F=y&z^~y&k,d=x+d+F+K[b+3]+c[b+3],e+=E,x=w+d<<0,w=d+e<<0;f=f+w<<0;n=n+l<<0;p=p+m<<0;q=q+h<<0;r=r+x<<0;t=t+y<<0;u=u+z<<0;v=v+k<<0}while(!J);f=a[f>>28&15]+a[f>>24&15]+a[f>>20&15]+a[f>>16&15]+a[f>>12&15]+a[f>>8&15]+a[f>>4&15]+a[f&15]+ -a[n>>28&15]+a[n>>24&15]+a[n>>20&15]+a[n>>16&15]+a[n>>12&15]+a[n>>8&15]+a[n>>4&15]+a[n&15]+a[p>>28&15]+a[p>>24&15]+a[p>>20&15]+a[p>>16&15]+a[p>>12&15]+a[p>>8&15]+a[p>>4&15]+a[p&15]+a[q>>28&15]+a[q>>24&15]+a[q>>20&15]+a[q>>16&15]+a[q>>12&15]+a[q>>8&15]+a[q>>4&15]+a[q&15]+a[r>>28&15]+a[r>>24&15]+a[r>>20&15]+a[r>>16&15]+a[r>>12&15]+a[r>>8&15]+a[r>>4&15]+a[r&15]+a[t>>28&15]+a[t>>24&15]+a[t>>20&15]+a[t>>16&15]+a[t>>12&15]+a[t>>8&15]+a[t>>4&15]+a[t&15]+a[u>>28&15]+a[u>>24&15]+a[u>>20&15]+a[u>>16&15]+a[u>> -12&15]+a[u>>8&15]+a[u>>4&15]+a[u&15];C||(f+=a[v>>28&15]+a[v>>24&15]+a[v>>20&15]+a[v>>16&15]+a[v>>12&15]+a[v>>8&15]+a[v>>4&15]+a[v&15]);return f};!C.JS_SHA256_TEST&&J?(A.sha256=A,A.sha224=H,module.exports=A):C&&(C.sha256=A,C.sha224=H)})(this); +/* + * js-sha256 v0.3.0 + * https://github.com/emn178/js-sha256 + * + * Copyright 2014-2015, emn178@gmail.com + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ +(function(I,R){var K="undefined"!=typeof module;K&&(I=global);var a="0123456789abcdef".split(""),Q=[-2147483648,8388608,32768,128],C=[24,16,8,0],M=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205, +773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],c=[],L=function(a){return A(a,!0)},A=function(D,A){var J="string"!=typeof D;J&&D.constructor==I.ArrayBuffer&&(D=new Uint8Array(D));var m,n,p,q,r,t,u,v,f,K=!0,L=!1,b,B= +0,N=0,P=0,O=D.length,e,d,E,F,G,H;A?(m=3238371032,n=914150663,p=812702999,q=4144912697,r=4290775857,t=1750603025,u=1694076839,v=3204075428):(m=1779033703,n=3144134277,p=1013904242,q=2773480762,r=1359893119,t=2600822924,u=528734635,v=1541459225);f=0;do{c[0]=f;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(J)for(b=N;Bb;++B)c[b>>2]|=D[B]<b;++B)f=D.charCodeAt(B),128>f?c[b>>2]|=f<f?c[b>>2]|=(192|f>>6)<f||57344<=f?c[b>>2]|=(224|f>>12)<>2]|=(240|f>>18)<>2]|=(128|f>>12&63)<>2]|=(128|f>>6&63)<>2]|=(128|f&63)<>2]|=Q[b&3],++B);f=c[16];B>O&&56>b&&(c[15]=P<<3,L=!0);var w=m,k=n,l=p,g=q,x=r,y=t,z=u,h=v;for(b=16;64>b;++b)d=c[b-15],e=(d>>>7|d<<25)^(d>>>18|d<<14)^d>>>3,d=c[b-2],d=(d>>>17|d<<15)^(d>>>19|d<<13)^d>>>10,c[b]=c[b-16]+e+c[b-7]+d<<0;H=k&l;for(b=0;64> +b;b+=4)K?(A?(G=300032,d=c[0]-1413257819,h=d-150054599<<0,g=d+24177077<<0):(G=704751109,d=c[0]-210244248,h=d-1521486534<<0,g=d+143694565<<0),K=!1):(e=(w>>>2|w<<30)^(w>>>13|w<<19)^(w>>>22|w<<10),d=(x>>>6|x<<26)^(x>>>11|x<<21)^(x>>>25|x<<7),G=w&k,E=G^w&l^H,F=x&y^~x&z,d=h+d+F+M[b]+c[b],e+=E,h=g+d<<0,g=d+e<<0),e=(g>>>2|g<<30)^(g>>>13|g<<19)^(g>>>22|g<<10),d=(h>>>6|h<<26)^(h>>>11|h<<21)^(h>>>25|h<<7),H=g&w,E=H^g&k^G,F=h&x^~h&y,d=z+d+F+M[b+1]+c[b+1],e+=E,z=l+d<<0,l=d+e<<0,e=(l>>>2|l<<30)^(l>>>13|l<<19)^ +(l>>>22|l<<10),d=(z>>>6|z<<26)^(z>>>11|z<<21)^(z>>>25|z<<7),G=l&g,E=G^l&w^H,F=z&h^~z&x,d=y+d+F+M[b+2]+c[b+2],e+=E,y=k+d<<0,k=d+e<<0,e=(k>>>2|k<<30)^(k>>>13|k<<19)^(k>>>22|k<<10),d=(y>>>6|y<<26)^(y>>>11|y<<21)^(y>>>25|y<<7),H=k&l,E=H^k&g^G,F=y&z^~y&h,d=x+d+F+M[b+3]+c[b+3],e+=E,x=w+d<<0,w=d+e<<0;m=m+w<<0;n=n+k<<0;p=p+l<<0;q=q+g<<0;r=r+x<<0;t=t+y<<0;u=u+z<<0;v=v+h<<0}while(!L);J=a[m>>28&15]+a[m>>24&15]+a[m>>20&15]+a[m>>16&15]+a[m>>12&15]+a[m>>8&15]+a[m>>4&15]+a[m&15]+a[n>>28&15]+a[n>>24&15]+a[n>>20& +15]+a[n>>16&15]+a[n>>12&15]+a[n>>8&15]+a[n>>4&15]+a[n&15]+a[p>>28&15]+a[p>>24&15]+a[p>>20&15]+a[p>>16&15]+a[p>>12&15]+a[p>>8&15]+a[p>>4&15]+a[p&15]+a[q>>28&15]+a[q>>24&15]+a[q>>20&15]+a[q>>16&15]+a[q>>12&15]+a[q>>8&15]+a[q>>4&15]+a[q&15]+a[r>>28&15]+a[r>>24&15]+a[r>>20&15]+a[r>>16&15]+a[r>>12&15]+a[r>>8&15]+a[r>>4&15]+a[r&15]+a[t>>28&15]+a[t>>24&15]+a[t>>20&15]+a[t>>16&15]+a[t>>12&15]+a[t>>8&15]+a[t>>4&15]+a[t&15]+a[u>>28&15]+a[u>>24&15]+a[u>>20&15]+a[u>>16&15]+a[u>>12&15]+a[u>>8&15]+a[u>>4&15]+a[u& +15];A||(J+=a[v>>28&15]+a[v>>24&15]+a[v>>20&15]+a[v>>16&15]+a[v>>12&15]+a[v>>8&15]+a[v>>4&15]+a[v&15]);return J};!I.JS_SHA256_TEST&&K?(A.sha256=A,A.sha224=L,module.exports=A):I&&(I.sha256=A,I.sha224=L)})(this); diff --git a/package.json b/package.json index 7c04a83..630f805 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "js-sha256", - "version": "0.2.3", + "version": "0.3.0", "description": "A simple SHA-256 / SHA-224 hash function for JavaScript supports UTF-8 encoding.", "main": "src/sha256.js", "devDependencies": { diff --git a/src/sha256.js b/src/sha256.js index c1c92f1..ddf8b3e 100644 --- a/src/sha256.js +++ b/src/sha256.js @@ -1,5 +1,5 @@ /* - * js-sha256 v0.2.3 + * js-sha256 v0.3.0 * https://github.com/emn178/js-sha256 * * Copyright 2014-2015, emn178@gmail.com @@ -29,16 +29,16 @@ var blocks = []; - Array.prototype.__ARRAY__ = true; - if(TYPED_ARRAY) { - Uint8Array.prototype.__ARRAY__ = true; - } - var sha224 = function(message) { return sha256(message, true); }; var sha256 = function(message, is224) { + var notString = typeof(message) != 'string'; + if(notString && message.constructor == root.ArrayBuffer) { + message = new Uint8Array(message); + } + var h0, h1, h2, h3, h4, h5, h6, h7, block, code, first = true, end = false, i, j, index = 0, start = 0, bytes = 0, length = message.length, s0, s1, maj, t1, t2, ch, ab, da, cd, bc; @@ -69,7 +69,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]; } diff --git a/tests/test.js b/tests/test.js index 6e418d2..5e9cd55 100644 --- a/tests/test.js +++ b/tests/test.js @@ -1,50 +1,50 @@ -describe('sha256', function() { - describe('ascii', function() { - describe('less than 64 bytes', function() { - it('should be successful', function() { - expect(sha256('')).to.be('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'); - expect(sha256('The quick brown fox jumps over the lazy dog')).to.be('d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592'); - expect(sha256('The quick brown fox jumps over the lazy dog.')).to.be('ef537f25c895bfa782526529a9b63d97aa631564d5d789c2b765448c8635fb6c'); +(function(sha256, sha224) { + describe('sha256', function() { + context('when ascii', function() { + context('and less than 64 bytes', function() { + it('should be equal', function() { + expect(sha256('')).to.be('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'); + expect(sha256('The quick brown fox jumps over the lazy dog')).to.be('d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592'); + expect(sha256('The quick brown fox jumps over the lazy dog.')).to.be('ef537f25c895bfa782526529a9b63d97aa631564d5d789c2b765448c8635fb6c'); + }); }); - }); - describe('more than 64 bytes', function() { - it('should be successful', function() { - expect(sha256('The MD5 message-digest algorithm is a widely used cryptographic hash function producing a 128-bit (16-byte) hash value, typically expressed in text format as a 32 digit hexadecimal number. MD5 has been utilized in a wide variety of cryptographic applications, and is also commonly used to verify data integrity.')).to.be('54e73d89e1924fdcd056390266a983924b6d6d461e9470b6cd50bbaf69b5c54c'); + context('and more than 64 bytes', function() { + it('should be equal', function() { + expect(sha256('The MD5 message-digest algorithm is a widely used cryptographic hash function producing a 128-bit (16-byte) hash value, typically expressed in text format as a 32 digit hexadecimal number. MD5 has been utilized in a wide variety of cryptographic applications, and is also commonly used to verify data integrity.')).to.be('54e73d89e1924fdcd056390266a983924b6d6d461e9470b6cd50bbaf69b5c54c'); + }); }); }); - }); - describe('UTF8', function() { - describe('less than 64 bytes', function() { - it('should be successful', function() { - expect(sha256('中文')).to.be('72726d8818f693066ceb69afa364218b692e62ea92b385782363780f47529c21'); - expect(sha256('aécio')).to.be('53196d1acfce0c4b264e01e8018c989d571351f59e33f055f76ff15b4f0516c6'); - expect(sha256('𠜎')).to.be('8d10a48685dbc34484696de7ea7434d80a54c1d60100530faccf697463ef19c9'); + context('when UTF8', function() { + context('and less than 64 bytes', function() { + it('should be equal', function() { + expect(sha256('中文')).to.be('72726d8818f693066ceb69afa364218b692e62ea92b385782363780f47529c21'); + expect(sha256('aécio')).to.be('53196d1acfce0c4b264e01e8018c989d571351f59e33f055f76ff15b4f0516c6'); + expect(sha256('𠜎')).to.be('8d10a48685dbc34484696de7ea7434d80a54c1d60100530faccf697463ef19c9'); + }); }); - }); - describe('more than 64 bytes', function() { - it('should be successful', function() { - expect(sha256('訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一')).to.be('d691014feebf35b3500ef6f6738d0094cac63628a7a018a980a40292a77703d1'); - expect(sha256('訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一(又譯雜湊演算法、摘要演算法等),主流程式語言普遍已有MD5的實作。')).to.be('81a1472ebdeb09406a783d607ff49ee2fde3e9f44ac1cd158ad8d6ad3c4e69fa'); + context('and more than 64 bytes', function() { + it('should be equal', function() { + expect(sha256('訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一')).to.be('d691014feebf35b3500ef6f6738d0094cac63628a7a018a980a40292a77703d1'); + expect(sha256('訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一(又譯雜湊演算法、摘要演算法等),主流程式語言普遍已有MD5的實作。')).to.be('81a1472ebdeb09406a783d607ff49ee2fde3e9f44ac1cd158ad8d6ad3c4e69fa'); + }); }); }); - }); - - describe('special length', function() { - it('should be successful', function() { - expect(sha256('0123456780123456780123456780123456780123456780123456780')).to.be('5e6b963e2b6444dab8544beab8532850cef2a9d143872a6a5384abe37e61b3db'); - expect(sha256('01234567801234567801234567801234567801234567801234567801')).to.be('85d240a4a03a0710423fc4f701da51e8785c9eaa96d718ab1c7991d6afd60d62'); - expect(sha256('0123456780123456780123456780123456780123456780123456780123456780')).to.be('c3ee464d5620eb2dde3dfda4c7955dbd9e9e2e9b113c13983fc67b0dfd892a53'); - expect(sha256('01234567801234567801234567801234567801234567801234567801234567801234567')).to.be('74b51c6911f9a8b5e7c499effe7604e43b672166818873c27752c248de434841'); - expect(sha256('012345678012345678012345678012345678012345678012345678012345678012345678')).to.be('6fba9e623ae6abf028a1b195748814aa95eebfb22e3ec5e15d2444cd6c48186a'); + + context('when special length', function() { + it('should be equal', function() { + expect(sha256('0123456780123456780123456780123456780123456780123456780')).to.be('5e6b963e2b6444dab8544beab8532850cef2a9d143872a6a5384abe37e61b3db'); + expect(sha256('01234567801234567801234567801234567801234567801234567801')).to.be('85d240a4a03a0710423fc4f701da51e8785c9eaa96d718ab1c7991d6afd60d62'); + expect(sha256('0123456780123456780123456780123456780123456780123456780123456780')).to.be('c3ee464d5620eb2dde3dfda4c7955dbd9e9e2e9b113c13983fc67b0dfd892a53'); + expect(sha256('01234567801234567801234567801234567801234567801234567801234567801234567')).to.be('74b51c6911f9a8b5e7c499effe7604e43b672166818873c27752c248de434841'); + expect(sha256('012345678012345678012345678012345678012345678012345678012345678012345678')).to.be('6fba9e623ae6abf028a1b195748814aa95eebfb22e3ec5e15d2444cd6c48186a'); + }); }); - }); - describe('Array', function() { - describe('Array', function() { - it('should be successful', function() { + context('when Array', function() { + it('should be equal', function() { expect(sha256([])).to.be('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'); expect(sha256([211, 212])).to.be('182889f925ae4e5cc37118ded6ed87f7bdc7cab5ec5e78faef2e50048999473f'); expect(sha256([84, 104, 101, 32, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 32, 102, 111, 120, 32, 106, 117, 109, 112, 115, 32, 111, 118, 101, 114, 32, 116, 104, 101, 32, 108, 97, 122, 121, 32, 100, 111, 103])).to.be('d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592'); @@ -52,56 +52,62 @@ describe('sha256', function() { }); }); - describe('Uint8Array', function() { - it('should be successful', function() { + context('when Uint8Array', function() { + it('should be equal', function() { expect(sha256(new Uint8Array([]))).to.be('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'); expect(sha256(new Uint8Array([211, 212]))).to.be('182889f925ae4e5cc37118ded6ed87f7bdc7cab5ec5e78faef2e50048999473f'); }); }); - }); -}); -describe('sha224', function() { - describe('ascii', function() { - describe('less than 64 bytes', function() { - it('should be successful', function() { - expect(sha224('')).to.be('d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f'); - expect(sha224('The quick brown fox jumps over the lazy dog')).to.be('730e109bd7a8a32b1cb9d9a09aa2325d2430587ddbc0c38bad911525'); - expect(sha224('The quick brown fox jumps over the lazy dog.')).to.be('619cba8e8e05826e9b8c519c0a5c68f4fb653e8a3d8aa04bb2c8cd4c'); + context('when ArrayBuffer', function() { + it('should be equal', function() { + expect(sha256(new ArrayBuffer(0))).to.be('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'); }); }); + }); - describe('more than 64 bytes', function() { - it('should be successful', function() { - expect(sha224('The MD5 message-digest algorithm is a widely used cryptographic hash function producing a 128-bit (16-byte) hash value, typically expressed in text format as a 32 digit hexadecimal number. MD5 has been utilized in a wide variety of cryptographic applications, and is also commonly used to verify data integrity.')).to.be('4d97e15967391d2e846ea7d21bb480efadbae5868b731e7cc6267006'); + describe('sha224', function() { + context('when ascii', function() { + context('and less than 64 bytes', function() { + it('should be equal', function() { + expect(sha224('')).to.be('d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f'); + expect(sha224('The quick brown fox jumps over the lazy dog')).to.be('730e109bd7a8a32b1cb9d9a09aa2325d2430587ddbc0c38bad911525'); + expect(sha224('The quick brown fox jumps over the lazy dog.')).to.be('619cba8e8e05826e9b8c519c0a5c68f4fb653e8a3d8aa04bb2c8cd4c'); + }); }); - }); - }); - describe('UTF8', function() { - describe('less than 64 bytes', function() { - it('should be successful', function() { - expect(sha224('中文')).to.be('dfbab71afdf54388af4d55f8bd3de8c9b15e0eb916bf9125f4a959d4'); - expect(sha224('aécio')).to.be('d12841cafd89c534924a839e62bf35a2b5f3717b7802eb19bd8d8e15'); - expect(sha224('𠜎')).to.be('eaa0129b5509f5701db218fb7076b282e4409da52d06363aa3bdd63d'); + context('and more than 64 bytes', function() { + it('should be equal', function() { + expect(sha224('The MD5 message-digest algorithm is a widely used cryptographic hash function producing a 128-bit (16-byte) hash value, typically expressed in text format as a 32 digit hexadecimal number. MD5 has been utilized in a wide variety of cryptographic applications, and is also commonly used to verify data integrity.')).to.be('4d97e15967391d2e846ea7d21bb480efadbae5868b731e7cc6267006'); + }); }); }); - describe('more than 64 bytes', function() { - it('should be successful', function() { - expect(sha224('訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一')).to.be('0dda421f3f81272418e1313673e9d74b7f2d04efc9c52c69458e12c3'); - expect(sha224('訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一(又譯雜湊演算法、摘要演算法等),主流程式語言普遍已有MD5的實作。')).to.be('a8cb74a54e6dc6ab6110db3915ba08ffe5e1abafaea78538fa12a626'); + context('when UTF8', function() { + context('and less than 64 bytes', function() { + it('should be equal', function() { + expect(sha224('中文')).to.be('dfbab71afdf54388af4d55f8bd3de8c9b15e0eb916bf9125f4a959d4'); + expect(sha224('aécio')).to.be('d12841cafd89c534924a839e62bf35a2b5f3717b7802eb19bd8d8e15'); + expect(sha224('𠜎')).to.be('eaa0129b5509f5701db218fb7076b282e4409da52d06363aa3bdd63d'); + }); + }); + + context('and more than 64 bytes', function() { + it('should be equal', function() { + expect(sha224('訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一')).to.be('0dda421f3f81272418e1313673e9d74b7f2d04efc9c52c69458e12c3'); + expect(sha224('訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一(又譯雜湊演算法、摘要演算法等),主流程式語言普遍已有MD5的實作。')).to.be('a8cb74a54e6dc6ab6110db3915ba08ffe5e1abafaea78538fa12a626'); + }); }); }); - }); - - describe('special length', function() { - it('should be successful', function() { - expect(sha224('0123456780123456780123456780123456780123456780123456780')).to.be('bc4a354d66f3cff4bc6dd6a88fbb0435cede7fd5fe94da0760cb1924'); - expect(sha224('01234567801234567801234567801234567801234567801234567801')).to.be('2f148f757d1295784a7c69bf328b8bf827a536669e132234cd6f50e7'); - expect(sha224('0123456780123456780123456780123456780123456780123456780123456780')).to.be('496275a96bf41aa27ce89c3ae0fc63c3a3eab063887a8ea075bd091b'); - expect(sha224('01234567801234567801234567801234567801234567801234567801234567801234567')).to.be('16ee1b101fe0e0d8dd156d598931ec19d75b0f8dc0a0455733c168c8'); - expect(sha224('012345678012345678012345678012345678012345678012345678012345678012345678')).to.be('04c7a30079c640e440d884cdf0d7ab04fd05501d4498cb21be29ca1f'); + + context('when special length', function() { + it('should be equal', function() { + expect(sha224('0123456780123456780123456780123456780123456780123456780')).to.be('bc4a354d66f3cff4bc6dd6a88fbb0435cede7fd5fe94da0760cb1924'); + expect(sha224('01234567801234567801234567801234567801234567801234567801')).to.be('2f148f757d1295784a7c69bf328b8bf827a536669e132234cd6f50e7'); + expect(sha224('0123456780123456780123456780123456780123456780123456780123456780')).to.be('496275a96bf41aa27ce89c3ae0fc63c3a3eab063887a8ea075bd091b'); + expect(sha224('01234567801234567801234567801234567801234567801234567801234567801234567')).to.be('16ee1b101fe0e0d8dd156d598931ec19d75b0f8dc0a0455733c168c8'); + expect(sha224('012345678012345678012345678012345678012345678012345678012345678012345678')).to.be('04c7a30079c640e440d884cdf0d7ab04fd05501d4498cb21be29ca1f'); + }); }); }); -}); +})(sha256, sha224);