mirror of
https://github.com/emn178/js-sha256.git
synced 2026-08-13 04:51:56 +08:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c31830ad54 | ||
|
|
f490ee426a | ||
|
|
bb8ae3a623 | ||
|
|
16b101f040 | ||
|
|
189bb9b037 | ||
|
|
e35c679c2b | ||
|
|
bf155ab82f | ||
|
|
68ffecdc6e | ||
|
|
3204c3743e | ||
|
|
4e5354859f | ||
|
|
cf975dfa0c | ||
|
|
77efe9529c | ||
|
|
ee3b3869bc | ||
|
|
b3e7b83e39 | ||
|
|
bae387d0b2 | ||
|
|
730f41e84b | ||
|
|
3c278a9dde | ||
|
|
64c114b54e | ||
|
|
0a82ff3825 |
@@ -1,2 +0,0 @@
|
|||||||
/tests/
|
|
||||||
node_modules/
|
|
||||||
+3
-2
@@ -1,2 +1,3 @@
|
|||||||
node_modules/
|
/node_modules/
|
||||||
covreporter
|
/coverage/
|
||||||
|
/.nyc_output/
|
||||||
|
|||||||
+8
-1
@@ -1 +1,8 @@
|
|||||||
covreporter
|
/node_modules/
|
||||||
|
/coverage/
|
||||||
|
/.nyc_output/
|
||||||
|
/tests/
|
||||||
|
.covignore
|
||||||
|
.travis.yml
|
||||||
|
.npmignore
|
||||||
|
bower.json
|
||||||
|
|||||||
+3
-5
@@ -1,12 +1,10 @@
|
|||||||
language: node_js
|
language: node_js
|
||||||
node_js:
|
node_js:
|
||||||
- "0.12.15"
|
- "6.11.4"
|
||||||
- "4.5"
|
- "8.6.0"
|
||||||
- "6.5.0"
|
|
||||||
before_install:
|
before_install:
|
||||||
- npm install coveralls
|
- npm install coveralls
|
||||||
- npm install mocha-lcov-reporter
|
after_success: npm run coveralls
|
||||||
script: npm run-script coveralls
|
|
||||||
branches:
|
branches:
|
||||||
only:
|
only:
|
||||||
- master
|
- master
|
||||||
|
|||||||
+103
-29
@@ -1,50 +1,124 @@
|
|||||||
# v0.3.1 / 2016-09-08
|
# Change Log
|
||||||
|
|
||||||
* Added some files to npm package.
|
## v0.10.1 / 2023-08-31
|
||||||
* Updated coding style.
|
### Added
|
||||||
|
- Disable webpack polyfill.
|
||||||
|
|
||||||
# v0.3.0 / 2015-05-23
|
## 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
|
||||||
|
|
||||||
* Support ArrayBuffer input.
|
### Changed
|
||||||
|
- TypeScript interface, secretKey can be bytes like message. #23, #25
|
||||||
|
- remove `eval` and use `require` directly. #18, #26
|
||||||
|
|
||||||
# v0.2.3 / 2015-02-11
|
## v0.9.0 / 2017-12-18
|
||||||
|
### Fixed
|
||||||
|
- incorrect result when first bit is 1 of bytes.
|
||||||
|
|
||||||
* Support byte array input.
|
### Changed
|
||||||
|
- throw error by Error oject. #13
|
||||||
|
|
||||||
# v0.2.2 / 2015-02-10
|
### Added
|
||||||
|
- TypeScript interfaces. #12
|
||||||
|
|
||||||
* Improve performance.
|
## v0.8.0 / 2017-11-19
|
||||||
|
### Added
|
||||||
|
- support for web worker.
|
||||||
|
- typescript types. #10
|
||||||
|
|
||||||
# v0.2.1 / 2015-02-05
|
### Changed
|
||||||
|
- prevent webpack to require dependencies.
|
||||||
|
|
||||||
* Fixed special length bug.
|
## v0.7.1 / 2017-10-31
|
||||||
* Add test cases.
|
### Improved
|
||||||
|
- performance of hBytes increment.
|
||||||
|
|
||||||
# v0.2.0 / 2015-02-03
|
## v0.7.0 / 2017-10-31
|
||||||
|
### Fixed
|
||||||
|
- incorrect result when file size >= 512M.
|
||||||
|
|
||||||
* Remove ascii parameter.
|
## v0.6.0 / 2017-07-11
|
||||||
* Improve performance.
|
### Added
|
||||||
* Add test cases.
|
- HMAC feature.
|
||||||
|
|
||||||
# v0.1.4 / 2015-01-24
|
### Changed
|
||||||
|
- throw error if input type is incorrect.
|
||||||
|
|
||||||
* Improve performance.
|
## v0.5.0 / 2017-01-24
|
||||||
|
### Added
|
||||||
|
- Streaming support #6
|
||||||
|
|
||||||
# v0.1.3 / 2015-01-09
|
## v0.4.0 / 2017-01-23
|
||||||
|
### Added
|
||||||
|
- AMD support.
|
||||||
|
|
||||||
* Improve performance.
|
### Fixed
|
||||||
|
- ArrayBuffer dosen't work in Webpack.
|
||||||
|
|
||||||
# v0.1.2 / 2015-01-06
|
## v0.3.2 / 2016-09-12
|
||||||
|
### Added
|
||||||
|
- CommonJS detection.
|
||||||
|
|
||||||
* Add bower package.
|
## v0.3.1 / 2016-09-08
|
||||||
* Fixed JSHint warnings.
|
### Added
|
||||||
* Add travis.
|
- some files to npm package.
|
||||||
* Add coveralls.
|
|
||||||
|
|
||||||
# v0.1.1 / 2014-07-27
|
### Fixed
|
||||||
|
- coding style.
|
||||||
|
|
||||||
* Fixed accents bug
|
## v0.3.0 / 2015-05-23
|
||||||
|
### Added
|
||||||
|
- support for ArrayBuffer input.
|
||||||
|
|
||||||
# v0.1.0 / 2014-01-05
|
## v0.2.3 / 2015-02-11
|
||||||
|
### Added
|
||||||
|
- support for byte array input.
|
||||||
|
|
||||||
* Initial release
|
## 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.
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
Copyright (c) 2014-2016 Chen, Yi-Cyuan
|
Copyright (c) 2014-2023 Chen, Yi-Cyuan
|
||||||
|
|
||||||
MIT License
|
MIT License
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# js-sha256
|
# js-sha256
|
||||||
[](https://travis-ci.org/emn178/js-sha256)
|
[](https://travis-ci.org/emn178/js-sha256)
|
||||||
[](https://coveralls.io/r/emn178/js-sha256?branch=master)
|
[](https://coveralls.io/r/emn178/js-sha256?branch=master)
|
||||||
|
[](https://cdnjs.com/libraries/js-sha256/)
|
||||||
[](https://nodei.co/npm/js-sha256/)
|
[](https://nodei.co/npm/js-sha256/)
|
||||||
A simple SHA-256 / SHA-224 hash function for JavaScript supports UTF-8 encoding.
|
A simple SHA-256 / SHA-224 hash function for JavaScript supports UTF-8 encoding.
|
||||||
|
|
||||||
@@ -26,63 +27,78 @@ You could use like this:
|
|||||||
```JavaScript
|
```JavaScript
|
||||||
sha256('Message to hash');
|
sha256('Message to hash');
|
||||||
sha224('Message to hash');
|
sha224('Message to hash');
|
||||||
|
|
||||||
|
var hash = sha256.create();
|
||||||
|
hash.update('Message to hash');
|
||||||
|
hash.hex();
|
||||||
|
|
||||||
|
var hash2 = sha256.update('Message to hash');
|
||||||
|
hash2.update('Message2 to hash');
|
||||||
|
hash2.array();
|
||||||
|
|
||||||
|
// HMAC
|
||||||
|
sha256.hmac('key', 'Message to hash');
|
||||||
|
sha224.hmac('key', 'Message to hash');
|
||||||
|
|
||||||
|
var hash = sha256.hmac.create('key');
|
||||||
|
hash.update('Message to hash');
|
||||||
|
hash.hex();
|
||||||
|
|
||||||
|
var hash2 = sha256.hmac.update('key', 'Message to hash');
|
||||||
|
hash2.update('Message2 to hash');
|
||||||
|
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
|
||||||
sha256 = require('js-sha256');
|
var sha256 = require('js-sha256');
|
||||||
```
|
```
|
||||||
or
|
or
|
||||||
```JavaScript
|
```JavaScript
|
||||||
sha256 = require('js-sha256').sha256;
|
var sha256 = require('js-sha256').sha256;
|
||||||
sha224 = require('js-sha256').sha224;
|
var sha224 = require('js-sha256').sha224;
|
||||||
|
```
|
||||||
|
or
|
||||||
|
```JavaScript
|
||||||
|
const { sha256, sha224 } = require('js-sha256');
|
||||||
|
```
|
||||||
|
### TypeScript
|
||||||
|
If you use TypeScript, you can import like this:
|
||||||
|
```TypeScript
|
||||||
|
import { sha256, sha224 } from 'js-sha256';
|
||||||
|
```
|
||||||
|
### RequireJS
|
||||||
|
It supports AMD:
|
||||||
|
```JavaScript
|
||||||
|
require(['your/path/sha256.js'], function(sha256) {
|
||||||
|
// ...
|
||||||
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
## Example
|
## Example
|
||||||
Code
|
|
||||||
```JavaScript
|
```JavaScript
|
||||||
sha256('');
|
sha256(''); // e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
||||||
sha256('The quick brown fox jumps over the lazy dog');
|
sha256('The quick brown fox jumps over the lazy dog'); // d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592
|
||||||
sha256('The quick brown fox jumps over the lazy dog.');
|
sha256('The quick brown fox jumps over the lazy dog.'); // ef537f25c895bfa782526529a9b63d97aa631564d5d789c2b765448c8635fb6c
|
||||||
sha224('');
|
sha224(''); // d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f
|
||||||
sha224('The quick brown fox jumps over the lazy dog');
|
sha224('The quick brown fox jumps over the lazy dog'); // 730e109bd7a8a32b1cb9d9a09aa2325d2430587ddbc0c38bad911525
|
||||||
sha224('The quick brown fox jumps over the lazy dog.');
|
sha224('The quick brown fox jumps over the lazy dog.'); // 619cba8e8e05826e9b8c519c0a5c68f4fb653e8a3d8aa04bb2c8cd4c
|
||||||
|
|
||||||
|
// It also supports UTF-8 encoding
|
||||||
|
sha256('中文'); // 72726d8818f693066ceb69afa364218b692e62ea92b385782363780f47529c21
|
||||||
|
sha224('中文'); // dfbab71afdf54388af4d55f8bd3de8c9b15e0eb916bf9125f4a959d4
|
||||||
|
|
||||||
|
// It also supports byte `Array`, `Uint8Array`, `ArrayBuffer` input
|
||||||
|
sha256([]); // e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
||||||
|
sha256(new Uint8Array([211, 212])); // 182889f925ae4e5cc37118ded6ed87f7bdc7cab5ec5e78faef2e50048999473f
|
||||||
|
|
||||||
|
// Different output
|
||||||
|
sha256(''); // e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
||||||
|
sha256.hex(''); // e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
||||||
|
sha256.array(''); // [227, 176, 196, 66, 152, 252, 28, 20, 154, 251, 244, 200, 153, 111, 185, 36, 39, 174, 65, 228, 100, 155, 147, 76, 164, 149, 153, 27, 120, 82, 184, 85]
|
||||||
|
sha256.digest(''); // [227, 176, 196, 66, 152, 252, 28, 20, 154, 251, 244, 200, 153, 111, 185, 36, 39, 174, 65, 228, 100, 155, 147, 76, 164, 149, 153, 27, 120, 82, 184, 85]
|
||||||
|
sha256.arrayBuffer(''); // ArrayBuffer
|
||||||
```
|
```
|
||||||
Output
|
|
||||||
|
|
||||||
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
|
||||||
d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592
|
|
||||||
ef537f25c895bfa782526529a9b63d97aa631564d5d789c2b765448c8635fb6c
|
|
||||||
d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f
|
|
||||||
730e109bd7a8a32b1cb9d9a09aa2325d2430587ddbc0c38bad911525
|
|
||||||
619cba8e8e05826e9b8c519c0a5c68f4fb653e8a3d8aa04bb2c8cd4c
|
|
||||||
|
|
||||||
It also supports UTF-8 encoding:
|
|
||||||
|
|
||||||
Code
|
|
||||||
```JavaScript
|
|
||||||
sha256('中文');
|
|
||||||
sha224('中文');
|
|
||||||
```
|
|
||||||
Output
|
|
||||||
|
|
||||||
72726d8818f693066ceb69afa364218b692e62ea92b385782363780f47529c21
|
|
||||||
dfbab71afdf54388af4d55f8bd3de8c9b15e0eb916bf9125f4a959d4
|
|
||||||
|
|
||||||
It also supports byte `Array`, `Uint8Array`, `ArrayBuffer` input:
|
|
||||||
|
|
||||||
Code
|
|
||||||
```JavaScript
|
|
||||||
sha256([]);
|
|
||||||
sha256(new Uint8Array([211, 212]));
|
|
||||||
```
|
|
||||||
Output
|
|
||||||
|
|
||||||
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
|
||||||
182889f925ae4e5cc37118ded6ed87f7bdc7cab5ec5e78faef2e50048999473f
|
|
||||||
|
|
||||||
## Benchmark
|
|
||||||
[UTF8](http://jsperf.com/sha256/66)
|
|
||||||
[ASCII](http://jsperf.com/sha256/65)
|
|
||||||
|
|
||||||
## License
|
## License
|
||||||
The project is released under the [MIT license](http://www.opensource.org/licenses/MIT).
|
The project is released under the [MIT license](http://www.opensource.org/licenses/MIT).
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "js-sha256",
|
"name": "js-sha256",
|
||||||
"version": "0.3.1",
|
"version": "0.10.1",
|
||||||
"main": ["src/sha256.js"],
|
"main": ["src/sha256.js"],
|
||||||
"ignore": [
|
"ignore": [
|
||||||
"samples",
|
"samples",
|
||||||
|
|||||||
Vendored
+3
-10
File diff suppressed because one or more lines are too long
Vendored
+149
@@ -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;
|
||||||
Generated
+1888
File diff suppressed because it is too large
Load Diff
+18
-5
@@ -1,16 +1,20 @@
|
|||||||
{
|
{
|
||||||
"name": "js-sha256",
|
"name": "js-sha256",
|
||||||
"version": "0.3.1",
|
"version": "0.10.1",
|
||||||
"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": {
|
||||||
"mocha": "~2.3.4",
|
|
||||||
"expect.js": "~0.3.1",
|
"expect.js": "~0.3.1",
|
||||||
"jscoverage": "~0.5.9"
|
"mocha": "~10.2.0",
|
||||||
|
"nyc": "^15.1.0",
|
||||||
|
"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",
|
||||||
"coveralls": "mocha tests/node-test.js -R mocha-lcov-reporter -r jscoverage | coveralls"
|
"report": "nyc --reporter=html --reporter=text mocha tests/node-test.js",
|
||||||
|
"coveralls": "nyc report --reporter=text-lcov | coveralls",
|
||||||
|
"build": "uglifyjs src/sha256.js -c -m eval --comments -o build/sha256.min.js"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@@ -31,5 +35,14 @@
|
|||||||
"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"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"browser": {
|
||||||
|
"crypto": false,
|
||||||
|
"buffer": false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+370
-71
@@ -1,79 +1,213 @@
|
|||||||
/**
|
/**
|
||||||
* [js-sha256]{@link https://github.com/emn178/js-sha256}
|
* [js-sha256]{@link https://github.com/emn178/js-sha256}
|
||||||
*
|
*
|
||||||
* @version 0.3.1
|
* @version 0.10.1
|
||||||
* @author Chen, Yi-Cyuan [emn178@gmail.com]
|
* @author Chen, Yi-Cyuan [emn178@gmail.com]
|
||||||
* @copyright Chen, Yi-Cyuan 2014-2016
|
* @copyright Chen, Yi-Cyuan 2014-2023
|
||||||
* @license MIT
|
* @license MIT
|
||||||
*/
|
*/
|
||||||
(function (root) {
|
/*jslint bitwise: true */
|
||||||
|
(function () {
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var NODE_JS = typeof process == 'object' && process.versions && process.versions.node;
|
var ERROR = 'input is invalid type';
|
||||||
|
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 TYPED_ARRAY = typeof Uint8Array != 'undefined';
|
var COMMON_JS = !root.JS_SHA256_NO_COMMON_JS && typeof module === 'object' && module.exports;
|
||||||
|
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 =[0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
|
var K = [
|
||||||
|
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 = [];
|
||||||
|
|
||||||
var sha224 = function (message) {
|
if (root.JS_SHA256_NO_NODE_JS || !Array.isArray) {
|
||||||
return sha256(message, true);
|
Array.isArray = function (obj) {
|
||||||
|
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 sha256 = function (message, is224) {
|
var createMethod = function (is224) {
|
||||||
var notString = typeof message != 'string';
|
var method = createOutputMethod('hex', is224);
|
||||||
if (notString && message.constructor == root.ArrayBuffer) {
|
if (NODE_JS) {
|
||||||
|
method = nodeWrap(method, is224);
|
||||||
|
}
|
||||||
|
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 crypto = require('crypto')
|
||||||
|
var Buffer = require('buffer').Buffer;
|
||||||
|
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);
|
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 h0, h1, h2, h3, h4, h5, h6, h7, block, code, first = true, end = false,
|
var createHmacOutputMethod = function (outputType, is224) {
|
||||||
i, j, index = 0, start = 0, bytes = 0, length = message.length,
|
return function (key, message) {
|
||||||
s0, s1, maj, t1, t2, ch, ab, da, cd, bc;
|
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) {
|
||||||
h0 = 0xc1059ed8;
|
this.h0 = 0xc1059ed8;
|
||||||
h1 = 0x367cd507;
|
this.h1 = 0x367cd507;
|
||||||
h2 = 0x3070dd17;
|
this.h2 = 0x3070dd17;
|
||||||
h3 = 0xf70e5939;
|
this.h3 = 0xf70e5939;
|
||||||
h4 = 0xffc00b31;
|
this.h4 = 0xffc00b31;
|
||||||
h5 = 0x68581511;
|
this.h5 = 0x68581511;
|
||||||
h6 = 0x64f98fa7;
|
this.h6 = 0x64f98fa7;
|
||||||
h7 = 0xbefa4fa4;
|
this.h7 = 0xbefa4fa4;
|
||||||
} else { // 256
|
} else { // 256
|
||||||
h0 = 0x6a09e667;
|
this.h0 = 0x6a09e667;
|
||||||
h1 = 0xbb67ae85;
|
this.h1 = 0xbb67ae85;
|
||||||
h2 = 0x3c6ef372;
|
this.h2 = 0x3c6ef372;
|
||||||
h3 = 0xa54ff53a;
|
this.h3 = 0xa54ff53a;
|
||||||
h4 = 0x510e527f;
|
this.h4 = 0x510e527f;
|
||||||
h5 = 0x9b05688c;
|
this.h5 = 0x9b05688c;
|
||||||
h6 = 0x1f83d9ab;
|
this.h6 = 0x1f83d9ab;
|
||||||
h7 = 0x5be0cd19;
|
this.h7 = 0x5be0cd19;
|
||||||
}
|
}
|
||||||
block = 0;
|
|
||||||
do {
|
this.block = this.start = this.bytes = this.hBytes = 0;
|
||||||
blocks[0] = block;
|
this.finalized = this.hashed = false;
|
||||||
|
this.first = true;
|
||||||
|
this.is224 = is224;
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
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) {
|
||||||
for (i = start;index < length && i < 64;++index) {
|
for (i = this.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 = start;index < length && i < 64;++index) {
|
for (i = this.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];
|
||||||
@@ -93,20 +227,54 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
bytes += i - start;
|
|
||||||
start = i - 64;
|
|
||||||
if (index == length) {
|
|
||||||
blocks[i >> 2] |= EXTRA[i & 3];
|
|
||||||
++index;
|
|
||||||
}
|
|
||||||
block = blocks[16];
|
|
||||||
if (index > length && i < 56) {
|
|
||||||
blocks[15] = bytes << 3;
|
|
||||||
end = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
var a = h0, b = h1, c = h2, d = h3, e = h4, f = h5, g = h6, h = h7;
|
this.lastByteIndex = i;
|
||||||
for (j = 16;j < 64;++j) {
|
this.bytes += i - this.start;
|
||||||
|
if (i >= 64) {
|
||||||
|
this.block = blocks[16];
|
||||||
|
this.start = i - 64;
|
||||||
|
this.hash();
|
||||||
|
this.hashed = true;
|
||||||
|
} else {
|
||||||
|
this.start = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (this.bytes > 4294967295) {
|
||||||
|
this.hBytes += this.bytes / 4294967296 << 0;
|
||||||
|
this.bytes = this.bytes % 4294967296;
|
||||||
|
}
|
||||||
|
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 = this.h0, b = this.h1, c = this.h2, d = this.h3, e = this.h4, f = this.h5, g = this.h6,
|
||||||
|
h = this.h7, blocks = this.blocks, j, s0, s1, maj, t1, t2, ch, ab, da, cd, bc;
|
||||||
|
|
||||||
|
for (j = 16; j < 64; ++j) {
|
||||||
// rightrotate
|
// rightrotate
|
||||||
t1 = blocks[j - 15];
|
t1 = blocks[j - 15];
|
||||||
s0 = ((t1 >>> 7) | (t1 << 25)) ^ ((t1 >>> 18) | (t1 << 14)) ^ (t1 >>> 3);
|
s0 = ((t1 >>> 7) | (t1 << 25)) ^ ((t1 >>> 18) | (t1 << 14)) ^ (t1 >>> 3);
|
||||||
@@ -116,9 +284,9 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
bc = b & c;
|
bc = b & c;
|
||||||
for (j = 0;j < 64;j += 4) {
|
for (j = 0; j < 64; j += 4) {
|
||||||
if (first) {
|
if (this.first) {
|
||||||
if (is224) {
|
if (this.is224) {
|
||||||
ab = 300032;
|
ab = 300032;
|
||||||
t1 = blocks[0] - 1413257819;
|
t1 = blocks[0] - 1413257819;
|
||||||
h = t1 - 150054599 << 0;
|
h = t1 - 150054599 << 0;
|
||||||
@@ -129,7 +297,7 @@
|
|||||||
h = t1 - 1521486534 << 0;
|
h = t1 - 1521486534 << 0;
|
||||||
d = t1 + 143694565 << 0;
|
d = t1 + 143694565 << 0;
|
||||||
}
|
}
|
||||||
first = false;
|
this.first = false;
|
||||||
} else {
|
} else {
|
||||||
s0 = ((a >>> 2) | (a << 30)) ^ ((a >>> 13) | (a << 19)) ^ ((a >>> 22) | (a << 10));
|
s0 = ((a >>> 2) | (a << 30)) ^ ((a >>> 13) | (a << 19)) ^ ((a >>> 22) | (a << 10));
|
||||||
s1 = ((e >>> 6) | (e << 26)) ^ ((e >>> 11) | (e << 21)) ^ ((e >>> 25) | (e << 7));
|
s1 = ((e >>> 6) | (e << 26)) ^ ((e >>> 11) | (e << 21)) ^ ((e >>> 25) | (e << 7));
|
||||||
@@ -168,17 +336,24 @@
|
|||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
h0 = h0 + a << 0;
|
this.h0 = this.h0 + a << 0;
|
||||||
h1 = h1 + b << 0;
|
this.h1 = this.h1 + b << 0;
|
||||||
h2 = h2 + c << 0;
|
this.h2 = this.h2 + c << 0;
|
||||||
h3 = h3 + d << 0;
|
this.h3 = this.h3 + d << 0;
|
||||||
h4 = h4 + e << 0;
|
this.h4 = this.h4 + e << 0;
|
||||||
h5 = h5 + f << 0;
|
this.h5 = this.h5 + f << 0;
|
||||||
h6 = h6 + g << 0;
|
this.h6 = this.h6 + g << 0;
|
||||||
h7 = h7 + h << 0;
|
this.h7 = this.h7 + h << 0;
|
||||||
} while (!end);
|
};
|
||||||
|
|
||||||
|
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,
|
||||||
|
h6 = this.h6, h7 = this.h7;
|
||||||
|
|
||||||
var hex = HEX_CHARS[(h0 >> 28) & 0x0F] + HEX_CHARS[(h0 >> 24) & 0x0F] +
|
var hex = HEX_CHARS[(h0 >> 28) & 0x0F] + HEX_CHARS[(h0 >> 24) & 0x0F] +
|
||||||
HEX_CHARS[(h0 >> 20) & 0x0F] + HEX_CHARS[(h0 >> 16) & 0x0F] +
|
HEX_CHARS[(h0 >> 20) & 0x0F] + HEX_CHARS[(h0 >> 16) & 0x0F] +
|
||||||
@@ -208,7 +383,7 @@
|
|||||||
HEX_CHARS[(h6 >> 20) & 0x0F] + HEX_CHARS[(h6 >> 16) & 0x0F] +
|
HEX_CHARS[(h6 >> 20) & 0x0F] + HEX_CHARS[(h6 >> 16) & 0x0F] +
|
||||||
HEX_CHARS[(h6 >> 12) & 0x0F] + HEX_CHARS[(h6 >> 8) & 0x0F] +
|
HEX_CHARS[(h6 >> 12) & 0x0F] + HEX_CHARS[(h6 >> 8) & 0x0F] +
|
||||||
HEX_CHARS[(h6 >> 4) & 0x0F] + HEX_CHARS[h6 & 0x0F];
|
HEX_CHARS[(h6 >> 4) & 0x0F] + HEX_CHARS[h6 & 0x0F];
|
||||||
if (!is224) {
|
if (!this.is224) {
|
||||||
hex += HEX_CHARS[(h7 >> 28) & 0x0F] + HEX_CHARS[(h7 >> 24) & 0x0F] +
|
hex += HEX_CHARS[(h7 >> 28) & 0x0F] + HEX_CHARS[(h7 >> 24) & 0x0F] +
|
||||||
HEX_CHARS[(h7 >> 20) & 0x0F] + HEX_CHARS[(h7 >> 16) & 0x0F] +
|
HEX_CHARS[(h7 >> 20) & 0x0F] + HEX_CHARS[(h7 >> 16) & 0x0F] +
|
||||||
HEX_CHARS[(h7 >> 12) & 0x0F] + HEX_CHARS[(h7 >> 8) & 0x0F] +
|
HEX_CHARS[(h7 >> 12) & 0x0F] + HEX_CHARS[(h7 >> 8) & 0x0F] +
|
||||||
@@ -217,12 +392,136 @@
|
|||||||
return hex;
|
return hex;
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!root.JS_SHA256_TEST && NODE_JS) {
|
Sha256.prototype.toString = Sha256.prototype.hex;
|
||||||
sha256.sha256 = sha256;
|
|
||||||
sha256.sha224 = sha224;
|
Sha256.prototype.digest = function () {
|
||||||
module.exports = sha256;
|
this.finalize();
|
||||||
} else if (root) {
|
|
||||||
root.sha256 = sha256;
|
var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3, h4 = this.h4, h5 = this.h5,
|
||||||
root.sha224 = sha224;
|
h6 = this.h6, h7 = this.h7;
|
||||||
|
|
||||||
|
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);
|
||||||
}
|
}
|
||||||
}(this));
|
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;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
|||||||
@@ -0,0 +1,245 @@
|
|||||||
|
(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);
|
||||||
@@ -14,6 +14,7 @@
|
|||||||
mocha.setup('bdd');
|
mocha.setup('bdd');
|
||||||
</script>
|
</script>
|
||||||
<script src="test.js"></script>
|
<script src="test.js"></script>
|
||||||
|
<script src="hmac-test.js"></script>
|
||||||
<script>
|
<script>
|
||||||
mocha.checkLeaks();
|
mocha.checkLeaks();
|
||||||
mocha.run();
|
mocha.run();
|
||||||
|
|||||||
+113
-9
@@ -1,13 +1,117 @@
|
|||||||
sha256 = require('../src/sha256.js').sha256;
|
|
||||||
sha224 = require('../src/sha256.js').sha224;
|
|
||||||
expect = require('expect.js');
|
expect = require('expect.js');
|
||||||
require('./test.js');
|
Worker = require("tiny-worker");
|
||||||
|
|
||||||
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')];
|
||||||
sha256 = null;
|
delete require.cache[require.resolve('./test.js')];
|
||||||
sha224 = null;
|
delete require.cache[require.resolve('./hmac-test.js')];
|
||||||
|
sha256 = null;
|
||||||
|
sha224 = null;
|
||||||
|
BUFFER = undefined;
|
||||||
|
JS_SHA256_NO_WINDOW = undefined;
|
||||||
|
JS_SHA256_NO_NODE_JS = undefined;
|
||||||
|
JS_SHA256_NO_COMMON_JS = undefined;
|
||||||
|
JS_SHA256_NO_ARRAY_BUFFER = undefined;
|
||||||
|
JS_SHA256_NO_ARRAY_BUFFER_IS_VIEW = undefined;
|
||||||
|
window = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
function requireToGlobal() {
|
||||||
|
sha256 = require('../src/sha256.js').sha256;
|
||||||
|
sha224 = require('../src/sha256.js').sha224;
|
||||||
|
}
|
||||||
|
|
||||||
|
function runCommonJsTest() {
|
||||||
|
requireToGlobal();
|
||||||
|
require('./test.js');
|
||||||
|
require('./hmac-test.js');
|
||||||
|
unset();
|
||||||
|
}
|
||||||
|
|
||||||
|
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');
|
||||||
require('./test.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');
|
||||||
|
|||||||
+244
-99
@@ -1,113 +1,258 @@
|
|||||||
(function (sha256, sha224) {
|
(function (sha256, sha224) {
|
||||||
describe('sha256', function () {
|
Array.prototype.toHexString = ArrayBuffer.prototype.toHexString = function () {
|
||||||
context('when ascii', function () {
|
var array = new Uint8Array(this);
|
||||||
context('and less than 64 bytes', function () {
|
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: {
|
||||||
|
'ascii': {
|
||||||
|
'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855': '',
|
||||||
|
'd7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592': 'The quick brown fox jumps over the lazy dog',
|
||||||
|
'ef537f25c895bfa782526529a9b63d97aa631564d5d789c2b765448c8635fb6c': 'The quick brown fox jumps over the lazy dog.'
|
||||||
|
},
|
||||||
|
'ascii more than 64 bytes': {
|
||||||
|
'54e73d89e1924fdcd056390266a983924b6d6d461e9470b6cd50bbaf69b5c54c': 'The MD5 message-digest algorithm is a widely used cryptographic hash function producing a 128-bit (16-byte) hash value, typically expressed in text format as a 32 digit hexadecimal number. MD5 has been utilized in a wide variety of cryptographic applications, and is also commonly used to verify data integrity.'
|
||||||
|
},
|
||||||
|
'UTF8': {
|
||||||
|
'72726d8818f693066ceb69afa364218b692e62ea92b385782363780f47529c21': '中文',
|
||||||
|
'53196d1acfce0c4b264e01e8018c989d571351f59e33f055f76ff15b4f0516c6': 'aécio',
|
||||||
|
'8d10a48685dbc34484696de7ea7434d80a54c1d60100530faccf697463ef19c9': '𠜎'
|
||||||
|
},
|
||||||
|
'UTF8 more than 64 bytes': {
|
||||||
|
'd691014feebf35b3500ef6f6738d0094cac63628a7a018a980a40292a77703d1': '訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一',
|
||||||
|
'81a1472ebdeb09406a783d607ff49ee2fde3e9f44ac1cd158ad8d6ad3c4e69fa': '訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一(又譯雜湊演算法、摘要演算法等),主流程式語言普遍已有MD5的實作。'
|
||||||
|
},
|
||||||
|
'special length': {
|
||||||
|
'5e6b963e2b6444dab8544beab8532850cef2a9d143872a6a5384abe37e61b3db': '0123456780123456780123456780123456780123456780123456780',
|
||||||
|
'85d240a4a03a0710423fc4f701da51e8785c9eaa96d718ab1c7991d6afd60d62': '01234567801234567801234567801234567801234567801234567801',
|
||||||
|
'c3ee464d5620eb2dde3dfda4c7955dbd9e9e2e9b113c13983fc67b0dfd892a53': '0123456780123456780123456780123456780123456780123456780123456780',
|
||||||
|
'74b51c6911f9a8b5e7c499effe7604e43b672166818873c27752c248de434841': '01234567801234567801234567801234567801234567801234567801234567801234567',
|
||||||
|
'6fba9e623ae6abf028a1b195748814aa95eebfb22e3ec5e15d2444cd6c48186a': '012345678012345678012345678012345678012345678012345678012345678012345678'
|
||||||
|
},
|
||||||
|
'Array': {
|
||||||
|
'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855': [],
|
||||||
|
'182889f925ae4e5cc37118ded6ed87f7bdc7cab5ec5e78faef2e50048999473f': [211, 212],
|
||||||
|
'd7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592': [84, 104, 101, 32, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 32, 102, 111, 120, 32, 106, 117, 109, 112, 115, 32, 111, 118, 101, 114, 32, 116, 104, 101, 32, 108, 97, 122, 121, 32, 100, 111, 103],
|
||||||
|
'74b51c6911f9a8b5e7c499effe7604e43b672166818873c27752c248de434841': [48, 49, 50, 51, 52, 53, 54, 55, 56, 48, 49, 50, 51, 52, 53, 54, 55, 56, 48, 49, 50, 51, 52, 53, 54, 55, 56, 48, 49, 50, 51, 52, 53, 54, 55, 56, 48, 49, 50, 51, 52, 53, 54, 55, 56, 48, 49, 50, 51, 52, 53, 54, 55, 56, 48, 49, 50, 51, 52, 53, 54, 55, 56, 48, 49, 50, 51, 52, 53, 54, 55]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
sha224: {
|
||||||
|
'ascii': {
|
||||||
|
'd14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f': '',
|
||||||
|
'730e109bd7a8a32b1cb9d9a09aa2325d2430587ddbc0c38bad911525': 'The quick brown fox jumps over the lazy dog',
|
||||||
|
'619cba8e8e05826e9b8c519c0a5c68f4fb653e8a3d8aa04bb2c8cd4c': 'The quick brown fox jumps over the lazy dog.'
|
||||||
|
},
|
||||||
|
'ascii more than 64 bytes': {
|
||||||
|
'4d97e15967391d2e846ea7d21bb480efadbae5868b731e7cc6267006': 'The MD5 message-digest algorithm is a widely used cryptographic hash function producing a 128-bit (16-byte) hash value, typically expressed in text format as a 32 digit hexadecimal number. MD5 has been utilized in a wide variety of cryptographic applications, and is also commonly used to verify data integrity.'
|
||||||
|
},
|
||||||
|
'UTF8': {
|
||||||
|
'dfbab71afdf54388af4d55f8bd3de8c9b15e0eb916bf9125f4a959d4': '中文',
|
||||||
|
'd12841cafd89c534924a839e62bf35a2b5f3717b7802eb19bd8d8e15': 'aécio',
|
||||||
|
'eaa0129b5509f5701db218fb7076b282e4409da52d06363aa3bdd63d': '𠜎'
|
||||||
|
},
|
||||||
|
'UTF8 more than 64 bytes': {
|
||||||
|
'0dda421f3f81272418e1313673e9d74b7f2d04efc9c52c69458e12c3': '訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一',
|
||||||
|
'a8cb74a54e6dc6ab6110db3915ba08ffe5e1abafaea78538fa12a626': '訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一(又譯雜湊演算法、摘要演算法等),主流程式語言普遍已有MD5的實作。'
|
||||||
|
},
|
||||||
|
'special length': {
|
||||||
|
'bc4a354d66f3cff4bc6dd6a88fbb0435cede7fd5fe94da0760cb1924': '0123456780123456780123456780123456780123456780123456780',
|
||||||
|
'2f148f757d1295784a7c69bf328b8bf827a536669e132234cd6f50e7': '01234567801234567801234567801234567801234567801234567801',
|
||||||
|
'496275a96bf41aa27ce89c3ae0fc63c3a3eab063887a8ea075bd091b': '0123456780123456780123456780123456780123456780123456780123456780',
|
||||||
|
'16ee1b101fe0e0d8dd156d598931ec19d75b0f8dc0a0455733c168c8': '01234567801234567801234567801234567801234567801234567801234567801234567',
|
||||||
|
'04c7a30079c640e440d884cdf0d7ab04fd05501d4498cb21be29ca1f': '012345678012345678012345678012345678012345678012345678012345678012345678'
|
||||||
|
},
|
||||||
|
'Array': {
|
||||||
|
'd14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f': [],
|
||||||
|
'730e109bd7a8a32b1cb9d9a09aa2325d2430587ddbc0c38bad911525': [84, 104, 101, 32, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 32, 102, 111, 120, 32, 106, 117, 109, 112, 115, 32, 111, 118, 101, 114, 32, 116, 104, 101, 32, 108, 97, 122, 121, 32, 100, 111, 103],
|
||||||
|
'16ee1b101fe0e0d8dd156d598931ec19d75b0f8dc0a0455733c168c8': [48, 49, 50, 51, 52, 53, 54, 55, 56, 48, 49, 50, 51, 52, 53, 54, 55, 56, 48, 49, 50, 51, 52, 53, 54, 55, 56, 48, 49, 50, 51, 52, 53, 54, 55, 56, 48, 49, 50, 51, 52, 53, 54, 55, 56, 48, 49, 50, 51, 52, 53, 54, 55, 56, 48, 49, 50, 51, 52, 53, 54, 55, 56, 48, 49, 50, 51, 52, 53, 54, 55]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!(typeof JS_SHA256_NO_ARRAY_BUFFER === 'boolean' && JS_SHA256_NO_ARRAY_BUFFER)) {
|
||||||
|
testCases.sha256.Uint8Array = {
|
||||||
|
'182889f925ae4e5cc37118ded6ed87f7bdc7cab5ec5e78faef2e50048999473f': new Uint8Array([211, 212]),
|
||||||
|
'd7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592': new Uint8Array([84, 104, 101, 32, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 32, 102, 111, 120, 32, 106, 117, 109, 112, 115, 32, 111, 118, 101, 114, 32, 116, 104, 101, 32, 108, 97, 122, 121, 32, 100, 111, 103])
|
||||||
|
};
|
||||||
|
testCases.sha256.Int8Array = {
|
||||||
|
'd7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592': new Int8Array([84, 104, 101, 32, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 32, 102, 111, 120, 32, 106, 117, 109, 112, 115, 32, 111, 118, 101, 114, 32, 116, 104, 101, 32, 108, 97, 122, 121, 32, 100, 111, 103])
|
||||||
|
};
|
||||||
|
testCases.sha256.ArrayBuffer = {
|
||||||
|
'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855': new ArrayBuffer(0),
|
||||||
|
'6e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d': new ArrayBuffer(1)
|
||||||
|
};
|
||||||
|
testCases.sha224.Uint8Array = {
|
||||||
|
'e17541396a3ecd1cd5a2b968b84e597e8eae3b0ea3127963bf48dd3b': new Uint8Array([211, 212]),
|
||||||
|
'730e109bd7a8a32b1cb9d9a09aa2325d2430587ddbc0c38bad911525': new Uint8Array([84, 104, 101, 32, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 32, 102, 111, 120, 32, 106, 117, 109, 112, 115, 32, 111, 118, 101, 114, 32, 116, 104, 101, 32, 108, 97, 122, 121, 32, 100, 111, 103])
|
||||||
|
};
|
||||||
|
testCases.sha224.Int8Array = {
|
||||||
|
'730e109bd7a8a32b1cb9d9a09aa2325d2430587ddbc0c38bad911525': new Int8Array([84, 104, 101, 32, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 32, 102, 111, 120, 32, 106, 117, 109, 112, 115, 32, 111, 118, 101, 114, 32, 116, 104, 101, 32, 108, 97, 122, 121, 32, 100, 111, 103])
|
||||||
|
};
|
||||||
|
testCases.sha224.ArrayBuffer = {
|
||||||
|
'd14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f': new ArrayBuffer(0),
|
||||||
|
'fff9292b4201617bdc4d3053fce02734166a683d7d858a7f5f59b073': new ArrayBuffer(1),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof 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) {
|
||||||
|
var methods = [
|
||||||
|
{
|
||||||
|
name: name,
|
||||||
|
call: algorithm,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: name + '.hex',
|
||||||
|
call: algorithm.hex
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: name + '.array',
|
||||||
|
call: function (message) {
|
||||||
|
return algorithm.array(message).toHexString();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: name + '.digest',
|
||||||
|
call: function (message) {
|
||||||
|
return algorithm.digest(message).toHexString();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: name + '.arrayBuffer',
|
||||||
|
call: function (message) {
|
||||||
|
return algorithm.arrayBuffer(message).toHexString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
var classMethods = [
|
||||||
|
{
|
||||||
|
name: 'create',
|
||||||
|
call: function (message) {
|
||||||
|
return algorithm.create().update(message).toString();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'update',
|
||||||
|
call: function (message) {
|
||||||
|
return algorithm.update(message).toString();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'hex',
|
||||||
|
call: function (message) {
|
||||||
|
return algorithm.update(message).hex();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'array',
|
||||||
|
call: function (message) {
|
||||||
|
return algorithm.update(message).array().toHexString();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'digest',
|
||||||
|
call: function (message) {
|
||||||
|
return algorithm.update(message).digest().toHexString();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'arrayBuffer',
|
||||||
|
call: function (message) {
|
||||||
|
return algorithm.update(message).arrayBuffer().toHexString();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'finalize',
|
||||||
|
call: function (message) {
|
||||||
|
var hash = algorithm.update(message);
|
||||||
|
hash.hex();
|
||||||
|
hash.update(message);
|
||||||
|
return hash.hex();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
var subTestCases = testCases[name];
|
||||||
|
|
||||||
|
describe(name, function () {
|
||||||
|
methods.forEach(function (method) {
|
||||||
|
describe('#' + method.name, function () {
|
||||||
|
for (var testCaseName in subTestCases) {
|
||||||
|
(function (testCaseName) {
|
||||||
|
var testCase = subTestCases[testCaseName];
|
||||||
|
context('when ' + testCaseName, function () {
|
||||||
|
for (var hash in testCase) {
|
||||||
|
(function (message, hash) {
|
||||||
it('should be equal', function () {
|
it('should be equal', function () {
|
||||||
expect(sha256('')).to.be('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855');
|
expect(method.call(message)).to.be(hash);
|
||||||
expect(sha256('The quick brown fox jumps over the lazy dog')).to.be('d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592');
|
});
|
||||||
expect(sha256('The quick brown fox jumps over the lazy dog.')).to.be('ef537f25c895bfa782526529a9b63d97aa631564d5d789c2b765448c8635fb6c');
|
})(testCase[hash], hash);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
})(testCaseName);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
context('and more than 64 bytes', function () {
|
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 () {
|
it('should be equal', function () {
|
||||||
expect(sha256('The MD5 message-digest algorithm is a widely used cryptographic hash function producing a 128-bit (16-byte) hash value, typically expressed in text format as a 32 digit hexadecimal number. MD5 has been utilized in a wide variety of cryptographic applications, and is also commonly used to verify data integrity.')).to.be('54e73d89e1924fdcd056390266a983924b6d6d461e9470b6cd50bbaf69b5c54c');
|
expect(method.call(message)).to.be(hash);
|
||||||
|
});
|
||||||
|
})(testCase[hash], hash);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
})(testCaseName);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('#' + name, function () {
|
||||||
|
errorTestCases.forEach(function (testCase) {
|
||||||
|
context('when ' + testCase, function () {
|
||||||
|
it('should throw error', function () {
|
||||||
|
expect(function () {
|
||||||
|
algorithm(testCase);
|
||||||
|
}).to.throwError(/input is invalid type/);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
context('when UTF8', function () {
|
context('when large size', function () {
|
||||||
context('and less than 64 bytes', function () {
|
var hash = algorithm.create();
|
||||||
it('should be equal', function () {
|
hash.bytes = 4294967295;
|
||||||
expect(sha256('中文')).to.be('72726d8818f693066ceb69afa364218b692e62ea92b385782363780f47529c21');
|
hash.update('any');
|
||||||
expect(sha256('aécio')).to.be('53196d1acfce0c4b264e01e8018c989d571351f59e33f055f76ff15b4f0516c6');
|
expect(hash.hBytes).to.be(1);
|
||||||
expect(sha256('𠜎')).to.be('8d10a48685dbc34484696de7ea7434d80a54c1d60100530faccf697463ef19c9');
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
context('and more than 64 bytes', function () {
|
runTestCases('sha256', sha256);
|
||||||
it('should be equal', function () {
|
runTestCases('sha224', sha224);
|
||||||
expect(sha256('訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一')).to.be('d691014feebf35b3500ef6f6738d0094cac63628a7a018a980a40292a77703d1');
|
|
||||||
expect(sha256('訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一(又譯雜湊演算法、摘要演算法等),主流程式語言普遍已有MD5的實作。')).to.be('81a1472ebdeb09406a783d607ff49ee2fde3e9f44ac1cd158ad8d6ad3c4e69fa');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
context('when special length', function () {
|
|
||||||
it('should be equal', function () {
|
|
||||||
expect(sha256('0123456780123456780123456780123456780123456780123456780')).to.be('5e6b963e2b6444dab8544beab8532850cef2a9d143872a6a5384abe37e61b3db');
|
|
||||||
expect(sha256('01234567801234567801234567801234567801234567801234567801')).to.be('85d240a4a03a0710423fc4f701da51e8785c9eaa96d718ab1c7991d6afd60d62');
|
|
||||||
expect(sha256('0123456780123456780123456780123456780123456780123456780123456780')).to.be('c3ee464d5620eb2dde3dfda4c7955dbd9e9e2e9b113c13983fc67b0dfd892a53');
|
|
||||||
expect(sha256('01234567801234567801234567801234567801234567801234567801234567801234567')).to.be('74b51c6911f9a8b5e7c499effe7604e43b672166818873c27752c248de434841');
|
|
||||||
expect(sha256('012345678012345678012345678012345678012345678012345678012345678012345678')).to.be('6fba9e623ae6abf028a1b195748814aa95eebfb22e3ec5e15d2444cd6c48186a');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
context('when Array', function () {
|
|
||||||
it('should be equal', function () {
|
|
||||||
expect(sha256([])).to.be('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855');
|
|
||||||
expect(sha256([211, 212])).to.be('182889f925ae4e5cc37118ded6ed87f7bdc7cab5ec5e78faef2e50048999473f');
|
|
||||||
expect(sha256([84, 104, 101, 32, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 32, 102, 111, 120, 32, 106, 117, 109, 112, 115, 32, 111, 118, 101, 114, 32, 116, 104, 101, 32, 108, 97, 122, 121, 32, 100, 111, 103])).to.be('d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592');
|
|
||||||
expect(sha256([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])).to.be('74b51c6911f9a8b5e7c499effe7604e43b672166818873c27752c248de434841');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
context('when Uint8Array', function () {
|
|
||||||
it('should be equal', function () {
|
|
||||||
expect(sha256(new Uint8Array([]))).to.be('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855');
|
|
||||||
expect(sha256(new Uint8Array([211, 212]))).to.be('182889f925ae4e5cc37118ded6ed87f7bdc7cab5ec5e78faef2e50048999473f');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
context('when ArrayBuffer', function () {
|
|
||||||
it('should be equal', function () {
|
|
||||||
expect(sha256(new ArrayBuffer(0))).to.be('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('sha224', function () {
|
|
||||||
context('when ascii', function () {
|
|
||||||
context('and less than 64 bytes', function () {
|
|
||||||
it('should be equal', function () {
|
|
||||||
expect(sha224('')).to.be('d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f');
|
|
||||||
expect(sha224('The quick brown fox jumps over the lazy dog')).to.be('730e109bd7a8a32b1cb9d9a09aa2325d2430587ddbc0c38bad911525');
|
|
||||||
expect(sha224('The quick brown fox jumps over the lazy dog.')).to.be('619cba8e8e05826e9b8c519c0a5c68f4fb653e8a3d8aa04bb2c8cd4c');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
context('and more than 64 bytes', function () {
|
|
||||||
it('should be equal', function () {
|
|
||||||
expect(sha224('The MD5 message-digest algorithm is a widely used cryptographic hash function producing a 128-bit (16-byte) hash value, typically expressed in text format as a 32 digit hexadecimal number. MD5 has been utilized in a wide variety of cryptographic applications, and is also commonly used to verify data integrity.')).to.be('4d97e15967391d2e846ea7d21bb480efadbae5868b731e7cc6267006');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
context('when UTF8', function () {
|
|
||||||
context('and less than 64 bytes', function () {
|
|
||||||
it('should be equal', function () {
|
|
||||||
expect(sha224('中文')).to.be('dfbab71afdf54388af4d55f8bd3de8c9b15e0eb916bf9125f4a959d4');
|
|
||||||
expect(sha224('aécio')).to.be('d12841cafd89c534924a839e62bf35a2b5f3717b7802eb19bd8d8e15');
|
|
||||||
expect(sha224('𠜎')).to.be('eaa0129b5509f5701db218fb7076b282e4409da52d06363aa3bdd63d');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
context('and more than 64 bytes', function () {
|
|
||||||
it('should be equal', function () {
|
|
||||||
expect(sha224('訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一')).to.be('0dda421f3f81272418e1313673e9d74b7f2d04efc9c52c69458e12c3');
|
|
||||||
expect(sha224('訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一(又譯雜湊演算法、摘要演算法等),主流程式語言普遍已有MD5的實作。')).to.be('a8cb74a54e6dc6ab6110db3915ba08ffe5e1abafaea78538fa12a626');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
context('when special length', function () {
|
|
||||||
it('should be equal', function () {
|
|
||||||
expect(sha224('0123456780123456780123456780123456780123456780123456780')).to.be('bc4a354d66f3cff4bc6dd6a88fbb0435cede7fd5fe94da0760cb1924');
|
|
||||||
expect(sha224('01234567801234567801234567801234567801234567801234567801')).to.be('2f148f757d1295784a7c69bf328b8bf827a536669e132234cd6f50e7');
|
|
||||||
expect(sha224('0123456780123456780123456780123456780123456780123456780123456780')).to.be('496275a96bf41aa27ce89c3ae0fc63c3a3eab063887a8ea075bd091b');
|
|
||||||
expect(sha224('01234567801234567801234567801234567801234567801234567801234567801234567')).to.be('16ee1b101fe0e0d8dd156d598931ec19d75b0f8dc0a0455733c168c8');
|
|
||||||
expect(sha224('012345678012345678012345678012345678012345678012345678012345678012345678')).to.be('04c7a30079c640e440d884cdf0d7ab04fd05501d4498cb21be29ca1f');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
})(sha256, sha224);
|
})(sha256, sha224);
|
||||||
|
|||||||
@@ -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);
|
||||||
@@ -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>
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user