mirror of
https://github.com/emn178/js-sha3.git
synced 2026-08-12 19:41:36 +08:00
Added
- AMD support. - support for web worker. #13 Changed - throw error if input type is incorrect when cSHAKE and KMAC. - freeze hash after finalize.
This commit is contained in:
@@ -1,2 +0,0 @@
|
||||
/node_modules/
|
||||
/tests/
|
||||
+2
-2
@@ -1,3 +1,3 @@
|
||||
/node_modules/
|
||||
/covreporter/
|
||||
/my_test/
|
||||
/coverage/
|
||||
/.nyc_output/
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
/node_modules/
|
||||
/coverage/
|
||||
/.nyc_output/
|
||||
/tests/
|
||||
.travis.yml
|
||||
.npmignore
|
||||
bower.json
|
||||
+3
-5
@@ -1,12 +1,10 @@
|
||||
language: node_js
|
||||
node_js:
|
||||
- "0.12.15"
|
||||
- "4.5"
|
||||
- "6.5.0"
|
||||
- "6.11.4"
|
||||
- "8.6.0"
|
||||
before_install:
|
||||
- npm install coveralls
|
||||
- npm install mocha-lcov-reporter
|
||||
script: npm run-script coveralls
|
||||
after_success: npm run coveralls
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
|
||||
@@ -1,5 +1,14 @@
|
||||
# Change Log
|
||||
|
||||
## v0.7.0 / 2017-12-01
|
||||
### Added
|
||||
- AMD support.
|
||||
- support for web worker. #13
|
||||
|
||||
### Changed
|
||||
- throw error if input type is incorrect when cSHAKE and KMAC.
|
||||
- freeze hash after finalize.
|
||||
|
||||
## v0.6.1 / 2017-07-03
|
||||
### Fixed
|
||||
- Typo on variable kmac_256 type definition. #12
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "js-sha3",
|
||||
"version": "0.6.1",
|
||||
"version": "0.7.0",
|
||||
"main": ["src/sha3.js"],
|
||||
"ignore": [
|
||||
"samples",
|
||||
|
||||
Vendored
+2
-2
File diff suppressed because one or more lines are too long
Generated
+1802
File diff suppressed because it is too large
Load Diff
+14
-10
@@ -1,21 +1,20 @@
|
||||
{
|
||||
"name": "js-sha3",
|
||||
"version": "0.6.1",
|
||||
"version": "0.7.0",
|
||||
"description": "A simple SHA-3 / Keccak / Shake hash function for JavaScript supports UTF-8 encoding.",
|
||||
"main": "src/sha3.js",
|
||||
"typings": "index",
|
||||
"types": "index.d.ts",
|
||||
"devDependencies": {
|
||||
"expect.js": "~0.3.1",
|
||||
"jscoverage": "~0.5.9",
|
||||
"mocha": "~2.3.2",
|
||||
"uglifyjs": "~2.4.10"
|
||||
"mocha": "~2.3.4",
|
||||
"nyc": "^11.3.0",
|
||||
"uglify-js": "^3.1.9",
|
||||
"webworker-threads": "^0.7.13"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "mocha tests/node-test.js -r jscoverage",
|
||||
"report": "mocha tests/node-test.js -r jscoverage --covout=html",
|
||||
"coveralls": "mocha tests/node-test.js -R mocha-lcov-reporter -r jscoverage | coveralls",
|
||||
"build": "uglifyjs src/sha3.js --compress --mangle --comments --output build/sha3.min.js"
|
||||
"test": "nyc mocha tests/node-test.js",
|
||||
"report": "nyc --reporter=html --reporter=text mocha tests/node-test.js",
|
||||
"coveralls": "nyc report --reporter=text-lcov | coveralls",
|
||||
"build": "uglifyjs src/sha3.js -c -m --comments --output build/sha3.min.js"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -37,5 +36,10 @@
|
||||
"homepage": "https://github.com/emn178/js-sha3",
|
||||
"bugs": {
|
||||
"url": "https://github.com/emn178/js-sha3/issues"
|
||||
},
|
||||
"nyc": {
|
||||
"exclude": [
|
||||
"tests"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
+62
-29
@@ -1,7 +1,7 @@
|
||||
/**
|
||||
* [js-sha3]{@link https://github.com/emn178/js-sha3}
|
||||
*
|
||||
* @version 0.6.1
|
||||
* @version 0.7.0
|
||||
* @author Chen, Yi-Cyuan [emn178@gmail.com]
|
||||
* @copyright Chen, Yi-Cyuan 2015-2017
|
||||
* @license MIT
|
||||
@@ -10,12 +10,21 @@
|
||||
(function () {
|
||||
'use strict';
|
||||
|
||||
var root = typeof window === 'object' ? window : {};
|
||||
var ERROR = 'input is invalid type';
|
||||
var WINDOW = typeof window === 'object';
|
||||
var root = WINDOW ? window : {};
|
||||
if (root.JS_SHA3_NO_WINDOW) {
|
||||
WINDOW = false;
|
||||
}
|
||||
var WEB_WORKER = !WINDOW && typeof self === 'object';
|
||||
var NODE_JS = !root.JS_SHA3_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_SHA3_NO_COMMON_JS && typeof module === 'object' && module.exports;
|
||||
var AMD = typeof define === 'function' && define.amd;
|
||||
var ARRAY_BUFFER = !root.JS_SHA3_NO_ARRAY_BUFFER && typeof ArrayBuffer !== 'undefined';
|
||||
var HEX_CHARS = '0123456789abcdef'.split('');
|
||||
var SHAKE_PADDING = [31, 7936, 2031616, 520093696];
|
||||
@@ -30,7 +39,7 @@
|
||||
2147516545, 2147483648, 32896, 2147483648, 2147483649, 0, 2147516424, 2147483648];
|
||||
var BITS = [224, 256, 384, 512];
|
||||
var SHAKE_BITS = [128, 256];
|
||||
var OUTPUT_TYPES = ['hex', 'buffer', 'arrayBuffer', 'array'];
|
||||
var OUTPUT_TYPES = ['hex', 'buffer', 'arrayBuffer', 'array', 'digest'];
|
||||
var CSHAKE_BYTEPAD = {
|
||||
'128': 168,
|
||||
'256': 136
|
||||
@@ -42,6 +51,12 @@
|
||||
};
|
||||
}
|
||||
|
||||
if (ARRAY_BUFFER && (root.JS_SHA3_NO_ARRAY_BUFFER_IS_VIEW || !ArrayBuffer.isView)) {
|
||||
ArrayBuffer.isView = function (obj) {
|
||||
return typeof obj === 'object' && obj.buffer && obj.buffer.constructor === ArrayBuffer;
|
||||
};
|
||||
}
|
||||
|
||||
var createOutputMethod = function (bits, padding, outputType) {
|
||||
return function (message) {
|
||||
return new Keccak(bits, padding, bits).update(message)[outputType]();
|
||||
@@ -155,6 +170,7 @@
|
||||
this.padding = padding;
|
||||
this.outputBits = outputBits;
|
||||
this.reset = true;
|
||||
this.finalized = false;
|
||||
this.block = 0;
|
||||
this.start = 0;
|
||||
this.blockCount = (1600 - (bits << 1)) >> 5;
|
||||
@@ -168,19 +184,27 @@
|
||||
}
|
||||
|
||||
Keccak.prototype.update = function (message) {
|
||||
var notString = typeof message !== 'string';
|
||||
if (notString && message.constructor === root.ArrayBuffer) {
|
||||
if (this.finalized) {
|
||||
return;
|
||||
}
|
||||
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);
|
||||
}
|
||||
var length = message.length;
|
||||
if (notString) {
|
||||
if (typeof length !== 'number' ||
|
||||
!Array.isArray(message) &&
|
||||
!(ARRAY_BUFFER && ArrayBuffer.isView(message))) {
|
||||
throw 'input is invalid type';
|
||||
} else if (!Array.isArray(message)) {
|
||||
if (!ARRAY_BUFFER || !ArrayBuffer.isView(message)) {
|
||||
throw ERROR;
|
||||
}
|
||||
}
|
||||
var blocks = this.blocks, byteCount = this.byteCount,
|
||||
} else {
|
||||
throw ERROR;
|
||||
}
|
||||
notString = true;
|
||||
}
|
||||
var blocks = this.blocks, byteCount = this.byteCount, length = message.length,
|
||||
blockCount = this.blockCount, index = 0, s = this.s, i, code;
|
||||
|
||||
while (index < length) {
|
||||
@@ -253,20 +277,24 @@
|
||||
};
|
||||
|
||||
Keccak.prototype.encodeString = function (str) {
|
||||
str = str || '';
|
||||
var notString = typeof str !== 'string';
|
||||
if (notString && str.constructor === root.ArrayBuffer) {
|
||||
var notString, type = typeof str;
|
||||
if (type !== 'string') {
|
||||
if (type === 'object') {
|
||||
if (str === null) {
|
||||
throw ERROR;
|
||||
} else if (ARRAY_BUFFER && str.constructor === ArrayBuffer) {
|
||||
str = new Uint8Array(str);
|
||||
}
|
||||
var length = str.length;
|
||||
if (notString) {
|
||||
if (typeof length !== 'number' ||
|
||||
!Array.isArray(str) &&
|
||||
!(ARRAY_BUFFER && ArrayBuffer.isView(str))) {
|
||||
throw 'input is invalid type';
|
||||
} else if (!Array.isArray(str)) {
|
||||
if (!ARRAY_BUFFER || !ArrayBuffer.isView(str)) {
|
||||
throw ERROR;
|
||||
}
|
||||
}
|
||||
var bytes = 0;
|
||||
} else {
|
||||
throw ERROR;
|
||||
}
|
||||
notString = true;
|
||||
}
|
||||
var bytes = 0, length = str.length;
|
||||
if (notString) {
|
||||
bytes = length;
|
||||
} else {
|
||||
@@ -302,6 +330,10 @@
|
||||
};
|
||||
|
||||
Keccak.prototype.finalize = function () {
|
||||
if (this.finalized) {
|
||||
return;
|
||||
}
|
||||
this.finalized = true;
|
||||
var blocks = this.blocks, i = this.lastByteIndex, blockCount = this.blockCount, s = this.s;
|
||||
blocks[i >> 2] |= this.padding[i & 3];
|
||||
if (this.lastByteIndex === this.byteCount) {
|
||||
@@ -338,9 +370,7 @@
|
||||
}
|
||||
if (extraBytes) {
|
||||
block = s[i];
|
||||
if (extraBytes > 0) {
|
||||
hex += HEX_CHARS[(block >> 4) & 0x0F] + HEX_CHARS[block & 0x0F];
|
||||
}
|
||||
if (extraBytes > 1) {
|
||||
hex += HEX_CHARS[(block >> 12) & 0x0F] + HEX_CHARS[(block >> 8) & 0x0F];
|
||||
}
|
||||
@@ -403,9 +433,7 @@
|
||||
if (extraBytes) {
|
||||
offset = j << 2;
|
||||
block = s[i];
|
||||
if (extraBytes > 0) {
|
||||
array[offset] = block & 0xFF;
|
||||
}
|
||||
if (extraBytes > 1) {
|
||||
array[offset + 1] = (block >> 8) & 0xFF;
|
||||
}
|
||||
@@ -615,8 +643,13 @@
|
||||
if (COMMON_JS) {
|
||||
module.exports = methods;
|
||||
} else {
|
||||
for (var i = 0; i < methodNames.length; ++i) {
|
||||
for (i = 0; i < methodNames.length; ++i) {
|
||||
root[methodNames[i]] = methods[methodNames[i]];
|
||||
}
|
||||
if (AMD) {
|
||||
define(function () {
|
||||
return methods;
|
||||
});
|
||||
}
|
||||
}
|
||||
})();
|
||||
|
||||
+128
-58
@@ -1,61 +1,9 @@
|
||||
expect = require('expect.js');
|
||||
Worker = require('webworker-threads').Worker;
|
||||
|
||||
// Node.js env
|
||||
var sha3 = require('../src/sha3.js');
|
||||
keccak512 = sha3.keccak512;
|
||||
keccak384 = sha3.keccak384;
|
||||
keccak256 = sha3.keccak256;
|
||||
keccak224 = sha3.keccak224;
|
||||
sha3_512 = sha3.sha3_512;
|
||||
sha3_384 = sha3.sha3_384;
|
||||
sha3_256 = sha3.sha3_256;
|
||||
sha3_224 = sha3.sha3_224;
|
||||
shake128 = sha3.shake128;
|
||||
shake256 = sha3.shake256;
|
||||
cshake128 = sha3.cshake128;
|
||||
cshake256 = sha3.cshake256;
|
||||
kmac128 = sha3.kmac128;
|
||||
kmac256 = sha3.kmac256;
|
||||
require('./test.js');
|
||||
require('./test-shake.js');
|
||||
require('./test-cshake.js');
|
||||
require('./test-kmac.js');
|
||||
|
||||
function unset() {
|
||||
delete require.cache[require.resolve('../src/sha3.js')];
|
||||
delete require.cache[require.resolve('./test.js')];
|
||||
delete require.cache[require.resolve('./test-shake.js')];
|
||||
delete require.cache[require.resolve('./test-cshake.js')];
|
||||
delete require.cache[require.resolve('./test-kmac.js')];
|
||||
|
||||
// Webpack browser env
|
||||
JS_SHA3_NO_NODE_JS = true;
|
||||
window = global;
|
||||
expect = require('expect.js');
|
||||
var sha3 = require('../src/sha3.js');
|
||||
keccak512 = sha3.keccak512;
|
||||
keccak384 = sha3.keccak384;
|
||||
keccak256 = sha3.keccak256;
|
||||
keccak224 = sha3.keccak224;
|
||||
sha3_512 = sha3.sha3_512;
|
||||
sha3_384 = sha3.sha3_384;
|
||||
sha3_256 = sha3.sha3_256;
|
||||
sha3_224 = sha3.sha3_224;
|
||||
shake128 = sha3.shake128;
|
||||
shake256 = sha3.shake256;
|
||||
cshake128 = sha3.cshake128;
|
||||
cshake256 = sha3.cshake256;
|
||||
kmac128 = sha3.kmac128;
|
||||
kmac256 = sha3.kmac256;
|
||||
require('./test.js');
|
||||
require('./test-shake.js');
|
||||
require('./test-cshake.js');
|
||||
require('./test-kmac.js');
|
||||
|
||||
delete require.cache[require.resolve('../src/sha3.js')];
|
||||
delete require.cache[require.resolve('./test.js')];
|
||||
delete require.cache[require.resolve('./test-shake.js')];
|
||||
delete require.cache[require.resolve('./test-cshake.js')];
|
||||
delete require.cache[require.resolve('./test-kmac.js')];
|
||||
sha3_512 = null;
|
||||
sha3_384 = null;
|
||||
sha3_256 = null;
|
||||
@@ -68,13 +16,135 @@ shake128 = null;
|
||||
shake256 = null;
|
||||
kmac128 = null;
|
||||
kmac256 = null;
|
||||
BUFFER = undefined;
|
||||
JS_SHA3_NO_WINDOW = undefined;
|
||||
JS_SHA3_NO_NODE_JS = undefined;
|
||||
JS_SHA3_NO_COMMON_JS = undefined;
|
||||
JS_SHA3_NO_ARRAY_BUFFER = undefined;
|
||||
JS_SHA3_NO_ARRAY_BUFFER_IS_VIEW = undefined;
|
||||
window = undefined;
|
||||
}
|
||||
|
||||
function requireToGlobal() {
|
||||
var sha3 = require('../src/sha3.js');
|
||||
keccak512 = sha3.keccak512;
|
||||
keccak384 = sha3.keccak384;
|
||||
keccak256 = sha3.keccak256;
|
||||
keccak224 = sha3.keccak224;
|
||||
sha3_512 = sha3.sha3_512;
|
||||
sha3_384 = sha3.sha3_384;
|
||||
sha3_256 = sha3.sha3_256;
|
||||
sha3_224 = sha3.sha3_224;
|
||||
shake128 = sha3.shake128;
|
||||
shake256 = sha3.shake256;
|
||||
cshake128 = sha3.cshake128;
|
||||
cshake256 = sha3.cshake256;
|
||||
kmac128 = sha3.kmac128;
|
||||
kmac256 = sha3.kmac256;
|
||||
}
|
||||
|
||||
function runCommonJsTest() {
|
||||
requireToGlobal();
|
||||
require('./test.js');
|
||||
unset();
|
||||
}
|
||||
|
||||
function runWindowTest(extra) {
|
||||
window = global;
|
||||
require('../src/sha3.js');
|
||||
require('./test.js');
|
||||
if (extra) {
|
||||
require('./test-shake.js');
|
||||
require('./test-cshake.js');
|
||||
require('./test-kmac.js');
|
||||
}
|
||||
unset();
|
||||
}
|
||||
|
||||
// Node.js env
|
||||
BUFFER = true;
|
||||
runCommonJsTest();
|
||||
|
||||
// Webpack browser env
|
||||
JS_SHA3_NO_NODE_JS = true;
|
||||
window = global;
|
||||
runCommonJsTest();
|
||||
|
||||
// browser env
|
||||
JS_SHA3_NO_NODE_JS = true;
|
||||
JS_SHA3_NO_COMMON_JS = true;
|
||||
runWindowTest(true);
|
||||
|
||||
// browser env and no array buffer
|
||||
JS_SHA3_NO_NODE_JS = true;
|
||||
JS_SHA3_NO_COMMON_JS = true;
|
||||
JS_SHA3_NO_ARRAY_BUFFER = true;
|
||||
runWindowTest();
|
||||
|
||||
// browser env and no isView
|
||||
JS_SHA3_NO_NODE_JS = true;
|
||||
JS_SHA3_NO_COMMON_JS = true;
|
||||
JS_SHA3_NO_ARRAY_BUFFER_IS_VIEW = true;
|
||||
runWindowTest();
|
||||
|
||||
// browser AMD
|
||||
JS_SHA3_NO_NODE_JS = true;
|
||||
JS_SHA3_NO_COMMON_JS = true;
|
||||
JS_SHA3_NO_ARRAY_BUFFER_IS_VIEW = false;
|
||||
window = global;
|
||||
require('../src/sha3.js');
|
||||
define = function (func) {
|
||||
sha3 = func();
|
||||
keccak512 = sha3.keccak512;
|
||||
keccak384 = sha3.keccak384;
|
||||
keccak256 = sha3.keccak256;
|
||||
keccak224 = sha3.keccak224;
|
||||
sha3_512 = sha3.sha3_512;
|
||||
sha3_384 = sha3.sha3_384;
|
||||
sha3_256 = sha3.sha3_256;
|
||||
sha3_224 = sha3.sha3_224;
|
||||
shake128 = sha3.shake128;
|
||||
shake256 = sha3.shake256;
|
||||
cshake128 = sha3.cshake128;
|
||||
cshake256 = sha3.cshake256;
|
||||
kmac128 = sha3.kmac128;
|
||||
kmac256 = sha3.kmac256;
|
||||
require('./test.js');
|
||||
require('./test-shake.js');
|
||||
require('./test-cshake.js');
|
||||
require('./test-kmac.js');
|
||||
};
|
||||
define.amd = true;
|
||||
|
||||
require('../src/sha3.js');
|
||||
unset();
|
||||
|
||||
// webworker
|
||||
WORKER = 'tests/worker.js';
|
||||
SOURCE = 'src/sha3.js';
|
||||
|
||||
require('./worker-test.js');
|
||||
|
||||
delete require.cache[require.resolve('./worker-test.js')];
|
||||
|
||||
// cover webworker
|
||||
JS_SHA3_NO_WINDOW = true;
|
||||
JS_SHA3_NO_NODE_JS = true;
|
||||
WORKER = './worker.js';
|
||||
SOURCE = '../src/sha3.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');
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
it('should be equal', function () {
|
||||
expect(shake128('', 16)).to.be('7f9c');
|
||||
expect(shake128('', 24)).to.be('7f9c2b');
|
||||
expect(shake128.array('', 8)).to.eql([0x7f]);
|
||||
expect(shake128.array('', 16)).to.eql([0x7f, 0x9c]);
|
||||
expect(shake128.array('', 24)).to.eql([0x7f, 0x9c, 0x2b]);
|
||||
});
|
||||
|
||||
+169
-146
@@ -9,63 +9,6 @@
|
||||
return hex;
|
||||
};
|
||||
|
||||
function runTestCases(methods, testCases) {
|
||||
methods.forEach(function (method) {
|
||||
describe('#' + method.name, function () {
|
||||
var methodTestCases = testCases[method.name];
|
||||
for (var testCaseName in methodTestCases) {
|
||||
(function (testCaseName) {
|
||||
var testCase = methodTestCases[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);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
var methods = [
|
||||
{
|
||||
name: 'sha3_512',
|
||||
call: sha3_512
|
||||
},
|
||||
{
|
||||
name: 'sha3_384',
|
||||
call: sha3_384
|
||||
},
|
||||
{
|
||||
name: 'sha3_256',
|
||||
call: sha3_256
|
||||
},
|
||||
{
|
||||
name: 'sha3_224',
|
||||
call: sha3_224
|
||||
},
|
||||
{
|
||||
name: 'keccak512',
|
||||
call: keccak512
|
||||
},
|
||||
{
|
||||
name: 'keccak384',
|
||||
call: keccak384
|
||||
},
|
||||
{
|
||||
name: 'keccak256',
|
||||
call: keccak256
|
||||
},
|
||||
{
|
||||
name: 'keccak224',
|
||||
call: keccak224
|
||||
}
|
||||
];
|
||||
|
||||
var testCases = {
|
||||
sha3_512: {
|
||||
'ascii': {
|
||||
@@ -92,14 +35,6 @@
|
||||
'Array': {
|
||||
'a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26': [],
|
||||
'01dedd5de4ef14642445ba5f5b97c15e47b9ad931326e4b0727cd94cefc44fff23f07bf543139939b49128caf436dc1bdee54fcb24023a08d9403f9b4bf0d450': [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]
|
||||
},
|
||||
'Uint8Array': {
|
||||
'a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26': new Uint8Array([]),
|
||||
'01dedd5de4ef14642445ba5f5b97c15e47b9ad931326e4b0727cd94cefc44fff23f07bf543139939b49128caf436dc1bdee54fcb24023a08d9403f9b4bf0d450': 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])
|
||||
},
|
||||
'ArrayBuffer': {
|
||||
'a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26': new ArrayBuffer(0),
|
||||
'01dedd5de4ef14642445ba5f5b97c15e47b9ad931326e4b0727cd94cefc44fff23f07bf543139939b49128caf436dc1bdee54fcb24023a08d9403f9b4bf0d450': 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]).buffer
|
||||
}
|
||||
},
|
||||
sha3_384: {
|
||||
@@ -237,104 +172,192 @@
|
||||
}
|
||||
};
|
||||
|
||||
runTestCases(methods, testCases);
|
||||
|
||||
describe('sha3_512', function () {
|
||||
context('#arrayBuffer', function () {
|
||||
it('should be equal', function () {
|
||||
expect(sha3_512.arrayBuffer('').toHexString()).to.be('a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26');
|
||||
expect(sha3_512.buffer('').toHexString()).to.be('a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26');
|
||||
});
|
||||
});
|
||||
|
||||
context('#hex', function () {
|
||||
it('should be equal', function () {
|
||||
expect(sha3_512.hex('')).to.be('a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26');
|
||||
});
|
||||
});
|
||||
|
||||
context('#update', function () {
|
||||
it('should be equal', function () {
|
||||
expect(sha3_512.update('').hex()).to.be('a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26');
|
||||
expect(sha3_512.update('The quick brown fox ').update('jumps over the lazy dog').hex()).to.be('01dedd5de4ef14642445ba5f5b97c15e47b9ad931326e4b0727cd94cefc44fff23f07bf543139939b49128caf436dc1bdee54fcb24023a08d9403f9b4bf0d450');
|
||||
});
|
||||
});
|
||||
|
||||
context('#create', function () {
|
||||
it('should be equal', function () {
|
||||
var bytes = [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 hash = sha3_512.create();
|
||||
for (var i = 0; i < bytes.length; ++i) {
|
||||
hash.update([bytes[i]]);
|
||||
if (!(typeof JS_SHA3_NO_ARRAY_BUFFER === 'boolean' && JS_SHA3_NO_ARRAY_BUFFER)) {
|
||||
testCases.sha3_512.Uint8Array = {
|
||||
'a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26': new Uint8Array([]),
|
||||
'01dedd5de4ef14642445ba5f5b97c15e47b9ad931326e4b0727cd94cefc44fff23f07bf543139939b49128caf436dc1bdee54fcb24023a08d9403f9b4bf0d450': 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.sha3_512.ArrayBuffer = {
|
||||
'a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26': new ArrayBuffer(0),
|
||||
'01dedd5de4ef14642445ba5f5b97c15e47b9ad931326e4b0727cd94cefc44fff23f07bf543139939b49128caf436dc1bdee54fcb24023a08d9403f9b4bf0d450': 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]).buffer
|
||||
};
|
||||
}
|
||||
expect(hash.hex()).to.be('01dedd5de4ef14642445ba5f5b97c15e47b9ad931326e4b0727cd94cefc44fff23f07bf543139939b49128caf436dc1bdee54fcb24023a08d9403f9b4bf0d450');
|
||||
|
||||
if (typeof BUFFER === 'boolean' && BUFFER) {
|
||||
testCases.sha3_512.Buffer = {
|
||||
'a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26': new Buffer(0),
|
||||
'01dedd5de4ef14642445ba5f5b97c15e47b9ad931326e4b0727cd94cefc44fff23f07bf543139939b49128caf436dc1bdee54fcb24023a08d9403f9b4bf0d450': 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 = [
|
||||
{
|
||||
name: name,
|
||||
call: algorithm,
|
||||
},
|
||||
{
|
||||
name: name + '.hex',
|
||||
call: algorithm.hex
|
||||
},
|
||||
{
|
||||
name: name + '.array',
|
||||
call: function (message) {
|
||||
return algorithm.array(message).toHexString();
|
||||
}
|
||||
},
|
||||
{
|
||||
name: name + '.digest',
|
||||
call: function (message) {
|
||||
return algorithm.digest(message).toHexString();
|
||||
}
|
||||
},
|
||||
{
|
||||
name: name + '.arrayBuffer',
|
||||
call: function (message) {
|
||||
return algorithm.arrayBuffer(message).toHexString();
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
var classMethods = [
|
||||
{
|
||||
name: 'create',
|
||||
call: function (message) {
|
||||
return algorithm.create().update(message).toString();
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'update',
|
||||
call: function (message) {
|
||||
return algorithm.update(message).toString();
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'hex',
|
||||
call: function (message) {
|
||||
return algorithm.update(message).hex();
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'array',
|
||||
call: function (message) {
|
||||
return algorithm.update(message).array().toHexString();
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'digest',
|
||||
call: function (message) {
|
||||
return algorithm.update(message).digest().toHexString();
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'arrayBuffer',
|
||||
call: function (message) {
|
||||
return algorithm.update(message).arrayBuffer().toHexString();
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'finalize',
|
||||
call: function (message) {
|
||||
var hash = algorithm.update(message);
|
||||
hash.hex();
|
||||
hash.update(message);
|
||||
return hash.hex();
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
var subTestCases = testCases[name];
|
||||
|
||||
describe(name, function () {
|
||||
methods.forEach(function (method) {
|
||||
describe('#' + method.name, function () {
|
||||
for (var testCaseName in subTestCases) {
|
||||
(function (testCaseName) {
|
||||
var testCase = subTestCases[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);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
classMethods.forEach(function (method) {
|
||||
describe('#' + method.name, function () {
|
||||
for (var testCaseName in subTestCases) {
|
||||
(function (testCaseName) {
|
||||
var testCase = subTestCases[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('#' + name, function () {
|
||||
errorTestCases.forEach(function (testCase) {
|
||||
context('when ' + testCase, function () {
|
||||
it('should throw error', function () {
|
||||
expect(function () {
|
||||
algorithm(testCase);
|
||||
}).to.throwError(/input is invalid type/);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
runTestCases('sha3_512', sha3_512);
|
||||
runTestCases('sha3_384', sha3_384);
|
||||
runTestCases('sha3_256', sha3_256);
|
||||
runTestCases('sha3_224', sha3_224);
|
||||
runTestCases('keccak512', keccak512);
|
||||
runTestCases('keccak384', keccak384);
|
||||
runTestCases('keccak256', keccak256);
|
||||
runTestCases('keccak224', keccak224);
|
||||
|
||||
describe('#keccak512', function () {
|
||||
context('when special length', function () {
|
||||
it('should be equal', function () {
|
||||
expect(keccak512('012345678901234567890123456789012345678901234567890123456789012345678901')).to.be('90b1d032c3bf06dcc78a46fe52054bab1250600224bfc6dfbfb40a7877c55e89bb982799a2edf198568a4166f6736678b45e76b12fac813cfdf0a76714e5eae8');
|
||||
expect(keccak512('01234567890123456789012345678901234567890123456789012345678901234567890')).to.be('3173e7abc754a0b2909410d78986428a9183e996864af02f421d273d9fa1b4e4a5b14e2998b20767712f53a01ff8f6ae2c3e71e51e2c0f24257b03e6da09eb77');
|
||||
});
|
||||
});
|
||||
|
||||
context('when Array', function () {
|
||||
it('should be equal', function () {
|
||||
expect(keccak512([])).to.be('0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e');
|
||||
expect(keccak512([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('d135bb84d0439dbac432247ee573a23ea7d3c9deb2a968eb31d47c4fb45f1ef4422d6c531b5b9bd6f449ebcc449ea94d0a8f05f62130fda612da53c79659f609');
|
||||
});
|
||||
});
|
||||
|
||||
context('when Uint8Array', function () {
|
||||
it('should be equal', function () {
|
||||
expect(keccak512(new Uint8Array([]))).to.be('0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e');
|
||||
expect(keccak512(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]))).to.be('d135bb84d0439dbac432247ee573a23ea7d3c9deb2a968eb31d47c4fb45f1ef4422d6c531b5b9bd6f449ebcc449ea94d0a8f05f62130fda612da53c79659f609');
|
||||
});
|
||||
});
|
||||
|
||||
context('when ArrayBuffer', function () {
|
||||
it('should be equal', function () {
|
||||
expect(keccak512(new ArrayBuffer(0))).to.be('0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e');
|
||||
});
|
||||
});
|
||||
|
||||
context('when output ArrayBuffer', function () {
|
||||
it('should be equal', function () {
|
||||
expect(keccak512.arrayBuffer('').toHexString()).to.be('0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e');
|
||||
expect(keccak512.buffer('').toHexString()).to.be('0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e');
|
||||
});
|
||||
});
|
||||
|
||||
context('when output Array', function () {
|
||||
it('should be equal', function () {
|
||||
expect(keccak512.array('').toHexString()).to.be('0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e');
|
||||
});
|
||||
});
|
||||
|
||||
context('when incorrect input', function () {
|
||||
it('should throw error', function () {
|
||||
expect(function () {
|
||||
keccak512(1);
|
||||
}).to.throwError();
|
||||
});
|
||||
});
|
||||
|
||||
context('#encodeString', function () {
|
||||
context('when incorrect input', function () {
|
||||
errorTestCases.forEach(function (testCase) {
|
||||
context('when ' + testCase, function () {
|
||||
it('should throw error', function () {
|
||||
expect(function () {
|
||||
keccak512.create().encodeString(1);
|
||||
}).to.throwError();
|
||||
keccak512.create().encodeString(testCase);
|
||||
}).to.throwError(/input is invalid type/);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
if (!(typeof JS_SHA3_NO_ARRAY_BUFFER === 'boolean' && JS_SHA3_NO_ARRAY_BUFFER)) {
|
||||
context('when ArrayBuffer', function () {
|
||||
it('should throw error', function () {
|
||||
expect(keccak512.create().encodeString(new ArrayBuffer(0))).to.be(2);
|
||||
});
|
||||
});
|
||||
context('when Uint8Array', function () {
|
||||
it('should throw error', function () {
|
||||
expect(keccak512.create().encodeString(new Uint8Array(0))).to.be(2);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
context('when UTF-8', function () {
|
||||
it('should throw error', function () {
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
(function (Worker, WORKER, SOURCE) {
|
||||
var cases = {
|
||||
'a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26': '',
|
||||
'01dedd5de4ef14642445ba5f5b97c15e47b9ad931326e4b0727cd94cefc44fff23f07bf543139939b49128caf436dc1bdee54fcb24023a08d9403f9b4bf0d450': 'The quick brown fox jumps over the lazy dog',
|
||||
'18f4f4bd419603f95538837003d9d254c26c23765565162247483f65c50303597bc9ce4d289f21d1c2f1f458828e33dc442100331b35e7eb031b5d38ba6460f8': 'The quick brown fox jumps over the lazy dog.'
|
||||
};
|
||||
|
||||
describe('#sha3_512', 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);
|
||||
@@ -0,0 +1,26 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>SHA3</title>
|
||||
<link rel="stylesheet" href="../node_modules/mocha/mocha.css">
|
||||
<script src="../node_modules/mocha/mocha.js"></script>
|
||||
<script src="../node_modules/expect.js/index.js"></script>
|
||||
<script src="../src/sha3.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="mocha"></div>
|
||||
<script>
|
||||
WORKER = 'worker.js';
|
||||
SOURCE = '../src/sha3.js';
|
||||
mocha.setup('bdd');
|
||||
</script>
|
||||
<script src="worker-test.js"></script>
|
||||
<script>
|
||||
mocha.checkLeaks();
|
||||
mocha.run();
|
||||
</script>
|
||||
<script>
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,12 @@
|
||||
var imported = false;
|
||||
onmessage = function(e) {
|
||||
if (imported) {
|
||||
postMessage(sha3_512(e.data));
|
||||
if (typeof exports !== 'undefined') {
|
||||
imported = false;
|
||||
}
|
||||
} else {
|
||||
imported = true;
|
||||
importScripts(e.data);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user