Compare commits
No commits in common. 'master' and 'v0.3.1' have entirely different histories.
@ -0,0 +1,2 @@
|
|||||||
|
/tests/
|
||||||
|
node_modules/
|
@ -1,3 +1,2 @@
|
|||||||
/node_modules/
|
node_modules/
|
||||||
/coverage/
|
covreporter
|
||||||
/.nyc_output/
|
|
||||||
|
@ -1,8 +1 @@
|
|||||||
/node_modules/
|
covreporter
|
||||||
/coverage/
|
|
||||||
/.nyc_output/
|
|
||||||
/tests/
|
|
||||||
.covignore
|
|
||||||
.travis.yml
|
|
||||||
.npmignore
|
|
||||||
bower.json
|
|
||||||
|
@ -1,10 +1,12 @@
|
|||||||
language: node_js
|
language: node_js
|
||||||
node_js:
|
node_js:
|
||||||
- "6.11.4"
|
- "0.12.15"
|
||||||
- "8.6.0"
|
- "4.5"
|
||||||
|
- "6.5.0"
|
||||||
before_install:
|
before_install:
|
||||||
- npm install coveralls
|
- npm install coveralls
|
||||||
after_success: npm run coveralls
|
- npm install mocha-lcov-reporter
|
||||||
|
script: npm run-script coveralls
|
||||||
branches:
|
branches:
|
||||||
only:
|
only:
|
||||||
- master
|
- master
|
||||||
|
@ -1,129 +1,50 @@
|
|||||||
# Change Log
|
# v0.3.1 / 2016-09-08
|
||||||
|
|
||||||
## v0.11.0 / 2024-01-24
|
* Added some files to npm package.
|
||||||
### Fixed
|
* Updated coding style.
|
||||||
- Generates incorrect hash in some cases #43
|
|
||||||
- dependencies and security issues. #41
|
|
||||||
|
|
||||||
## v0.10.1 / 2023-08-31
|
# v0.3.0 / 2015-05-23
|
||||||
### Added
|
|
||||||
- Disable webpack polyfill.
|
|
||||||
|
|
||||||
## v0.10.0 / 2023-08-30
|
* Support ArrayBuffer input.
|
||||||
### Fixed
|
|
||||||
- Chrome bug by workaround. #40
|
|
||||||
- deprecated `new Buffer`, replace with `Buffer.from`. #34
|
|
||||||
- dependencies and security issues. #32, #36
|
|
||||||
|
|
||||||
### Changed
|
# v0.2.3 / 2015-02-11
|
||||||
- TypeScript interface, secretKey can be bytes like message. #23, #25
|
|
||||||
- remove `eval` and use `require` directly. #18, #26
|
|
||||||
|
|
||||||
## v0.9.0 / 2017-12-18
|
* Support byte array input.
|
||||||
### Fixed
|
|
||||||
- incorrect result when first bit is 1 of bytes.
|
|
||||||
|
|
||||||
### Changed
|
# v0.2.2 / 2015-02-10
|
||||||
- throw error by Error oject. #13
|
|
||||||
|
|
||||||
### Added
|
* Improve performance.
|
||||||
- TypeScript interfaces. #12
|
|
||||||
|
|
||||||
## v0.8.0 / 2017-11-19
|
# v0.2.1 / 2015-02-05
|
||||||
### Added
|
|
||||||
- support for web worker.
|
|
||||||
- typescript types. #10
|
|
||||||
|
|
||||||
### Changed
|
* Fixed special length bug.
|
||||||
- prevent webpack to require dependencies.
|
* Add test cases.
|
||||||
|
|
||||||
## v0.7.1 / 2017-10-31
|
# v0.2.0 / 2015-02-03
|
||||||
### Improved
|
|
||||||
- performance of hBytes increment.
|
|
||||||
|
|
||||||
## v0.7.0 / 2017-10-31
|
* Remove ascii parameter.
|
||||||
### Fixed
|
* Improve performance.
|
||||||
- incorrect result when file size >= 512M.
|
* Add test cases.
|
||||||
|
|
||||||
## v0.6.0 / 2017-07-11
|
# v0.1.4 / 2015-01-24
|
||||||
### Added
|
|
||||||
- HMAC feature.
|
|
||||||
|
|
||||||
### Changed
|
* Improve performance.
|
||||||
- throw error if input type is incorrect.
|
|
||||||
|
|
||||||
## v0.5.0 / 2017-01-24
|
# v0.1.3 / 2015-01-09
|
||||||
### Added
|
|
||||||
- Streaming support #6
|
|
||||||
|
|
||||||
## v0.4.0 / 2017-01-23
|
* Improve performance.
|
||||||
### Added
|
|
||||||
- AMD support.
|
|
||||||
|
|
||||||
### Fixed
|
# v0.1.2 / 2015-01-06
|
||||||
- ArrayBuffer dosen't work in Webpack.
|
|
||||||
|
|
||||||
## v0.3.2 / 2016-09-12
|
* Add bower package.
|
||||||
### Added
|
* Fixed JSHint warnings.
|
||||||
- CommonJS detection.
|
* Add travis.
|
||||||
|
* Add coveralls.
|
||||||
|
|
||||||
## v0.3.1 / 2016-09-08
|
# v0.1.1 / 2014-07-27
|
||||||
### Added
|
|
||||||
- some files to npm package.
|
|
||||||
|
|
||||||
### Fixed
|
* Fixed accents bug
|
||||||
- coding style.
|
|
||||||
|
|
||||||
## v0.3.0 / 2015-05-23
|
# v0.1.0 / 2014-01-05
|
||||||
### Added
|
|
||||||
- support for ArrayBuffer input.
|
|
||||||
|
|
||||||
## v0.2.3 / 2015-02-11
|
* Initial release
|
||||||
### Added
|
|
||||||
- support for byte array input.
|
|
||||||
|
|
||||||
## v0.2.2 / 2015-02-10
|
|
||||||
### Improved
|
|
||||||
- performance.
|
|
||||||
|
|
||||||
## v0.2.1 / 2015-02-05
|
|
||||||
### Fixed
|
|
||||||
- special length bug.
|
|
||||||
|
|
||||||
### Added
|
|
||||||
- test cases.
|
|
||||||
|
|
||||||
## v0.2.0 / 2015-02-03
|
|
||||||
### Removed
|
|
||||||
- ascii parameter.
|
|
||||||
|
|
||||||
### Improved
|
|
||||||
- performance.
|
|
||||||
|
|
||||||
### Added
|
|
||||||
- test cases.
|
|
||||||
|
|
||||||
## v0.1.4 / 2015-01-24
|
|
||||||
### Improved
|
|
||||||
- performance.
|
|
||||||
|
|
||||||
## v0.1.3 / 2015-01-09
|
|
||||||
### Improved
|
|
||||||
- performance.
|
|
||||||
|
|
||||||
## v0.1.2 / 2015-01-06
|
|
||||||
### Added
|
|
||||||
- bower package.
|
|
||||||
- travis.
|
|
||||||
- coveralls.
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
- JSHint warnings.
|
|
||||||
|
|
||||||
## v0.1.1 / 2014-07-27
|
|
||||||
### Fixed
|
|
||||||
- accents bug.
|
|
||||||
|
|
||||||
## v0.1.0 / 2014-01-05
|
|
||||||
### Added
|
|
||||||
- initial release.
|
|
||||||
|
File diff suppressed because one or more lines are too long
@ -1,149 +0,0 @@
|
|||||||
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;
|
|
File diff suppressed because it is too large
Load Diff
@ -1,526 +1,228 @@
|
|||||||
/**
|
/**
|
||||||
* [js-sha256]{@link https://github.com/emn178/js-sha256}
|
* [js-sha256]{@link https://github.com/emn178/js-sha256}
|
||||||
*
|
*
|
||||||
* @version 0.11.0
|
* @version 0.3.1
|
||||||
* @author Chen, Yi-Cyuan [emn178@gmail.com]
|
* @author Chen, Yi-Cyuan [emn178@gmail.com]
|
||||||
* @copyright Chen, Yi-Cyuan 2014-2024
|
* @copyright Chen, Yi-Cyuan 2014-2016
|
||||||
* @license MIT
|
* @license MIT
|
||||||
*/
|
*/
|
||||||
/*jslint bitwise: true */
|
(function (root) {
|
||||||
(function () {
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var ERROR = 'input is invalid type';
|
var NODE_JS = typeof process == 'object' && process.versions && process.versions.node;
|
||||||
var WINDOW = typeof window === 'object';
|
|
||||||
var root = WINDOW ? window : {};
|
|
||||||
if (root.JS_SHA256_NO_WINDOW) {
|
|
||||||
WINDOW = false;
|
|
||||||
}
|
|
||||||
var WEB_WORKER = !WINDOW && typeof self === 'object';
|
|
||||||
var NODE_JS = !root.JS_SHA256_NO_NODE_JS && typeof process === 'object' && process.versions && process.versions.node;
|
|
||||||
if (NODE_JS) {
|
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 TYPED_ARRAY = typeof Uint8Array != 'undefined';
|
||||||
var AMD = typeof define === 'function' && define.amd;
|
|
||||||
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];
|
||||||
var K = [
|
var K =[0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
|
||||||
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
|
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
|
||||||
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
|
0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
|
||||||
0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
|
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
|
||||||
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
|
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
|
||||||
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
|
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
|
||||||
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
|
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
|
||||||
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
|
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2];
|
||||||
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
|
|
||||||
];
|
|
||||||
var OUTPUT_TYPES = ['hex', 'array', 'digest', 'arrayBuffer'];
|
|
||||||
|
|
||||||
var blocks = [];
|
var blocks = [];
|
||||||
|
|
||||||
if (root.JS_SHA256_NO_NODE_JS || !Array.isArray) {
|
var sha224 = function (message) {
|
||||||
Array.isArray = function (obj) {
|
return sha256(message, true);
|
||||||
return Object.prototype.toString.call(obj) === '[object Array]';
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ARRAY_BUFFER && (root.JS_SHA256_NO_ARRAY_BUFFER_IS_VIEW || !ArrayBuffer.isView)) {
|
|
||||||
ArrayBuffer.isView = function (obj) {
|
|
||||||
return typeof obj === 'object' && obj.buffer && obj.buffer.constructor === ArrayBuffer;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
var createOutputMethod = function (outputType, is224) {
|
|
||||||
return function (message) {
|
|
||||||
return new Sha256(is224, true).update(message)[outputType]();
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
var createMethod = function (is224) {
|
var sha256 = function (message, is224) {
|
||||||
var method = createOutputMethod('hex', is224);
|
var notString = typeof message != 'string';
|
||||||
if (NODE_JS) {
|
if (notString && message.constructor == root.ArrayBuffer) {
|
||||||
method = nodeWrap(method, is224);
|
message = new Uint8Array(message);
|
||||||
}
|
|
||||||
method.create = function () {
|
|
||||||
return new Sha256(is224);
|
|
||||||
};
|
|
||||||
method.update = function (message) {
|
|
||||||
return method.create().update(message);
|
|
||||||
};
|
|
||||||
for (var i = 0; i < OUTPUT_TYPES.length; ++i) {
|
|
||||||
var type = OUTPUT_TYPES[i];
|
|
||||||
method[type] = createOutputMethod(type, is224);
|
|
||||||
}
|
}
|
||||||
return method;
|
|
||||||
};
|
|
||||||
|
|
||||||
var nodeWrap = function (method, is224) {
|
var h0, h1, h2, h3, h4, h5, h6, h7, block, code, first = true, end = false,
|
||||||
var crypto = require('crypto')
|
i, j, index = 0, start = 0, bytes = 0, length = message.length,
|
||||||
var Buffer = require('buffer').Buffer;
|
s0, s1, maj, t1, t2, ch, ab, da, cd, bc;
|
||||||
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) {
|
|
||||||
if (typeof message === 'string') {
|
|
||||||
return crypto.createHash(algorithm).update(message, 'utf8').digest('hex');
|
|
||||||
} else {
|
|
||||||
if (message === null || message === undefined) {
|
|
||||||
throw new Error(ERROR);
|
|
||||||
} else if (message.constructor === ArrayBuffer) {
|
|
||||||
message = new Uint8Array(message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (Array.isArray(message) || ArrayBuffer.isView(message) ||
|
|
||||||
message.constructor === Buffer) {
|
|
||||||
return crypto.createHash(algorithm).update(bufferFrom(message)).digest('hex');
|
|
||||||
} else {
|
|
||||||
return method(message);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
return nodeMethod;
|
|
||||||
};
|
|
||||||
|
|
||||||
var createHmacOutputMethod = function (outputType, is224) {
|
|
||||||
return function (key, message) {
|
|
||||||
return new HmacSha256(key, is224, true).update(message)[outputType]();
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
var createHmacMethod = function (is224) {
|
|
||||||
var method = createHmacOutputMethod('hex', is224);
|
|
||||||
method.create = function (key) {
|
|
||||||
return new HmacSha256(key, is224);
|
|
||||||
};
|
|
||||||
method.update = function (key, message) {
|
|
||||||
return method.create(key).update(message);
|
|
||||||
};
|
|
||||||
for (var i = 0; i < OUTPUT_TYPES.length; ++i) {
|
|
||||||
var type = OUTPUT_TYPES[i];
|
|
||||||
method[type] = createHmacOutputMethod(type, is224);
|
|
||||||
}
|
|
||||||
return method;
|
|
||||||
};
|
|
||||||
|
|
||||||
function Sha256(is224, sharedMemory) {
|
|
||||||
if (sharedMemory) {
|
|
||||||
blocks[0] = blocks[16] = blocks[1] = blocks[2] = blocks[3] =
|
|
||||||
blocks[4] = blocks[5] = blocks[6] = blocks[7] =
|
|
||||||
blocks[8] = blocks[9] = blocks[10] = blocks[11] =
|
|
||||||
blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
|
|
||||||
this.blocks = blocks;
|
|
||||||
} else {
|
|
||||||
this.blocks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is224) {
|
if (is224) {
|
||||||
this.h0 = 0xc1059ed8;
|
h0 = 0xc1059ed8;
|
||||||
this.h1 = 0x367cd507;
|
h1 = 0x367cd507;
|
||||||
this.h2 = 0x3070dd17;
|
h2 = 0x3070dd17;
|
||||||
this.h3 = 0xf70e5939;
|
h3 = 0xf70e5939;
|
||||||
this.h4 = 0xffc00b31;
|
h4 = 0xffc00b31;
|
||||||
this.h5 = 0x68581511;
|
h5 = 0x68581511;
|
||||||
this.h6 = 0x64f98fa7;
|
h6 = 0x64f98fa7;
|
||||||
this.h7 = 0xbefa4fa4;
|
h7 = 0xbefa4fa4;
|
||||||
} else { // 256
|
} else { // 256
|
||||||
this.h0 = 0x6a09e667;
|
h0 = 0x6a09e667;
|
||||||
this.h1 = 0xbb67ae85;
|
h1 = 0xbb67ae85;
|
||||||
this.h2 = 0x3c6ef372;
|
h2 = 0x3c6ef372;
|
||||||
this.h3 = 0xa54ff53a;
|
h3 = 0xa54ff53a;
|
||||||
this.h4 = 0x510e527f;
|
h4 = 0x510e527f;
|
||||||
this.h5 = 0x9b05688c;
|
h5 = 0x9b05688c;
|
||||||
this.h6 = 0x1f83d9ab;
|
h6 = 0x1f83d9ab;
|
||||||
this.h7 = 0x5be0cd19;
|
h7 = 0x5be0cd19;
|
||||||
}
|
}
|
||||||
|
block = 0;
|
||||||
this.block = this.start = this.bytes = this.hBytes = 0;
|
do {
|
||||||
this.finalized = this.hashed = false;
|
blocks[0] = block;
|
||||||
this.first = true;
|
blocks[16] = blocks[1] = blocks[2] = blocks[3] =
|
||||||
this.is224 = is224;
|
blocks[4] = blocks[5] = blocks[6] = blocks[7] =
|
||||||
}
|
blocks[8] = blocks[9] = blocks[10] = blocks[11] =
|
||||||
|
blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
|
||||||
Sha256.prototype.update = function (message) {
|
|
||||||
if (this.finalized) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var notString, type = typeof message;
|
|
||||||
if (type !== 'string') {
|
|
||||||
if (type === 'object') {
|
|
||||||
if (message === null) {
|
|
||||||
throw new Error(ERROR);
|
|
||||||
} 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 code, index = 0, i, length = message.length, blocks = this.blocks;
|
|
||||||
while (index < length) {
|
|
||||||
if (this.hashed) {
|
|
||||||
this.hashed = false;
|
|
||||||
blocks[0] = this.block;
|
|
||||||
this.block = blocks[16] = blocks[1] = blocks[2] = blocks[3] =
|
|
||||||
blocks[4] = blocks[5] = blocks[6] = blocks[7] =
|
|
||||||
blocks[8] = blocks[9] = blocks[10] = blocks[11] =
|
|
||||||
blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (notString) {
|
if (notString) {
|
||||||
for (i = this.start; index < length && i < 64; ++index) {
|
for (i = start;index < length && i < 64;++index) {
|
||||||
blocks[i >>> 2] |= message[index] << SHIFT[i++ & 3];
|
blocks[i >> 2] |= message[index] << SHIFT[i++ & 3];
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (i = this.start; index < length && i < 64; ++index) {
|
for (i = start;index < length && i < 64;++index) {
|
||||||
code = message.charCodeAt(index);
|
code = message.charCodeAt(index);
|
||||||
if (code < 0x80) {
|
if (code < 0x80) {
|
||||||
blocks[i >>> 2] |= code << SHIFT[i++ & 3];
|
blocks[i >> 2] |= code << SHIFT[i++ & 3];
|
||||||
} else if (code < 0x800) {
|
} else if (code < 0x800) {
|
||||||
blocks[i >>> 2] |= (0xc0 | (code >>> 6)) << SHIFT[i++ & 3];
|
blocks[i >> 2] |= (0xc0 | (code >> 6)) << SHIFT[i++ & 3];
|
||||||
blocks[i >>> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
|
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
|
||||||
} else if (code < 0xd800 || code >= 0xe000) {
|
} else if (code < 0xd800 || code >= 0xe000) {
|
||||||
blocks[i >>> 2] |= (0xe0 | (code >>> 12)) << SHIFT[i++ & 3];
|
blocks[i >> 2] |= (0xe0 | (code >> 12)) << SHIFT[i++ & 3];
|
||||||
blocks[i >>> 2] |= (0x80 | ((code >>> 6) & 0x3f)) << SHIFT[i++ & 3];
|
blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
|
||||||
blocks[i >>> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
|
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
|
||||||
} else {
|
} else {
|
||||||
code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
|
code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
|
||||||
blocks[i >>> 2] |= (0xf0 | (code >>> 18)) << SHIFT[i++ & 3];
|
blocks[i >> 2] |= (0xf0 | (code >> 18)) << SHIFT[i++ & 3];
|
||||||
blocks[i >>> 2] |= (0x80 | ((code >>> 12) & 0x3f)) << SHIFT[i++ & 3];
|
blocks[i >> 2] |= (0x80 | ((code >> 12) & 0x3f)) << SHIFT[i++ & 3];
|
||||||
blocks[i >>> 2] |= (0x80 | ((code >>> 6) & 0x3f)) << SHIFT[i++ & 3];
|
blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
|
||||||
blocks[i >>> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
|
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
bytes += i - start;
|
||||||
this.lastByteIndex = i;
|
start = i - 64;
|
||||||
this.bytes += i - this.start;
|
if (index == length) {
|
||||||
if (i >= 64) {
|
blocks[i >> 2] |= EXTRA[i & 3];
|
||||||
this.block = blocks[16];
|
++index;
|
||||||
this.start = i - 64;
|
|
||||||
this.hash();
|
|
||||||
this.hashed = true;
|
|
||||||
} else {
|
|
||||||
this.start = i;
|
|
||||||
}
|
}
|
||||||
}
|
block = blocks[16];
|
||||||
if (this.bytes > 4294967295) {
|
if (index > length && i < 56) {
|
||||||
this.hBytes += this.bytes / 4294967296 << 0;
|
blocks[15] = bytes << 3;
|
||||||
this.bytes = this.bytes % 4294967296;
|
end = true;
|
||||||
}
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
Sha256.prototype.finalize = function () {
|
|
||||||
if (this.finalized) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.finalized = true;
|
|
||||||
var blocks = this.blocks, i = this.lastByteIndex;
|
|
||||||
blocks[16] = this.block;
|
|
||||||
blocks[i >>> 2] |= EXTRA[i & 3];
|
|
||||||
this.block = blocks[16];
|
|
||||||
if (i >= 56) {
|
|
||||||
if (!this.hashed) {
|
|
||||||
this.hash();
|
|
||||||
}
|
}
|
||||||
blocks[0] = this.block;
|
|
||||||
blocks[16] = blocks[1] = blocks[2] = blocks[3] =
|
|
||||||
blocks[4] = blocks[5] = blocks[6] = blocks[7] =
|
|
||||||
blocks[8] = blocks[9] = blocks[10] = blocks[11] =
|
|
||||||
blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
|
|
||||||
}
|
|
||||||
blocks[14] = this.hBytes << 3 | this.bytes >>> 29;
|
|
||||||
blocks[15] = this.bytes << 3;
|
|
||||||
this.hash();
|
|
||||||
};
|
|
||||||
|
|
||||||
Sha256.prototype.hash = function () {
|
var a = h0, b = h1, c = h2, d = h3, e = h4, f = h5, g = h6, h = h7;
|
||||||
var a = this.h0, b = this.h1, c = this.h2, d = this.h3, e = this.h4, f = this.h5, g = this.h6,
|
for (j = 16;j < 64;++j) {
|
||||||
h = this.h7, blocks = this.blocks, j, s0, s1, maj, t1, t2, ch, ab, da, cd, bc;
|
// rightrotate
|
||||||
|
t1 = blocks[j - 15];
|
||||||
for (j = 16; j < 64; ++j) {
|
s0 = ((t1 >>> 7) | (t1 << 25)) ^ ((t1 >>> 18) | (t1 << 14)) ^ (t1 >>> 3);
|
||||||
// rightrotate
|
t1 = blocks[j - 2];
|
||||||
t1 = blocks[j - 15];
|
s1 = ((t1 >>> 17) | (t1 << 15)) ^ ((t1 >>> 19) | (t1 << 13)) ^ (t1 >>> 10);
|
||||||
s0 = ((t1 >>> 7) | (t1 << 25)) ^ ((t1 >>> 18) | (t1 << 14)) ^ (t1 >>> 3);
|
blocks[j] = blocks[j - 16] + s0 + blocks[j - 7] + s1 << 0;
|
||||||
t1 = blocks[j - 2];
|
}
|
||||||
s1 = ((t1 >>> 17) | (t1 << 15)) ^ ((t1 >>> 19) | (t1 << 13)) ^ (t1 >>> 10);
|
|
||||||
blocks[j] = blocks[j - 16] + s0 + blocks[j - 7] + s1 << 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bc = b & c;
|
bc = b & c;
|
||||||
for (j = 0; j < 64; j += 4) {
|
for (j = 0;j < 64;j += 4) {
|
||||||
if (this.first) {
|
if (first) {
|
||||||
if (this.is224) {
|
if (is224) {
|
||||||
ab = 300032;
|
ab = 300032;
|
||||||
t1 = blocks[0] - 1413257819;
|
t1 = blocks[0] - 1413257819;
|
||||||
h = t1 - 150054599 << 0;
|
h = t1 - 150054599 << 0;
|
||||||
d = t1 + 24177077 << 0;
|
d = t1 + 24177077 << 0;
|
||||||
|
} else {
|
||||||
|
ab = 704751109;
|
||||||
|
t1 = blocks[0] - 210244248;
|
||||||
|
h = t1 - 1521486534 << 0;
|
||||||
|
d = t1 + 143694565 << 0;
|
||||||
|
}
|
||||||
|
first = false;
|
||||||
} else {
|
} else {
|
||||||
ab = 704751109;
|
s0 = ((a >>> 2) | (a << 30)) ^ ((a >>> 13) | (a << 19)) ^ ((a >>> 22) | (a << 10));
|
||||||
t1 = blocks[0] - 210244248;
|
s1 = ((e >>> 6) | (e << 26)) ^ ((e >>> 11) | (e << 21)) ^ ((e >>> 25) | (e << 7));
|
||||||
h = t1 - 1521486534 << 0;
|
ab = a & b;
|
||||||
d = t1 + 143694565 << 0;
|
maj = ab ^ (a & c) ^ bc;
|
||||||
|
ch = (e & f) ^ (~e & g);
|
||||||
|
t1 = h + s1 + ch + K[j] + blocks[j];
|
||||||
|
t2 = s0 + maj;
|
||||||
|
h = d + t1 << 0;
|
||||||
|
d = t1 + t2 << 0;
|
||||||
}
|
}
|
||||||
this.first = false;
|
s0 = ((d >>> 2) | (d << 30)) ^ ((d >>> 13) | (d << 19)) ^ ((d >>> 22) | (d << 10));
|
||||||
} else {
|
s1 = ((h >>> 6) | (h << 26)) ^ ((h >>> 11) | (h << 21)) ^ ((h >>> 25) | (h << 7));
|
||||||
s0 = ((a >>> 2) | (a << 30)) ^ ((a >>> 13) | (a << 19)) ^ ((a >>> 22) | (a << 10));
|
da = d & a;
|
||||||
s1 = ((e >>> 6) | (e << 26)) ^ ((e >>> 11) | (e << 21)) ^ ((e >>> 25) | (e << 7));
|
maj = da ^ (d & b) ^ ab;
|
||||||
ab = a & b;
|
ch = (h & e) ^ (~h & f);
|
||||||
maj = ab ^ (a & c) ^ bc;
|
t1 = g + s1 + ch + K[j + 1] + blocks[j + 1];
|
||||||
ch = (e & f) ^ (~e & g);
|
t2 = s0 + maj;
|
||||||
t1 = h + s1 + ch + K[j] + blocks[j];
|
g = c + t1 << 0;
|
||||||
|
c = t1 + t2 << 0;
|
||||||
|
s0 = ((c >>> 2) | (c << 30)) ^ ((c >>> 13) | (c << 19)) ^ ((c >>> 22) | (c << 10));
|
||||||
|
s1 = ((g >>> 6) | (g << 26)) ^ ((g >>> 11) | (g << 21)) ^ ((g >>> 25) | (g << 7));
|
||||||
|
cd = c & d;
|
||||||
|
maj = cd ^ (c & a) ^ da;
|
||||||
|
ch = (g & h) ^ (~g & e);
|
||||||
|
t1 = f + s1 + ch + K[j + 2] + blocks[j + 2];
|
||||||
t2 = s0 + maj;
|
t2 = s0 + maj;
|
||||||
h = d + t1 << 0;
|
f = b + t1 << 0;
|
||||||
d = t1 + t2 << 0;
|
b = t1 + t2 << 0;
|
||||||
|
s0 = ((b >>> 2) | (b << 30)) ^ ((b >>> 13) | (b << 19)) ^ ((b >>> 22) | (b << 10));
|
||||||
|
s1 = ((f >>> 6) | (f << 26)) ^ ((f >>> 11) | (f << 21)) ^ ((f >>> 25) | (f << 7));
|
||||||
|
bc = b & c;
|
||||||
|
maj = bc ^ (b & d) ^ cd;
|
||||||
|
ch = (f & g) ^ (~f & h);
|
||||||
|
t1 = e + s1 + ch + K[j + 3] + blocks[j + 3];
|
||||||
|
t2 = s0 + maj;
|
||||||
|
e = a + t1 << 0;
|
||||||
|
a = t1 + t2 << 0;
|
||||||
}
|
}
|
||||||
s0 = ((d >>> 2) | (d << 30)) ^ ((d >>> 13) | (d << 19)) ^ ((d >>> 22) | (d << 10));
|
|
||||||
s1 = ((h >>> 6) | (h << 26)) ^ ((h >>> 11) | (h << 21)) ^ ((h >>> 25) | (h << 7));
|
|
||||||
da = d & a;
|
|
||||||
maj = da ^ (d & b) ^ ab;
|
|
||||||
ch = (h & e) ^ (~h & f);
|
|
||||||
t1 = g + s1 + ch + K[j + 1] + blocks[j + 1];
|
|
||||||
t2 = s0 + maj;
|
|
||||||
g = c + t1 << 0;
|
|
||||||
c = t1 + t2 << 0;
|
|
||||||
s0 = ((c >>> 2) | (c << 30)) ^ ((c >>> 13) | (c << 19)) ^ ((c >>> 22) | (c << 10));
|
|
||||||
s1 = ((g >>> 6) | (g << 26)) ^ ((g >>> 11) | (g << 21)) ^ ((g >>> 25) | (g << 7));
|
|
||||||
cd = c & d;
|
|
||||||
maj = cd ^ (c & a) ^ da;
|
|
||||||
ch = (g & h) ^ (~g & e);
|
|
||||||
t1 = f + s1 + ch + K[j + 2] + blocks[j + 2];
|
|
||||||
t2 = s0 + maj;
|
|
||||||
f = b + t1 << 0;
|
|
||||||
b = t1 + t2 << 0;
|
|
||||||
s0 = ((b >>> 2) | (b << 30)) ^ ((b >>> 13) | (b << 19)) ^ ((b >>> 22) | (b << 10));
|
|
||||||
s1 = ((f >>> 6) | (f << 26)) ^ ((f >>> 11) | (f << 21)) ^ ((f >>> 25) | (f << 7));
|
|
||||||
bc = b & c;
|
|
||||||
maj = bc ^ (b & d) ^ cd;
|
|
||||||
ch = (f & g) ^ (~f & h);
|
|
||||||
t1 = e + s1 + ch + K[j + 3] + blocks[j + 3];
|
|
||||||
t2 = s0 + maj;
|
|
||||||
e = a + t1 << 0;
|
|
||||||
a = t1 + t2 << 0;
|
|
||||||
this.chromeBugWorkAround = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.h0 = this.h0 + a << 0;
|
|
||||||
this.h1 = this.h1 + b << 0;
|
|
||||||
this.h2 = this.h2 + c << 0;
|
|
||||||
this.h3 = this.h3 + d << 0;
|
|
||||||
this.h4 = this.h4 + e << 0;
|
|
||||||
this.h5 = this.h5 + f << 0;
|
|
||||||
this.h6 = this.h6 + g << 0;
|
|
||||||
this.h7 = this.h7 + h << 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
Sha256.prototype.hex = function () {
|
|
||||||
this.finalize();
|
|
||||||
|
|
||||||
var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3, h4 = this.h4, h5 = this.h5,
|
h0 = h0 + a << 0;
|
||||||
h6 = this.h6, h7 = this.h7;
|
h1 = h1 + b << 0;
|
||||||
|
h2 = h2 + c << 0;
|
||||||
var hex = HEX_CHARS[(h0 >>> 28) & 0x0F] + HEX_CHARS[(h0 >>> 24) & 0x0F] +
|
h3 = h3 + d << 0;
|
||||||
HEX_CHARS[(h0 >>> 20) & 0x0F] + HEX_CHARS[(h0 >>> 16) & 0x0F] +
|
h4 = h4 + e << 0;
|
||||||
HEX_CHARS[(h0 >>> 12) & 0x0F] + HEX_CHARS[(h0 >>> 8) & 0x0F] +
|
h5 = h5 + f << 0;
|
||||||
HEX_CHARS[(h0 >>> 4) & 0x0F] + HEX_CHARS[h0 & 0x0F] +
|
h6 = h6 + g << 0;
|
||||||
HEX_CHARS[(h1 >>> 28) & 0x0F] + HEX_CHARS[(h1 >>> 24) & 0x0F] +
|
h7 = h7 + h << 0;
|
||||||
HEX_CHARS[(h1 >>> 20) & 0x0F] + HEX_CHARS[(h1 >>> 16) & 0x0F] +
|
} while (!end);
|
||||||
HEX_CHARS[(h1 >>> 12) & 0x0F] + HEX_CHARS[(h1 >>> 8) & 0x0F] +
|
|
||||||
HEX_CHARS[(h1 >>> 4) & 0x0F] + HEX_CHARS[h1 & 0x0F] +
|
var hex = HEX_CHARS[(h0 >> 28) & 0x0F] + HEX_CHARS[(h0 >> 24) & 0x0F] +
|
||||||
HEX_CHARS[(h2 >>> 28) & 0x0F] + HEX_CHARS[(h2 >>> 24) & 0x0F] +
|
HEX_CHARS[(h0 >> 20) & 0x0F] + HEX_CHARS[(h0 >> 16) & 0x0F] +
|
||||||
HEX_CHARS[(h2 >>> 20) & 0x0F] + HEX_CHARS[(h2 >>> 16) & 0x0F] +
|
HEX_CHARS[(h0 >> 12) & 0x0F] + HEX_CHARS[(h0 >> 8) & 0x0F] +
|
||||||
HEX_CHARS[(h2 >>> 12) & 0x0F] + HEX_CHARS[(h2 >>> 8) & 0x0F] +
|
HEX_CHARS[(h0 >> 4) & 0x0F] + HEX_CHARS[h0 & 0x0F] +
|
||||||
HEX_CHARS[(h2 >>> 4) & 0x0F] + HEX_CHARS[h2 & 0x0F] +
|
HEX_CHARS[(h1 >> 28) & 0x0F] + HEX_CHARS[(h1 >> 24) & 0x0F] +
|
||||||
HEX_CHARS[(h3 >>> 28) & 0x0F] + HEX_CHARS[(h3 >>> 24) & 0x0F] +
|
HEX_CHARS[(h1 >> 20) & 0x0F] + HEX_CHARS[(h1 >> 16) & 0x0F] +
|
||||||
HEX_CHARS[(h3 >>> 20) & 0x0F] + HEX_CHARS[(h3 >>> 16) & 0x0F] +
|
HEX_CHARS[(h1 >> 12) & 0x0F] + HEX_CHARS[(h1 >> 8) & 0x0F] +
|
||||||
HEX_CHARS[(h3 >>> 12) & 0x0F] + HEX_CHARS[(h3 >>> 8) & 0x0F] +
|
HEX_CHARS[(h1 >> 4) & 0x0F] + HEX_CHARS[h1 & 0x0F] +
|
||||||
HEX_CHARS[(h3 >>> 4) & 0x0F] + HEX_CHARS[h3 & 0x0F] +
|
HEX_CHARS[(h2 >> 28) & 0x0F] + HEX_CHARS[(h2 >> 24) & 0x0F] +
|
||||||
HEX_CHARS[(h4 >>> 28) & 0x0F] + HEX_CHARS[(h4 >>> 24) & 0x0F] +
|
HEX_CHARS[(h2 >> 20) & 0x0F] + HEX_CHARS[(h2 >> 16) & 0x0F] +
|
||||||
HEX_CHARS[(h4 >>> 20) & 0x0F] + HEX_CHARS[(h4 >>> 16) & 0x0F] +
|
HEX_CHARS[(h2 >> 12) & 0x0F] + HEX_CHARS[(h2 >> 8) & 0x0F] +
|
||||||
HEX_CHARS[(h4 >>> 12) & 0x0F] + HEX_CHARS[(h4 >>> 8) & 0x0F] +
|
HEX_CHARS[(h2 >> 4) & 0x0F] + HEX_CHARS[h2 & 0x0F] +
|
||||||
HEX_CHARS[(h4 >>> 4) & 0x0F] + HEX_CHARS[h4 & 0x0F] +
|
HEX_CHARS[(h3 >> 28) & 0x0F] + HEX_CHARS[(h3 >> 24) & 0x0F] +
|
||||||
HEX_CHARS[(h5 >>> 28) & 0x0F] + HEX_CHARS[(h5 >>> 24) & 0x0F] +
|
HEX_CHARS[(h3 >> 20) & 0x0F] + HEX_CHARS[(h3 >> 16) & 0x0F] +
|
||||||
HEX_CHARS[(h5 >>> 20) & 0x0F] + HEX_CHARS[(h5 >>> 16) & 0x0F] +
|
HEX_CHARS[(h3 >> 12) & 0x0F] + HEX_CHARS[(h3 >> 8) & 0x0F] +
|
||||||
HEX_CHARS[(h5 >>> 12) & 0x0F] + HEX_CHARS[(h5 >>> 8) & 0x0F] +
|
HEX_CHARS[(h3 >> 4) & 0x0F] + HEX_CHARS[h3 & 0x0F] +
|
||||||
HEX_CHARS[(h5 >>> 4) & 0x0F] + HEX_CHARS[h5 & 0x0F] +
|
HEX_CHARS[(h4 >> 28) & 0x0F] + HEX_CHARS[(h4 >> 24) & 0x0F] +
|
||||||
HEX_CHARS[(h6 >>> 28) & 0x0F] + HEX_CHARS[(h6 >>> 24) & 0x0F] +
|
HEX_CHARS[(h4 >> 20) & 0x0F] + HEX_CHARS[(h4 >> 16) & 0x0F] +
|
||||||
HEX_CHARS[(h6 >>> 20) & 0x0F] + HEX_CHARS[(h6 >>> 16) & 0x0F] +
|
HEX_CHARS[(h4 >> 12) & 0x0F] + HEX_CHARS[(h4 >> 8) & 0x0F] +
|
||||||
HEX_CHARS[(h6 >>> 12) & 0x0F] + HEX_CHARS[(h6 >>> 8) & 0x0F] +
|
HEX_CHARS[(h4 >> 4) & 0x0F] + HEX_CHARS[h4 & 0x0F] +
|
||||||
HEX_CHARS[(h6 >>> 4) & 0x0F] + HEX_CHARS[h6 & 0x0F];
|
HEX_CHARS[(h5 >> 28) & 0x0F] + HEX_CHARS[(h5 >> 24) & 0x0F] +
|
||||||
if (!this.is224) {
|
HEX_CHARS[(h5 >> 20) & 0x0F] + HEX_CHARS[(h5 >> 16) & 0x0F] +
|
||||||
hex += HEX_CHARS[(h7 >>> 28) & 0x0F] + HEX_CHARS[(h7 >>> 24) & 0x0F] +
|
HEX_CHARS[(h5 >> 12) & 0x0F] + HEX_CHARS[(h5 >> 8) & 0x0F] +
|
||||||
HEX_CHARS[(h7 >>> 20) & 0x0F] + HEX_CHARS[(h7 >>> 16) & 0x0F] +
|
HEX_CHARS[(h5 >> 4) & 0x0F] + HEX_CHARS[h5 & 0x0F] +
|
||||||
HEX_CHARS[(h7 >>> 12) & 0x0F] + HEX_CHARS[(h7 >>> 8) & 0x0F] +
|
HEX_CHARS[(h6 >> 28) & 0x0F] + HEX_CHARS[(h6 >> 24) & 0x0F] +
|
||||||
HEX_CHARS[(h7 >>> 4) & 0x0F] + HEX_CHARS[h7 & 0x0F];
|
HEX_CHARS[(h6 >> 20) & 0x0F] + HEX_CHARS[(h6 >> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h6 >> 12) & 0x0F] + HEX_CHARS[(h6 >> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h6 >> 4) & 0x0F] + HEX_CHARS[h6 & 0x0F];
|
||||||
|
if (!is224) {
|
||||||
|
hex += HEX_CHARS[(h7 >> 28) & 0x0F] + HEX_CHARS[(h7 >> 24) & 0x0F] +
|
||||||
|
HEX_CHARS[(h7 >> 20) & 0x0F] + HEX_CHARS[(h7 >> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h7 >> 12) & 0x0F] + HEX_CHARS[(h7 >> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h7 >> 4) & 0x0F] + HEX_CHARS[h7 & 0x0F];
|
||||||
}
|
}
|
||||||
return hex;
|
return hex;
|
||||||
};
|
};
|
||||||
|
|
||||||
Sha256.prototype.toString = Sha256.prototype.hex;
|
if (!root.JS_SHA256_TEST && NODE_JS) {
|
||||||
|
sha256.sha256 = sha256;
|
||||||
Sha256.prototype.digest = function () {
|
sha256.sha224 = sha224;
|
||||||
this.finalize();
|
module.exports = sha256;
|
||||||
|
} else if (root) {
|
||||||
var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3, h4 = this.h4, h5 = this.h5,
|
root.sha256 = sha256;
|
||||||
h6 = this.h6, h7 = this.h7;
|
root.sha224 = sha224;
|
||||||
|
|
||||||
var arr = [
|
|
||||||
(h0 >>> 24) & 0xFF, (h0 >>> 16) & 0xFF, (h0 >>> 8) & 0xFF, h0 & 0xFF,
|
|
||||||
(h1 >>> 24) & 0xFF, (h1 >>> 16) & 0xFF, (h1 >>> 8) & 0xFF, h1 & 0xFF,
|
|
||||||
(h2 >>> 24) & 0xFF, (h2 >>> 16) & 0xFF, (h2 >>> 8) & 0xFF, h2 & 0xFF,
|
|
||||||
(h3 >>> 24) & 0xFF, (h3 >>> 16) & 0xFF, (h3 >>> 8) & 0xFF, h3 & 0xFF,
|
|
||||||
(h4 >>> 24) & 0xFF, (h4 >>> 16) & 0xFF, (h4 >>> 8) & 0xFF, h4 & 0xFF,
|
|
||||||
(h5 >>> 24) & 0xFF, (h5 >>> 16) & 0xFF, (h5 >>> 8) & 0xFF, h5 & 0xFF,
|
|
||||||
(h6 >>> 24) & 0xFF, (h6 >>> 16) & 0xFF, (h6 >>> 8) & 0xFF, h6 & 0xFF
|
|
||||||
];
|
|
||||||
if (!this.is224) {
|
|
||||||
arr.push((h7 >>> 24) & 0xFF, (h7 >>> 16) & 0xFF, (h7 >>> 8) & 0xFF, h7 & 0xFF);
|
|
||||||
}
|
|
||||||
return arr;
|
|
||||||
};
|
|
||||||
|
|
||||||
Sha256.prototype.array = Sha256.prototype.digest;
|
|
||||||
|
|
||||||
Sha256.prototype.arrayBuffer = function () {
|
|
||||||
this.finalize();
|
|
||||||
|
|
||||||
var buffer = new ArrayBuffer(this.is224 ? 28 : 32);
|
|
||||||
var dataView = new DataView(buffer);
|
|
||||||
dataView.setUint32(0, this.h0);
|
|
||||||
dataView.setUint32(4, this.h1);
|
|
||||||
dataView.setUint32(8, this.h2);
|
|
||||||
dataView.setUint32(12, this.h3);
|
|
||||||
dataView.setUint32(16, this.h4);
|
|
||||||
dataView.setUint32(20, this.h5);
|
|
||||||
dataView.setUint32(24, this.h6);
|
|
||||||
if (!this.is224) {
|
|
||||||
dataView.setUint32(28, this.h7);
|
|
||||||
}
|
|
||||||
return buffer;
|
|
||||||
};
|
|
||||||
|
|
||||||
function HmacSha256(key, is224, sharedMemory) {
|
|
||||||
var i, type = typeof key;
|
|
||||||
if (type === 'string') {
|
|
||||||
var bytes = [], length = key.length, index = 0, code;
|
|
||||||
for (i = 0; i < length; ++i) {
|
|
||||||
code = key.charCodeAt(i);
|
|
||||||
if (code < 0x80) {
|
|
||||||
bytes[index++] = code;
|
|
||||||
} else if (code < 0x800) {
|
|
||||||
bytes[index++] = (0xc0 | (code >>> 6));
|
|
||||||
bytes[index++] = (0x80 | (code & 0x3f));
|
|
||||||
} else if (code < 0xd800 || code >= 0xe000) {
|
|
||||||
bytes[index++] = (0xe0 | (code >>> 12));
|
|
||||||
bytes[index++] = (0x80 | ((code >>> 6) & 0x3f));
|
|
||||||
bytes[index++] = (0x80 | (code & 0x3f));
|
|
||||||
} else {
|
|
||||||
code = 0x10000 + (((code & 0x3ff) << 10) | (key.charCodeAt(++i) & 0x3ff));
|
|
||||||
bytes[index++] = (0xf0 | (code >>> 18));
|
|
||||||
bytes[index++] = (0x80 | ((code >>> 12) & 0x3f));
|
|
||||||
bytes[index++] = (0x80 | ((code >>> 6) & 0x3f));
|
|
||||||
bytes[index++] = (0x80 | (code & 0x3f));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
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) {
|
|
||||||
key = (new Sha256(is224, true)).update(key).array();
|
|
||||||
}
|
|
||||||
|
|
||||||
var oKeyPad = [], iKeyPad = [];
|
|
||||||
for (i = 0; i < 64; ++i) {
|
|
||||||
var b = key[i] || 0;
|
|
||||||
oKeyPad[i] = 0x5c ^ b;
|
|
||||||
iKeyPad[i] = 0x36 ^ b;
|
|
||||||
}
|
|
||||||
|
|
||||||
Sha256.call(this, is224, sharedMemory);
|
|
||||||
|
|
||||||
this.update(iKeyPad);
|
|
||||||
this.oKeyPad = oKeyPad;
|
|
||||||
this.inner = true;
|
|
||||||
this.sharedMemory = sharedMemory;
|
|
||||||
}
|
|
||||||
HmacSha256.prototype = new Sha256();
|
|
||||||
|
|
||||||
HmacSha256.prototype.finalize = function () {
|
|
||||||
Sha256.prototype.finalize.call(this);
|
|
||||||
if (this.inner) {
|
|
||||||
this.inner = false;
|
|
||||||
var innerHash = this.array();
|
|
||||||
Sha256.call(this, this.is224, this.sharedMemory);
|
|
||||||
this.update(this.oKeyPad);
|
|
||||||
this.update(innerHash);
|
|
||||||
Sha256.prototype.finalize.call(this);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
var exports = createMethod();
|
|
||||||
exports.sha256 = exports;
|
|
||||||
exports.sha224 = createMethod(true);
|
|
||||||
exports.sha256.hmac = createHmacMethod();
|
|
||||||
exports.sha224.hmac = createHmacMethod(true);
|
|
||||||
|
|
||||||
if (COMMON_JS) {
|
|
||||||
module.exports = exports;
|
|
||||||
} else {
|
|
||||||
root.sha256 = exports.sha256;
|
|
||||||
root.sha224 = exports.sha224;
|
|
||||||
if (AMD) {
|
|
||||||
define(function () {
|
|
||||||
return exports;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
})();
|
}(this));
|
||||||
|
@ -1,245 +0,0 @@
|
|||||||
(function (sha256, sha224) {
|
|
||||||
Array.prototype.toHexString = ArrayBuffer.prototype.toHexString = function () {
|
|
||||||
var array = new Uint8Array(this);
|
|
||||||
var hex = '';
|
|
||||||
for (var i = 0; i < array.length; ++i) {
|
|
||||||
var c = array[i].toString('16');
|
|
||||||
hex += c.length === 1 ? '0' + c : c;
|
|
||||||
}
|
|
||||||
return hex;
|
|
||||||
};
|
|
||||||
|
|
||||||
var testCases = {
|
|
||||||
sha256_hmac: {
|
|
||||||
'Test Vectors': {
|
|
||||||
'b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7': [
|
|
||||||
[0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b],
|
|
||||||
'Hi There'
|
|
||||||
],
|
|
||||||
'5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843': [
|
|
||||||
'Jefe',
|
|
||||||
'what do ya want for nothing?'
|
|
||||||
],
|
|
||||||
'773ea91e36800e46854db8ebd09181a72959098b3ef8c122d9635514ced565fe': [
|
|
||||||
[0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa],
|
|
||||||
[0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd]
|
|
||||||
],
|
|
||||||
'82558a389a443c0ea4cc819899f2083a85f0faa3e578f8077a2e3ff46729665b': [
|
|
||||||
[0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19],
|
|
||||||
[0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd]
|
|
||||||
],
|
|
||||||
'60e431591ee0b67f0d8a26aacbf5b77f8e0bc6213728c5140546040f0ee37f54': [
|
|
||||||
[0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa],
|
|
||||||
'Test Using Larger Than Block-Size Key - Hash Key First'
|
|
||||||
],
|
|
||||||
'9b09ffa71b942fcb27635fbcd5b0e944bfdc63644f0713938a7f51535c3a35e2': [
|
|
||||||
[0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa],
|
|
||||||
'This is a test using a larger than block-size key and a larger than block-size data. The key needs to be hashed before being used by the HMAC algorithm.'
|
|
||||||
]
|
|
||||||
},
|
|
||||||
'UTF8': {
|
|
||||||
'865cc329d317f6d9fdbd183a3c5cc5fd4c370d11f98abbbb404bceb1e6392c7e': ['中文', '中文'],
|
|
||||||
'efeef87be5731506b69bb64a9898a456dd12c94834c36a4d8ba99e3db79ad7ed': ['aécio', 'aécio'],
|
|
||||||
'8a6e527049b9cfc7e1c84bcf356a1289c95da68a586c03de3327f3de0d3737fe': ['𠜎', '𠜎']
|
|
||||||
}
|
|
||||||
},
|
|
||||||
sha224_hmac: {
|
|
||||||
'Test Vectors': {
|
|
||||||
'896fb1128abbdf196832107cd49df33f47b4b1169912ba4f53684b22': [
|
|
||||||
[0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b],
|
|
||||||
'Hi There'
|
|
||||||
],
|
|
||||||
'a30e01098bc6dbbf45690f3a7e9e6d0f8bbea2a39e6148008fd05e44': [
|
|
||||||
'Jefe',
|
|
||||||
'what do ya want for nothing?'
|
|
||||||
],
|
|
||||||
'7fb3cb3588c6c1f6ffa9694d7d6ad2649365b0c1f65d69d1ec8333ea': [
|
|
||||||
[0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa],
|
|
||||||
[0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd]
|
|
||||||
],
|
|
||||||
'6c11506874013cac6a2abc1bb382627cec6a90d86efc012de7afec5a': [
|
|
||||||
[0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19],
|
|
||||||
[0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd]
|
|
||||||
],
|
|
||||||
'95e9a0db962095adaebe9b2d6f0dbce2d499f112f2d2b7273fa6870e': [
|
|
||||||
[0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa],
|
|
||||||
'Test Using Larger Than Block-Size Key - Hash Key First'
|
|
||||||
],
|
|
||||||
'3a854166ac5d9f023f54d517d0b39dbd946770db9c2b95c9f6f565d1': [
|
|
||||||
[0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa],
|
|
||||||
'This is a test using a larger than block-size key and a larger than block-size data. The key needs to be hashed before being used by the HMAC algorithm.'
|
|
||||||
]
|
|
||||||
},
|
|
||||||
'UTF8': {
|
|
||||||
'e2280928fe813aeb7fa59aa14dd5e589041bfdf91945d19d25b9f3db': ['中文', '中文'],
|
|
||||||
'86c53dc054b16f6e006a254891bc9ff0da5df8e1a6faee3b0aaa732d': ['aécio', 'aécio'],
|
|
||||||
'e9e5991bfb84506b105f800afac1599ff807bb8e20db8ffda48997b9': ['𠜎', '𠜎']
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
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 () {}];
|
|
||||||
|
|
||||||
function runTestCases(name, algorithm) {
|
|
||||||
var methods = [
|
|
||||||
{
|
|
||||||
name: name,
|
|
||||||
call: algorithm,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: name + '.hex',
|
|
||||||
call: algorithm.hex
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: name + '.array',
|
|
||||||
call: function (key, message) {
|
|
||||||
return algorithm.array(key, message).toHexString();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: name + '.digest',
|
|
||||||
call: function (key, message) {
|
|
||||||
return algorithm.digest(key, message).toHexString();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: name + '.arrayBuffer',
|
|
||||||
call: function (key, message) {
|
|
||||||
return algorithm.arrayBuffer(key, message).toHexString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
];
|
|
||||||
|
|
||||||
var classMethods = [
|
|
||||||
{
|
|
||||||
name: 'create',
|
|
||||||
call: function (key, message) {
|
|
||||||
return algorithm.create(key).update(message).toString();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'update',
|
|
||||||
call: function (key, message) {
|
|
||||||
return algorithm.update(key, message).toString();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'hex',
|
|
||||||
call: function (key, message) {
|
|
||||||
return algorithm.update(key, message).hex();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'array',
|
|
||||||
call: function (key, message) {
|
|
||||||
return algorithm.update(key, message).array().toHexString();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'digest',
|
|
||||||
call: function (key, message) {
|
|
||||||
return algorithm.update(key, message).digest().toHexString();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'arrayBuffer',
|
|
||||||
call: function (key, message) {
|
|
||||||
return algorithm.update(key, message).arrayBuffer().toHexString();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'finalize',
|
|
||||||
call: function (key, message) {
|
|
||||||
var hash = algorithm.update(key, 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[0], message[1])).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[0], message[1])).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('sha256_hmac', sha256.hmac);
|
|
||||||
runTestCases('sha224_hmac', sha224.hmac);
|
|
||||||
})(sha256, sha224);
|
|
@ -1,117 +1,13 @@
|
|||||||
|
sha256 = require('../src/sha256.js').sha256;
|
||||||
|
sha224 = require('../src/sha256.js').sha224;
|
||||||
expect = require('expect.js');
|
expect = require('expect.js');
|
||||||
Worker = require("tiny-worker");
|
require('./test.js');
|
||||||
|
|
||||||
function unset() {
|
delete require.cache[require.resolve('../src/sha256.js')]
|
||||||
delete require.cache[require.resolve('../src/sha256.js')];
|
delete require.cache[require.resolve('./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
|
|
||||||
JS_SHA256_NO_NODE_JS = true;
|
|
||||||
window = global;
|
|
||||||
runCommonJsTest();
|
|
||||||
|
|
||||||
// browser env
|
|
||||||
JS_SHA256_NO_NODE_JS = true;
|
|
||||||
JS_SHA256_NO_COMMON_JS = true;
|
|
||||||
runWindowTest();
|
|
||||||
|
|
||||||
// browser env and no array buffer
|
|
||||||
JS_SHA256_NO_NODE_JS = true;
|
|
||||||
JS_SHA256_NO_COMMON_JS = true;
|
|
||||||
JS_SHA256_NO_ARRAY_BUFFER = true;
|
|
||||||
runWindowTest();
|
|
||||||
|
|
||||||
// browser env and no isView
|
|
||||||
JS_SHA256_NO_NODE_JS = true;
|
|
||||||
JS_SHA256_NO_COMMON_JS = true;
|
|
||||||
JS_SHA256_NO_ARRAY_BUFFER_IS_VIEW = true;
|
|
||||||
runWindowTest();
|
|
||||||
|
|
||||||
// browser AMD
|
|
||||||
JS_SHA256_NO_NODE_JS = true;
|
|
||||||
JS_SHA256_NO_COMMON_JS = true;
|
|
||||||
JS_SHA256_NO_ARRAY_BUFFER_IS_VIEW = false;
|
|
||||||
window = global;
|
|
||||||
define = function (func) {
|
|
||||||
sha256 = func();
|
|
||||||
sha224 = sha256.sha224;
|
|
||||||
require('./test.js');
|
|
||||||
require('./hmac-test.js');
|
|
||||||
};
|
|
||||||
define.amd = true;
|
|
||||||
|
|
||||||
|
JS_SHA256_TEST = true;
|
||||||
require('../src/sha256.js');
|
require('../src/sha256.js');
|
||||||
unset();
|
require('./test.js');
|
||||||
|
|
||||||
// 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');
|
|
||||||
|
@ -1,24 +0,0 @@
|
|||||||
(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);
|
|
@ -1,26 +0,0 @@
|
|||||||
<!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>
|
|
@ -1,12 +0,0 @@
|
|||||||
var imported = false;
|
|
||||||
onmessage = function(e) {
|
|
||||||
if (imported) {
|
|
||||||
postMessage(sha256(e.data));
|
|
||||||
if (typeof exports !== 'undefined') {
|
|
||||||
imported = false;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
imported = true;
|
|
||||||
importScripts(e.data);
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue