mirror of
https://github.com/emn178/js-sha3.git
synced 2026-08-13 03:51:54 +08:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fb7e6403d9 | ||
|
|
c43f9d1d18 | ||
|
|
94a2758bf7 | ||
|
|
540bbee16b |
@@ -1,2 +0,0 @@
|
|||||||
/node_modules/
|
|
||||||
/tests/
|
|
||||||
+2
-2
@@ -1,3 +1,3 @@
|
|||||||
/node_modules/
|
/node_modules/
|
||||||
/covreporter/
|
/coverage/
|
||||||
/my_test/
|
/.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
|
language: node_js
|
||||||
node_js:
|
node_js:
|
||||||
- "0.12.15"
|
- "6.11.4"
|
||||||
- "4.5"
|
- "8.6.0"
|
||||||
- "6.5.0"
|
|
||||||
before_install:
|
before_install:
|
||||||
- npm install coveralls
|
- npm install coveralls
|
||||||
- npm install mocha-lcov-reporter
|
after_success: npm run coveralls
|
||||||
script: npm run-script coveralls
|
|
||||||
branches:
|
branches:
|
||||||
only:
|
only:
|
||||||
- master
|
- master
|
||||||
|
|||||||
@@ -1,5 +1,18 @@
|
|||||||
# Change Log
|
# 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
|
||||||
|
|
||||||
## v0.6.0 / 2017-06-15
|
## v0.6.0 / 2017-06-15
|
||||||
### Added
|
### Added
|
||||||
- cSHAKE method.
|
- cSHAKE method.
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "js-sha3",
|
"name": "js-sha3",
|
||||||
"version": "0.6.0",
|
"version": "0.7.0",
|
||||||
"main": ["src/sha3.js"],
|
"main": ["src/sha3.js"],
|
||||||
"ignore": [
|
"ignore": [
|
||||||
"samples",
|
"samples",
|
||||||
|
|||||||
Vendored
+2
-2
File diff suppressed because one or more lines are too long
Vendored
+1
-1
@@ -163,6 +163,6 @@ export var cshake_256: CshakeHash;
|
|||||||
export var cshake128: CshakeHash;
|
export var cshake128: CshakeHash;
|
||||||
export var cshake256: CshakeHash;
|
export var cshake256: CshakeHash;
|
||||||
export var kmac_128: KmacHash;
|
export var kmac_128: KmacHash;
|
||||||
export var kmac_256: kmacHash;
|
export var kmac_256: KmacHash;
|
||||||
export var kmac128: KmacHash;
|
export var kmac128: KmacHash;
|
||||||
export var kmac256: KmacHash;
|
export var kmac256: KmacHash;
|
||||||
|
|||||||
Generated
+1802
File diff suppressed because it is too large
Load Diff
+14
-10
@@ -1,21 +1,20 @@
|
|||||||
{
|
{
|
||||||
"name": "js-sha3",
|
"name": "js-sha3",
|
||||||
"version": "0.6.0",
|
"version": "0.7.0",
|
||||||
"description": "A simple SHA-3 / Keccak / Shake hash function for JavaScript supports UTF-8 encoding.",
|
"description": "A simple SHA-3 / Keccak / Shake hash function for JavaScript supports UTF-8 encoding.",
|
||||||
"main": "src/sha3.js",
|
"main": "src/sha3.js",
|
||||||
"typings": "index",
|
|
||||||
"types": "index.d.ts",
|
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"expect.js": "~0.3.1",
|
"expect.js": "~0.3.1",
|
||||||
"jscoverage": "~0.5.9",
|
"mocha": "~2.3.4",
|
||||||
"mocha": "~2.3.2",
|
"nyc": "^11.3.0",
|
||||||
"uglifyjs": "~2.4.10"
|
"uglify-js": "^3.1.9",
|
||||||
|
"webworker-threads": "^0.7.13"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "mocha tests/node-test.js -r jscoverage",
|
"test": "nyc mocha tests/node-test.js",
|
||||||
"report": "mocha tests/node-test.js -r jscoverage --covout=html",
|
"report": "nyc --reporter=html --reporter=text mocha tests/node-test.js",
|
||||||
"coveralls": "mocha tests/node-test.js -R mocha-lcov-reporter -r jscoverage | coveralls",
|
"coveralls": "nyc report --reporter=text-lcov | coveralls",
|
||||||
"build": "uglifyjs src/sha3.js --compress --mangle --comments --output build/sha3.min.js"
|
"build": "uglifyjs src/sha3.js -c -m --comments --output build/sha3.min.js"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@@ -37,5 +36,10 @@
|
|||||||
"homepage": "https://github.com/emn178/js-sha3",
|
"homepage": "https://github.com/emn178/js-sha3",
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/emn178/js-sha3/issues"
|
"url": "https://github.com/emn178/js-sha3/issues"
|
||||||
|
},
|
||||||
|
"nyc": {
|
||||||
|
"exclude": [
|
||||||
|
"tests"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+68
-35
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* [js-sha3]{@link https://github.com/emn178/js-sha3}
|
* [js-sha3]{@link https://github.com/emn178/js-sha3}
|
||||||
*
|
*
|
||||||
* @version 0.6.0
|
* @version 0.7.0
|
||||||
* @author Chen, Yi-Cyuan [emn178@gmail.com]
|
* @author Chen, Yi-Cyuan [emn178@gmail.com]
|
||||||
* @copyright Chen, Yi-Cyuan 2015-2017
|
* @copyright Chen, Yi-Cyuan 2015-2017
|
||||||
* @license MIT
|
* @license MIT
|
||||||
@@ -10,12 +10,21 @@
|
|||||||
(function () {
|
(function () {
|
||||||
'use strict';
|
'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;
|
var NODE_JS = !root.JS_SHA3_NO_NODE_JS && typeof process === 'object' && process.versions && process.versions.node;
|
||||||
if (NODE_JS) {
|
if (NODE_JS) {
|
||||||
root = global;
|
root = global;
|
||||||
|
} else if (WEB_WORKER) {
|
||||||
|
root = self;
|
||||||
}
|
}
|
||||||
var COMMON_JS = !root.JS_SHA3_NO_COMMON_JS && typeof module === 'object' && module.exports;
|
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 ARRAY_BUFFER = !root.JS_SHA3_NO_ARRAY_BUFFER && typeof ArrayBuffer !== 'undefined';
|
||||||
var HEX_CHARS = '0123456789abcdef'.split('');
|
var HEX_CHARS = '0123456789abcdef'.split('');
|
||||||
var SHAKE_PADDING = [31, 7936, 2031616, 520093696];
|
var SHAKE_PADDING = [31, 7936, 2031616, 520093696];
|
||||||
@@ -30,7 +39,7 @@
|
|||||||
2147516545, 2147483648, 32896, 2147483648, 2147483649, 0, 2147516424, 2147483648];
|
2147516545, 2147483648, 32896, 2147483648, 2147483649, 0, 2147516424, 2147483648];
|
||||||
var BITS = [224, 256, 384, 512];
|
var BITS = [224, 256, 384, 512];
|
||||||
var SHAKE_BITS = [128, 256];
|
var SHAKE_BITS = [128, 256];
|
||||||
var OUTPUT_TYPES = ['hex', 'buffer', 'arrayBuffer', 'array'];
|
var OUTPUT_TYPES = ['hex', 'buffer', 'arrayBuffer', 'array', 'digest'];
|
||||||
var CSHAKE_BYTEPAD = {
|
var CSHAKE_BYTEPAD = {
|
||||||
'128': 168,
|
'128': 168,
|
||||||
'256': 136
|
'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) {
|
var createOutputMethod = function (bits, padding, outputType) {
|
||||||
return function (message) {
|
return function (message) {
|
||||||
return new Keccak(bits, padding, bits).update(message)[outputType]();
|
return new Keccak(bits, padding, bits).update(message)[outputType]();
|
||||||
@@ -125,11 +140,11 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
var algorithms = [
|
var algorithms = [
|
||||||
{name: 'keccak', padding: KECCAK_PADDING, bits: BITS, createMethod: createMethod},
|
{ name: 'keccak', padding: KECCAK_PADDING, bits: BITS, createMethod: createMethod },
|
||||||
{name: 'sha3', padding: PADDING, bits: BITS, createMethod: createMethod},
|
{ name: 'sha3', padding: PADDING, bits: BITS, createMethod: createMethod },
|
||||||
{name: 'shake', padding: SHAKE_PADDING, bits: SHAKE_BITS, createMethod: createShakeMethod},
|
{ name: 'shake', padding: SHAKE_PADDING, bits: SHAKE_BITS, createMethod: createShakeMethod },
|
||||||
{name: 'cshake', padding: CSHAKE_PADDING, bits: SHAKE_BITS, createMethod: createCshakeMethod},
|
{ name: 'cshake', padding: CSHAKE_PADDING, bits: SHAKE_BITS, createMethod: createCshakeMethod },
|
||||||
{name: 'kmac', padding: CSHAKE_PADDING, bits: SHAKE_BITS, createMethod: createKmacMethod}
|
{ name: 'kmac', padding: CSHAKE_PADDING, bits: SHAKE_BITS, createMethod: createKmacMethod }
|
||||||
];
|
];
|
||||||
|
|
||||||
var methods = {}, methodNames = [];
|
var methods = {}, methodNames = [];
|
||||||
@@ -155,6 +170,7 @@
|
|||||||
this.padding = padding;
|
this.padding = padding;
|
||||||
this.outputBits = outputBits;
|
this.outputBits = outputBits;
|
||||||
this.reset = true;
|
this.reset = true;
|
||||||
|
this.finalized = false;
|
||||||
this.block = 0;
|
this.block = 0;
|
||||||
this.start = 0;
|
this.start = 0;
|
||||||
this.blockCount = (1600 - (bits << 1)) >> 5;
|
this.blockCount = (1600 - (bits << 1)) >> 5;
|
||||||
@@ -168,19 +184,27 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
Keccak.prototype.update = function (message) {
|
Keccak.prototype.update = function (message) {
|
||||||
var notString = typeof message !== 'string';
|
if (this.finalized) {
|
||||||
if (notString && message.constructor === root.ArrayBuffer) {
|
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);
|
message = new Uint8Array(message);
|
||||||
}
|
} else if (!Array.isArray(message)) {
|
||||||
var length = message.length;
|
if (!ARRAY_BUFFER || !ArrayBuffer.isView(message)) {
|
||||||
if (notString) {
|
throw ERROR;
|
||||||
if (typeof length !== 'number' ||
|
|
||||||
!Array.isArray(message) &&
|
|
||||||
!(ARRAY_BUFFER && ArrayBuffer.isView(message))) {
|
|
||||||
throw 'input is invalid type';
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
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;
|
blockCount = this.blockCount, index = 0, s = this.s, i, code;
|
||||||
|
|
||||||
while (index < length) {
|
while (index < length) {
|
||||||
@@ -253,20 +277,24 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
Keccak.prototype.encodeString = function (str) {
|
Keccak.prototype.encodeString = function (str) {
|
||||||
str = str || '';
|
var notString, type = typeof str;
|
||||||
var notString = typeof str !== 'string';
|
if (type !== 'string') {
|
||||||
if (notString && str.constructor === root.ArrayBuffer) {
|
if (type === 'object') {
|
||||||
|
if (str === null) {
|
||||||
|
throw ERROR;
|
||||||
|
} else if (ARRAY_BUFFER && str.constructor === ArrayBuffer) {
|
||||||
str = new Uint8Array(str);
|
str = new Uint8Array(str);
|
||||||
}
|
} else if (!Array.isArray(str)) {
|
||||||
var length = str.length;
|
if (!ARRAY_BUFFER || !ArrayBuffer.isView(str)) {
|
||||||
if (notString) {
|
throw ERROR;
|
||||||
if (typeof length !== 'number' ||
|
|
||||||
!Array.isArray(str) &&
|
|
||||||
!(ARRAY_BUFFER && ArrayBuffer.isView(str))) {
|
|
||||||
throw 'input is invalid type';
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var bytes = 0;
|
} else {
|
||||||
|
throw ERROR;
|
||||||
|
}
|
||||||
|
notString = true;
|
||||||
|
}
|
||||||
|
var bytes = 0, length = str.length;
|
||||||
if (notString) {
|
if (notString) {
|
||||||
bytes = length;
|
bytes = length;
|
||||||
} else {
|
} else {
|
||||||
@@ -291,7 +319,7 @@
|
|||||||
|
|
||||||
Keccak.prototype.bytepad = function (strs, w) {
|
Keccak.prototype.bytepad = function (strs, w) {
|
||||||
var bytes = this.encode(w);
|
var bytes = this.encode(w);
|
||||||
for (var i = 0;i < strs.length;++i) {
|
for (var i = 0; i < strs.length; ++i) {
|
||||||
bytes += this.encodeString(strs[i]);
|
bytes += this.encodeString(strs[i]);
|
||||||
}
|
}
|
||||||
var paddingBytes = w - bytes % w;
|
var paddingBytes = w - bytes % w;
|
||||||
@@ -302,6 +330,10 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
Keccak.prototype.finalize = function () {
|
Keccak.prototype.finalize = function () {
|
||||||
|
if (this.finalized) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.finalized = true;
|
||||||
var blocks = this.blocks, i = this.lastByteIndex, blockCount = this.blockCount, s = this.s;
|
var blocks = this.blocks, i = this.lastByteIndex, blockCount = this.blockCount, s = this.s;
|
||||||
blocks[i >> 2] |= this.padding[i & 3];
|
blocks[i >> 2] |= this.padding[i & 3];
|
||||||
if (this.lastByteIndex === this.byteCount) {
|
if (this.lastByteIndex === this.byteCount) {
|
||||||
@@ -338,9 +370,7 @@
|
|||||||
}
|
}
|
||||||
if (extraBytes) {
|
if (extraBytes) {
|
||||||
block = s[i];
|
block = s[i];
|
||||||
if (extraBytes > 0) {
|
|
||||||
hex += HEX_CHARS[(block >> 4) & 0x0F] + HEX_CHARS[block & 0x0F];
|
hex += HEX_CHARS[(block >> 4) & 0x0F] + HEX_CHARS[block & 0x0F];
|
||||||
}
|
|
||||||
if (extraBytes > 1) {
|
if (extraBytes > 1) {
|
||||||
hex += HEX_CHARS[(block >> 12) & 0x0F] + HEX_CHARS[(block >> 8) & 0x0F];
|
hex += HEX_CHARS[(block >> 12) & 0x0F] + HEX_CHARS[(block >> 8) & 0x0F];
|
||||||
}
|
}
|
||||||
@@ -403,9 +433,7 @@
|
|||||||
if (extraBytes) {
|
if (extraBytes) {
|
||||||
offset = j << 2;
|
offset = j << 2;
|
||||||
block = s[i];
|
block = s[i];
|
||||||
if (extraBytes > 0) {
|
|
||||||
array[offset] = block & 0xFF;
|
array[offset] = block & 0xFF;
|
||||||
}
|
|
||||||
if (extraBytes > 1) {
|
if (extraBytes > 1) {
|
||||||
array[offset + 1] = (block >> 8) & 0xFF;
|
array[offset + 1] = (block >> 8) & 0xFF;
|
||||||
}
|
}
|
||||||
@@ -615,8 +643,13 @@
|
|||||||
if (COMMON_JS) {
|
if (COMMON_JS) {
|
||||||
module.exports = methods;
|
module.exports = methods;
|
||||||
} else {
|
} else {
|
||||||
for (var i = 0; i < methodNames.length; ++i) {
|
for (i = 0; i < methodNames.length; ++i) {
|
||||||
root[methodNames[i]] = methods[methodNames[i]];
|
root[methodNames[i]] = methods[methodNames[i]];
|
||||||
}
|
}
|
||||||
|
if (AMD) {
|
||||||
|
define(function () {
|
||||||
|
return methods;
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
|
|||||||
+137
-67
@@ -1,80 +1,150 @@
|
|||||||
expect = require('expect.js');
|
expect = require('expect.js');
|
||||||
|
Worker = require('webworker-threads').Worker;
|
||||||
|
|
||||||
|
function unset() {
|
||||||
|
delete require.cache[require.resolve('../src/sha3.js')];
|
||||||
|
delete require.cache[require.resolve('./test.js')];
|
||||||
|
sha3_512 = null;
|
||||||
|
sha3_384 = null;
|
||||||
|
sha3_256 = null;
|
||||||
|
sha3_224 = null;
|
||||||
|
keccak512 = null;
|
||||||
|
keccak384 = null;
|
||||||
|
keccak256 = null;
|
||||||
|
keccak224 = null;
|
||||||
|
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
|
// Node.js env
|
||||||
var sha3 = require('../src/sha3.js');
|
BUFFER = true;
|
||||||
keccak512 = sha3.keccak512;
|
runCommonJsTest();
|
||||||
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')];
|
|
||||||
|
|
||||||
// Webpack browser env
|
// Webpack browser env
|
||||||
JS_SHA3_NO_NODE_JS = true;
|
JS_SHA3_NO_NODE_JS = true;
|
||||||
window = global;
|
window = global;
|
||||||
expect = require('expect.js');
|
runCommonJsTest();
|
||||||
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;
|
|
||||||
sha3_224 = null;
|
|
||||||
keccak512 = null;
|
|
||||||
keccak384 = null;
|
|
||||||
keccak256 = null;
|
|
||||||
keccak224 = null;
|
|
||||||
shake128 = null;
|
|
||||||
shake256 = null;
|
|
||||||
kmac128 = null;
|
|
||||||
kmac256 = null;
|
|
||||||
|
|
||||||
// browser env
|
// browser env
|
||||||
JS_SHA3_NO_NODE_JS = true;
|
JS_SHA3_NO_NODE_JS = true;
|
||||||
JS_SHA3_NO_COMMON_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;
|
window = global;
|
||||||
|
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');
|
||||||
|
};
|
||||||
|
define.amd = true;
|
||||||
|
|
||||||
require('../src/sha3.js');
|
require('../src/sha3.js');
|
||||||
require('./test.js');
|
unset();
|
||||||
require('./test-shake.js');
|
|
||||||
require('./test-cshake.js');
|
// webworker
|
||||||
require('./test-kmac.js');
|
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 () {
|
it('should be equal', function () {
|
||||||
expect(shake128('', 16)).to.be('7f9c');
|
expect(shake128('', 16)).to.be('7f9c');
|
||||||
expect(shake128('', 24)).to.be('7f9c2b');
|
expect(shake128('', 24)).to.be('7f9c2b');
|
||||||
|
expect(shake128.array('', 8)).to.eql([0x7f]);
|
||||||
expect(shake128.array('', 16)).to.eql([0x7f, 0x9c]);
|
expect(shake128.array('', 16)).to.eql([0x7f, 0x9c]);
|
||||||
expect(shake128.array('', 24)).to.eql([0x7f, 0x9c, 0x2b]);
|
expect(shake128.array('', 24)).to.eql([0x7f, 0x9c, 0x2b]);
|
||||||
});
|
});
|
||||||
|
|||||||
+169
-146
@@ -9,63 +9,6 @@
|
|||||||
return hex;
|
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 = {
|
var testCases = {
|
||||||
sha3_512: {
|
sha3_512: {
|
||||||
'ascii': {
|
'ascii': {
|
||||||
@@ -92,14 +35,6 @@
|
|||||||
'Array': {
|
'Array': {
|
||||||
'a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26': [],
|
'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]
|
'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: {
|
sha3_384: {
|
||||||
@@ -237,104 +172,192 @@
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
runTestCases(methods, testCases);
|
if (!(typeof JS_SHA3_NO_ARRAY_BUFFER === 'boolean' && JS_SHA3_NO_ARRAY_BUFFER)) {
|
||||||
|
testCases.sha3_512.Uint8Array = {
|
||||||
describe('sha3_512', function () {
|
'a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26': new Uint8Array([]),
|
||||||
context('#arrayBuffer', function () {
|
'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])
|
||||||
it('should be equal', function () {
|
};
|
||||||
expect(sha3_512.arrayBuffer('').toHexString()).to.be('a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26');
|
testCases.sha3_512.ArrayBuffer = {
|
||||||
expect(sha3_512.buffer('').toHexString()).to.be('a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26');
|
'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
|
||||||
});
|
};
|
||||||
|
|
||||||
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]]);
|
|
||||||
}
|
}
|
||||||
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 () {
|
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('#encodeString', function () {
|
||||||
context('when incorrect input', function () {
|
errorTestCases.forEach(function (testCase) {
|
||||||
|
context('when ' + testCase, function () {
|
||||||
it('should throw error', function () {
|
it('should throw error', function () {
|
||||||
expect(function () {
|
expect(function () {
|
||||||
keccak512.create().encodeString(1);
|
keccak512.create().encodeString(testCase);
|
||||||
}).to.throwError();
|
}).to.throwError(/input is invalid type/);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (!(typeof JS_SHA3_NO_ARRAY_BUFFER === 'boolean' && JS_SHA3_NO_ARRAY_BUFFER)) {
|
||||||
context('when ArrayBuffer', function () {
|
context('when ArrayBuffer', function () {
|
||||||
it('should throw error', function () {
|
it('should throw error', function () {
|
||||||
expect(keccak512.create().encodeString(new ArrayBuffer(0))).to.be(2);
|
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 () {
|
context('when UTF-8', function () {
|
||||||
it('should throw error', 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