mirror of
https://github.com/emn178/js-sha256.git
synced 2026-08-12 20:32:16 +08:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
77efe9529c | ||
|
|
ee3b3869bc | ||
|
|
b3e7b83e39 | ||
|
|
bae387d0b2 | ||
|
|
730f41e84b | ||
|
|
3c278a9dde | ||
|
|
64c114b54e | ||
|
|
0a82ff3825 | ||
|
|
61d4076633 | ||
|
|
1ff17fbdd9 | ||
|
|
f73267ad15 | ||
|
|
18457729c8 | ||
|
|
90136f7a05 | ||
|
|
009d7b6070 | ||
|
|
8754ac17ef | ||
|
|
c016df9256 |
@@ -1 +1,2 @@
|
|||||||
|
/node_modules/
|
||||||
/tests/
|
/tests/
|
||||||
|
|||||||
+2
-2
@@ -1,2 +1,2 @@
|
|||||||
node_modules/
|
/node_modules/
|
||||||
covreporter
|
/covreporter/
|
||||||
|
|||||||
+6
-10
@@ -1,15 +1,11 @@
|
|||||||
language: node_js
|
language: node_js
|
||||||
node_js:
|
node_js:
|
||||||
- "0.11"
|
- "6.11.4"
|
||||||
- "0.10"
|
- "8.6.0"
|
||||||
- "0.8"
|
before_install:
|
||||||
install:
|
- npm install coveralls
|
||||||
- npm install mocha -g
|
- npm install mocha-lcov-reporter
|
||||||
- npm install coveralls -g
|
script: npm run-script coveralls
|
||||||
- npm install mocha-lcov-reporter -g
|
|
||||||
- npm install
|
|
||||||
script:
|
|
||||||
- npm run-script coveralls
|
|
||||||
branches:
|
branches:
|
||||||
only:
|
only:
|
||||||
- master
|
- master
|
||||||
|
|||||||
+79
-13
@@ -1,22 +1,88 @@
|
|||||||
# v0.1.4 / 2015-01-24
|
# Change Log
|
||||||
|
|
||||||
* Improve performance.
|
## v0.7.0 / 2017-10-31
|
||||||
|
### Fixed
|
||||||
|
- incorrect result when file size >= 512M.
|
||||||
|
|
||||||
# v0.1.3 / 2015-01-09
|
## v0.6.0 / 2017-07-11
|
||||||
|
### Added
|
||||||
|
- HMAC feature.
|
||||||
|
|
||||||
* Improve performance.
|
### Changed
|
||||||
|
- throw error if input type is incorrect.
|
||||||
|
|
||||||
# v0.1.2 / 2015-01-06
|
## v0.5.0 / 2017-01-24
|
||||||
|
### Added
|
||||||
|
- Streaming support #6
|
||||||
|
|
||||||
* Add bower package.
|
## v0.4.0 / 2017-01-23
|
||||||
* Fixed JSHint warnings.
|
### Added
|
||||||
* Add travis.
|
- AMD support.
|
||||||
* Add coveralls.
|
|
||||||
|
|
||||||
# v0.1.1 / 2014-07-27
|
### Fixed
|
||||||
|
- ArrayBuffer dosen't work in Webpack.
|
||||||
|
|
||||||
* Fixed accents bug
|
## v0.3.2 / 2016-09-12
|
||||||
|
### Added
|
||||||
|
- CommonJS detection.
|
||||||
|
|
||||||
# v0.1.0 / 2014-01-05
|
## v0.3.1 / 2016-09-08
|
||||||
|
### Added
|
||||||
|
- some files to npm package.
|
||||||
|
|
||||||
* Initial release
|
### Fixed
|
||||||
|
- coding style.
|
||||||
|
|
||||||
|
## v0.3.0 / 2015-05-23
|
||||||
|
### Added
|
||||||
|
- support for ArrayBuffer input.
|
||||||
|
|
||||||
|
## v0.2.3 / 2015-02-11
|
||||||
|
### 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.
|
||||||
|
|||||||
+3
-1
@@ -1,4 +1,6 @@
|
|||||||
Copyright 2014-2015 emn178@gmail.com
|
Copyright (c) 2014-2017 Chen, Yi-Cyuan
|
||||||
|
|
||||||
|
MIT License
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
a copy of this software and associated documentation files (the
|
a copy of this software and associated documentation files (the
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# js-sha256
|
# js-sha256
|
||||||
[](https://travis-ci.org/emn178/js-sha256?branch=master)
|
[](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,112 +27,70 @@ 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();
|
||||||
```
|
```
|
||||||
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;
|
||||||
|
```
|
||||||
|
It supports AMD:
|
||||||
|
```JavaScript
|
||||||
|
require(['your/path/sha256.js'], function(sha256) {
|
||||||
|
// ...
|
||||||
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
### Methods
|
|
||||||
|
|
||||||
#### sha256(str, asciiOnly)
|
|
||||||
|
|
||||||
Hash string to sha256, set asciiOnly to true for better performace if you ensure input is ascii.
|
|
||||||
|
|
||||||
##### *str: `String`*
|
|
||||||
|
|
||||||
String to hash.
|
|
||||||
|
|
||||||
##### *asciiOnly: `Boolean` (default: `false`)*
|
|
||||||
|
|
||||||
Specify the string encoding is ASCII.
|
|
||||||
|
|
||||||
#### sha224(str, asciiOnly)
|
|
||||||
|
|
||||||
Hash string to sha224, set asciiOnly to true for better performace if you ensure input is ascii.
|
|
||||||
|
|
||||||
##### *str: `String`*
|
|
||||||
|
|
||||||
String to hash.
|
|
||||||
|
|
||||||
##### *asciiOnly: `Boolean` (default: `false`)*
|
|
||||||
|
|
||||||
Specify the string encoding is ASCII.
|
|
||||||
|
|
||||||
## Example
|
## Example
|
||||||
Code
|
|
||||||
```JavaScript
|
```JavaScript
|
||||||
sha256('');
|
sha256(''); // e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
||||||
sha256('The quick brown fox jumps over the lazy dog', true);
|
sha256('The quick brown fox jumps over the lazy dog'); // d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592
|
||||||
sha256('The quick brown fox jumps over the lazy dog.', true);
|
sha256('The quick brown fox jumps over the lazy dog.'); // ef537f25c895bfa782526529a9b63d97aa631564d5d789c2b765448c8635fb6c
|
||||||
sha224('');
|
sha224(''); // d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f
|
||||||
sha224('The quick brown fox jumps over the lazy dog', true);
|
sha224('The quick brown fox jumps over the lazy dog'); // 730e109bd7a8a32b1cb9d9a09aa2325d2430587ddbc0c38bad911525
|
||||||
sha224('The quick brown fox jumps over the lazy dog.', true);
|
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
|
|
||||||
|
|
||||||
## Benchmark
|
|
||||||
[UTF8](http://jsperf.com/sha256/64)
|
|
||||||
[ASCII](http://jsperf.com/sha256-ascii/)
|
|
||||||
|
|
||||||
## Extensions
|
|
||||||
### jQuery
|
|
||||||
If you prefer jQuery style, you can add following code to add a jQuery extension.
|
|
||||||
|
|
||||||
Code
|
|
||||||
```JavaScript
|
|
||||||
jQuery.sha256 = sha256
|
|
||||||
jQuery.sha224 = sha224
|
|
||||||
```
|
|
||||||
And then you could use like this:
|
|
||||||
```JavaScript
|
|
||||||
$.sha256('message');
|
|
||||||
$.sha224('message');
|
|
||||||
```
|
|
||||||
### Prototype
|
|
||||||
If you prefer prototype style, you can add following code to add a prototype extension.
|
|
||||||
|
|
||||||
Code
|
|
||||||
```JavaScript
|
|
||||||
String.prototype.sha256 = function() {
|
|
||||||
return sha256(this);
|
|
||||||
};
|
|
||||||
String.prototype.sha224 = function() {
|
|
||||||
return sha224(this);
|
|
||||||
};
|
|
||||||
```
|
|
||||||
And then you could use like this:
|
|
||||||
```JavaScript
|
|
||||||
'message'.sha256();
|
|
||||||
'message'.sha224();
|
|
||||||
```
|
|
||||||
## 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).
|
||||||
|
|
||||||
## Contact
|
## Contact
|
||||||
The project's website is located at https://github.com/emn178/js-sha256
|
The project's website is located at https://github.com/emn178/js-sha256
|
||||||
Author: emn178@gmail.com
|
Author: Chen, Yi-Cyuan (emn178@gmail.com)
|
||||||
|
|||||||
+2
-2
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "js-sha256",
|
"name": "js-sha256",
|
||||||
"version": "0.1.4",
|
"version": "0.7.0",
|
||||||
"main": ["build/sha256.min.js"],
|
"main": ["src/sha256.js"],
|
||||||
"ignore": [
|
"ignore": [
|
||||||
"samples",
|
"samples",
|
||||||
"tests"
|
"tests"
|
||||||
|
|||||||
Vendored
+9
-7
File diff suppressed because one or more lines are too long
Generated
+280
@@ -0,0 +1,280 @@
|
|||||||
|
{
|
||||||
|
"name": "js-sha256",
|
||||||
|
"version": "0.7.0",
|
||||||
|
"lockfileVersion": 1,
|
||||||
|
"requires": true,
|
||||||
|
"dependencies": {
|
||||||
|
"amdefine": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
|
||||||
|
"integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"async": {
|
||||||
|
"version": "0.2.10",
|
||||||
|
"resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz",
|
||||||
|
"integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"coffee-script": {
|
||||||
|
"version": "1.12.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz",
|
||||||
|
"integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"commander": {
|
||||||
|
"version": "2.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz",
|
||||||
|
"integrity": "sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"debug": {
|
||||||
|
"version": "1.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/debug/-/debug-1.0.3.tgz",
|
||||||
|
"integrity": "sha1-/IxrLWACgEtAgcAgjg9kYLofo+Q=",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"ms": "0.6.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"diff": {
|
||||||
|
"version": "1.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz",
|
||||||
|
"integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"ejs": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/ejs/-/ejs-1.0.0.tgz",
|
||||||
|
"integrity": "sha1-ycYKSKRu5FL7MqccMXuV5aofyz0=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"escape-string-regexp": {
|
||||||
|
"version": "1.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz",
|
||||||
|
"integrity": "sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"expect.js": {
|
||||||
|
"version": "0.3.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/expect.js/-/expect.js-0.3.1.tgz",
|
||||||
|
"integrity": "sha1-sKWaDS7/VDdUTr8M6qYBWEHQm1s=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"glob": {
|
||||||
|
"version": "3.2.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/glob/-/glob-3.2.3.tgz",
|
||||||
|
"integrity": "sha1-4xPusknHr/qlxHUoaw4RW1mDlGc=",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"graceful-fs": "2.0.3",
|
||||||
|
"inherits": "2.0.3",
|
||||||
|
"minimatch": "0.2.14"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"graceful-fs": {
|
||||||
|
"version": "2.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz",
|
||||||
|
"integrity": "sha1-fNLNsiiko/Nule+mzBQt59GhNtA=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"growl": {
|
||||||
|
"version": "1.8.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/growl/-/growl-1.8.1.tgz",
|
||||||
|
"integrity": "sha1-Sy3sjZB+k9szZiTc7AGDUC+MlCg=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"inherits": {
|
||||||
|
"version": "2.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
|
||||||
|
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"jade": {
|
||||||
|
"version": "0.26.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz",
|
||||||
|
"integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"commander": "0.6.1",
|
||||||
|
"mkdirp": "0.3.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"commander": {
|
||||||
|
"version": "0.6.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz",
|
||||||
|
"integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"mkdirp": {
|
||||||
|
"version": "0.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz",
|
||||||
|
"integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=",
|
||||||
|
"dev": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"jscoverage": {
|
||||||
|
"version": "0.5.9",
|
||||||
|
"resolved": "https://registry.npmjs.org/jscoverage/-/jscoverage-0.5.9.tgz",
|
||||||
|
"integrity": "sha1-M3tR3ZBU6OyTwLCxU3VTtSvwst8=",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"coffee-script": "1.12.7",
|
||||||
|
"debug": "1.0.3",
|
||||||
|
"ejs": "1.0.0",
|
||||||
|
"optimist": "0.3.1",
|
||||||
|
"uglify-js": "2.4.15",
|
||||||
|
"xfs": "0.1.8"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"lru-cache": {
|
||||||
|
"version": "2.7.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz",
|
||||||
|
"integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"minimatch": {
|
||||||
|
"version": "0.2.14",
|
||||||
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz",
|
||||||
|
"integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"lru-cache": "2.7.3",
|
||||||
|
"sigmund": "1.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"minimist": {
|
||||||
|
"version": "0.0.8",
|
||||||
|
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
|
||||||
|
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"mkdirp": {
|
||||||
|
"version": "0.5.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz",
|
||||||
|
"integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"minimist": "0.0.8"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mocha": {
|
||||||
|
"version": "2.3.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/mocha/-/mocha-2.3.4.tgz",
|
||||||
|
"integrity": "sha1-himm+wRPLSJapLgaKuLQAWmesmY=",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"commander": "2.3.0",
|
||||||
|
"debug": "2.2.0",
|
||||||
|
"diff": "1.4.0",
|
||||||
|
"escape-string-regexp": "1.0.2",
|
||||||
|
"glob": "3.2.3",
|
||||||
|
"growl": "1.8.1",
|
||||||
|
"jade": "0.26.3",
|
||||||
|
"mkdirp": "0.5.0",
|
||||||
|
"supports-color": "1.2.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"debug": {
|
||||||
|
"version": "2.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
|
||||||
|
"integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"ms": "0.7.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ms": {
|
||||||
|
"version": "0.7.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz",
|
||||||
|
"integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=",
|
||||||
|
"dev": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ms": {
|
||||||
|
"version": "0.6.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz",
|
||||||
|
"integrity": "sha1-2JwhJMb9wTU9Zai3e/GqxLGTcIw=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"optimist": {
|
||||||
|
"version": "0.3.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.1.tgz",
|
||||||
|
"integrity": "sha1-ZoDTBWAZOvWlXrZDlIg+17y5jy4=",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"wordwrap": "0.0.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"sigmund": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz",
|
||||||
|
"integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"source-map": {
|
||||||
|
"version": "0.1.34",
|
||||||
|
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.34.tgz",
|
||||||
|
"integrity": "sha1-p8/omux7FoLDsZjQrPtH19CQVms=",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"amdefine": "1.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"supports-color": {
|
||||||
|
"version": "1.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz",
|
||||||
|
"integrity": "sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"uglify-js": {
|
||||||
|
"version": "2.4.15",
|
||||||
|
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.4.15.tgz",
|
||||||
|
"integrity": "sha1-ErxthDRfvDBuE/cHXWQ3qL9k1+M=",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"async": "0.2.10",
|
||||||
|
"optimist": "0.3.7",
|
||||||
|
"source-map": "0.1.34",
|
||||||
|
"uglify-to-browserify": "1.0.2"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"optimist": {
|
||||||
|
"version": "0.3.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz",
|
||||||
|
"integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"wordwrap": "0.0.3"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"uglify-to-browserify": {
|
||||||
|
"version": "1.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
|
||||||
|
"integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"uglifyjs": {
|
||||||
|
"version": "2.4.11",
|
||||||
|
"resolved": "https://registry.npmjs.org/uglifyjs/-/uglifyjs-2.4.11.tgz",
|
||||||
|
"integrity": "sha1-NEDWTgRXWViVJEGOtkHGi7kNET4=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"wordwrap": {
|
||||||
|
"version": "0.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
|
||||||
|
"integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"xfs": {
|
||||||
|
"version": "0.1.8",
|
||||||
|
"resolved": "https://registry.npmjs.org/xfs/-/xfs-0.1.8.tgz",
|
||||||
|
"integrity": "sha1-iHY8QtEdHvlWy9ZNnU2GunM1n9A=",
|
||||||
|
"dev": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+8
-4
@@ -1,15 +1,19 @@
|
|||||||
{
|
{
|
||||||
"name": "js-sha256",
|
"name": "js-sha256",
|
||||||
"version": "0.1.4",
|
"version": "0.7.0",
|
||||||
"description": "A simple SHA-256 / SHA-224 hash function for JavaScript supports UTF-8 encoding.",
|
"description": "A simple SHA-256 / SHA-224 hash function for JavaScript supports UTF-8 encoding.",
|
||||||
"main": "src/sha256.js",
|
"main": "src/sha256.js",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"expect.js": "~0.3.1",
|
"expect.js": "~0.3.1",
|
||||||
"jscoverage": "~0.5.9"
|
"jscoverage": "~0.5.9",
|
||||||
|
"mocha": "~2.3.4",
|
||||||
|
"uglifyjs": "~2.4.10"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "mocha tests/node-test.js -r jscoverage",
|
"test": "mocha tests/node-test.js -r jscoverage",
|
||||||
"coveralls": "mocha tests/node-test.js -R mocha-lcov-reporter -r jscoverage | coveralls"
|
"report": "mocha tests/node-test.js -r jscoverage --covout=html",
|
||||||
|
"coveralls": "mocha tests/node-test.js -R mocha-lcov-reporter -r jscoverage | coveralls",
|
||||||
|
"build": "uglifyjs src/sha256.js --compress --mangle --comments --output build/sha256.min.js"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@@ -26,7 +30,7 @@
|
|||||||
"HMAC"
|
"HMAC"
|
||||||
],
|
],
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"author": "emn178 <emn178@gmail.com>",
|
"author": "Chen, Yi-Cyuan <emn178@gmail.com>",
|
||||||
"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"
|
||||||
|
|||||||
+409
-168
@@ -1,160 +1,336 @@
|
|||||||
/*
|
/**
|
||||||
* js-sha256 v0.1.4
|
* [js-sha256]{@link https://github.com/emn178/js-sha256}
|
||||||
* https://github.com/emn178/js-sha256
|
|
||||||
*
|
*
|
||||||
* Copyright 2014-2015, emn178@gmail.com
|
* @version 0.7.0
|
||||||
*
|
* @author Chen, Yi-Cyuan [emn178@gmail.com]
|
||||||
* Licensed under the MIT license:
|
* @copyright Chen, Yi-Cyuan 2014-2017
|
||||||
* http://www.opensource.org/licenses/MIT
|
* @license MIT
|
||||||
*/
|
*/
|
||||||
;(function(root, undefined) {
|
/*jslint bitwise: true */
|
||||||
|
(function () {
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var NODE_JS = typeof(module) != 'undefined';
|
var ERROR = 'input is invalid type';
|
||||||
if(NODE_JS) {
|
var root = typeof window === 'object' ? window : {};
|
||||||
|
var NODE_JS = !root.JS_SHA256_NO_NODE_JS && typeof process === 'object' && process.versions && process.versions.node;
|
||||||
|
if (NODE_JS) {
|
||||||
root = global;
|
root = global;
|
||||||
if(root.JS_SHA256_TEST) {
|
|
||||||
root.navigator = { userAgent: 'Firefox'};
|
|
||||||
}
|
}
|
||||||
}
|
var COMMON_JS = !root.JS_SHA256_NO_COMMON_JS && typeof module === 'object' && module.exports;
|
||||||
var FIREFOX = (root.JS_SHA256_TEST || !NODE_JS) && navigator.userAgent.indexOf('Firefox') != -1;
|
var AMD = typeof define === 'function' && define.amd;
|
||||||
|
var ARRAY_BUFFER = typeof ArrayBuffer !== 'undefined';
|
||||||
var HEX_CHARS = '0123456789abcdef'.split('');
|
var HEX_CHARS = '0123456789abcdef'.split('');
|
||||||
|
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 sha256 = function(message, asciiOnly) {
|
var blocks = [];
|
||||||
return sha2(message, true, asciiOnly);
|
|
||||||
|
if (root.JS_SHA256_NO_NODE_JS || !Array.isArray) {
|
||||||
|
Array.isArray = function (obj) {
|
||||||
|
return Object.prototype.toString.call(obj) === '[object Array]';
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
var createOutputMethod = function (outputType, is224) {
|
||||||
|
return function (message) {
|
||||||
|
return new Sha256(is224, true).update(message)[outputType]();
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
var sha224 = function(message, asciiOnly) {
|
var createMethod = function (is224) {
|
||||||
return sha2(message, false, asciiOnly);
|
var method = createOutputMethod('hex', is224);
|
||||||
|
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 sha2 = function(message, is256, asciiOnly) {
|
var nodeWrap = function (method, is224) {
|
||||||
var chunks, h0, h1, h2, h3, h4, h5, h6, h7;
|
var crypto = require('crypto');
|
||||||
if(!asciiOnly && /[^\x00-\x7F]/.test(message)) {
|
var Buffer = require('buffer').Buffer;
|
||||||
chunks = getChunksFromUtf8(message);
|
var algorithm = is224 ? 'sha224' : 'sha256';
|
||||||
|
var nodeMethod = function (message) {
|
||||||
|
if (typeof message === 'string') {
|
||||||
|
return crypto.createHash(algorithm).update(message, 'utf8').digest('hex');
|
||||||
} else {
|
} else {
|
||||||
chunks = getChunksFromAscii(message);
|
if (message === null || message === undefined) {
|
||||||
|
throw ERROR;
|
||||||
|
} else if (message.constructor === ArrayBuffer) {
|
||||||
|
message = new Uint8Array(message);
|
||||||
}
|
}
|
||||||
if(is256) {
|
}
|
||||||
h0 = 0x6a09e667;
|
if (Array.isArray(message) || ArrayBuffer.isView(message) ||
|
||||||
h1 = 0xbb67ae85;
|
message.constructor === Buffer) {
|
||||||
h2 = 0x3c6ef372;
|
return crypto.createHash(algorithm).update(new Buffer(message)).digest('hex');
|
||||||
h3 = 0xa54ff53a;
|
} else {
|
||||||
h4 = 0x510e527f;
|
return method(message);
|
||||||
h5 = 0x9b05688c;
|
}
|
||||||
h6 = 0x1f83d9ab;
|
};
|
||||||
h7 = 0x5be0cd19;
|
return nodeMethod;
|
||||||
} else { // 224
|
};
|
||||||
h0 = 0xc1059ed8;
|
|
||||||
h1 = 0x367cd507;
|
var createHmacOutputMethod = function (outputType, is224) {
|
||||||
h2 = 0x3070dd17;
|
return function (key, message) {
|
||||||
h3 = 0xf70e5939;
|
return new HmacSha256(key, is224, true).update(message)[outputType]();
|
||||||
h4 = 0xffc00b31;
|
};
|
||||||
h5 = 0x68581511;
|
};
|
||||||
h6 = 0x64f98fa7;
|
|
||||||
h7 = 0xbefa4fa4;
|
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];
|
||||||
}
|
}
|
||||||
|
|
||||||
for(var i = 0, length = chunks.length;i < length;++i) {
|
if (is224) {
|
||||||
var w = chunks[i], s0, s1, j, tmp1, tmp2, tmp3, maj, t1, t2, ch, ab, da, cd, bc,
|
this.h0 = 0xc1059ed8;
|
||||||
a = h0, b = h1, c = h2, d = h3, e = h4, f = h5, g = h6, h = h7;
|
this.h1 = 0x367cd507;
|
||||||
|
this.h2 = 0x3070dd17;
|
||||||
|
this.h3 = 0xf70e5939;
|
||||||
|
this.h4 = 0xffc00b31;
|
||||||
|
this.h5 = 0x68581511;
|
||||||
|
this.h6 = 0x64f98fa7;
|
||||||
|
this.h7 = 0xbefa4fa4;
|
||||||
|
} else { // 256
|
||||||
|
this.h0 = 0x6a09e667;
|
||||||
|
this.h1 = 0xbb67ae85;
|
||||||
|
this.h2 = 0x3c6ef372;
|
||||||
|
this.h3 = 0xa54ff53a;
|
||||||
|
this.h4 = 0x510e527f;
|
||||||
|
this.h5 = 0x9b05688c;
|
||||||
|
this.h6 = 0x1f83d9ab;
|
||||||
|
this.h7 = 0x5be0cd19;
|
||||||
|
}
|
||||||
|
|
||||||
for(j = 16;j < 64;++j) {
|
this.block = this.start = this.bytes = this.hBytes = 0;
|
||||||
|
this.finalized = this.hashed = false;
|
||||||
|
this.first = true;
|
||||||
|
this.is224 = is224;
|
||||||
|
}
|
||||||
|
|
||||||
|
Sha256.prototype.update = function (message) {
|
||||||
|
if (this.finalized) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var notString = typeof message !== 'string';
|
||||||
|
if (notString) {
|
||||||
|
if (message === null || message === undefined) {
|
||||||
|
throw ERROR;
|
||||||
|
} else if (message.constructor === root.ArrayBuffer) {
|
||||||
|
message = new Uint8Array(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var length = message.length;
|
||||||
|
if (notString) {
|
||||||
|
if (typeof length !== 'number' ||
|
||||||
|
!Array.isArray(message) &&
|
||||||
|
!(ARRAY_BUFFER && ArrayBuffer.isView(message))) {
|
||||||
|
throw ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var code, index = 0, i, blocks = this.blocks;
|
||||||
|
|
||||||
|
while (index < length) {
|
||||||
|
if (this.hashed) {
|
||||||
|
this.hashed = false;
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (notString) {
|
||||||
|
for (i = this.start; index < length && i < 64; ++index) {
|
||||||
|
blocks[i >> 2] |= message[index] << SHIFT[i++ & 3];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (i = this.start; index < length && i < 64; ++index) {
|
||||||
|
code = message.charCodeAt(index);
|
||||||
|
if (code < 0x80) {
|
||||||
|
blocks[i >> 2] |= code << SHIFT[i++ & 3];
|
||||||
|
} else if (code < 0x800) {
|
||||||
|
blocks[i >> 2] |= (0xc0 | (code >> 6)) << SHIFT[i++ & 3];
|
||||||
|
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
|
||||||
|
} else if (code < 0xd800 || code >= 0xe000) {
|
||||||
|
blocks[i >> 2] |= (0xe0 | (code >> 12)) << SHIFT[i++ & 3];
|
||||||
|
blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
|
||||||
|
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
|
||||||
|
} else {
|
||||||
|
code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
|
||||||
|
blocks[i >> 2] |= (0xf0 | (code >> 18)) << 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 & 0x3f)) << SHIFT[i++ & 3];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.lastByteIndex = i;
|
||||||
|
this.bytes += i - this.start;
|
||||||
|
while (this.bytes > 4294967295) {
|
||||||
|
++this.hBytes;
|
||||||
|
this.bytes -= 4294967296;
|
||||||
|
}
|
||||||
|
if (i >= 64) {
|
||||||
|
this.block = blocks[16];
|
||||||
|
this.start = i - 64;
|
||||||
|
this.hash();
|
||||||
|
this.hashed = true;
|
||||||
|
} else {
|
||||||
|
this.start = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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
|
||||||
tmp1 = tmp2 = w[j - 15];
|
t1 = blocks[j - 15];
|
||||||
tmp1 = (tmp1 >>> 7) | (tmp1 << 25);
|
s0 = ((t1 >>> 7) | (t1 << 25)) ^ ((t1 >>> 18) | (t1 << 14)) ^ (t1 >>> 3);
|
||||||
tmp2 = (tmp2 >>> 18) | (tmp2 << 14);
|
t1 = blocks[j - 2];
|
||||||
s0 = tmp1 ^ tmp2 ^ (w[j - 15] >>> 3);
|
s1 = ((t1 >>> 17) | (t1 << 15)) ^ ((t1 >>> 19) | (t1 << 13)) ^ (t1 >>> 10);
|
||||||
tmp1 = tmp2 = w[j - 2];
|
blocks[j] = blocks[j - 16] + s0 + blocks[j - 7] + s1 << 0;
|
||||||
tmp1 = (tmp1 >>> 17) | (tmp1 << 15);
|
|
||||||
tmp2 = (tmp2 >>> 19) | (tmp2 << 13);
|
|
||||||
s1 = tmp1 ^ tmp2 ^ (w[j - 2] >>> 10);
|
|
||||||
w[j] = w[j - 16] + s0 + w[j - 7] + s1 << 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bc = b & c;
|
bc = b & c;
|
||||||
for(j = 0;j < 64;j += 4) {
|
for (j = 0; j < 64; j += 4) {
|
||||||
tmp1 = (a >>> 2) | (a << 30);
|
if (this.first) {
|
||||||
tmp2 = (a >>> 13) | (a << 19);
|
if (this.is224) {
|
||||||
tmp3 = (a >>> 22) | (a << 10);
|
ab = 300032;
|
||||||
s0 = tmp1 ^ tmp2 ^ tmp3;
|
t1 = blocks[0] - 1413257819;
|
||||||
tmp1 = (e >>> 6) | (e << 26);
|
h = t1 - 150054599 << 0;
|
||||||
tmp2 = (e >>> 11) | (e << 21);
|
d = t1 + 24177077 << 0;
|
||||||
tmp3 = (e >>> 25) | (e << 7);
|
} else {
|
||||||
s1 = tmp1 ^ tmp2 ^ tmp3;
|
ab = 704751109;
|
||||||
|
t1 = blocks[0] - 210244248;
|
||||||
|
h = t1 - 1521486534 << 0;
|
||||||
|
d = t1 + 143694565 << 0;
|
||||||
|
}
|
||||||
|
this.first = false;
|
||||||
|
} else {
|
||||||
|
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));
|
||||||
ab = a & b;
|
ab = a & b;
|
||||||
maj = ab ^ (a & c) ^ bc;
|
maj = ab ^ (a & c) ^ bc;
|
||||||
ch = (e & f) ^ (~e & g);
|
ch = (e & f) ^ (~e & g);
|
||||||
t1 = h + s1 + ch + K[j] + w[j] << 0;
|
t1 = h + s1 + ch + K[j] + blocks[j];
|
||||||
t2 = s0 + maj << 0;
|
t2 = s0 + maj;
|
||||||
h = d + t1 << 0;
|
h = d + t1 << 0;
|
||||||
d = t1 + t2 << 0;
|
d = t1 + t2 << 0;
|
||||||
tmp1 = (d >>> 2) | (d << 30);
|
}
|
||||||
tmp2 = (d >>> 13) | (d << 19);
|
s0 = ((d >>> 2) | (d << 30)) ^ ((d >>> 13) | (d << 19)) ^ ((d >>> 22) | (d << 10));
|
||||||
tmp3 = (d >>> 22) | (d << 10);
|
s1 = ((h >>> 6) | (h << 26)) ^ ((h >>> 11) | (h << 21)) ^ ((h >>> 25) | (h << 7));
|
||||||
s0 = tmp1 ^ tmp2 ^ tmp3;
|
|
||||||
tmp1 = (h >>> 6) | (h << 26);
|
|
||||||
tmp2 = (h >>> 11) | (h << 21);
|
|
||||||
tmp3 = (h >>> 25) | (h << 7);
|
|
||||||
s1 = tmp1 ^ tmp2 ^ tmp3;
|
|
||||||
da = d & a;
|
da = d & a;
|
||||||
maj = da ^ (d & b) ^ ab;
|
maj = da ^ (d & b) ^ ab;
|
||||||
ch = (h & e) ^ (~h & f);
|
ch = (h & e) ^ (~h & f);
|
||||||
t1 = g + s1 + ch + K[j + 1] + w[j + 1] << 0;
|
t1 = g + s1 + ch + K[j + 1] + blocks[j + 1];
|
||||||
t2 = s0 + maj << 0;
|
t2 = s0 + maj;
|
||||||
g = c + t1 << 0;
|
g = c + t1 << 0;
|
||||||
c = t1 + t2 << 0;
|
c = t1 + t2 << 0;
|
||||||
tmp1 = (c >>> 2) | (c << 30);
|
s0 = ((c >>> 2) | (c << 30)) ^ ((c >>> 13) | (c << 19)) ^ ((c >>> 22) | (c << 10));
|
||||||
tmp2 = (c >>> 13) | (c << 19);
|
s1 = ((g >>> 6) | (g << 26)) ^ ((g >>> 11) | (g << 21)) ^ ((g >>> 25) | (g << 7));
|
||||||
tmp3 = (c >>> 22) | (c << 10);
|
|
||||||
s0 = tmp1 ^ tmp2 ^ tmp3;
|
|
||||||
tmp1 = (g >>> 6) | (g << 26);
|
|
||||||
tmp2 = (g >>> 11) | (g << 21);
|
|
||||||
tmp3 = (g >>> 25) | (g << 7);
|
|
||||||
s1 = tmp1 ^ tmp2 ^ tmp3;
|
|
||||||
cd = c & d;
|
cd = c & d;
|
||||||
maj = cd ^ (c & a) ^ da;
|
maj = cd ^ (c & a) ^ da;
|
||||||
ch = (g & h) ^ (~g & e);
|
ch = (g & h) ^ (~g & e);
|
||||||
t1 = f + s1 + ch + K[j + 2] + w[j + 2] << 0;
|
t1 = f + s1 + ch + K[j + 2] + blocks[j + 2];
|
||||||
t2 = s0 + maj << 0;
|
t2 = s0 + maj;
|
||||||
f = b + t1 << 0;
|
f = b + t1 << 0;
|
||||||
b = t1 + t2 << 0;
|
b = t1 + t2 << 0;
|
||||||
tmp1 = (b >>> 2) | (b << 30);
|
s0 = ((b >>> 2) | (b << 30)) ^ ((b >>> 13) | (b << 19)) ^ ((b >>> 22) | (b << 10));
|
||||||
tmp2 = (b >>> 13) | (b << 19);
|
s1 = ((f >>> 6) | (f << 26)) ^ ((f >>> 11) | (f << 21)) ^ ((f >>> 25) | (f << 7));
|
||||||
tmp3 = (b >>> 22) | (b << 10);
|
|
||||||
s0 = tmp1 ^ tmp2 ^ tmp3;
|
|
||||||
tmp1 = (f >>> 6) | (f << 26);
|
|
||||||
tmp2 = (f >>> 11) | (f << 21);
|
|
||||||
tmp3 = (f >>> 25) | (f << 7);
|
|
||||||
s1 = tmp1 ^ tmp2 ^ tmp3;
|
|
||||||
bc = b & c;
|
bc = b & c;
|
||||||
maj = bc ^ (b & d) ^ cd;
|
maj = bc ^ (b & d) ^ cd;
|
||||||
ch = (f & g) ^ (~f & h);
|
ch = (f & g) ^ (~f & h);
|
||||||
t1 = e + s1 + ch + K[j + 3] + w[j + 3] << 0;
|
t1 = e + s1 + ch + K[j + 3] + blocks[j + 3];
|
||||||
t2 = s0 + maj << 0;
|
t2 = s0 + maj;
|
||||||
e = a + t1 << 0;
|
e = a + t1 << 0;
|
||||||
a = t1 + t2 << 0;
|
a = t1 + t2 << 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
||||||
}
|
};
|
||||||
|
|
||||||
|
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] +
|
||||||
@@ -184,7 +360,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(is256) {
|
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] +
|
||||||
@@ -193,71 +369,136 @@
|
|||||||
return hex;
|
return hex;
|
||||||
};
|
};
|
||||||
|
|
||||||
var getBytesFromUtf8 = function(str) {
|
Sha256.prototype.toString = Sha256.prototype.hex;
|
||||||
var bytes = [], index = 0;
|
|
||||||
for (var i = 0;i < str.length; i++) {
|
Sha256.prototype.digest = function () {
|
||||||
var c = str.charCodeAt(i);
|
this.finalize();
|
||||||
if (c < 0x80) {
|
|
||||||
bytes[index++] = c;
|
var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3, h4 = this.h4, h5 = this.h5,
|
||||||
} else if (c < 0x800) {
|
h6 = this.h6, h7 = this.h7;
|
||||||
bytes[index++] = 0xc0 | (c >> 6);
|
|
||||||
bytes[index++] = 0x80 | (c & 0x3f);
|
var arr = [
|
||||||
} else if (c < 0xd800 || c >= 0xe000) {
|
(h0 >> 24) & 0xFF, (h0 >> 16) & 0xFF, (h0 >> 8) & 0xFF, h0 & 0xFF,
|
||||||
bytes[index++] = 0xe0 | (c >> 12);
|
(h1 >> 24) & 0xFF, (h1 >> 16) & 0xFF, (h1 >> 8) & 0xFF, h1 & 0xFF,
|
||||||
bytes[index++] = 0x80 | ((c >> 6) & 0x3f);
|
(h2 >> 24) & 0xFF, (h2 >> 16) & 0xFF, (h2 >> 8) & 0xFF, h2 & 0xFF,
|
||||||
bytes[index++] = 0x80 | (c & 0x3f);
|
(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 notString = typeof key !== 'string';
|
||||||
|
if (notString) {
|
||||||
|
if (key === null || key === undefined) {
|
||||||
|
throw ERROR;
|
||||||
|
} else if (key.constructor === root.ArrayBuffer) {
|
||||||
|
key = new Uint8Array(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var length = key.length;
|
||||||
|
if (notString) {
|
||||||
|
if (typeof length !== 'number' ||
|
||||||
|
!Array.isArray(key) &&
|
||||||
|
!(ARRAY_BUFFER && ArrayBuffer.isView(key))) {
|
||||||
|
throw ERROR;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
c = 0x10000 + (((c & 0x3ff) << 10) | (str.charCodeAt(++i) & 0x3ff));
|
var bytes = [], length = key.length, index = 0, code;
|
||||||
bytes[index++] = 0xf0 | (c >> 18);
|
for (var i = 0; i < length; ++i) {
|
||||||
bytes[index++] = 0x80 | ((c >> 12) & 0x3f);
|
code = key.charCodeAt(i);
|
||||||
bytes[index++] = 0x80 | ((c >> 6) & 0x3f);
|
if (code < 0x80) {
|
||||||
bytes[index++] = 0x80 | (c & 0x3f);
|
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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return bytes;
|
key = bytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (key.length > 64) {
|
||||||
|
key = (new Sha256(is224, true)).update(key).array();
|
||||||
|
}
|
||||||
|
|
||||||
|
var oKeyPad = [], iKeyPad = [];
|
||||||
|
for (var 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 getChunksFromAscii = function(message) {
|
var exports = createMethod();
|
||||||
// a block is 32 bits(4 bytes), a chunk is 512 bits(64 bytes)
|
exports.sha256 = exports;
|
||||||
var length = message.length;
|
exports.sha224 = createMethod(true);
|
||||||
var chunkCount = ((length + 8) >> 6) + 1;
|
exports.sha256.hmac = createHmacMethod();
|
||||||
var chunks = [], blocks, i;
|
exports.sha224.hmac = createHmacMethod(true);
|
||||||
for(i = 0;i < chunkCount;++i) {
|
|
||||||
chunks[i] = blocks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
|
||||||
}
|
|
||||||
for(i = 0;i < length;++i) {
|
|
||||||
blocks = chunks[i >> 6];
|
|
||||||
blocks[(i & 63) >> 2] |= message.charCodeAt(i) << SHIFT[i & 3];
|
|
||||||
}
|
|
||||||
blocks[(i & 63) >> 2] |= 0x80 << SHIFT[i & 3];
|
|
||||||
blocks[15] = length << 3; // length * 8
|
|
||||||
return chunks;
|
|
||||||
};
|
|
||||||
|
|
||||||
var getChunksFromUtf8 = function(message) {
|
if (COMMON_JS) {
|
||||||
// a block is 32 bits(4 bytes), a chunk is 512 bits(64 bytes)
|
module.exports = exports;
|
||||||
var bytes = getBytesFromUtf8(message);
|
} else {
|
||||||
var length = bytes.length;
|
root.sha256 = exports.sha256;
|
||||||
var chunkCount = ((length + 8) >> 6) + 1;
|
root.sha224 = exports.sha224;
|
||||||
var chunks = [], blocks, i;
|
if (AMD) {
|
||||||
for(i = 0;i < chunkCount;++i) {
|
define(function () {
|
||||||
chunks[i] = blocks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
return exports;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
for(i = 0;i < length;++i) {
|
|
||||||
blocks = chunks[i >> 6];
|
|
||||||
blocks[(i & 63) >> 2] |= bytes[i] << SHIFT[i & 3];
|
|
||||||
}
|
}
|
||||||
blocks[(i & 63) >> 2] |= 0x80 << SHIFT[i & 3];
|
})();
|
||||||
blocks[15] = length << 3; // length * 8
|
|
||||||
return chunks;
|
|
||||||
};
|
|
||||||
|
|
||||||
if(!root.JS_SHA256_TEST && NODE_JS) {
|
|
||||||
sha256.sha256 = sha256;
|
|
||||||
sha256.sha224 = sha224;
|
|
||||||
module.exports = sha256;
|
|
||||||
} else if(root) {
|
|
||||||
root.sha256 = sha256;
|
|
||||||
root.sha224 = sha224;
|
|
||||||
}
|
|
||||||
}(this));
|
|
||||||
|
|||||||
@@ -0,0 +1,230 @@
|
|||||||
|
(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': ['𠜎', '𠜎']
|
||||||
|
},
|
||||||
|
'ArrayBuffer': {
|
||||||
|
'e48411262715c8370cd5e7bf8e82bef53bd53712d007f3429351843b77c7bb9b': [
|
||||||
|
new ArrayBuffer(0),
|
||||||
|
'Hi There'
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
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': ['𠜎', '𠜎']
|
||||||
|
},
|
||||||
|
'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();
|
||||||
|
|||||||
+43
-3
@@ -1,14 +1,54 @@
|
|||||||
|
// Node.js env
|
||||||
|
expect = require('expect.js');
|
||||||
sha256 = require('../src/sha256.js').sha256;
|
sha256 = require('../src/sha256.js').sha256;
|
||||||
sha224 = require('../src/sha256.js').sha224;
|
sha224 = require('../src/sha256.js').sha224;
|
||||||
expect = require('expect.js');
|
|
||||||
require('./test.js');
|
require('./test.js');
|
||||||
|
require('./hmac-test.js');
|
||||||
|
|
||||||
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')]
|
||||||
|
delete require.cache[require.resolve('./hmac-test.js')]
|
||||||
sha256 = null;
|
sha256 = null;
|
||||||
sha224 = null;
|
sha224 = null;
|
||||||
|
|
||||||
JS_SHA256_TEST = true;
|
// Webpack browser env
|
||||||
testName = 'without ArrayBuffer';
|
JS_SHA256_NO_NODE_JS = true;
|
||||||
|
window = global;
|
||||||
|
sha256 = require('../src/sha256.js').sha256;
|
||||||
|
sha224 = require('../src/sha256.js').sha224;
|
||||||
|
require('./test.js');
|
||||||
|
require('./hmac-test.js');
|
||||||
|
|
||||||
|
delete require.cache[require.resolve('../src/sha256.js')]
|
||||||
|
delete require.cache[require.resolve('./test.js')]
|
||||||
|
delete require.cache[require.resolve('./hmac-test.js')]
|
||||||
|
sha256 = null;
|
||||||
|
sha224 = null;
|
||||||
|
|
||||||
|
// browser env
|
||||||
|
JS_SHA256_NO_NODE_JS = true;
|
||||||
|
JS_SHA256_NO_COMMON_JS = true;
|
||||||
|
window = global;
|
||||||
require('../src/sha256.js');
|
require('../src/sha256.js');
|
||||||
require('./test.js');
|
require('./test.js');
|
||||||
|
require('./hmac-test.js');
|
||||||
|
|
||||||
|
delete require.cache[require.resolve('../src/sha256.js')]
|
||||||
|
delete require.cache[require.resolve('./test.js')]
|
||||||
|
delete require.cache[require.resolve('./hmac-test.js')]
|
||||||
|
sha256 = null;
|
||||||
|
sha224 = null;
|
||||||
|
|
||||||
|
// browser AMD
|
||||||
|
JS_SHA256_NO_NODE_JS = true;
|
||||||
|
JS_SHA256_NO_COMMON_JS = true;
|
||||||
|
window = global;
|
||||||
|
define = function (func) {
|
||||||
|
sha256 = func();
|
||||||
|
sha224 = sha256.sha224;
|
||||||
|
require('./test.js');
|
||||||
|
require('./hmac-test.js');
|
||||||
|
};
|
||||||
|
define.amd = true;
|
||||||
|
|
||||||
|
require('../src/sha256.js');
|
||||||
|
|||||||
+246
-57
@@ -1,67 +1,256 @@
|
|||||||
describe('sha256', function() {
|
(function (sha256, sha224) {
|
||||||
describe('ascii', function() {
|
Array.prototype.toHexString = ArrayBuffer.prototype.toHexString = function () {
|
||||||
describe('less than 64 bytes', function() {
|
var array = new Uint8Array(this);
|
||||||
it('should be successful', function() {
|
var hex = '';
|
||||||
expect(sha256('')).to.be('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855');
|
for (var i = 0; i < array.length; ++i) {
|
||||||
expect(sha256('The quick brown fox jumps over the lazy dog')).to.be('d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592');
|
var c = array[i].toString('16');
|
||||||
expect(sha256('The quick brown fox jumps over the lazy dog.')).to.be('ef537f25c895bfa782526529a9b63d97aa631564d5d789c2b765448c8635fb6c');
|
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]
|
||||||
|
},
|
||||||
|
|
||||||
|
'Uint8Array': {
|
||||||
|
'182889f925ae4e5cc37118ded6ed87f7bdc7cab5ec5e78faef2e50048999473f': new Uint8Array([211, 212]),
|
||||||
|
'd7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592': new Uint8Array([84, 104, 101, 32, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 32, 102, 111, 120, 32, 106, 117, 109, 112, 115, 32, 111, 118, 101, 114, 32, 116, 104, 101, 32, 108, 97, 122, 121, 32, 100, 111, 103])
|
||||||
|
},
|
||||||
|
'Int8Array': {
|
||||||
|
'd7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592': new Int8Array([84, 104, 101, 32, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 32, 102, 111, 120, 32, 106, 117, 109, 112, 115, 32, 111, 118, 101, 114, 32, 116, 104, 101, 32, 108, 97, 122, 121, 32, 100, 111, 103])
|
||||||
|
},
|
||||||
|
'ArrayBuffer': {
|
||||||
|
'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855': new ArrayBuffer(0),
|
||||||
|
'6e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d': new ArrayBuffer(1),
|
||||||
|
}
|
||||||
|
},
|
||||||
|
sha224: {
|
||||||
|
'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]
|
||||||
|
},
|
||||||
|
'Uint8Array': {
|
||||||
|
'e17541396a3ecd1cd5a2b968b84e597e8eae3b0ea3127963bf48dd3b': new Uint8Array([211, 212]),
|
||||||
|
'730e109bd7a8a32b1cb9d9a09aa2325d2430587ddbc0c38bad911525': new Uint8Array([84, 104, 101, 32, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 32, 102, 111, 120, 32, 106, 117, 109, 112, 115, 32, 111, 118, 101, 114, 32, 116, 104, 101, 32, 108, 97, 122, 121, 32, 100, 111, 103])
|
||||||
|
},
|
||||||
|
'Int8Array': {
|
||||||
|
'730e109bd7a8a32b1cb9d9a09aa2325d2430587ddbc0c38bad911525': new Int8Array([84, 104, 101, 32, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 32, 102, 111, 120, 32, 106, 117, 109, 112, 115, 32, 111, 118, 101, 114, 32, 116, 104, 101, 32, 108, 97, 122, 121, 32, 100, 111, 103])
|
||||||
|
},
|
||||||
|
'ArrayBuffer': {
|
||||||
|
'd14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f': new ArrayBuffer(0),
|
||||||
|
'fff9292b4201617bdc4d3053fce02734166a683d7d858a7f5f59b073': new ArrayBuffer(1),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var errorTestCases = [null, undefined, { length: 0 }, 0, 1, false, true, NaN, Infinity, function () {}];
|
||||||
|
|
||||||
|
if (typeof process == 'object') {
|
||||||
|
testCases.sha256['Buffer'] = {
|
||||||
|
'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855': new Buffer(0),
|
||||||
|
'd7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592': new Buffer(new Uint8Array([84, 104, 101, 32, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 32, 102, 111, 120, 32, 106, 117, 109, 112, 115, 32, 111, 118, 101, 114, 32, 116, 104, 101, 32, 108, 97, 122, 121, 32, 100, 111, 103]))
|
||||||
|
};
|
||||||
|
testCases.sha224['Buffer'] = {
|
||||||
|
'd14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f': new Buffer(0),
|
||||||
|
'730e109bd7a8a32b1cb9d9a09aa2325d2430587ddbc0c38bad911525': new Buffer(new Uint8Array([84, 104, 101, 32, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119, 110, 32, 102, 111, 120, 32, 106, 117, 109, 112, 115, 32, 111, 118, 101, 114, 32, 116, 104, 101, 32, 108, 97, 122, 121, 32, 100, 111, 103]))
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function runTestCases(name, algorithm) {
|
||||||
|
var methods = [
|
||||||
|
{
|
||||||
|
name: name,
|
||||||
|
call: algorithm,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: name + '.hex',
|
||||||
|
call: algorithm.hex
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: name + '.array',
|
||||||
|
call: function (message) {
|
||||||
|
return algorithm.array(message).toHexString();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: name + '.digest',
|
||||||
|
call: function (message) {
|
||||||
|
return algorithm.digest(message).toHexString();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: name + '.arrayBuffer',
|
||||||
|
call: function (message) {
|
||||||
|
return algorithm.arrayBuffer(message).toHexString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
var classMethods = [
|
||||||
|
{
|
||||||
|
name: 'create',
|
||||||
|
call: function (message) {
|
||||||
|
return algorithm.create().update(message).toString();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'update',
|
||||||
|
call: function (message) {
|
||||||
|
return algorithm.update(message).toString();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'hex',
|
||||||
|
call: function (message) {
|
||||||
|
return algorithm.update(message).hex();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'array',
|
||||||
|
call: function (message) {
|
||||||
|
return algorithm.update(message).array().toHexString();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'digest',
|
||||||
|
call: function (message) {
|
||||||
|
return algorithm.update(message).digest().toHexString();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'arrayBuffer',
|
||||||
|
call: function (message) {
|
||||||
|
return algorithm.update(message).arrayBuffer().toHexString();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'finalize',
|
||||||
|
call: function (message) {
|
||||||
|
var hash = algorithm.update(message);
|
||||||
|
hash.hex();
|
||||||
|
hash.update(message);
|
||||||
|
return hash.hex();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
var subTestCases = testCases[name];
|
||||||
|
|
||||||
|
describe(name, function () {
|
||||||
|
methods.forEach(function (method) {
|
||||||
|
describe('#' + method.name, function () {
|
||||||
|
for (var testCaseName in subTestCases) {
|
||||||
|
(function (testCaseName) {
|
||||||
|
var testCase = subTestCases[testCaseName];
|
||||||
|
context('when ' + testCaseName, function () {
|
||||||
|
for (var hash in testCase) {
|
||||||
|
(function (message, hash) {
|
||||||
|
it('should be equal', function () {
|
||||||
|
expect(method.call(message)).to.be(hash);
|
||||||
|
});
|
||||||
|
})(testCase[hash], hash);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
})(testCaseName);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('more than 64 bytes', function() {
|
classMethods.forEach(function (method) {
|
||||||
it('should be successful', function() {
|
describe('#' + method.name, 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');
|
for (var testCaseName in subTestCases) {
|
||||||
|
(function (testCaseName) {
|
||||||
|
var testCase = subTestCases[testCaseName];
|
||||||
|
context('when ' + testCaseName, function () {
|
||||||
|
for (var hash in testCase) {
|
||||||
|
(function (message, hash) {
|
||||||
|
it('should be equal', function () {
|
||||||
|
expect(method.call(message)).to.be(hash);
|
||||||
|
});
|
||||||
|
})(testCase[hash], hash);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
})(testCaseName);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('#' + name, function () {
|
||||||
|
errorTestCases.forEach(function (testCase) {
|
||||||
|
context('when ' + testCase, function () {
|
||||||
|
it('should throw error', function () {
|
||||||
|
expect(function () {
|
||||||
|
algorithm(testCase);
|
||||||
|
}).to.throwError(/input is invalid type/);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('UTF8', function() {
|
context('when large size', function () {
|
||||||
describe('less than 64 bytes', function() {
|
var hash = algorithm.create();
|
||||||
it('should be successful', 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');
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
describe('more than 64 bytes', function() {
|
runTestCases('sha256', sha256);
|
||||||
it('should be successful', function() {
|
runTestCases('sha224', sha224);
|
||||||
expect(sha256('訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一(又譯雜湊演算法、摘要演算法等),主流程式語言普遍已有MD5的實作。')).to.be('81a1472ebdeb09406a783d607ff49ee2fde3e9f44ac1cd158ad8d6ad3c4e69fa');
|
})(sha256, sha224);
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('sha224', function() {
|
|
||||||
describe('ascii', function() {
|
|
||||||
describe('less than 64 bytes', function() {
|
|
||||||
it('should be successful', 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');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('more than 64 bytes', function() {
|
|
||||||
it('should be successful', 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');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('UTF8', function() {
|
|
||||||
describe('less than 64 bytes', function() {
|
|
||||||
it('should be successful', function() {
|
|
||||||
expect(sha224('中文')).to.be('dfbab71afdf54388af4d55f8bd3de8c9b15e0eb916bf9125f4a959d4');
|
|
||||||
expect(sha224('aécio')).to.be('d12841cafd89c534924a839e62bf35a2b5f3717b7802eb19bd8d8e15');
|
|
||||||
expect(sha224('𠜎')).to.be('eaa0129b5509f5701db218fb7076b282e4409da52d06363aa3bdd63d');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('more than 64 bytes', function() {
|
|
||||||
it('should be successful', function() {
|
|
||||||
expect(sha224('訊息摘要演算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前電腦領域用於確保資訊傳輸完整一致而廣泛使用的雜湊演算法之一(又譯雜湊演算法、摘要演算法等),主流程式語言普遍已有MD5的實作。')).to.be('a8cb74a54e6dc6ab6110db3915ba08ffe5e1abafaea78538fa12a626');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|||||||
Reference in New Issue
Block a user