diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..85581a5 --- /dev/null +++ b/.npmignore @@ -0,0 +1,7 @@ +/node_modules/ +/covreporter/ +/tests/ +.covignore +.travis.yml +.npmignore +bower.json diff --git a/CHANGELOG.md b/CHANGELOG.md index f5498a5..f41e1e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Change Log +## v0.8.0 / 2017-11-19 +### Added +- support for web worker. +- typescript types. #10 + +### Changed +- prevent webpack to require dependencies. + ## v0.7.1 / 2017-10-31 ### Improved - performance of hBytes increment. diff --git a/bower.json b/bower.json index af3a185..f5e038a 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "js-sha256", - "version": "0.7.1", + "version": "0.8.0", "main": ["src/sha256.js"], "ignore": [ "samples", diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..3ac12ed --- /dev/null +++ b/index.d.ts @@ -0,0 +1,59 @@ +type Message = string | number[] | ArrayBuffer | Uint8Array; + +interface Hasher { + /** + * Update hash + * + * @param message The message you want to hash. + */ + update(message: Message): Hasher; + + /** + * Return hash in hex string. + */ + hex(): string; + + /** + * Return hash in hex string. + */ + toString(): string; + + /** + * Return hash in ArrayBuffer. + */ + arrayBuffer(): ArrayBuffer; + + /** + * Return hash in integer array. + */ + digest(): number[]; + + /** + * Return hash in integer array. + */ + array(): number[]; +} + +interface Hash { + /** + * Hash and return hex string. + * + * @param message The message you want to hash. + */ + (message: Message): string; + + /** + * Create a hash object. + */ + create(): Hasher; + + /** + * Create a hash object and hash message. + * + * @param message The message you want to hash. + */ + update(message: Message): Hasher; +} + +export var sha256: Hash; +export var sha224: Hash; diff --git a/package-lock.json b/package-lock.json index 83d9d2a..b6a79dc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "js-sha256", - "version": "0.7.0", + "version": "0.8.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -16,6 +16,12 @@ "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", "dev": true }, + "bindings": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.3.0.tgz", + "integrity": "sha512-DpLh5EzMR2kzvX1KIlVC0VkC3iZtHKTgdtZ0a3pglBZdaQFjt5S9g9xd1lE+YvXyfd6mtCeRnrUfOLYiTMlNSw==", + "dev": true + }, "coffee-script": { "version": "1.12.7", "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz", @@ -199,6 +205,12 @@ "integrity": "sha1-2JwhJMb9wTU9Zai3e/GqxLGTcIw=", "dev": true }, + "nan": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", + "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=", + "dev": true + }, "optimist": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.1.tgz", @@ -264,6 +276,16 @@ "integrity": "sha1-NEDWTgRXWViVJEGOtkHGi7kNET4=", "dev": true }, + "webworker-threads": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/webworker-threads/-/webworker-threads-0.7.13.tgz", + "integrity": "sha1-yEsYtrokElu503NC5E3rgVFi+4M=", + "dev": true, + "requires": { + "bindings": "1.3.0", + "nan": "2.8.0" + } + }, "wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", diff --git a/package.json b/package.json index b0b0df5..44981b5 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,14 @@ { "name": "js-sha256", - "version": "0.7.1", + "version": "0.8.0", "description": "A simple SHA-256 / SHA-224 hash function for JavaScript supports UTF-8 encoding.", "main": "src/sha256.js", "devDependencies": { "expect.js": "~0.3.1", "jscoverage": "~0.5.9", "mocha": "~2.3.4", - "uglifyjs": "~2.4.10" + "uglifyjs": "~2.4.10", + "webworker-threads": "^0.7.13" }, "scripts": { "test": "mocha tests/node-test.js -r jscoverage", diff --git a/src/sha256.js b/src/sha256.js index 7c6519e..e7a71d7 100644 --- a/src/sha256.js +++ b/src/sha256.js @@ -1,7 +1,7 @@ /** * [js-sha256]{@link https://github.com/emn178/js-sha256} * - * @version 0.7.1 + * @version 0.8.0 * @author Chen, Yi-Cyuan [emn178@gmail.com] * @copyright Chen, Yi-Cyuan 2014-2017 * @license MIT @@ -11,14 +11,21 @@ 'use strict'; var ERROR = 'input is invalid type'; - var root = typeof window === 'object' ? window : {}; + var WINDOW = typeof window === 'object'; + var root = WINDOW ? window : {}; + if (root.JS_SHA256_NO_WINDOW) { + WINDOW = false; + } + var WEB_WORKER = !WINDOW && typeof self === 'object'; var NODE_JS = !root.JS_SHA256_NO_NODE_JS && typeof process === 'object' && process.versions && process.versions.node; if (NODE_JS) { root = global; + } else if (WEB_WORKER) { + root = self; } var COMMON_JS = !root.JS_SHA256_NO_COMMON_JS && typeof module === 'object' && module.exports; var AMD = typeof define === 'function' && define.amd; - var ARRAY_BUFFER = typeof ArrayBuffer !== 'undefined'; + var ARRAY_BUFFER = !root.JS_SHA256_NO_ARRAY_BUFFER && typeof ArrayBuffer !== 'undefined'; var HEX_CHARS = '0123456789abcdef'.split(''); var EXTRA = [-2147483648, 8388608, 32768, 128]; var SHIFT = [24, 16, 8, 0]; @@ -42,6 +49,12 @@ }; } + if (ARRAY_BUFFER && (root.JS_SHA256_NO_ARRAY_BUFFER_IS_VIEW || !ArrayBuffer.isView)) { + ArrayBuffer.isView = function (obj) { + return typeof obj === 'object' && obj.buffer && obj.buffer.constructor === ArrayBuffer; + }; + } + var createOutputMethod = function (outputType, is224) { return function (message) { return new Sha256(is224, true).update(message)[outputType](); @@ -67,8 +80,8 @@ }; var nodeWrap = function (method, is224) { - var crypto = require('crypto'); - var Buffer = require('buffer').Buffer; + var crypto = eval("require('crypto')"); + var Buffer = eval("require('buffer').Buffer"); var algorithm = is224 ? 'sha224' : 'sha256'; var nodeMethod = function (message) { if (typeof message === 'string') { @@ -114,9 +127,9 @@ function Sha256(is224, 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; + 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; this.blocks = blocks; } else { this.blocks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; @@ -152,32 +165,33 @@ if (this.finalized) { return; } - var notString = typeof message !== 'string'; - if (notString) { - if (message === null || message === undefined) { - throw ERROR; - } else if (message.constructor === root.ArrayBuffer) { - message = new Uint8Array(message); - } - } - var length = message.length; - if (notString) { - if (typeof length !== 'number' || - !Array.isArray(message) && - !(ARRAY_BUFFER && ArrayBuffer.isView(message))) { + var notString, type = typeof message; + if (type !== 'string') { + if (type === 'object') { + if (message === null) { + throw ERROR; + } else if (ARRAY_BUFFER && message.constructor === ArrayBuffer) { + message = new Uint8Array(message); + } else if (!Array.isArray(message)) { + if (!ARRAY_BUFFER || !ArrayBuffer.isView(message)) { + throw ERROR; + } + } + } else { throw ERROR; } + notString = true; } - var code, index = 0, i, blocks = this.blocks; + var code, index = 0, i, length = message.length, blocks = this.blocks; while (index < length) { if (this.hashed) { this.hashed = false; blocks[0] = this.block; 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[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) { @@ -239,9 +253,9 @@ } blocks[0] = this.block; 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[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.hBytes << 3 | this.bytes >> 29; blocks[15] = this.bytes << 3; @@ -413,24 +427,10 @@ }; function HmacSha256(key, is224, sharedMemory) { - var notString = typeof key !== 'string'; - if (notString) { - if (key === null || key === undefined) { - throw ERROR; - } else if (key.constructor === root.ArrayBuffer) { - key = new Uint8Array(key); - } - } - var length = key.length; - if (notString) { - if (typeof length !== 'number' || - !Array.isArray(key) && - !(ARRAY_BUFFER && ArrayBuffer.isView(key))) { - throw ERROR; - } - } else { + var i, type = typeof key; + if (type === 'string') { var bytes = [], length = key.length, index = 0, code; - for (var i = 0; i < length; ++i) { + for (i = 0; i < length; ++i) { code = key.charCodeAt(i); if (code < 0x80) { bytes[index++] = code; @@ -450,6 +450,20 @@ } } key = bytes; + } else { + if (type === 'object') { + if (key === null) { + throw ERROR; + } else if (ARRAY_BUFFER && key.constructor === ArrayBuffer) { + key = new Uint8Array(key); + } else if (!Array.isArray(key)) { + if (!ARRAY_BUFFER || !ArrayBuffer.isView(key)) { + throw ERROR; + } + } + } else { + throw ERROR; + } } if (key.length > 64) { @@ -457,7 +471,7 @@ } var oKeyPad = [], iKeyPad = []; - for (var i = 0; i < 64; ++i) { + for (i = 0; i < 64; ++i) { var b = key[i] || 0; oKeyPad[i] = 0x5c ^ b; iKeyPad[i] = 0x36 ^ b; diff --git a/tests/hmac-test.js b/tests/hmac-test.js index 76aecb5..c83a7b8 100644 --- a/tests/hmac-test.js +++ b/tests/hmac-test.js @@ -41,12 +41,6 @@ '865cc329d317f6d9fdbd183a3c5cc5fd4c370d11f98abbbb404bceb1e6392c7e': ['中文', '中文'], 'efeef87be5731506b69bb64a9898a456dd12c94834c36a4d8ba99e3db79ad7ed': ['aécio', 'aécio'], '8a6e527049b9cfc7e1c84bcf356a1289c95da68a586c03de3327f3de0d3737fe': ['𠜎', '𠜎'] - }, - 'ArrayBuffer': { - 'e48411262715c8370cd5e7bf8e82bef53bd53712d007f3429351843b77c7bb9b': [ - new ArrayBuffer(0), - 'Hi There' - ] } }, sha224_hmac: { @@ -80,16 +74,25 @@ 'e2280928fe813aeb7fa59aa14dd5e589041bfdf91945d19d25b9f3db': ['中文', '中文'], '86c53dc054b16f6e006a254891bc9ff0da5df8e1a6faee3b0aaa732d': ['aécio', 'aécio'], 'e9e5991bfb84506b105f800afac1599ff807bb8e20db8ffda48997b9': ['𠜎', '𠜎'] - }, - 'ArrayBuffer': { - 'da8f94de91d62154b55ea4e8d6eb133f6d553bcd1f1ba205b9488945': [ - new ArrayBuffer(0), - 'Hi There' - ] } } }; + if (!(typeof JS_SHA256_NO_ARRAY_BUFFER === 'boolean' && JS_SHA256_NO_ARRAY_BUFFER)) { + testCases.sha256_hmac.ArrayBuffer = { + 'e48411262715c8370cd5e7bf8e82bef53bd53712d007f3429351843b77c7bb9b': [ + new ArrayBuffer(0), + 'Hi There' + ] + }; + testCases.sha224_hmac.ArrayBuffer = { + 'da8f94de91d62154b55ea4e8d6eb133f6d553bcd1f1ba205b9488945': [ + new ArrayBuffer(0), + 'Hi There' + ] + }; + } + var errorTestCases = [null, undefined, { length: 0 }, 0, 1, false, true, NaN, Infinity, function () {}]; function runTestCases(name, algorithm) { diff --git a/tests/node-test.js b/tests/node-test.js index f794b1b..a232558 100644 --- a/tests/node-test.js +++ b/tests/node-test.js @@ -1,47 +1,71 @@ -// Node.js env expect = require('expect.js'); -sha256 = require('../src/sha256.js').sha256; -sha224 = require('../src/sha256.js').sha224; -require('./test.js'); -require('./hmac-test.js'); +Worker = require('webworker-threads').Worker; + +function unset() { + delete require.cache[require.resolve('../src/sha256.js')]; + delete require.cache[require.resolve('./test.js')]; + delete require.cache[require.resolve('./hmac-test.js')]; + sha256 = null; + sha224 = null; + BUFFER = undefined; + JS_SHA256_NO_WINDOW = undefined; + JS_SHA256_NO_NODE_JS = undefined; + JS_SHA256_NO_COMMON_JS = undefined; + JS_SHA256_NO_ARRAY_BUFFER = undefined; + JS_SHA256_NO_ARRAY_BUFFER_IS_VIEW = undefined; + window = undefined; +} + +function requireToGlobal() { + sha256 = require('../src/sha256.js').sha256; + sha224 = require('../src/sha256.js').sha224; +} + +function runCommonJsTest() { + requireToGlobal(); + require('./test.js'); + require('./hmac-test.js'); + unset(); +} -delete require.cache[require.resolve('../src/sha256.js')] -delete require.cache[require.resolve('./test.js')] -delete require.cache[require.resolve('./hmac-test.js')] -sha256 = null; -sha224 = null; +function runWindowTest() { + window = global; + require('../src/sha256.js'); + require('./test.js'); + require('./hmac-test.js'); + unset(); +} + +// Node.js env +BUFFER = true; +runCommonJsTest(); // Webpack browser env JS_SHA256_NO_NODE_JS = true; window = global; -sha256 = require('../src/sha256.js').sha256; -sha224 = require('../src/sha256.js').sha224; -require('./test.js'); -require('./hmac-test.js'); - -delete require.cache[require.resolve('../src/sha256.js')] -delete require.cache[require.resolve('./test.js')] -delete require.cache[require.resolve('./hmac-test.js')] -sha256 = null; -sha224 = null; +runCommonJsTest(); // browser env JS_SHA256_NO_NODE_JS = true; JS_SHA256_NO_COMMON_JS = true; -window = global; -require('../src/sha256.js'); -require('./test.js'); -require('./hmac-test.js'); +runWindowTest(); -delete require.cache[require.resolve('../src/sha256.js')] -delete require.cache[require.resolve('./test.js')] -delete require.cache[require.resolve('./hmac-test.js')] -sha256 = null; -sha224 = null; +// browser env and no array buffer +JS_SHA256_NO_NODE_JS = true; +JS_SHA256_NO_COMMON_JS = true; +JS_SHA256_NO_ARRAY_BUFFER = true; +runWindowTest(); + +// browser env and no isView +JS_SHA256_NO_NODE_JS = true; +JS_SHA256_NO_COMMON_JS = true; +JS_SHA256_NO_ARRAY_BUFFER_IS_VIEW = true; +runWindowTest(); // browser AMD JS_SHA256_NO_NODE_JS = true; JS_SHA256_NO_COMMON_JS = true; +JS_SHA256_NO_ARRAY_BUFFER_IS_VIEW = false; window = global; define = function (func) { sha256 = func(); @@ -52,3 +76,38 @@ define = function (func) { define.amd = true; require('../src/sha256.js'); +unset(); + +// webworker +WORKER = 'tests/worker.js'; +SOURCE = 'src/sha256.js'; + +require('./worker-test.js'); + +delete require.cache[require.resolve('./worker-test.js')]; + +// cover webworker +JS_SHA256_NO_WINDOW = true; +JS_SHA256_NO_NODE_JS = true; +WORKER = './worker.js'; +SOURCE = '../src/sha256.js'; +window = global; +self = global; + +Worker = function (file) { + require(file); + currentWorker = this; + + this.postMessage = function (data) { + onmessage({data: data}); + }; +} + +postMessage = function (data) { + currentWorker.onmessage({data: data}); +} + +importScripts = function () {}; + +requireToGlobal(); +require('./worker-test.js'); diff --git a/tests/test.js b/tests/test.js index 7fed82d..1093429 100644 --- a/tests/test.js +++ b/tests/test.js @@ -40,18 +40,6 @@ '182889f925ae4e5cc37118ded6ed87f7bdc7cab5ec5e78faef2e50048999473f': [211, 212], 'd7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592': [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], '74b51c6911f9a8b5e7c499effe7604e43b672166818873c27752c248de434841': [48, 49, 50, 51, 52, 53, 54, 55, 56, 48, 49, 50, 51, 52, 53, 54, 55, 56, 48, 49, 50, 51, 52, 53, 54, 55, 56, 48, 49, 50, 51, 52, 53, 54, 55, 56, 48, 49, 50, 51, 52, 53, 54, 55, 56, 48, 49, 50, 51, 52, 53, 54, 55, 56, 48, 49, 50, 51, 52, 53, 54, 55, 56, 48, 49, 50, 51, 52, 53, 54, 55] - }, - - 'Uint8Array': { - '182889f925ae4e5cc37118ded6ed87f7bdc7cab5ec5e78faef2e50048999473f': new Uint8Array([211, 212]), - 'd7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592': new Uint8Array([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]) - }, - 'Int8Array': { - 'd7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592': new Int8Array([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]) - }, - 'ArrayBuffer': { - 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855': new ArrayBuffer(0), - '6e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d': new ArrayBuffer(1), } }, sha224: { @@ -83,34 +71,48 @@ 'd14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f': [], '730e109bd7a8a32b1cb9d9a09aa2325d2430587ddbc0c38bad911525': [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], '16ee1b101fe0e0d8dd156d598931ec19d75b0f8dc0a0455733c168c8': [48, 49, 50, 51, 52, 53, 54, 55, 56, 48, 49, 50, 51, 52, 53, 54, 55, 56, 48, 49, 50, 51, 52, 53, 54, 55, 56, 48, 49, 50, 51, 52, 53, 54, 55, 56, 48, 49, 50, 51, 52, 53, 54, 55, 56, 48, 49, 50, 51, 52, 53, 54, 55, 56, 48, 49, 50, 51, 52, 53, 54, 55, 56, 48, 49, 50, 51, 52, 53, 54, 55] - }, - 'Uint8Array': { - 'e17541396a3ecd1cd5a2b968b84e597e8eae3b0ea3127963bf48dd3b': new Uint8Array([211, 212]), - '730e109bd7a8a32b1cb9d9a09aa2325d2430587ddbc0c38bad911525': new Uint8Array([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]) - }, - 'Int8Array': { - '730e109bd7a8a32b1cb9d9a09aa2325d2430587ddbc0c38bad911525': new Int8Array([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]) - }, - 'ArrayBuffer': { - 'd14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f': new ArrayBuffer(0), - 'fff9292b4201617bdc4d3053fce02734166a683d7d858a7f5f59b073': new ArrayBuffer(1), } } }; - var errorTestCases = [null, undefined, { length: 0 }, 0, 1, false, true, NaN, Infinity, function () {}]; + if (!(typeof JS_SHA256_NO_ARRAY_BUFFER === 'boolean' && JS_SHA256_NO_ARRAY_BUFFER)) { + testCases.sha256.Uint8Array = { + '182889f925ae4e5cc37118ded6ed87f7bdc7cab5ec5e78faef2e50048999473f': new Uint8Array([211, 212]), + 'd7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592': new Uint8Array([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]) + }; + testCases.sha256.Int8Array = { + 'd7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592': new Int8Array([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]) + }; + testCases.sha256.ArrayBuffer = { + 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855': new ArrayBuffer(0), + '6e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d': new ArrayBuffer(1) + }; + testCases.sha224.Uint8Array = { + 'e17541396a3ecd1cd5a2b968b84e597e8eae3b0ea3127963bf48dd3b': new Uint8Array([211, 212]), + '730e109bd7a8a32b1cb9d9a09aa2325d2430587ddbc0c38bad911525': new Uint8Array([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]) + }; + testCases.sha224.Int8Array = { + '730e109bd7a8a32b1cb9d9a09aa2325d2430587ddbc0c38bad911525': new Int8Array([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]) + }; + testCases.sha224.ArrayBuffer = { + 'd14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f': new ArrayBuffer(0), + 'fff9292b4201617bdc4d3053fce02734166a683d7d858a7f5f59b073': new ArrayBuffer(1), + }; + } - if (typeof process == 'object') { - testCases.sha256['Buffer'] = { + if (typeof BUFFER === 'boolean' && BUFFER) { + testCases.sha256.Buffer = { 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855': new Buffer(0), 'd7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592': new Buffer(new Uint8Array([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])) }; - testCases.sha224['Buffer'] = { + testCases.sha224.Buffer = { 'd14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f': new Buffer(0), '730e109bd7a8a32b1cb9d9a09aa2325d2430587ddbc0c38bad911525': new Buffer(new Uint8Array([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])) }; } + var errorTestCases = [null, undefined, { length: 0 }, 0, 1, false, true, NaN, Infinity, function () {}]; + function runTestCases(name, algorithm) { var methods = [ { diff --git a/tests/worker-test.js b/tests/worker-test.js new file mode 100644 index 0000000..20b63e0 --- /dev/null +++ b/tests/worker-test.js @@ -0,0 +1,21 @@ +(function (Worker, WORKER, SOURCE) { + var cases = { + 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855': '', + 'd7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592': 'The quick brown fox jumps over the lazy dog', + 'ef537f25c895bfa782526529a9b63d97aa631564d5d789c2b765448c8635fb6c': 'The quick brown fox jumps over the lazy dog.' + }; + + describe('#sha256', function () { + Object.keys(cases).forEach(function (hash) { + it('should be equal', function (done) { + var worker = new Worker(WORKER); + worker.onmessage = function(event) { + expect(event.data).to.be(hash); + done(); + }; + worker.postMessage(SOURCE); + worker.postMessage(cases[hash]); + }); + }); + }); +})(Worker, WORKER, SOURCE); diff --git a/tests/worker.html b/tests/worker.html new file mode 100644 index 0000000..1ed41b2 --- /dev/null +++ b/tests/worker.html @@ -0,0 +1,26 @@ + + +
+ +