Compare commits

...
10 Commits
Author SHA1 Message Date
Yi-Cyuan Chen bb8ae3a623 ## v0.10.0 / 2023-08-30
### Fixed
- Chrome bug by workaround. #40
- deprecated `new Buffer`, replace with `Buffer.from`. #34
- dependencies and security issues. #32, #36

### Changed
- TypeScript interface, secretKey can be bytes like message. #23, #25
- remove `eval` and use `require` directly. #18, #26
2023-08-30 22:58:30 +08:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
16b101f040 Bump minimist, mocha and nyc (#36)
Removes [minimist](https://github.com/minimistjs/minimist). It's no longer used after updating ancestor dependencies [minimist](https://github.com/minimistjs/minimist), [mocha](https://github.com/mochajs/mocha) and [nyc](https://github.com/istanbuljs/nyc). These dependencies need to be updated together.


Removes `minimist`

Updates `mocha` from 2.3.4 to 10.2.0
- [Release notes](https://github.com/mochajs/mocha/releases)
- [Changelog](https://github.com/mochajs/mocha/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mochajs/mocha/compare/2.3.4...v10.2.0)

Updates `nyc` from 11.3.0 to 15.1.0
- [Release notes](https://github.com/istanbuljs/nyc/releases)
- [Changelog](https://github.com/istanbuljs/nyc/blob/master/CHANGELOG.md)
- [Commits](https://github.com/istanbuljs/nyc/compare/v11.3.0...v15.1.0)

---
updated-dependencies:
- dependency-name: minimist
  dependency-type: indirect
- dependency-name: mocha
  dependency-type: direct:development
- dependency-name: nyc
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-08-27 15:02:58 +08:00
Yi-Cyuan Chen 189bb9b037 Fixed
- incorrect result when first bit is 1 of bytes.

Changed
- throw error by Error oject. #13

Added
- TypeScript interfaces. #12
2017-12-18 20:03:12 +08:00
Olegandemn178 e35c679c2b Throw Errors to improve error reporting (#13) 2017-12-13 20:49:51 +08:00
shiyuesongandemn178 bf155ab82f Added "hmac" to interface Hash. (#12) 2017-12-13 20:49:21 +08:00
Yi-Cyuan Chen 68ffecdc6e update README and travis config 2017-11-19 16:41:14 +08:00
Yi-Cyuan Chen 3204c3743e update coverage library 2017-11-19 16:36:30 +08:00
Yi-Cyuan Chen 4e5354859f Added
- support for web worker.
- typescript types. #10

Changed
- prevent webpack to require dependencies.
2017-11-19 15:15:13 +08:00
Yi-Cyuan Chen cf975dfa0c Improved performance of hBytes increment. 2017-10-31 20:33:20 +08:00
Yi-Cyuan Chen 77efe9529c Fixed incorrect result when file size >= 512M. 2017-10-31 19:53:15 +08:00
18 changed files with 2417 additions and 144 deletions
-2
View File
@@ -1,2 +0,0 @@
/node_modules/
/tests/
+2 -1
View File
@@ -1,2 +1,3 @@
/node_modules/ /node_modules/
/covreporter/ /coverage/
/.nyc_output/
+8
View File
@@ -0,0 +1,8 @@
/node_modules/
/coverage/
/.nyc_output/
/tests/
.covignore
.travis.yml
.npmignore
bower.json
+3 -5
View File
@@ -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
+36
View File
@@ -1,5 +1,41 @@
# Change Log # Change Log
## v0.10.0 / 2023-08-30
### Fixed
- Chrome bug by workaround. #40
- deprecated `new Buffer`, replace with `Buffer.from`. #34
- dependencies and security issues. #32, #36
### Changed
- TypeScript interface, secretKey can be bytes like message. #23, #25
- remove `eval` and use `require` directly. #18, #26
## v0.9.0 / 2017-12-18
### Fixed
- incorrect result when first bit is 1 of bytes.
### Changed
- throw error by Error oject. #13
### Added
- TypeScript interfaces. #12
## 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.
## v0.7.0 / 2017-10-31
### Fixed
- incorrect result when file size >= 512M.
## v0.6.0 / 2017-07-11 ## v0.6.0 / 2017-07-11
### Added ### Added
- HMAC feature. - HMAC feature.
+13 -1
View File
@@ -48,15 +48,27 @@ var hash2 = sha256.hmac.update('key', 'Message to hash');
hash2.update('Message2 to hash'); hash2.update('Message2 to hash');
hash2.array(); hash2.array();
``` ```
### Node.js
If you use node.js, you should require the module first: If you use node.js, you should require the module first:
```JavaScript ```JavaScript
var sha256 = require('js-sha256'); var sha256 = require('js-sha256');
``` ```
or or
```JavaScript ```JavaScript
var sha256 = require('js-sha256').sha256; var sha256 = require('js-sha256').sha256;
var sha224 = require('js-sha256').sha224; var sha224 = require('js-sha256').sha224;
``` ```
or
```JavaScript
const { sha256, sha224 } = require('js-sha256');
```
### TypeScript
or TypeScript
```TypeScript
import { sha256, sha224 } from 'js-sha256';
```
### RequireJS
It supports AMD: It supports AMD:
```JavaScript ```JavaScript
require(['your/path/sha256.js'], function(sha256) { require(['your/path/sha256.js'], function(sha256) {
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "js-sha256", "name": "js-sha256",
"version": "0.6.0", "version": "0.9.0",
"main": ["src/sha256.js"], "main": ["src/sha256.js"],
"ignore": [ "ignore": [
"samples", "samples",
+3 -3
View File
File diff suppressed because one or more lines are too long
Vendored
+149
View File
@@ -0,0 +1,149 @@
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 Hmac {
/**
* Computes a Hash-based message authentication code (HMAC) using a secret key
*
* @param secretKey The Secret Key
* @param message The message you want to hash.
*/
(secretKey: Message, message: Message): string;
/**
* Create a hash object using a secret key.
*
* @param secretKey The Secret Key
*/
create(secretKey: Message): Hasher;
/**
* Create a hash object and hash message using a secret key
*
* @param secretKey The Secret Key
* @param message The message you want to hash.
*/
update(secretKey: Message, message: Message): Hasher;
/**
* Return hash in hex string.
*
* @param secretKey The Secret Key
* @param message The message you want to hash.
*/
hex(secretKey: Message, message: Message): string;
/**
* Return hash in ArrayBuffer.
*
* @param secretKey The Secret Key
* @param message The message you want to hash.
*/
arrayBuffer(secretKey: Message, message: Message): ArrayBuffer;
/**
* Return hash in integer array.
*
* @param secretKey The Secret Key
* @param message The message you want to hash.
*/
digest(secretKey: Message, message: Message): number[];
/**
* Return hash in integer array.
*
* @param secretKey The Secret Key
* @param message The message you want to hash.
*/
array(secretKey: Message, message: Message): 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;
/**
* Return hash in hex string.
*
* @param message The message you want to hash.
*/
hex(message: Message): string;
/**
* Return hash in ArrayBuffer.
*
* @param message The message you want to hash.
*/
arrayBuffer(message: Message): ArrayBuffer;
/**
* Return hash in integer array.
*
* @param message The message you want to hash.
*/
digest(message: Message): number[];
/**
* Return hash in integer array.
*
* @param message The message you want to hash.
*/
array(message: Message): number[];
/**
* HMAC interface
*/
hmac: Hmac;
}
export var sha256: Hash;
export var sha224: Hash;
+1888
View File
File diff suppressed because it is too large Load Diff
+14 -8
View File
@@ -1,19 +1,20 @@
{ {
"name": "js-sha256", "name": "js-sha256",
"version": "0.6.0", "version": "0.10.0",
"description": "A simple SHA-256 / SHA-224 hash function for JavaScript supports UTF-8 encoding.", "description": "A simple SHA-256 / SHA-224 hash function for JavaScript supports UTF-8 encoding.",
"main": "src/sha256.js", "main": "src/sha256.js",
"devDependencies": { "devDependencies": {
"expect.js": "~0.3.1", "expect.js": "~0.3.1",
"jscoverage": "~0.5.9", "mocha": "~10.2.0",
"mocha": "~2.3.4", "nyc": "^15.1.0",
"uglifyjs": "~2.4.10" "tiny-worker": "^2.3.0",
"uglify-js": "^3.1.9"
}, },
"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/sha256.js --compress --mangle --comments --output build/sha256.min.js" "build": "uglifyjs src/sha256.js -c -m eval --comments -o build/sha256.min.js"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
@@ -34,5 +35,10 @@
"homepage": "https://github.com/emn178/js-sha256", "homepage": "https://github.com/emn178/js-sha256",
"bugs": { "bugs": {
"url": "https://github.com/emn178/js-sha256/issues" "url": "https://github.com/emn178/js-sha256/issues"
},
"nyc": {
"exclude": [
"tests"
]
} }
} }
+78 -50
View File
@@ -1,9 +1,9 @@
/** /**
* [js-sha256]{@link https://github.com/emn178/js-sha256} * [js-sha256]{@link https://github.com/emn178/js-sha256}
* *
* @version 0.6.0 * @version 0.10.0
* @author Chen, Yi-Cyuan [emn178@gmail.com] * @author Chen, Yi-Cyuan [emn178@gmail.com]
* @copyright Chen, Yi-Cyuan 2014-2017 * @copyright Chen, Yi-Cyuan 2014-2023
* @license MIT * @license MIT
*/ */
/*jslint bitwise: true */ /*jslint bitwise: true */
@@ -11,14 +11,21 @@
'use strict'; 'use strict';
var ERROR = 'input is invalid type'; 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; var NODE_JS = !root.JS_SHA256_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_SHA256_NO_COMMON_JS && typeof module === 'object' && module.exports; var COMMON_JS = !root.JS_SHA256_NO_COMMON_JS && typeof module === 'object' && module.exports;
var AMD = typeof define === 'function' && define.amd; 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 HEX_CHARS = '0123456789abcdef'.split('');
var EXTRA = [-2147483648, 8388608, 32768, 128]; var EXTRA = [-2147483648, 8388608, 32768, 128];
var SHIFT = [24, 16, 8, 0]; 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) { var createOutputMethod = function (outputType, is224) {
return function (message) { return function (message) {
return new Sha256(is224, true).update(message)[outputType](); return new Sha256(is224, true).update(message)[outputType]();
@@ -67,22 +80,30 @@
}; };
var nodeWrap = function (method, is224) { var nodeWrap = function (method, is224) {
var crypto = require('crypto'); var crypto = require('crypto')
var Buffer = require('buffer').Buffer; var Buffer = require('buffer').Buffer;
var algorithm = is224 ? 'sha224' : 'sha256'; var algorithm = is224 ? 'sha224' : 'sha256';
var bufferFrom;
if (Buffer.from && !root.JS_SHA256_NO_BUFFER_FROM) {
bufferFrom = Buffer.from;
} else {
bufferFrom = function (message) {
return new Buffer(message);
};
}
var nodeMethod = function (message) { var nodeMethod = function (message) {
if (typeof message === 'string') { if (typeof message === 'string') {
return crypto.createHash(algorithm).update(message, 'utf8').digest('hex'); return crypto.createHash(algorithm).update(message, 'utf8').digest('hex');
} else { } else {
if (message === null || message === undefined) { if (message === null || message === undefined) {
throw ERROR; throw new Error(ERROR);
} else if (message.constructor === ArrayBuffer) { } else if (message.constructor === ArrayBuffer) {
message = new Uint8Array(message); message = new Uint8Array(message);
} }
} }
if (Array.isArray(message) || ArrayBuffer.isView(message) || if (Array.isArray(message) || ArrayBuffer.isView(message) ||
message.constructor === Buffer) { message.constructor === Buffer) {
return crypto.createHash(algorithm).update(new Buffer(message)).digest('hex'); return crypto.createHash(algorithm).update(bufferFrom(message)).digest('hex');
} else { } else {
return method(message); return method(message);
} }
@@ -114,9 +135,9 @@
function Sha256(is224, sharedMemory) { function Sha256(is224, sharedMemory) {
if (sharedMemory) { if (sharedMemory) {
blocks[0] = blocks[16] = blocks[1] = blocks[2] = blocks[3] = blocks[0] = blocks[16] = blocks[1] = blocks[2] = blocks[3] =
blocks[4] = blocks[5] = blocks[6] = blocks[7] = blocks[4] = blocks[5] = blocks[6] = blocks[7] =
blocks[8] = blocks[9] = blocks[10] = blocks[11] = blocks[8] = blocks[9] = blocks[10] = blocks[11] =
blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0; blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
this.blocks = blocks; this.blocks = blocks;
} else { } else {
this.blocks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; this.blocks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
@@ -142,7 +163,7 @@
this.h7 = 0x5be0cd19; this.h7 = 0x5be0cd19;
} }
this.block = this.start = this.bytes = 0; this.block = this.start = this.bytes = this.hBytes = 0;
this.finalized = this.hashed = false; this.finalized = this.hashed = false;
this.first = true; this.first = true;
this.is224 = is224; this.is224 = is224;
@@ -152,32 +173,33 @@
if (this.finalized) { if (this.finalized) {
return; return;
} }
var notString = typeof message !== 'string'; var notString, type = typeof message;
if (notString) { if (type !== 'string') {
if (message === null || message === undefined) { if (type === 'object') {
throw ERROR; if (message === null) {
} else if (message.constructor === root.ArrayBuffer) { throw new Error(ERROR);
message = new Uint8Array(message); } else if (ARRAY_BUFFER && message.constructor === ArrayBuffer) {
message = new Uint8Array(message);
} else if (!Array.isArray(message)) {
if (!ARRAY_BUFFER || !ArrayBuffer.isView(message)) {
throw new Error(ERROR);
}
}
} else {
throw new Error(ERROR);
} }
notString = true;
} }
var length = message.length; var code, index = 0, i, length = message.length, blocks = this.blocks;
if (notString) {
if (typeof length !== 'number' ||
!Array.isArray(message) &&
!(ARRAY_BUFFER && ArrayBuffer.isView(message))) {
throw ERROR;
}
}
var code, index = 0, i, blocks = this.blocks;
while (index < length) { while (index < length) {
if (this.hashed) { if (this.hashed) {
this.hashed = false; this.hashed = false;
blocks[0] = this.block; blocks[0] = this.block;
blocks[16] = blocks[1] = blocks[2] = blocks[3] = blocks[16] = blocks[1] = blocks[2] = blocks[3] =
blocks[4] = blocks[5] = blocks[6] = blocks[7] = blocks[4] = blocks[5] = blocks[6] = blocks[7] =
blocks[8] = blocks[9] = blocks[10] = blocks[11] = blocks[8] = blocks[9] = blocks[10] = blocks[11] =
blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0; blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
} }
if (notString) { if (notString) {
@@ -217,6 +239,10 @@
this.start = i; this.start = i;
} }
} }
if (this.bytes > 4294967295) {
this.hBytes += this.bytes / 4294967296 << 0;
this.bytes = this.bytes % 4294967296;
}
return this; return this;
}; };
@@ -235,10 +261,11 @@
} }
blocks[0] = this.block; blocks[0] = this.block;
blocks[16] = blocks[1] = blocks[2] = blocks[3] = blocks[16] = blocks[1] = blocks[2] = blocks[3] =
blocks[4] = blocks[5] = blocks[6] = blocks[7] = blocks[4] = blocks[5] = blocks[6] = blocks[7] =
blocks[8] = blocks[9] = blocks[10] = blocks[11] = blocks[8] = blocks[9] = blocks[10] = blocks[11] =
blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0; blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
} }
blocks[14] = this.hBytes << 3 | this.bytes >>> 29;
blocks[15] = this.bytes << 3; blocks[15] = this.bytes << 3;
this.hash(); this.hash();
}; };
@@ -309,6 +336,7 @@
t2 = s0 + maj; t2 = s0 + maj;
e = a + t1 << 0; e = a + t1 << 0;
a = t1 + t2 << 0; a = t1 + t2 << 0;
this.chromeBugWorkAround = true;
} }
this.h0 = this.h0 + a << 0; this.h0 = this.h0 + a << 0;
@@ -408,24 +436,10 @@
}; };
function HmacSha256(key, is224, sharedMemory) { function HmacSha256(key, is224, sharedMemory) {
var notString = typeof key !== 'string'; var i, type = typeof key;
if (notString) { if (type === 'string') {
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 bytes = [], length = key.length, index = 0, code; 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); code = key.charCodeAt(i);
if (code < 0x80) { if (code < 0x80) {
bytes[index++] = code; bytes[index++] = code;
@@ -445,6 +459,20 @@
} }
} }
key = bytes; key = bytes;
} else {
if (type === 'object') {
if (key === null) {
throw new Error(ERROR);
} else if (ARRAY_BUFFER && key.constructor === ArrayBuffer) {
key = new Uint8Array(key);
} else if (!Array.isArray(key)) {
if (!ARRAY_BUFFER || !ArrayBuffer.isView(key)) {
throw new Error(ERROR);
}
}
} else {
throw new Error(ERROR);
}
} }
if (key.length > 64) { if (key.length > 64) {
@@ -452,7 +480,7 @@
} }
var oKeyPad = [], iKeyPad = []; var oKeyPad = [], iKeyPad = [];
for (var i = 0; i < 64; ++i) { for (i = 0; i < 64; ++i) {
var b = key[i] || 0; var b = key[i] || 0;
oKeyPad[i] = 0x5c ^ b; oKeyPad[i] = 0x5c ^ b;
iKeyPad[i] = 0x36 ^ b; iKeyPad[i] = 0x36 ^ b;
+27 -12
View File
@@ -41,12 +41,6 @@
'865cc329d317f6d9fdbd183a3c5cc5fd4c370d11f98abbbb404bceb1e6392c7e': ['中文', '中文'], '865cc329d317f6d9fdbd183a3c5cc5fd4c370d11f98abbbb404bceb1e6392c7e': ['中文', '中文'],
'efeef87be5731506b69bb64a9898a456dd12c94834c36a4d8ba99e3db79ad7ed': ['aécio', 'aécio'], 'efeef87be5731506b69bb64a9898a456dd12c94834c36a4d8ba99e3db79ad7ed': ['aécio', 'aécio'],
'8a6e527049b9cfc7e1c84bcf356a1289c95da68a586c03de3327f3de0d3737fe': ['𠜎', '𠜎'] '8a6e527049b9cfc7e1c84bcf356a1289c95da68a586c03de3327f3de0d3737fe': ['𠜎', '𠜎']
},
'ArrayBuffer': {
'e48411262715c8370cd5e7bf8e82bef53bd53712d007f3429351843b77c7bb9b': [
new ArrayBuffer(0),
'Hi There'
]
} }
}, },
sha224_hmac: { sha224_hmac: {
@@ -80,16 +74,37 @@
'e2280928fe813aeb7fa59aa14dd5e589041bfdf91945d19d25b9f3db': ['中文', '中文'], 'e2280928fe813aeb7fa59aa14dd5e589041bfdf91945d19d25b9f3db': ['中文', '中文'],
'86c53dc054b16f6e006a254891bc9ff0da5df8e1a6faee3b0aaa732d': ['aécio', 'aécio'], '86c53dc054b16f6e006a254891bc9ff0da5df8e1a6faee3b0aaa732d': ['aécio', 'aécio'],
'e9e5991bfb84506b105f800afac1599ff807bb8e20db8ffda48997b9': ['𠜎', '𠜎'] 'e9e5991bfb84506b105f800afac1599ff807bb8e20db8ffda48997b9': ['𠜎', '𠜎']
},
'ArrayBuffer': {
'da8f94de91d62154b55ea4e8d6eb133f6d553bcd1f1ba205b9488945': [
new ArrayBuffer(0),
'Hi There'
]
} }
} }
}; };
if (!(typeof JS_SHA256_NO_ARRAY_BUFFER === 'boolean' && JS_SHA256_NO_ARRAY_BUFFER)) {
testCases.sha256_hmac.Uint8Array = {
'e48411262715c8370cd5e7bf8e82bef53bd53712d007f3429351843b77c7bb9b': [
new Uint8Array(0),
'Hi There'
]
};
testCases.sha256_hmac.ArrayBuffer = {
'e48411262715c8370cd5e7bf8e82bef53bd53712d007f3429351843b77c7bb9b': [
new ArrayBuffer(0),
'Hi There'
]
};
testCases.sha224_hmac.Uint8Array = {
'da8f94de91d62154b55ea4e8d6eb133f6d553bcd1f1ba205b9488945': [
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 () {}]; var errorTestCases = [null, undefined, { length: 0 }, 0, 1, false, true, NaN, Infinity, function () {}];
function runTestCases(name, algorithm) { function runTestCases(name, algorithm) {
+92 -29
View File
@@ -1,47 +1,75 @@
// Node.js env
expect = require('expect.js'); expect = require('expect.js');
sha256 = require('../src/sha256.js').sha256; Worker = require("tiny-worker");
sha224 = require('../src/sha256.js').sha224;
require('./test.js');
require('./hmac-test.js');
delete require.cache[require.resolve('../src/sha256.js')] function unset() {
delete require.cache[require.resolve('./test.js')] delete require.cache[require.resolve('../src/sha256.js')];
delete require.cache[require.resolve('./hmac-test.js')] delete require.cache[require.resolve('./test.js')];
sha256 = null; delete require.cache[require.resolve('./hmac-test.js')];
sha224 = null; 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();
}
function runWindowTest() {
window = global;
require('../src/sha256.js');
require('./test.js');
require('./hmac-test.js');
unset();
}
// Node.js env
BUFFER = true;
runCommonJsTest();
// Node.js env, no Buffer.from
JS_SHA256_NO_BUFFER_FROM = true
runCommonJsTest();
// Webpack browser env // Webpack browser env
JS_SHA256_NO_NODE_JS = true; JS_SHA256_NO_NODE_JS = true;
window = global; window = global;
sha256 = require('../src/sha256.js').sha256; runCommonJsTest();
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;
// browser env // browser env
JS_SHA256_NO_NODE_JS = true; JS_SHA256_NO_NODE_JS = true;
JS_SHA256_NO_COMMON_JS = true; JS_SHA256_NO_COMMON_JS = true;
window = global; runWindowTest();
require('../src/sha256.js');
require('./test.js');
require('./hmac-test.js');
delete require.cache[require.resolve('../src/sha256.js')] // browser env and no array buffer
delete require.cache[require.resolve('./test.js')] JS_SHA256_NO_NODE_JS = true;
delete require.cache[require.resolve('./hmac-test.js')] JS_SHA256_NO_COMMON_JS = true;
sha256 = null; JS_SHA256_NO_ARRAY_BUFFER = true;
sha224 = null; 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 // browser AMD
JS_SHA256_NO_NODE_JS = true; JS_SHA256_NO_NODE_JS = true;
JS_SHA256_NO_COMMON_JS = true; JS_SHA256_NO_COMMON_JS = true;
JS_SHA256_NO_ARRAY_BUFFER_IS_VIEW = false;
window = global; window = global;
define = function (func) { define = function (func) {
sha256 = func(); sha256 = func();
@@ -52,3 +80,38 @@ define = function (func) {
define.amd = true; define.amd = true;
require('../src/sha256.js'); 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');
+41 -32
View File
@@ -40,18 +40,6 @@
'182889f925ae4e5cc37118ded6ed87f7bdc7cab5ec5e78faef2e50048999473f': [211, 212], '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], '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] '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: { sha224: {
@@ -83,34 +71,48 @@
'd14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f': [], '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], '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] '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 = {
if (typeof process == 'object') { '182889f925ae4e5cc37118ded6ed87f7bdc7cab5ec5e78faef2e50048999473f': new Uint8Array([211, 212]),
testCases.sha256['Buffer'] = { '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])
'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.sha256.Int8Array = {
'd14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f': new Buffer(0), '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])
'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])) };
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 BUFFER === 'boolean' && BUFFER) {
testCases.sha256.Buffer = {
'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855': Buffer.from([]),
'd7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592': Buffer.from(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 = {
'd14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f': Buffer.from([]),
'730e109bd7a8a32b1cb9d9a09aa2325d2430587ddbc0c38bad911525': Buffer.from(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) { function runTestCases(name, algorithm) {
var methods = [ var methods = [
{ {
@@ -240,6 +242,13 @@
}); });
}); });
}); });
context('when large size', function () {
var hash = algorithm.create();
hash.bytes = 4294967295;
hash.update('any');
expect(hash.hBytes).to.be(1);
});
}); });
}); });
} }
+24
View File
@@ -0,0 +1,24 @@
(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);
if (worker.terminate) {
worker.terminate();
}
done();
};
worker.postMessage(SOURCE);
worker.postMessage(cases[hash]);
});
});
});
})(Worker, WORKER, SOURCE);
+26
View File
@@ -0,0 +1,26 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>SHA256</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/mocha/2.1.0/mocha.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/mocha/2.1.0/mocha.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/expect.js/0.2.0/expect.min.js"></script>
<script src="../src/sha256.js"></script>
</head>
<body>
<div id="mocha"></div>
<script>
WORKER = 'worker.js';
SOURCE = '../src/sha256.js';
mocha.setup('bdd');
</script>
<script src="worker-test.js"></script>
<script>
mocha.checkLeaks();
mocha.run();
</script>
<script>
</script>
</body>
</html>
+12
View File
@@ -0,0 +1,12 @@
var imported = false;
onmessage = function(e) {
if (imported) {
postMessage(sha256(e.data));
if (typeof exports !== 'undefined') {
imported = false;
}
} else {
imported = true;
importScripts(e.data);
}
}