mirror of
https://github.com/emn178/js-md5.git
synced 2026-08-13 04:51:44 +08:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
114d18e574 | ||
|
|
801a004b4f | ||
|
|
b02f0d93f3 | ||
|
|
6f25176e1e | ||
|
|
a4f0f5014a | ||
|
|
4c40b94725 | ||
|
|
1ed1b0677d | ||
|
|
698290b4bc | ||
|
|
0ecaeee185 | ||
|
|
daf1188dc6 | ||
|
|
a9de3df8c6 | ||
|
|
08049ec6fa | ||
|
|
bdf1150097 | ||
|
|
c2e8d8683d | ||
|
|
c154bc5a38 | ||
|
|
0263ab835f | ||
|
|
5f0bd5a888 | ||
|
|
cb8eb73ef1 |
@@ -1,2 +0,0 @@
|
|||||||
/node_modules/
|
|
||||||
/tests/
|
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
name: CI
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
ci:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
node-version: [16.x, 18.x, 20.x, 22.x]
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up Node ${{ matrix.node-version }}
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: ${{ matrix.node-version }}
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: npm ci
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
if: matrix.node-version == '22.x'
|
||||||
|
run: npm run build
|
||||||
|
|
||||||
|
- name: Run tests
|
||||||
|
run: npm test
|
||||||
|
|
||||||
|
- name: Generate coverage report
|
||||||
|
if: matrix.node-version == '22.x'
|
||||||
|
run: npm run coverage
|
||||||
|
|
||||||
|
- name: Upload to coveralls
|
||||||
|
if: matrix.node-version == '22.x'
|
||||||
|
uses: coverallsapp/github-action@v2
|
||||||
|
with:
|
||||||
|
file: ./coverage.lcov
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
name: Publish
|
||||||
|
|
||||||
|
on:
|
||||||
|
release:
|
||||||
|
types: [published]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
id-token: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
publish:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: 24.x
|
||||||
|
registry-url: https://registry.npmjs.org
|
||||||
|
package-manager-cache: false
|
||||||
|
|
||||||
|
- run: npm ci
|
||||||
|
|
||||||
|
- name: Verify release version
|
||||||
|
run: |
|
||||||
|
PACKAGE_VERSION=$(node -p "require('./package.json').version")
|
||||||
|
test "$GITHUB_REF_NAME" = "v$PACKAGE_VERSION"
|
||||||
|
|
||||||
|
- run: npm run build
|
||||||
|
- run: npm test
|
||||||
|
- run: npm publish
|
||||||
@@ -1,2 +1,4 @@
|
|||||||
/node_modules/
|
/node_modules/
|
||||||
/covreporter/
|
/covreporter/
|
||||||
|
/.nyc_output/
|
||||||
|
/coverage/
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
/node_modules/
|
||||||
|
/coverage/
|
||||||
|
/.nyc_output/
|
||||||
|
/tests/
|
||||||
|
/doc/
|
||||||
|
.covignore
|
||||||
|
.travis.yml
|
||||||
|
.npmignore
|
||||||
|
bower.json
|
||||||
-11
@@ -1,11 +0,0 @@
|
|||||||
language: node_js
|
|
||||||
node_js:
|
|
||||||
- "6.11.4"
|
|
||||||
- "8.6.0"
|
|
||||||
before_install:
|
|
||||||
- npm install coveralls
|
|
||||||
- npm install mocha-lcov-reporter
|
|
||||||
script: npm run-script coveralls
|
|
||||||
branches:
|
|
||||||
only:
|
|
||||||
- master
|
|
||||||
@@ -1,5 +1,61 @@
|
|||||||
# Change Log
|
# Change Log
|
||||||
|
|
||||||
|
## v0.9.1 / 2026-07-20
|
||||||
|
### Changed
|
||||||
|
- web worker detection. #44
|
||||||
|
|
||||||
|
## v0.9.0 / 2026-07-20
|
||||||
|
### Added
|
||||||
|
- Modern and lite builds generated from the same source. #44
|
||||||
|
- support ESM.
|
||||||
|
- Set up GitHub release action / provenance
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Fix uploading coverage to coveralls
|
||||||
|
- fix recognize environment is node when use browserfs
|
||||||
|
|
||||||
|
## v0.8.3 / 2023-10-09
|
||||||
|
### Fixed
|
||||||
|
- package.json main property.
|
||||||
|
|
||||||
|
## v0.8.2 / 2023-10-09
|
||||||
|
### Remove
|
||||||
|
- package.json module property.
|
||||||
|
|
||||||
|
## v0.8.1 / 2023-10-09
|
||||||
|
### Added
|
||||||
|
- TypeScript base64 interfaces.
|
||||||
|
- Disable webpack polyfill.
|
||||||
|
|
||||||
|
## v0.8.0 / 2023-09-27
|
||||||
|
### Added
|
||||||
|
- TypeScript interfaces.
|
||||||
|
- HMAC feature.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- deprecated `new Buffer`, replace with `Buffer.from`.
|
||||||
|
- dependencies and security issues.
|
||||||
|
- don't modify global Array and ArrayBuffer prototypes.
|
||||||
|
- refactor: simplify formatMessage internal logic.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- remove `eval` and use `require` directly.
|
||||||
|
- throw error by Error oject.
|
||||||
|
- throw error if update after finalize
|
||||||
|
- use unsigned right shift.
|
||||||
|
|
||||||
|
## v0.7.3 / 2017-12-18
|
||||||
|
### Fixed
|
||||||
|
- incorrect result when first bit is 1 of bytes. #18
|
||||||
|
|
||||||
|
## v0.7.2 / 2017-10-31
|
||||||
|
### Improved
|
||||||
|
- performance of hBytes increment.
|
||||||
|
|
||||||
|
## v0.7.1 / 2017-10-29
|
||||||
|
### Fixed
|
||||||
|
- incorrect result when file size >= 4G.
|
||||||
|
|
||||||
## v0.7.0 / 2017-10-29
|
## v0.7.0 / 2017-10-29
|
||||||
### Fixed
|
### Fixed
|
||||||
- incorrect result when file size >= 512M.
|
- incorrect result when file size >= 512M.
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
Copyright 2014-2017 Chen, Yi-Cyuan
|
Copyright 2014-2026 Chen, Yi-Cyuan
|
||||||
|
|
||||||
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,17 +1,48 @@
|
|||||||
# js-md5
|
# js-md5
|
||||||
[](https://travis-ci.org/emn178/js-md5)
|
[](https://github.com/emn178/js-md5/actions/workflows/ci.yml)
|
||||||
[](https://coveralls.io/r/emn178/js-md5?branch=master)
|
[](https://coveralls.io/r/emn178/js-md5?branch=master)
|
||||||
[](https://nodei.co/npm/js-md5/)
|
[](https://nodei.co/npm/js-md5/)
|
||||||
|
|
||||||
A simple MD5 hash function for JavaScript supports UTF-8 encoding.
|
A simple and fast MD5 hash function for JavaScript supports UTF-8 encoding.
|
||||||
|
|
||||||
## Demo
|
## Demo
|
||||||
[MD5 Online](http://emn178.github.io/online-tools/md5.html)
|
[MD5 Online](http://emn178.github.io/online-tools/md5.html)
|
||||||
[MD5 File Checksum Online](http://emn178.github.io/online-tools/md5_checksum.html)
|
[MD5 File Checksum Online](http://emn178.github.io/online-tools/md5_checksum.html)
|
||||||
|
|
||||||
## Download
|
## Download
|
||||||
[Compress](https://raw.github.com/emn178/js-md5/master/build/md5.min.js)
|
- [Compress](https://raw.github.com/emn178/js-md5/master/build/md5.min.js)
|
||||||
[Uncompress](https://raw.github.com/emn178/js-md5/master/src/md5.js)
|
- [Uncompressed build](https://raw.github.com/emn178/js-md5/master/build/md5.js)
|
||||||
|
- [Modern](https://raw.github.com/emn178/js-md5/master/build/md5.modern.min.js)
|
||||||
|
- [Modern uncompressed](https://raw.github.com/emn178/js-md5/master/build/md5.modern.js)
|
||||||
|
- [Lite](https://raw.github.com/emn178/js-md5/master/build/md5-lite.min.js)
|
||||||
|
- [Lite uncompressed](https://raw.github.com/emn178/js-md5/master/build/md5-lite.js)
|
||||||
|
- [Uncompress](https://raw.github.com/emn178/js-md5/master/src/md5.js)
|
||||||
|
|
||||||
|
### Builds
|
||||||
|
|
||||||
|
| Build | Legacy fallbacks | Node acceleration | HMAC | Base64 | Deprecated `buffer` |
|
||||||
|
| --- | --- | --- | --- | --- | --- |
|
||||||
|
| `md5.js` / `md5.min.js` | Yes | Yes | Yes | Yes | Yes |
|
||||||
|
| `md5.modern.js` / `md5.modern.min.js` | No | Yes | Yes | Yes | Yes |
|
||||||
|
| `md5-lite.js` / `md5-lite.min.js` | No | No | No | No | No |
|
||||||
|
|
||||||
|
The modern and lite builds require `Array.isArray`, `ArrayBuffer`, typed arrays,
|
||||||
|
and `ArrayBuffer.isView`. The lite build keeps the one-shot and streaming MD5
|
||||||
|
APIs, including `hex`, `array`, `digest`, and `arrayBuffer` output.
|
||||||
|
|
||||||
|
## Benchmark
|
||||||
|
- [Benchmark (measurethat.net) - Short String](https://measurethat.net/Benchmarks/Show/29171/0/md5-performance-comparison-v2)
|
||||||
|
- [Benchmark (measurethat.net) - Long String](https://measurethat.net/Benchmarks/Show/29172/0/md5-performance-comparison-long-text-v2)
|
||||||
|
- [Benchmark (jsperf.app) - Long String](https://jsperf.app/jonuhi/6)
|
||||||
|
- [Benchmark (measurethat.net) - Very Long String](https://measurethat.net/Benchmarks/Show/29173/0/md5-performance-comparison-very-long-text)
|
||||||
|
- [Benchmark (jsperf.app) - Very Long String](https://jsperf.app/jonuhi/8)
|
||||||
|
- [Async Benchmark (measurethat.net)](https://measurethat.net/Benchmarks/Show/29176/0/md5-performance-comparison-very-long-text-v6)
|
||||||
|
- [Async Benchmark (jsperf.app)](https://jsperf.app/jonuhi/9)
|
||||||
|
|
||||||
|
* js-md5 is the fastest synchronous MD5 library, but slower than Hash-WASM
|
||||||
|
|
||||||
|
- [File Benchmark - Issue #19](https://github.com/emn178/js-md5/issues/19)
|
||||||
|
- [File Benchmark - Issue #42](https://github.com/emn178/js-md5/issues/42)
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
You can also install js-md5 by using Bower.
|
You can also install js-md5 by using Bower.
|
||||||
@@ -32,11 +63,28 @@ md5('Message to hash');
|
|||||||
var hash = md5.create();
|
var hash = md5.create();
|
||||||
hash.update('Message to hash');
|
hash.update('Message to hash');
|
||||||
hash.hex();
|
hash.hex();
|
||||||
|
|
||||||
|
// HMAC
|
||||||
|
md5.hmac('key', 'Message to hash');
|
||||||
|
|
||||||
|
var hash = md5.hmac.create('key');
|
||||||
|
hash.update('Message to hash');
|
||||||
|
hash.hex();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### 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
|
||||||
md5 = require('js-md5');
|
var md5 = require('js-md5');
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### TypeScript
|
||||||
|
If you use TypeScript, you can import like this:
|
||||||
|
```TypeScript
|
||||||
|
import { md5 } from 'js-md5';
|
||||||
|
```
|
||||||
|
|
||||||
|
## RequireJS
|
||||||
It supports AMD:
|
It supports AMD:
|
||||||
```JavaScript
|
```JavaScript
|
||||||
require(['your/path/md5.js'], function(md5) {
|
require(['your/path/md5.js'], function(md5) {
|
||||||
@@ -64,12 +112,16 @@ md5.hex(''); // d41d8cd98f00b204e9800998ecf8427e
|
|||||||
md5.array(''); // [212, 29, 140, 217, 143, 0, 178, 4, 233, 128, 9, 152, 236, 248, 66, 126]
|
md5.array(''); // [212, 29, 140, 217, 143, 0, 178, 4, 233, 128, 9, 152, 236, 248, 66, 126]
|
||||||
md5.digest(''); // [212, 29, 140, 217, 143, 0, 178, 4, 233, 128, 9, 152, 236, 248, 66, 126]
|
md5.digest(''); // [212, 29, 140, 217, 143, 0, 178, 4, 233, 128, 9, 152, 236, 248, 66, 126]
|
||||||
md5.arrayBuffer(''); // ArrayBuffer
|
md5.arrayBuffer(''); // ArrayBuffer
|
||||||
md5.buffer(''); // ArrayBuffer, deprecated, This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.
|
|
||||||
md5.base64(''); // 1B2M2Y8AsgTpgAmY7PhCfg==
|
md5.base64(''); // 1B2M2Y8AsgTpgAmY7PhCfg==
|
||||||
|
|
||||||
|
// HMAC
|
||||||
|
md5.hmac.hex('key', 'Message to hash');
|
||||||
|
md5.hmac.array('key', 'Message to hash');
|
||||||
|
// ...
|
||||||
```
|
```
|
||||||
|
|
||||||
## License
|
## License
|
||||||
The project is released under the [MIT license](http://www.opensource.org/licenses/MIT).
|
The project is released under the [MIT license](https://opensource.org/license/mit/).
|
||||||
|
|
||||||
## Contact
|
## Contact
|
||||||
The project's website is located at https://github.com/emn178/js-md5
|
The project's website is located at https://github.com/emn178/js-md5
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "js-md5",
|
"name": "js-md5",
|
||||||
"version": "0.7.0",
|
"version": "0.9.0",
|
||||||
"main": ["src/md5.js"],
|
"main": ["src/md5.js"],
|
||||||
"ignore": [
|
"ignore": [
|
||||||
"tests"
|
"tests"
|
||||||
|
|||||||
@@ -0,0 +1,612 @@
|
|||||||
|
/**
|
||||||
|
* [js-md5]{@link https://github.com/emn178/js-md5}
|
||||||
|
*
|
||||||
|
* @namespace md5
|
||||||
|
* @version 0.9.0
|
||||||
|
* @author Chen, Yi-Cyuan [emn178@gmail.com]
|
||||||
|
* @copyright Chen, Yi-Cyuan 2014-2026
|
||||||
|
* @license MIT
|
||||||
|
*/
|
||||||
|
(function () {
|
||||||
|
|
||||||
|
var INPUT_ERROR = 'input is invalid type';
|
||||||
|
var FINALIZE_ERROR = 'finalize already called';
|
||||||
|
var WINDOW = typeof window === 'object';
|
||||||
|
var root = WINDOW ? window : {};
|
||||||
|
if (root.JS_MD5_NO_WINDOW) {
|
||||||
|
WINDOW = false;
|
||||||
|
}
|
||||||
|
var WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && typeof self !== 'undefined' && self instanceof WorkerGlobalScope;
|
||||||
|
/* istanbul ignore next */
|
||||||
|
var NODE_JS = !root.JS_MD5_NO_NODE_JS && !WINDOW && typeof process === 'object' && process.versions && process.versions.node;
|
||||||
|
if (NODE_JS) {
|
||||||
|
root = global;
|
||||||
|
} else if (WEB_WORKER) {
|
||||||
|
root = self;
|
||||||
|
}
|
||||||
|
var COMMON_JS = !root.JS_MD5_NO_COMMON_JS && typeof module === 'object' && module.exports;
|
||||||
|
var AMD = typeof define === 'function' && define.amd;
|
||||||
|
var HEX_CHARS = '0123456789abcdef'.split('');
|
||||||
|
var EXTRA = [128, 32768, 8388608, -2147483648];
|
||||||
|
var OUTPUT_TYPES = ['hex', 'array', 'digest', 'arrayBuffer'];
|
||||||
|
|
||||||
|
var blocks = [], buffer8;
|
||||||
|
{
|
||||||
|
var buffer = new ArrayBuffer(68);
|
||||||
|
buffer8 = new Uint8Array(buffer);
|
||||||
|
blocks = new Uint32Array(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
var isArray = Array.isArray;
|
||||||
|
|
||||||
|
var isView = ArrayBuffer.isView;
|
||||||
|
|
||||||
|
// [message: string, isString: bool]
|
||||||
|
var formatMessage = function (message) {
|
||||||
|
var type = typeof message;
|
||||||
|
if (type === 'string') {
|
||||||
|
return [message, true];
|
||||||
|
}
|
||||||
|
if (type !== 'object' || message === null) {
|
||||||
|
throw new Error(INPUT_ERROR);
|
||||||
|
}
|
||||||
|
if (message.constructor === ArrayBuffer) {
|
||||||
|
return [new Uint8Array(message), false];
|
||||||
|
}
|
||||||
|
if (!isArray(message) && !isView(message)) {
|
||||||
|
throw new Error(INPUT_ERROR);
|
||||||
|
}
|
||||||
|
return [message, false];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method hex
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as hex string
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} Hex string
|
||||||
|
* @example
|
||||||
|
* md5.hex('The quick brown fox jumps over the lazy dog');
|
||||||
|
* // equal to
|
||||||
|
* md5('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method digest
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @example
|
||||||
|
* md5.digest('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method array
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @example
|
||||||
|
* md5.array('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method arrayBuffer
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @example
|
||||||
|
* md5.arrayBuffer('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method buffer
|
||||||
|
* @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @example
|
||||||
|
* md5.buffer('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method base64
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as base64 string
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} base64 string
|
||||||
|
* @example
|
||||||
|
* md5.base64('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
var createOutputMethod = function (outputType) {
|
||||||
|
return function (message) {
|
||||||
|
return new Md5(true).update(message)[outputType]();
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method create
|
||||||
|
* @memberof md5
|
||||||
|
* @description Create Md5 object
|
||||||
|
* @returns {Md5} Md5 object.
|
||||||
|
* @example
|
||||||
|
* var hash = md5.create();
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method update
|
||||||
|
* @memberof md5
|
||||||
|
* @description Create and update Md5 object
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Md5} Md5 object.
|
||||||
|
* @example
|
||||||
|
* var hash = md5.update('The quick brown fox jumps over the lazy dog');
|
||||||
|
* // equal to
|
||||||
|
* var hash = md5.create();
|
||||||
|
* hash.update('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
var createMethod = function () {
|
||||||
|
var method = createOutputMethod('hex');
|
||||||
|
if (NODE_JS) {
|
||||||
|
method = nodeWrap(method);
|
||||||
|
}
|
||||||
|
method.create = function () {
|
||||||
|
return new Md5();
|
||||||
|
};
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
return method;
|
||||||
|
};
|
||||||
|
|
||||||
|
var nodeWrap = function (method) {
|
||||||
|
var crypto = require('crypto');
|
||||||
|
var Buffer = require('buffer').Buffer;
|
||||||
|
var bufferFrom = Buffer.from;
|
||||||
|
var nodeMethod = function (message) {
|
||||||
|
if (typeof message === 'string') {
|
||||||
|
return crypto.createHash('md5').update(message, 'utf8').digest('hex');
|
||||||
|
} else {
|
||||||
|
if (message === null || message === undefined) {
|
||||||
|
throw new Error(INPUT_ERROR);
|
||||||
|
} else if (message.constructor === ArrayBuffer) {
|
||||||
|
message = new Uint8Array(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isArray(message) || isView(message) ||
|
||||||
|
message.constructor === Buffer) {
|
||||||
|
return crypto.createHash('md5').update(bufferFrom(message)).digest('hex');
|
||||||
|
} else {
|
||||||
|
return method(message);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
return nodeMethod;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Md5 class
|
||||||
|
* @class Md5
|
||||||
|
* @description This is internal class.
|
||||||
|
* @see {@link md5.create}
|
||||||
|
*/
|
||||||
|
function Md5(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;
|
||||||
|
this.buffer8 = buffer8;
|
||||||
|
} else {
|
||||||
|
{
|
||||||
|
var buffer = new ArrayBuffer(68);
|
||||||
|
this.buffer8 = new Uint8Array(buffer);
|
||||||
|
this.blocks = new Uint32Array(buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.h0 = this.h1 = this.h2 = this.h3 = this.start = this.bytes = this.hBytes = 0;
|
||||||
|
this.finalized = this.hashed = false;
|
||||||
|
this.first = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method update
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Update hash
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Md5} Md5 object.
|
||||||
|
* @see {@link md5.update}
|
||||||
|
*/
|
||||||
|
Md5.prototype.update = function (message) {
|
||||||
|
if (this.finalized) {
|
||||||
|
throw new Error(FINALIZE_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
var result = formatMessage(message);
|
||||||
|
message = result[0];
|
||||||
|
var isString = result[1];
|
||||||
|
var code, index = 0, i, length = message.length, blocks = this.blocks;
|
||||||
|
var buffer8 = this.buffer8;
|
||||||
|
|
||||||
|
while (index < length) {
|
||||||
|
if (this.hashed) {
|
||||||
|
this.hashed = false;
|
||||||
|
blocks[0] = blocks[16];
|
||||||
|
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 (isString) {
|
||||||
|
{
|
||||||
|
for (i = this.start; index < length && i < 64; ++index) {
|
||||||
|
code = message.charCodeAt(index);
|
||||||
|
if (code < 0x80) {
|
||||||
|
buffer8[i++] = code;
|
||||||
|
} else if (code < 0x800) {
|
||||||
|
buffer8[i++] = 0xc0 | (code >>> 6);
|
||||||
|
buffer8[i++] = 0x80 | (code & 0x3f);
|
||||||
|
} else if (code < 0xd800 || code >= 0xe000) {
|
||||||
|
buffer8[i++] = 0xe0 | (code >>> 12);
|
||||||
|
buffer8[i++] = 0x80 | ((code >>> 6) & 0x3f);
|
||||||
|
buffer8[i++] = 0x80 | (code & 0x3f);
|
||||||
|
} else {
|
||||||
|
code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
|
||||||
|
buffer8[i++] = 0xf0 | (code >>> 18);
|
||||||
|
buffer8[i++] = 0x80 | ((code >>> 12) & 0x3f);
|
||||||
|
buffer8[i++] = 0x80 | ((code >>> 6) & 0x3f);
|
||||||
|
buffer8[i++] = 0x80 | (code & 0x3f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
{
|
||||||
|
for (i = this.start; index < length && i < 64; ++index) {
|
||||||
|
buffer8[i++] = message[index];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.lastByteIndex = i;
|
||||||
|
this.bytes += i - this.start;
|
||||||
|
if (i >= 64) {
|
||||||
|
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;
|
||||||
|
};
|
||||||
|
|
||||||
|
Md5.prototype.finalize = function () {
|
||||||
|
if (this.finalized) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.finalized = true;
|
||||||
|
var blocks = this.blocks, i = this.lastByteIndex;
|
||||||
|
blocks[i >>> 2] |= EXTRA[i & 3];
|
||||||
|
if (i >= 56) {
|
||||||
|
if (!this.hashed) {
|
||||||
|
this.hash();
|
||||||
|
}
|
||||||
|
blocks[0] = blocks[16];
|
||||||
|
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.bytes << 3;
|
||||||
|
blocks[15] = this.hBytes << 3 | this.bytes >>> 29;
|
||||||
|
this.hash();
|
||||||
|
};
|
||||||
|
|
||||||
|
Md5.prototype.hash = function () {
|
||||||
|
var a, b, c, d, bc, da, blocks = this.blocks;
|
||||||
|
|
||||||
|
if (this.first) {
|
||||||
|
a = blocks[0] - 680876937;
|
||||||
|
a = (a << 7 | a >>> 25) - 271733879 << 0;
|
||||||
|
d = (-1732584194 ^ a & 2004318071) + blocks[1] - 117830708;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c = (-271733879 ^ (d & (a ^ -271733879))) + blocks[2] - 1126478375;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b = (a ^ (c & (d ^ a))) + blocks[3] - 1316259209;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
} else {
|
||||||
|
a = this.h0;
|
||||||
|
b = this.h1;
|
||||||
|
c = this.h2;
|
||||||
|
d = this.h3;
|
||||||
|
a += (d ^ (b & (c ^ d))) + blocks[0] - 680876936;
|
||||||
|
a = (a << 7 | a >>> 25) + b << 0;
|
||||||
|
d += (c ^ (a & (b ^ c))) + blocks[1] - 389564586;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c += (b ^ (d & (a ^ b))) + blocks[2] + 606105819;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b += (a ^ (c & (d ^ a))) + blocks[3] - 1044525330;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
a += (d ^ (b & (c ^ d))) + blocks[4] - 176418897;
|
||||||
|
a = (a << 7 | a >>> 25) + b << 0;
|
||||||
|
d += (c ^ (a & (b ^ c))) + blocks[5] + 1200080426;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c += (b ^ (d & (a ^ b))) + blocks[6] - 1473231341;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b += (a ^ (c & (d ^ a))) + blocks[7] - 45705983;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
a += (d ^ (b & (c ^ d))) + blocks[8] + 1770035416;
|
||||||
|
a = (a << 7 | a >>> 25) + b << 0;
|
||||||
|
d += (c ^ (a & (b ^ c))) + blocks[9] - 1958414417;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c += (b ^ (d & (a ^ b))) + blocks[10] - 42063;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b += (a ^ (c & (d ^ a))) + blocks[11] - 1990404162;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
a += (d ^ (b & (c ^ d))) + blocks[12] + 1804603682;
|
||||||
|
a = (a << 7 | a >>> 25) + b << 0;
|
||||||
|
d += (c ^ (a & (b ^ c))) + blocks[13] - 40341101;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c += (b ^ (d & (a ^ b))) + blocks[14] - 1502002290;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b += (a ^ (c & (d ^ a))) + blocks[15] + 1236535329;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
a += (c ^ (d & (b ^ c))) + blocks[1] - 165796510;
|
||||||
|
a = (a << 5 | a >>> 27) + b << 0;
|
||||||
|
d += (b ^ (c & (a ^ b))) + blocks[6] - 1069501632;
|
||||||
|
d = (d << 9 | d >>> 23) + a << 0;
|
||||||
|
c += (a ^ (b & (d ^ a))) + blocks[11] + 643717713;
|
||||||
|
c = (c << 14 | c >>> 18) + d << 0;
|
||||||
|
b += (d ^ (a & (c ^ d))) + blocks[0] - 373897302;
|
||||||
|
b = (b << 20 | b >>> 12) + c << 0;
|
||||||
|
a += (c ^ (d & (b ^ c))) + blocks[5] - 701558691;
|
||||||
|
a = (a << 5 | a >>> 27) + b << 0;
|
||||||
|
d += (b ^ (c & (a ^ b))) + blocks[10] + 38016083;
|
||||||
|
d = (d << 9 | d >>> 23) + a << 0;
|
||||||
|
c += (a ^ (b & (d ^ a))) + blocks[15] - 660478335;
|
||||||
|
c = (c << 14 | c >>> 18) + d << 0;
|
||||||
|
b += (d ^ (a & (c ^ d))) + blocks[4] - 405537848;
|
||||||
|
b = (b << 20 | b >>> 12) + c << 0;
|
||||||
|
a += (c ^ (d & (b ^ c))) + blocks[9] + 568446438;
|
||||||
|
a = (a << 5 | a >>> 27) + b << 0;
|
||||||
|
d += (b ^ (c & (a ^ b))) + blocks[14] - 1019803690;
|
||||||
|
d = (d << 9 | d >>> 23) + a << 0;
|
||||||
|
c += (a ^ (b & (d ^ a))) + blocks[3] - 187363961;
|
||||||
|
c = (c << 14 | c >>> 18) + d << 0;
|
||||||
|
b += (d ^ (a & (c ^ d))) + blocks[8] + 1163531501;
|
||||||
|
b = (b << 20 | b >>> 12) + c << 0;
|
||||||
|
a += (c ^ (d & (b ^ c))) + blocks[13] - 1444681467;
|
||||||
|
a = (a << 5 | a >>> 27) + b << 0;
|
||||||
|
d += (b ^ (c & (a ^ b))) + blocks[2] - 51403784;
|
||||||
|
d = (d << 9 | d >>> 23) + a << 0;
|
||||||
|
c += (a ^ (b & (d ^ a))) + blocks[7] + 1735328473;
|
||||||
|
c = (c << 14 | c >>> 18) + d << 0;
|
||||||
|
b += (d ^ (a & (c ^ d))) + blocks[12] - 1926607734;
|
||||||
|
b = (b << 20 | b >>> 12) + c << 0;
|
||||||
|
bc = b ^ c;
|
||||||
|
a += (bc ^ d) + blocks[5] - 378558;
|
||||||
|
a = (a << 4 | a >>> 28) + b << 0;
|
||||||
|
d += (bc ^ a) + blocks[8] - 2022574463;
|
||||||
|
d = (d << 11 | d >>> 21) + a << 0;
|
||||||
|
da = d ^ a;
|
||||||
|
c += (da ^ b) + blocks[11] + 1839030562;
|
||||||
|
c = (c << 16 | c >>> 16) + d << 0;
|
||||||
|
b += (da ^ c) + blocks[14] - 35309556;
|
||||||
|
b = (b << 23 | b >>> 9) + c << 0;
|
||||||
|
bc = b ^ c;
|
||||||
|
a += (bc ^ d) + blocks[1] - 1530992060;
|
||||||
|
a = (a << 4 | a >>> 28) + b << 0;
|
||||||
|
d += (bc ^ a) + blocks[4] + 1272893353;
|
||||||
|
d = (d << 11 | d >>> 21) + a << 0;
|
||||||
|
da = d ^ a;
|
||||||
|
c += (da ^ b) + blocks[7] - 155497632;
|
||||||
|
c = (c << 16 | c >>> 16) + d << 0;
|
||||||
|
b += (da ^ c) + blocks[10] - 1094730640;
|
||||||
|
b = (b << 23 | b >>> 9) + c << 0;
|
||||||
|
bc = b ^ c;
|
||||||
|
a += (bc ^ d) + blocks[13] + 681279174;
|
||||||
|
a = (a << 4 | a >>> 28) + b << 0;
|
||||||
|
d += (bc ^ a) + blocks[0] - 358537222;
|
||||||
|
d = (d << 11 | d >>> 21) + a << 0;
|
||||||
|
da = d ^ a;
|
||||||
|
c += (da ^ b) + blocks[3] - 722521979;
|
||||||
|
c = (c << 16 | c >>> 16) + d << 0;
|
||||||
|
b += (da ^ c) + blocks[6] + 76029189;
|
||||||
|
b = (b << 23 | b >>> 9) + c << 0;
|
||||||
|
bc = b ^ c;
|
||||||
|
a += (bc ^ d) + blocks[9] - 640364487;
|
||||||
|
a = (a << 4 | a >>> 28) + b << 0;
|
||||||
|
d += (bc ^ a) + blocks[12] - 421815835;
|
||||||
|
d = (d << 11 | d >>> 21) + a << 0;
|
||||||
|
da = d ^ a;
|
||||||
|
c += (da ^ b) + blocks[15] + 530742520;
|
||||||
|
c = (c << 16 | c >>> 16) + d << 0;
|
||||||
|
b += (da ^ c) + blocks[2] - 995338651;
|
||||||
|
b = (b << 23 | b >>> 9) + c << 0;
|
||||||
|
a += (c ^ (b | ~d)) + blocks[0] - 198630844;
|
||||||
|
a = (a << 6 | a >>> 26) + b << 0;
|
||||||
|
d += (b ^ (a | ~c)) + blocks[7] + 1126891415;
|
||||||
|
d = (d << 10 | d >>> 22) + a << 0;
|
||||||
|
c += (a ^ (d | ~b)) + blocks[14] - 1416354905;
|
||||||
|
c = (c << 15 | c >>> 17) + d << 0;
|
||||||
|
b += (d ^ (c | ~a)) + blocks[5] - 57434055;
|
||||||
|
b = (b << 21 | b >>> 11) + c << 0;
|
||||||
|
a += (c ^ (b | ~d)) + blocks[12] + 1700485571;
|
||||||
|
a = (a << 6 | a >>> 26) + b << 0;
|
||||||
|
d += (b ^ (a | ~c)) + blocks[3] - 1894986606;
|
||||||
|
d = (d << 10 | d >>> 22) + a << 0;
|
||||||
|
c += (a ^ (d | ~b)) + blocks[10] - 1051523;
|
||||||
|
c = (c << 15 | c >>> 17) + d << 0;
|
||||||
|
b += (d ^ (c | ~a)) + blocks[1] - 2054922799;
|
||||||
|
b = (b << 21 | b >>> 11) + c << 0;
|
||||||
|
a += (c ^ (b | ~d)) + blocks[8] + 1873313359;
|
||||||
|
a = (a << 6 | a >>> 26) + b << 0;
|
||||||
|
d += (b ^ (a | ~c)) + blocks[15] - 30611744;
|
||||||
|
d = (d << 10 | d >>> 22) + a << 0;
|
||||||
|
c += (a ^ (d | ~b)) + blocks[6] - 1560198380;
|
||||||
|
c = (c << 15 | c >>> 17) + d << 0;
|
||||||
|
b += (d ^ (c | ~a)) + blocks[13] + 1309151649;
|
||||||
|
b = (b << 21 | b >>> 11) + c << 0;
|
||||||
|
a += (c ^ (b | ~d)) + blocks[4] - 145523070;
|
||||||
|
a = (a << 6 | a >>> 26) + b << 0;
|
||||||
|
d += (b ^ (a | ~c)) + blocks[11] - 1120210379;
|
||||||
|
d = (d << 10 | d >>> 22) + a << 0;
|
||||||
|
c += (a ^ (d | ~b)) + blocks[2] + 718787259;
|
||||||
|
c = (c << 15 | c >>> 17) + d << 0;
|
||||||
|
b += (d ^ (c | ~a)) + blocks[9] - 343485551;
|
||||||
|
b = (b << 21 | b >>> 11) + c << 0;
|
||||||
|
|
||||||
|
if (this.first) {
|
||||||
|
this.h0 = a + 1732584193 << 0;
|
||||||
|
this.h1 = b - 271733879 << 0;
|
||||||
|
this.h2 = c - 1732584194 << 0;
|
||||||
|
this.h3 = d + 271733878 << 0;
|
||||||
|
this.first = false;
|
||||||
|
} else {
|
||||||
|
this.h0 = this.h0 + a << 0;
|
||||||
|
this.h1 = this.h1 + b << 0;
|
||||||
|
this.h2 = this.h2 + c << 0;
|
||||||
|
this.h3 = this.h3 + d << 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method hex
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as hex string
|
||||||
|
* @returns {String} Hex string
|
||||||
|
* @see {@link md5.hex}
|
||||||
|
* @example
|
||||||
|
* hash.hex();
|
||||||
|
*/
|
||||||
|
Md5.prototype.hex = function () {
|
||||||
|
this.finalize();
|
||||||
|
|
||||||
|
var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;
|
||||||
|
|
||||||
|
return HEX_CHARS[(h0 >>> 4) & 0x0F] + HEX_CHARS[h0 & 0x0F] +
|
||||||
|
HEX_CHARS[(h0 >>> 12) & 0x0F] + HEX_CHARS[(h0 >>> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h0 >>> 20) & 0x0F] + HEX_CHARS[(h0 >>> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h0 >>> 28) & 0x0F] + HEX_CHARS[(h0 >>> 24) & 0x0F] +
|
||||||
|
HEX_CHARS[(h1 >>> 4) & 0x0F] + HEX_CHARS[h1 & 0x0F] +
|
||||||
|
HEX_CHARS[(h1 >>> 12) & 0x0F] + HEX_CHARS[(h1 >>> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h1 >>> 20) & 0x0F] + HEX_CHARS[(h1 >>> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h1 >>> 28) & 0x0F] + HEX_CHARS[(h1 >>> 24) & 0x0F] +
|
||||||
|
HEX_CHARS[(h2 >>> 4) & 0x0F] + HEX_CHARS[h2 & 0x0F] +
|
||||||
|
HEX_CHARS[(h2 >>> 12) & 0x0F] + HEX_CHARS[(h2 >>> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h2 >>> 20) & 0x0F] + HEX_CHARS[(h2 >>> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h2 >>> 28) & 0x0F] + HEX_CHARS[(h2 >>> 24) & 0x0F] +
|
||||||
|
HEX_CHARS[(h3 >>> 4) & 0x0F] + HEX_CHARS[h3 & 0x0F] +
|
||||||
|
HEX_CHARS[(h3 >>> 12) & 0x0F] + HEX_CHARS[(h3 >>> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h3 >>> 20) & 0x0F] + HEX_CHARS[(h3 >>> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h3 >>> 28) & 0x0F] + HEX_CHARS[(h3 >>> 24) & 0x0F];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method toString
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as hex string
|
||||||
|
* @returns {String} Hex string
|
||||||
|
* @see {@link md5.hex}
|
||||||
|
* @example
|
||||||
|
* hash.toString();
|
||||||
|
*/
|
||||||
|
Md5.prototype.toString = Md5.prototype.hex;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method digest
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @see {@link md5.digest}
|
||||||
|
* @example
|
||||||
|
* hash.digest();
|
||||||
|
*/
|
||||||
|
Md5.prototype.digest = function () {
|
||||||
|
this.finalize();
|
||||||
|
|
||||||
|
var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;
|
||||||
|
return [
|
||||||
|
h0 & 0xFF, (h0 >>> 8) & 0xFF, (h0 >>> 16) & 0xFF, (h0 >>> 24) & 0xFF,
|
||||||
|
h1 & 0xFF, (h1 >>> 8) & 0xFF, (h1 >>> 16) & 0xFF, (h1 >>> 24) & 0xFF,
|
||||||
|
h2 & 0xFF, (h2 >>> 8) & 0xFF, (h2 >>> 16) & 0xFF, (h2 >>> 24) & 0xFF,
|
||||||
|
h3 & 0xFF, (h3 >>> 8) & 0xFF, (h3 >>> 16) & 0xFF, (h3 >>> 24) & 0xFF
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method array
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @see {@link md5.array}
|
||||||
|
* @example
|
||||||
|
* hash.array();
|
||||||
|
*/
|
||||||
|
Md5.prototype.array = Md5.prototype.digest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method arrayBuffer
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @see {@link md5.arrayBuffer}
|
||||||
|
* @example
|
||||||
|
* hash.arrayBuffer();
|
||||||
|
*/
|
||||||
|
Md5.prototype.arrayBuffer = function () {
|
||||||
|
this.finalize();
|
||||||
|
|
||||||
|
var buffer = new ArrayBuffer(16);
|
||||||
|
var blocks = new Uint32Array(buffer);
|
||||||
|
blocks[0] = this.h0;
|
||||||
|
blocks[1] = this.h1;
|
||||||
|
blocks[2] = this.h2;
|
||||||
|
blocks[3] = this.h3;
|
||||||
|
return buffer;
|
||||||
|
};
|
||||||
|
|
||||||
|
var exports = createMethod();
|
||||||
|
exports.md5 = exports;
|
||||||
|
|
||||||
|
if (COMMON_JS) {
|
||||||
|
module.exports = exports;
|
||||||
|
} else {
|
||||||
|
/**
|
||||||
|
* @method md5
|
||||||
|
* @description Md5 hash function, export to global in browsers.
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} md5 hashes
|
||||||
|
* @example
|
||||||
|
* md5(''); // d41d8cd98f00b204e9800998ecf8427e
|
||||||
|
* md5('The quick brown fox jumps over the lazy dog'); // 9e107d9d372bb6826bd81d3542a419d6
|
||||||
|
* md5('The quick brown fox jumps over the lazy dog.'); // e4d909c290d0fb1ca068ffaddf22cbd0
|
||||||
|
*
|
||||||
|
* // It also supports UTF-8 encoding
|
||||||
|
* md5('中文'); // a7bac2239fcdcb3a067903d8077c4a07
|
||||||
|
*
|
||||||
|
* // It also supports byte `Array`, `Uint8Array`, `ArrayBuffer`
|
||||||
|
* md5([]); // d41d8cd98f00b204e9800998ecf8427e
|
||||||
|
* md5(new Uint8Array([])); // d41d8cd98f00b204e9800998ecf8427e
|
||||||
|
*/
|
||||||
|
root.md5 = exports;
|
||||||
|
if (AMD) {
|
||||||
|
define(function () {
|
||||||
|
return exports;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})();
|
||||||
Vendored
+10
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,589 @@
|
|||||||
|
function getDefaultExportFromCjs (x) {
|
||||||
|
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
|
||||||
|
}
|
||||||
|
|
||||||
|
var md5$1 = {exports: {}};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* [js-md5]{@link https://github.com/emn178/js-md5}
|
||||||
|
*
|
||||||
|
* @namespace md5
|
||||||
|
* @version 0.9.0
|
||||||
|
* @author Chen, Yi-Cyuan [emn178@gmail.com]
|
||||||
|
* @copyright Chen, Yi-Cyuan 2014-2026
|
||||||
|
* @license MIT
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function (module) {
|
||||||
|
(function () {
|
||||||
|
|
||||||
|
var INPUT_ERROR = 'input is invalid type';
|
||||||
|
var FINALIZE_ERROR = 'finalize already called';
|
||||||
|
var WINDOW = typeof window === 'object';
|
||||||
|
var root = WINDOW ? window : {};
|
||||||
|
if (root.JS_MD5_NO_WINDOW) {
|
||||||
|
WINDOW = false;
|
||||||
|
}
|
||||||
|
var WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && typeof self !== 'undefined' && self instanceof WorkerGlobalScope;
|
||||||
|
if (WEB_WORKER) {
|
||||||
|
root = self;
|
||||||
|
}
|
||||||
|
var COMMON_JS = !root.JS_MD5_NO_COMMON_JS && 'object' === 'object' && module.exports;
|
||||||
|
var HEX_CHARS = '0123456789abcdef'.split('');
|
||||||
|
var EXTRA = [128, 32768, 8388608, -2147483648];
|
||||||
|
var OUTPUT_TYPES = ['hex', 'array', 'digest', 'arrayBuffer'];
|
||||||
|
|
||||||
|
var blocks = [], buffer8;
|
||||||
|
{
|
||||||
|
var buffer = new ArrayBuffer(68);
|
||||||
|
buffer8 = new Uint8Array(buffer);
|
||||||
|
blocks = new Uint32Array(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
var isArray = Array.isArray;
|
||||||
|
|
||||||
|
var isView = ArrayBuffer.isView;
|
||||||
|
|
||||||
|
// [message: string, isString: bool]
|
||||||
|
var formatMessage = function (message) {
|
||||||
|
var type = typeof message;
|
||||||
|
if (type === 'string') {
|
||||||
|
return [message, true];
|
||||||
|
}
|
||||||
|
if (type !== 'object' || message === null) {
|
||||||
|
throw new Error(INPUT_ERROR);
|
||||||
|
}
|
||||||
|
if (message.constructor === ArrayBuffer) {
|
||||||
|
return [new Uint8Array(message), false];
|
||||||
|
}
|
||||||
|
if (!isArray(message) && !isView(message)) {
|
||||||
|
throw new Error(INPUT_ERROR);
|
||||||
|
}
|
||||||
|
return [message, false];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method hex
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as hex string
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} Hex string
|
||||||
|
* @example
|
||||||
|
* md5.hex('The quick brown fox jumps over the lazy dog');
|
||||||
|
* // equal to
|
||||||
|
* md5('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method digest
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @example
|
||||||
|
* md5.digest('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method array
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @example
|
||||||
|
* md5.array('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method arrayBuffer
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @example
|
||||||
|
* md5.arrayBuffer('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method buffer
|
||||||
|
* @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @example
|
||||||
|
* md5.buffer('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method base64
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as base64 string
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} base64 string
|
||||||
|
* @example
|
||||||
|
* md5.base64('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
var createOutputMethod = function (outputType) {
|
||||||
|
return function (message) {
|
||||||
|
return new Md5(true).update(message)[outputType]();
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method create
|
||||||
|
* @memberof md5
|
||||||
|
* @description Create Md5 object
|
||||||
|
* @returns {Md5} Md5 object.
|
||||||
|
* @example
|
||||||
|
* var hash = md5.create();
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method update
|
||||||
|
* @memberof md5
|
||||||
|
* @description Create and update Md5 object
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Md5} Md5 object.
|
||||||
|
* @example
|
||||||
|
* var hash = md5.update('The quick brown fox jumps over the lazy dog');
|
||||||
|
* // equal to
|
||||||
|
* var hash = md5.create();
|
||||||
|
* hash.update('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
var createMethod = function () {
|
||||||
|
var method = createOutputMethod('hex');
|
||||||
|
method.create = function () {
|
||||||
|
return new Md5();
|
||||||
|
};
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
return method;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Md5 class
|
||||||
|
* @class Md5
|
||||||
|
* @description This is internal class.
|
||||||
|
* @see {@link md5.create}
|
||||||
|
*/
|
||||||
|
function Md5(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;
|
||||||
|
this.buffer8 = buffer8;
|
||||||
|
} else {
|
||||||
|
{
|
||||||
|
var buffer = new ArrayBuffer(68);
|
||||||
|
this.buffer8 = new Uint8Array(buffer);
|
||||||
|
this.blocks = new Uint32Array(buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.h0 = this.h1 = this.h2 = this.h3 = this.start = this.bytes = this.hBytes = 0;
|
||||||
|
this.finalized = this.hashed = false;
|
||||||
|
this.first = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method update
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Update hash
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Md5} Md5 object.
|
||||||
|
* @see {@link md5.update}
|
||||||
|
*/
|
||||||
|
Md5.prototype.update = function (message) {
|
||||||
|
if (this.finalized) {
|
||||||
|
throw new Error(FINALIZE_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
var result = formatMessage(message);
|
||||||
|
message = result[0];
|
||||||
|
var isString = result[1];
|
||||||
|
var code, index = 0, i, length = message.length, blocks = this.blocks;
|
||||||
|
var buffer8 = this.buffer8;
|
||||||
|
|
||||||
|
while (index < length) {
|
||||||
|
if (this.hashed) {
|
||||||
|
this.hashed = false;
|
||||||
|
blocks[0] = blocks[16];
|
||||||
|
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 (isString) {
|
||||||
|
{
|
||||||
|
for (i = this.start; index < length && i < 64; ++index) {
|
||||||
|
code = message.charCodeAt(index);
|
||||||
|
if (code < 0x80) {
|
||||||
|
buffer8[i++] = code;
|
||||||
|
} else if (code < 0x800) {
|
||||||
|
buffer8[i++] = 0xc0 | (code >>> 6);
|
||||||
|
buffer8[i++] = 0x80 | (code & 0x3f);
|
||||||
|
} else if (code < 0xd800 || code >= 0xe000) {
|
||||||
|
buffer8[i++] = 0xe0 | (code >>> 12);
|
||||||
|
buffer8[i++] = 0x80 | ((code >>> 6) & 0x3f);
|
||||||
|
buffer8[i++] = 0x80 | (code & 0x3f);
|
||||||
|
} else {
|
||||||
|
code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
|
||||||
|
buffer8[i++] = 0xf0 | (code >>> 18);
|
||||||
|
buffer8[i++] = 0x80 | ((code >>> 12) & 0x3f);
|
||||||
|
buffer8[i++] = 0x80 | ((code >>> 6) & 0x3f);
|
||||||
|
buffer8[i++] = 0x80 | (code & 0x3f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
{
|
||||||
|
for (i = this.start; index < length && i < 64; ++index) {
|
||||||
|
buffer8[i++] = message[index];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.lastByteIndex = i;
|
||||||
|
this.bytes += i - this.start;
|
||||||
|
if (i >= 64) {
|
||||||
|
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;
|
||||||
|
};
|
||||||
|
|
||||||
|
Md5.prototype.finalize = function () {
|
||||||
|
if (this.finalized) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.finalized = true;
|
||||||
|
var blocks = this.blocks, i = this.lastByteIndex;
|
||||||
|
blocks[i >>> 2] |= EXTRA[i & 3];
|
||||||
|
if (i >= 56) {
|
||||||
|
if (!this.hashed) {
|
||||||
|
this.hash();
|
||||||
|
}
|
||||||
|
blocks[0] = blocks[16];
|
||||||
|
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.bytes << 3;
|
||||||
|
blocks[15] = this.hBytes << 3 | this.bytes >>> 29;
|
||||||
|
this.hash();
|
||||||
|
};
|
||||||
|
|
||||||
|
Md5.prototype.hash = function () {
|
||||||
|
var a, b, c, d, bc, da, blocks = this.blocks;
|
||||||
|
|
||||||
|
if (this.first) {
|
||||||
|
a = blocks[0] - 680876937;
|
||||||
|
a = (a << 7 | a >>> 25) - 271733879 << 0;
|
||||||
|
d = (-1732584194 ^ a & 2004318071) + blocks[1] - 117830708;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c = (-271733879 ^ (d & (a ^ -271733879))) + blocks[2] - 1126478375;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b = (a ^ (c & (d ^ a))) + blocks[3] - 1316259209;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
} else {
|
||||||
|
a = this.h0;
|
||||||
|
b = this.h1;
|
||||||
|
c = this.h2;
|
||||||
|
d = this.h3;
|
||||||
|
a += (d ^ (b & (c ^ d))) + blocks[0] - 680876936;
|
||||||
|
a = (a << 7 | a >>> 25) + b << 0;
|
||||||
|
d += (c ^ (a & (b ^ c))) + blocks[1] - 389564586;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c += (b ^ (d & (a ^ b))) + blocks[2] + 606105819;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b += (a ^ (c & (d ^ a))) + blocks[3] - 1044525330;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
a += (d ^ (b & (c ^ d))) + blocks[4] - 176418897;
|
||||||
|
a = (a << 7 | a >>> 25) + b << 0;
|
||||||
|
d += (c ^ (a & (b ^ c))) + blocks[5] + 1200080426;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c += (b ^ (d & (a ^ b))) + blocks[6] - 1473231341;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b += (a ^ (c & (d ^ a))) + blocks[7] - 45705983;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
a += (d ^ (b & (c ^ d))) + blocks[8] + 1770035416;
|
||||||
|
a = (a << 7 | a >>> 25) + b << 0;
|
||||||
|
d += (c ^ (a & (b ^ c))) + blocks[9] - 1958414417;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c += (b ^ (d & (a ^ b))) + blocks[10] - 42063;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b += (a ^ (c & (d ^ a))) + blocks[11] - 1990404162;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
a += (d ^ (b & (c ^ d))) + blocks[12] + 1804603682;
|
||||||
|
a = (a << 7 | a >>> 25) + b << 0;
|
||||||
|
d += (c ^ (a & (b ^ c))) + blocks[13] - 40341101;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c += (b ^ (d & (a ^ b))) + blocks[14] - 1502002290;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b += (a ^ (c & (d ^ a))) + blocks[15] + 1236535329;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
a += (c ^ (d & (b ^ c))) + blocks[1] - 165796510;
|
||||||
|
a = (a << 5 | a >>> 27) + b << 0;
|
||||||
|
d += (b ^ (c & (a ^ b))) + blocks[6] - 1069501632;
|
||||||
|
d = (d << 9 | d >>> 23) + a << 0;
|
||||||
|
c += (a ^ (b & (d ^ a))) + blocks[11] + 643717713;
|
||||||
|
c = (c << 14 | c >>> 18) + d << 0;
|
||||||
|
b += (d ^ (a & (c ^ d))) + blocks[0] - 373897302;
|
||||||
|
b = (b << 20 | b >>> 12) + c << 0;
|
||||||
|
a += (c ^ (d & (b ^ c))) + blocks[5] - 701558691;
|
||||||
|
a = (a << 5 | a >>> 27) + b << 0;
|
||||||
|
d += (b ^ (c & (a ^ b))) + blocks[10] + 38016083;
|
||||||
|
d = (d << 9 | d >>> 23) + a << 0;
|
||||||
|
c += (a ^ (b & (d ^ a))) + blocks[15] - 660478335;
|
||||||
|
c = (c << 14 | c >>> 18) + d << 0;
|
||||||
|
b += (d ^ (a & (c ^ d))) + blocks[4] - 405537848;
|
||||||
|
b = (b << 20 | b >>> 12) + c << 0;
|
||||||
|
a += (c ^ (d & (b ^ c))) + blocks[9] + 568446438;
|
||||||
|
a = (a << 5 | a >>> 27) + b << 0;
|
||||||
|
d += (b ^ (c & (a ^ b))) + blocks[14] - 1019803690;
|
||||||
|
d = (d << 9 | d >>> 23) + a << 0;
|
||||||
|
c += (a ^ (b & (d ^ a))) + blocks[3] - 187363961;
|
||||||
|
c = (c << 14 | c >>> 18) + d << 0;
|
||||||
|
b += (d ^ (a & (c ^ d))) + blocks[8] + 1163531501;
|
||||||
|
b = (b << 20 | b >>> 12) + c << 0;
|
||||||
|
a += (c ^ (d & (b ^ c))) + blocks[13] - 1444681467;
|
||||||
|
a = (a << 5 | a >>> 27) + b << 0;
|
||||||
|
d += (b ^ (c & (a ^ b))) + blocks[2] - 51403784;
|
||||||
|
d = (d << 9 | d >>> 23) + a << 0;
|
||||||
|
c += (a ^ (b & (d ^ a))) + blocks[7] + 1735328473;
|
||||||
|
c = (c << 14 | c >>> 18) + d << 0;
|
||||||
|
b += (d ^ (a & (c ^ d))) + blocks[12] - 1926607734;
|
||||||
|
b = (b << 20 | b >>> 12) + c << 0;
|
||||||
|
bc = b ^ c;
|
||||||
|
a += (bc ^ d) + blocks[5] - 378558;
|
||||||
|
a = (a << 4 | a >>> 28) + b << 0;
|
||||||
|
d += (bc ^ a) + blocks[8] - 2022574463;
|
||||||
|
d = (d << 11 | d >>> 21) + a << 0;
|
||||||
|
da = d ^ a;
|
||||||
|
c += (da ^ b) + blocks[11] + 1839030562;
|
||||||
|
c = (c << 16 | c >>> 16) + d << 0;
|
||||||
|
b += (da ^ c) + blocks[14] - 35309556;
|
||||||
|
b = (b << 23 | b >>> 9) + c << 0;
|
||||||
|
bc = b ^ c;
|
||||||
|
a += (bc ^ d) + blocks[1] - 1530992060;
|
||||||
|
a = (a << 4 | a >>> 28) + b << 0;
|
||||||
|
d += (bc ^ a) + blocks[4] + 1272893353;
|
||||||
|
d = (d << 11 | d >>> 21) + a << 0;
|
||||||
|
da = d ^ a;
|
||||||
|
c += (da ^ b) + blocks[7] - 155497632;
|
||||||
|
c = (c << 16 | c >>> 16) + d << 0;
|
||||||
|
b += (da ^ c) + blocks[10] - 1094730640;
|
||||||
|
b = (b << 23 | b >>> 9) + c << 0;
|
||||||
|
bc = b ^ c;
|
||||||
|
a += (bc ^ d) + blocks[13] + 681279174;
|
||||||
|
a = (a << 4 | a >>> 28) + b << 0;
|
||||||
|
d += (bc ^ a) + blocks[0] - 358537222;
|
||||||
|
d = (d << 11 | d >>> 21) + a << 0;
|
||||||
|
da = d ^ a;
|
||||||
|
c += (da ^ b) + blocks[3] - 722521979;
|
||||||
|
c = (c << 16 | c >>> 16) + d << 0;
|
||||||
|
b += (da ^ c) + blocks[6] + 76029189;
|
||||||
|
b = (b << 23 | b >>> 9) + c << 0;
|
||||||
|
bc = b ^ c;
|
||||||
|
a += (bc ^ d) + blocks[9] - 640364487;
|
||||||
|
a = (a << 4 | a >>> 28) + b << 0;
|
||||||
|
d += (bc ^ a) + blocks[12] - 421815835;
|
||||||
|
d = (d << 11 | d >>> 21) + a << 0;
|
||||||
|
da = d ^ a;
|
||||||
|
c += (da ^ b) + blocks[15] + 530742520;
|
||||||
|
c = (c << 16 | c >>> 16) + d << 0;
|
||||||
|
b += (da ^ c) + blocks[2] - 995338651;
|
||||||
|
b = (b << 23 | b >>> 9) + c << 0;
|
||||||
|
a += (c ^ (b | ~d)) + blocks[0] - 198630844;
|
||||||
|
a = (a << 6 | a >>> 26) + b << 0;
|
||||||
|
d += (b ^ (a | ~c)) + blocks[7] + 1126891415;
|
||||||
|
d = (d << 10 | d >>> 22) + a << 0;
|
||||||
|
c += (a ^ (d | ~b)) + blocks[14] - 1416354905;
|
||||||
|
c = (c << 15 | c >>> 17) + d << 0;
|
||||||
|
b += (d ^ (c | ~a)) + blocks[5] - 57434055;
|
||||||
|
b = (b << 21 | b >>> 11) + c << 0;
|
||||||
|
a += (c ^ (b | ~d)) + blocks[12] + 1700485571;
|
||||||
|
a = (a << 6 | a >>> 26) + b << 0;
|
||||||
|
d += (b ^ (a | ~c)) + blocks[3] - 1894986606;
|
||||||
|
d = (d << 10 | d >>> 22) + a << 0;
|
||||||
|
c += (a ^ (d | ~b)) + blocks[10] - 1051523;
|
||||||
|
c = (c << 15 | c >>> 17) + d << 0;
|
||||||
|
b += (d ^ (c | ~a)) + blocks[1] - 2054922799;
|
||||||
|
b = (b << 21 | b >>> 11) + c << 0;
|
||||||
|
a += (c ^ (b | ~d)) + blocks[8] + 1873313359;
|
||||||
|
a = (a << 6 | a >>> 26) + b << 0;
|
||||||
|
d += (b ^ (a | ~c)) + blocks[15] - 30611744;
|
||||||
|
d = (d << 10 | d >>> 22) + a << 0;
|
||||||
|
c += (a ^ (d | ~b)) + blocks[6] - 1560198380;
|
||||||
|
c = (c << 15 | c >>> 17) + d << 0;
|
||||||
|
b += (d ^ (c | ~a)) + blocks[13] + 1309151649;
|
||||||
|
b = (b << 21 | b >>> 11) + c << 0;
|
||||||
|
a += (c ^ (b | ~d)) + blocks[4] - 145523070;
|
||||||
|
a = (a << 6 | a >>> 26) + b << 0;
|
||||||
|
d += (b ^ (a | ~c)) + blocks[11] - 1120210379;
|
||||||
|
d = (d << 10 | d >>> 22) + a << 0;
|
||||||
|
c += (a ^ (d | ~b)) + blocks[2] + 718787259;
|
||||||
|
c = (c << 15 | c >>> 17) + d << 0;
|
||||||
|
b += (d ^ (c | ~a)) + blocks[9] - 343485551;
|
||||||
|
b = (b << 21 | b >>> 11) + c << 0;
|
||||||
|
|
||||||
|
if (this.first) {
|
||||||
|
this.h0 = a + 1732584193 << 0;
|
||||||
|
this.h1 = b - 271733879 << 0;
|
||||||
|
this.h2 = c - 1732584194 << 0;
|
||||||
|
this.h3 = d + 271733878 << 0;
|
||||||
|
this.first = false;
|
||||||
|
} else {
|
||||||
|
this.h0 = this.h0 + a << 0;
|
||||||
|
this.h1 = this.h1 + b << 0;
|
||||||
|
this.h2 = this.h2 + c << 0;
|
||||||
|
this.h3 = this.h3 + d << 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method hex
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as hex string
|
||||||
|
* @returns {String} Hex string
|
||||||
|
* @see {@link md5.hex}
|
||||||
|
* @example
|
||||||
|
* hash.hex();
|
||||||
|
*/
|
||||||
|
Md5.prototype.hex = function () {
|
||||||
|
this.finalize();
|
||||||
|
|
||||||
|
var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;
|
||||||
|
|
||||||
|
return HEX_CHARS[(h0 >>> 4) & 0x0F] + HEX_CHARS[h0 & 0x0F] +
|
||||||
|
HEX_CHARS[(h0 >>> 12) & 0x0F] + HEX_CHARS[(h0 >>> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h0 >>> 20) & 0x0F] + HEX_CHARS[(h0 >>> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h0 >>> 28) & 0x0F] + HEX_CHARS[(h0 >>> 24) & 0x0F] +
|
||||||
|
HEX_CHARS[(h1 >>> 4) & 0x0F] + HEX_CHARS[h1 & 0x0F] +
|
||||||
|
HEX_CHARS[(h1 >>> 12) & 0x0F] + HEX_CHARS[(h1 >>> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h1 >>> 20) & 0x0F] + HEX_CHARS[(h1 >>> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h1 >>> 28) & 0x0F] + HEX_CHARS[(h1 >>> 24) & 0x0F] +
|
||||||
|
HEX_CHARS[(h2 >>> 4) & 0x0F] + HEX_CHARS[h2 & 0x0F] +
|
||||||
|
HEX_CHARS[(h2 >>> 12) & 0x0F] + HEX_CHARS[(h2 >>> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h2 >>> 20) & 0x0F] + HEX_CHARS[(h2 >>> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h2 >>> 28) & 0x0F] + HEX_CHARS[(h2 >>> 24) & 0x0F] +
|
||||||
|
HEX_CHARS[(h3 >>> 4) & 0x0F] + HEX_CHARS[h3 & 0x0F] +
|
||||||
|
HEX_CHARS[(h3 >>> 12) & 0x0F] + HEX_CHARS[(h3 >>> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h3 >>> 20) & 0x0F] + HEX_CHARS[(h3 >>> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h3 >>> 28) & 0x0F] + HEX_CHARS[(h3 >>> 24) & 0x0F];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method toString
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as hex string
|
||||||
|
* @returns {String} Hex string
|
||||||
|
* @see {@link md5.hex}
|
||||||
|
* @example
|
||||||
|
* hash.toString();
|
||||||
|
*/
|
||||||
|
Md5.prototype.toString = Md5.prototype.hex;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method digest
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @see {@link md5.digest}
|
||||||
|
* @example
|
||||||
|
* hash.digest();
|
||||||
|
*/
|
||||||
|
Md5.prototype.digest = function () {
|
||||||
|
this.finalize();
|
||||||
|
|
||||||
|
var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;
|
||||||
|
return [
|
||||||
|
h0 & 0xFF, (h0 >>> 8) & 0xFF, (h0 >>> 16) & 0xFF, (h0 >>> 24) & 0xFF,
|
||||||
|
h1 & 0xFF, (h1 >>> 8) & 0xFF, (h1 >>> 16) & 0xFF, (h1 >>> 24) & 0xFF,
|
||||||
|
h2 & 0xFF, (h2 >>> 8) & 0xFF, (h2 >>> 16) & 0xFF, (h2 >>> 24) & 0xFF,
|
||||||
|
h3 & 0xFF, (h3 >>> 8) & 0xFF, (h3 >>> 16) & 0xFF, (h3 >>> 24) & 0xFF
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method array
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @see {@link md5.array}
|
||||||
|
* @example
|
||||||
|
* hash.array();
|
||||||
|
*/
|
||||||
|
Md5.prototype.array = Md5.prototype.digest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method arrayBuffer
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @see {@link md5.arrayBuffer}
|
||||||
|
* @example
|
||||||
|
* hash.arrayBuffer();
|
||||||
|
*/
|
||||||
|
Md5.prototype.arrayBuffer = function () {
|
||||||
|
this.finalize();
|
||||||
|
|
||||||
|
var buffer = new ArrayBuffer(16);
|
||||||
|
var blocks = new Uint32Array(buffer);
|
||||||
|
blocks[0] = this.h0;
|
||||||
|
blocks[1] = this.h1;
|
||||||
|
blocks[2] = this.h2;
|
||||||
|
blocks[3] = this.h3;
|
||||||
|
return buffer;
|
||||||
|
};
|
||||||
|
|
||||||
|
var exports = createMethod();
|
||||||
|
exports.md5 = exports;
|
||||||
|
|
||||||
|
if (COMMON_JS) {
|
||||||
|
module.exports = exports;
|
||||||
|
} else {
|
||||||
|
/**
|
||||||
|
* @method md5
|
||||||
|
* @description Md5 hash function, export to global in browsers.
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} md5 hashes
|
||||||
|
* @example
|
||||||
|
* md5(''); // d41d8cd98f00b204e9800998ecf8427e
|
||||||
|
* md5('The quick brown fox jumps over the lazy dog'); // 9e107d9d372bb6826bd81d3542a419d6
|
||||||
|
* md5('The quick brown fox jumps over the lazy dog.'); // e4d909c290d0fb1ca068ffaddf22cbd0
|
||||||
|
*
|
||||||
|
* // It also supports UTF-8 encoding
|
||||||
|
* md5('中文'); // a7bac2239fcdcb3a067903d8077c4a07
|
||||||
|
*
|
||||||
|
* // It also supports byte `Array`, `Uint8Array`, `ArrayBuffer`
|
||||||
|
* md5([]); // d41d8cd98f00b204e9800998ecf8427e
|
||||||
|
* md5(new Uint8Array([])); // d41d8cd98f00b204e9800998ecf8427e
|
||||||
|
*/
|
||||||
|
root.md5 = exports;
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
} (md5$1));
|
||||||
|
|
||||||
|
var md5Exports = md5$1.exports;
|
||||||
|
var md5 = /*@__PURE__*/getDefaultExportFromCjs(md5Exports);
|
||||||
|
|
||||||
|
export { md5 as default, md5 };
|
||||||
@@ -0,0 +1,625 @@
|
|||||||
|
import require$$0 from 'crypto';
|
||||||
|
import require$$1 from 'buffer';
|
||||||
|
|
||||||
|
var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
|
||||||
|
|
||||||
|
function getDefaultExportFromCjs (x) {
|
||||||
|
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
|
||||||
|
}
|
||||||
|
|
||||||
|
var md5$1 = {exports: {}};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* [js-md5]{@link https://github.com/emn178/js-md5}
|
||||||
|
*
|
||||||
|
* @namespace md5
|
||||||
|
* @version 0.9.0
|
||||||
|
* @author Chen, Yi-Cyuan [emn178@gmail.com]
|
||||||
|
* @copyright Chen, Yi-Cyuan 2014-2026
|
||||||
|
* @license MIT
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function (module) {
|
||||||
|
(function () {
|
||||||
|
|
||||||
|
var INPUT_ERROR = 'input is invalid type';
|
||||||
|
var FINALIZE_ERROR = 'finalize already called';
|
||||||
|
var WINDOW = typeof window === 'object';
|
||||||
|
var root = WINDOW ? window : {};
|
||||||
|
if (root.JS_MD5_NO_WINDOW) {
|
||||||
|
WINDOW = false;
|
||||||
|
}
|
||||||
|
var WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && typeof self !== 'undefined' && self instanceof WorkerGlobalScope;
|
||||||
|
/* istanbul ignore next */
|
||||||
|
var NODE_JS = !root.JS_MD5_NO_NODE_JS && !WINDOW && typeof process === 'object' && process.versions && process.versions.node;
|
||||||
|
if (NODE_JS) {
|
||||||
|
root = commonjsGlobal;
|
||||||
|
} else if (WEB_WORKER) {
|
||||||
|
root = self;
|
||||||
|
}
|
||||||
|
var COMMON_JS = !root.JS_MD5_NO_COMMON_JS && 'object' === 'object' && module.exports;
|
||||||
|
var HEX_CHARS = '0123456789abcdef'.split('');
|
||||||
|
var EXTRA = [128, 32768, 8388608, -2147483648];
|
||||||
|
var OUTPUT_TYPES = ['hex', 'array', 'digest', 'arrayBuffer'];
|
||||||
|
|
||||||
|
var blocks = [], buffer8;
|
||||||
|
{
|
||||||
|
var buffer = new ArrayBuffer(68);
|
||||||
|
buffer8 = new Uint8Array(buffer);
|
||||||
|
blocks = new Uint32Array(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
var isArray = Array.isArray;
|
||||||
|
|
||||||
|
var isView = ArrayBuffer.isView;
|
||||||
|
|
||||||
|
// [message: string, isString: bool]
|
||||||
|
var formatMessage = function (message) {
|
||||||
|
var type = typeof message;
|
||||||
|
if (type === 'string') {
|
||||||
|
return [message, true];
|
||||||
|
}
|
||||||
|
if (type !== 'object' || message === null) {
|
||||||
|
throw new Error(INPUT_ERROR);
|
||||||
|
}
|
||||||
|
if (message.constructor === ArrayBuffer) {
|
||||||
|
return [new Uint8Array(message), false];
|
||||||
|
}
|
||||||
|
if (!isArray(message) && !isView(message)) {
|
||||||
|
throw new Error(INPUT_ERROR);
|
||||||
|
}
|
||||||
|
return [message, false];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method hex
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as hex string
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} Hex string
|
||||||
|
* @example
|
||||||
|
* md5.hex('The quick brown fox jumps over the lazy dog');
|
||||||
|
* // equal to
|
||||||
|
* md5('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method digest
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @example
|
||||||
|
* md5.digest('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method array
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @example
|
||||||
|
* md5.array('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method arrayBuffer
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @example
|
||||||
|
* md5.arrayBuffer('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method buffer
|
||||||
|
* @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @example
|
||||||
|
* md5.buffer('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method base64
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as base64 string
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} base64 string
|
||||||
|
* @example
|
||||||
|
* md5.base64('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
var createOutputMethod = function (outputType) {
|
||||||
|
return function (message) {
|
||||||
|
return new Md5(true).update(message)[outputType]();
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method create
|
||||||
|
* @memberof md5
|
||||||
|
* @description Create Md5 object
|
||||||
|
* @returns {Md5} Md5 object.
|
||||||
|
* @example
|
||||||
|
* var hash = md5.create();
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method update
|
||||||
|
* @memberof md5
|
||||||
|
* @description Create and update Md5 object
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Md5} Md5 object.
|
||||||
|
* @example
|
||||||
|
* var hash = md5.update('The quick brown fox jumps over the lazy dog');
|
||||||
|
* // equal to
|
||||||
|
* var hash = md5.create();
|
||||||
|
* hash.update('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
var createMethod = function () {
|
||||||
|
var method = createOutputMethod('hex');
|
||||||
|
if (NODE_JS) {
|
||||||
|
method = nodeWrap(method);
|
||||||
|
}
|
||||||
|
method.create = function () {
|
||||||
|
return new Md5();
|
||||||
|
};
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
return method;
|
||||||
|
};
|
||||||
|
|
||||||
|
var nodeWrap = function (method) {
|
||||||
|
var crypto = require$$0;
|
||||||
|
var Buffer = require$$1.Buffer;
|
||||||
|
var bufferFrom = Buffer.from;
|
||||||
|
var nodeMethod = function (message) {
|
||||||
|
if (typeof message === 'string') {
|
||||||
|
return crypto.createHash('md5').update(message, 'utf8').digest('hex');
|
||||||
|
} else {
|
||||||
|
if (message === null || message === undefined) {
|
||||||
|
throw new Error(INPUT_ERROR);
|
||||||
|
} else if (message.constructor === ArrayBuffer) {
|
||||||
|
message = new Uint8Array(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isArray(message) || isView(message) ||
|
||||||
|
message.constructor === Buffer) {
|
||||||
|
return crypto.createHash('md5').update(bufferFrom(message)).digest('hex');
|
||||||
|
} else {
|
||||||
|
return method(message);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
return nodeMethod;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Md5 class
|
||||||
|
* @class Md5
|
||||||
|
* @description This is internal class.
|
||||||
|
* @see {@link md5.create}
|
||||||
|
*/
|
||||||
|
function Md5(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;
|
||||||
|
this.buffer8 = buffer8;
|
||||||
|
} else {
|
||||||
|
{
|
||||||
|
var buffer = new ArrayBuffer(68);
|
||||||
|
this.buffer8 = new Uint8Array(buffer);
|
||||||
|
this.blocks = new Uint32Array(buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.h0 = this.h1 = this.h2 = this.h3 = this.start = this.bytes = this.hBytes = 0;
|
||||||
|
this.finalized = this.hashed = false;
|
||||||
|
this.first = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method update
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Update hash
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Md5} Md5 object.
|
||||||
|
* @see {@link md5.update}
|
||||||
|
*/
|
||||||
|
Md5.prototype.update = function (message) {
|
||||||
|
if (this.finalized) {
|
||||||
|
throw new Error(FINALIZE_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
var result = formatMessage(message);
|
||||||
|
message = result[0];
|
||||||
|
var isString = result[1];
|
||||||
|
var code, index = 0, i, length = message.length, blocks = this.blocks;
|
||||||
|
var buffer8 = this.buffer8;
|
||||||
|
|
||||||
|
while (index < length) {
|
||||||
|
if (this.hashed) {
|
||||||
|
this.hashed = false;
|
||||||
|
blocks[0] = blocks[16];
|
||||||
|
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 (isString) {
|
||||||
|
{
|
||||||
|
for (i = this.start; index < length && i < 64; ++index) {
|
||||||
|
code = message.charCodeAt(index);
|
||||||
|
if (code < 0x80) {
|
||||||
|
buffer8[i++] = code;
|
||||||
|
} else if (code < 0x800) {
|
||||||
|
buffer8[i++] = 0xc0 | (code >>> 6);
|
||||||
|
buffer8[i++] = 0x80 | (code & 0x3f);
|
||||||
|
} else if (code < 0xd800 || code >= 0xe000) {
|
||||||
|
buffer8[i++] = 0xe0 | (code >>> 12);
|
||||||
|
buffer8[i++] = 0x80 | ((code >>> 6) & 0x3f);
|
||||||
|
buffer8[i++] = 0x80 | (code & 0x3f);
|
||||||
|
} else {
|
||||||
|
code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
|
||||||
|
buffer8[i++] = 0xf0 | (code >>> 18);
|
||||||
|
buffer8[i++] = 0x80 | ((code >>> 12) & 0x3f);
|
||||||
|
buffer8[i++] = 0x80 | ((code >>> 6) & 0x3f);
|
||||||
|
buffer8[i++] = 0x80 | (code & 0x3f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
{
|
||||||
|
for (i = this.start; index < length && i < 64; ++index) {
|
||||||
|
buffer8[i++] = message[index];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.lastByteIndex = i;
|
||||||
|
this.bytes += i - this.start;
|
||||||
|
if (i >= 64) {
|
||||||
|
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;
|
||||||
|
};
|
||||||
|
|
||||||
|
Md5.prototype.finalize = function () {
|
||||||
|
if (this.finalized) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.finalized = true;
|
||||||
|
var blocks = this.blocks, i = this.lastByteIndex;
|
||||||
|
blocks[i >>> 2] |= EXTRA[i & 3];
|
||||||
|
if (i >= 56) {
|
||||||
|
if (!this.hashed) {
|
||||||
|
this.hash();
|
||||||
|
}
|
||||||
|
blocks[0] = blocks[16];
|
||||||
|
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.bytes << 3;
|
||||||
|
blocks[15] = this.hBytes << 3 | this.bytes >>> 29;
|
||||||
|
this.hash();
|
||||||
|
};
|
||||||
|
|
||||||
|
Md5.prototype.hash = function () {
|
||||||
|
var a, b, c, d, bc, da, blocks = this.blocks;
|
||||||
|
|
||||||
|
if (this.first) {
|
||||||
|
a = blocks[0] - 680876937;
|
||||||
|
a = (a << 7 | a >>> 25) - 271733879 << 0;
|
||||||
|
d = (-1732584194 ^ a & 2004318071) + blocks[1] - 117830708;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c = (-271733879 ^ (d & (a ^ -271733879))) + blocks[2] - 1126478375;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b = (a ^ (c & (d ^ a))) + blocks[3] - 1316259209;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
} else {
|
||||||
|
a = this.h0;
|
||||||
|
b = this.h1;
|
||||||
|
c = this.h2;
|
||||||
|
d = this.h3;
|
||||||
|
a += (d ^ (b & (c ^ d))) + blocks[0] - 680876936;
|
||||||
|
a = (a << 7 | a >>> 25) + b << 0;
|
||||||
|
d += (c ^ (a & (b ^ c))) + blocks[1] - 389564586;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c += (b ^ (d & (a ^ b))) + blocks[2] + 606105819;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b += (a ^ (c & (d ^ a))) + blocks[3] - 1044525330;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
a += (d ^ (b & (c ^ d))) + blocks[4] - 176418897;
|
||||||
|
a = (a << 7 | a >>> 25) + b << 0;
|
||||||
|
d += (c ^ (a & (b ^ c))) + blocks[5] + 1200080426;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c += (b ^ (d & (a ^ b))) + blocks[6] - 1473231341;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b += (a ^ (c & (d ^ a))) + blocks[7] - 45705983;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
a += (d ^ (b & (c ^ d))) + blocks[8] + 1770035416;
|
||||||
|
a = (a << 7 | a >>> 25) + b << 0;
|
||||||
|
d += (c ^ (a & (b ^ c))) + blocks[9] - 1958414417;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c += (b ^ (d & (a ^ b))) + blocks[10] - 42063;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b += (a ^ (c & (d ^ a))) + blocks[11] - 1990404162;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
a += (d ^ (b & (c ^ d))) + blocks[12] + 1804603682;
|
||||||
|
a = (a << 7 | a >>> 25) + b << 0;
|
||||||
|
d += (c ^ (a & (b ^ c))) + blocks[13] - 40341101;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c += (b ^ (d & (a ^ b))) + blocks[14] - 1502002290;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b += (a ^ (c & (d ^ a))) + blocks[15] + 1236535329;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
a += (c ^ (d & (b ^ c))) + blocks[1] - 165796510;
|
||||||
|
a = (a << 5 | a >>> 27) + b << 0;
|
||||||
|
d += (b ^ (c & (a ^ b))) + blocks[6] - 1069501632;
|
||||||
|
d = (d << 9 | d >>> 23) + a << 0;
|
||||||
|
c += (a ^ (b & (d ^ a))) + blocks[11] + 643717713;
|
||||||
|
c = (c << 14 | c >>> 18) + d << 0;
|
||||||
|
b += (d ^ (a & (c ^ d))) + blocks[0] - 373897302;
|
||||||
|
b = (b << 20 | b >>> 12) + c << 0;
|
||||||
|
a += (c ^ (d & (b ^ c))) + blocks[5] - 701558691;
|
||||||
|
a = (a << 5 | a >>> 27) + b << 0;
|
||||||
|
d += (b ^ (c & (a ^ b))) + blocks[10] + 38016083;
|
||||||
|
d = (d << 9 | d >>> 23) + a << 0;
|
||||||
|
c += (a ^ (b & (d ^ a))) + blocks[15] - 660478335;
|
||||||
|
c = (c << 14 | c >>> 18) + d << 0;
|
||||||
|
b += (d ^ (a & (c ^ d))) + blocks[4] - 405537848;
|
||||||
|
b = (b << 20 | b >>> 12) + c << 0;
|
||||||
|
a += (c ^ (d & (b ^ c))) + blocks[9] + 568446438;
|
||||||
|
a = (a << 5 | a >>> 27) + b << 0;
|
||||||
|
d += (b ^ (c & (a ^ b))) + blocks[14] - 1019803690;
|
||||||
|
d = (d << 9 | d >>> 23) + a << 0;
|
||||||
|
c += (a ^ (b & (d ^ a))) + blocks[3] - 187363961;
|
||||||
|
c = (c << 14 | c >>> 18) + d << 0;
|
||||||
|
b += (d ^ (a & (c ^ d))) + blocks[8] + 1163531501;
|
||||||
|
b = (b << 20 | b >>> 12) + c << 0;
|
||||||
|
a += (c ^ (d & (b ^ c))) + blocks[13] - 1444681467;
|
||||||
|
a = (a << 5 | a >>> 27) + b << 0;
|
||||||
|
d += (b ^ (c & (a ^ b))) + blocks[2] - 51403784;
|
||||||
|
d = (d << 9 | d >>> 23) + a << 0;
|
||||||
|
c += (a ^ (b & (d ^ a))) + blocks[7] + 1735328473;
|
||||||
|
c = (c << 14 | c >>> 18) + d << 0;
|
||||||
|
b += (d ^ (a & (c ^ d))) + blocks[12] - 1926607734;
|
||||||
|
b = (b << 20 | b >>> 12) + c << 0;
|
||||||
|
bc = b ^ c;
|
||||||
|
a += (bc ^ d) + blocks[5] - 378558;
|
||||||
|
a = (a << 4 | a >>> 28) + b << 0;
|
||||||
|
d += (bc ^ a) + blocks[8] - 2022574463;
|
||||||
|
d = (d << 11 | d >>> 21) + a << 0;
|
||||||
|
da = d ^ a;
|
||||||
|
c += (da ^ b) + blocks[11] + 1839030562;
|
||||||
|
c = (c << 16 | c >>> 16) + d << 0;
|
||||||
|
b += (da ^ c) + blocks[14] - 35309556;
|
||||||
|
b = (b << 23 | b >>> 9) + c << 0;
|
||||||
|
bc = b ^ c;
|
||||||
|
a += (bc ^ d) + blocks[1] - 1530992060;
|
||||||
|
a = (a << 4 | a >>> 28) + b << 0;
|
||||||
|
d += (bc ^ a) + blocks[4] + 1272893353;
|
||||||
|
d = (d << 11 | d >>> 21) + a << 0;
|
||||||
|
da = d ^ a;
|
||||||
|
c += (da ^ b) + blocks[7] - 155497632;
|
||||||
|
c = (c << 16 | c >>> 16) + d << 0;
|
||||||
|
b += (da ^ c) + blocks[10] - 1094730640;
|
||||||
|
b = (b << 23 | b >>> 9) + c << 0;
|
||||||
|
bc = b ^ c;
|
||||||
|
a += (bc ^ d) + blocks[13] + 681279174;
|
||||||
|
a = (a << 4 | a >>> 28) + b << 0;
|
||||||
|
d += (bc ^ a) + blocks[0] - 358537222;
|
||||||
|
d = (d << 11 | d >>> 21) + a << 0;
|
||||||
|
da = d ^ a;
|
||||||
|
c += (da ^ b) + blocks[3] - 722521979;
|
||||||
|
c = (c << 16 | c >>> 16) + d << 0;
|
||||||
|
b += (da ^ c) + blocks[6] + 76029189;
|
||||||
|
b = (b << 23 | b >>> 9) + c << 0;
|
||||||
|
bc = b ^ c;
|
||||||
|
a += (bc ^ d) + blocks[9] - 640364487;
|
||||||
|
a = (a << 4 | a >>> 28) + b << 0;
|
||||||
|
d += (bc ^ a) + blocks[12] - 421815835;
|
||||||
|
d = (d << 11 | d >>> 21) + a << 0;
|
||||||
|
da = d ^ a;
|
||||||
|
c += (da ^ b) + blocks[15] + 530742520;
|
||||||
|
c = (c << 16 | c >>> 16) + d << 0;
|
||||||
|
b += (da ^ c) + blocks[2] - 995338651;
|
||||||
|
b = (b << 23 | b >>> 9) + c << 0;
|
||||||
|
a += (c ^ (b | ~d)) + blocks[0] - 198630844;
|
||||||
|
a = (a << 6 | a >>> 26) + b << 0;
|
||||||
|
d += (b ^ (a | ~c)) + blocks[7] + 1126891415;
|
||||||
|
d = (d << 10 | d >>> 22) + a << 0;
|
||||||
|
c += (a ^ (d | ~b)) + blocks[14] - 1416354905;
|
||||||
|
c = (c << 15 | c >>> 17) + d << 0;
|
||||||
|
b += (d ^ (c | ~a)) + blocks[5] - 57434055;
|
||||||
|
b = (b << 21 | b >>> 11) + c << 0;
|
||||||
|
a += (c ^ (b | ~d)) + blocks[12] + 1700485571;
|
||||||
|
a = (a << 6 | a >>> 26) + b << 0;
|
||||||
|
d += (b ^ (a | ~c)) + blocks[3] - 1894986606;
|
||||||
|
d = (d << 10 | d >>> 22) + a << 0;
|
||||||
|
c += (a ^ (d | ~b)) + blocks[10] - 1051523;
|
||||||
|
c = (c << 15 | c >>> 17) + d << 0;
|
||||||
|
b += (d ^ (c | ~a)) + blocks[1] - 2054922799;
|
||||||
|
b = (b << 21 | b >>> 11) + c << 0;
|
||||||
|
a += (c ^ (b | ~d)) + blocks[8] + 1873313359;
|
||||||
|
a = (a << 6 | a >>> 26) + b << 0;
|
||||||
|
d += (b ^ (a | ~c)) + blocks[15] - 30611744;
|
||||||
|
d = (d << 10 | d >>> 22) + a << 0;
|
||||||
|
c += (a ^ (d | ~b)) + blocks[6] - 1560198380;
|
||||||
|
c = (c << 15 | c >>> 17) + d << 0;
|
||||||
|
b += (d ^ (c | ~a)) + blocks[13] + 1309151649;
|
||||||
|
b = (b << 21 | b >>> 11) + c << 0;
|
||||||
|
a += (c ^ (b | ~d)) + blocks[4] - 145523070;
|
||||||
|
a = (a << 6 | a >>> 26) + b << 0;
|
||||||
|
d += (b ^ (a | ~c)) + blocks[11] - 1120210379;
|
||||||
|
d = (d << 10 | d >>> 22) + a << 0;
|
||||||
|
c += (a ^ (d | ~b)) + blocks[2] + 718787259;
|
||||||
|
c = (c << 15 | c >>> 17) + d << 0;
|
||||||
|
b += (d ^ (c | ~a)) + blocks[9] - 343485551;
|
||||||
|
b = (b << 21 | b >>> 11) + c << 0;
|
||||||
|
|
||||||
|
if (this.first) {
|
||||||
|
this.h0 = a + 1732584193 << 0;
|
||||||
|
this.h1 = b - 271733879 << 0;
|
||||||
|
this.h2 = c - 1732584194 << 0;
|
||||||
|
this.h3 = d + 271733878 << 0;
|
||||||
|
this.first = false;
|
||||||
|
} else {
|
||||||
|
this.h0 = this.h0 + a << 0;
|
||||||
|
this.h1 = this.h1 + b << 0;
|
||||||
|
this.h2 = this.h2 + c << 0;
|
||||||
|
this.h3 = this.h3 + d << 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method hex
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as hex string
|
||||||
|
* @returns {String} Hex string
|
||||||
|
* @see {@link md5.hex}
|
||||||
|
* @example
|
||||||
|
* hash.hex();
|
||||||
|
*/
|
||||||
|
Md5.prototype.hex = function () {
|
||||||
|
this.finalize();
|
||||||
|
|
||||||
|
var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;
|
||||||
|
|
||||||
|
return HEX_CHARS[(h0 >>> 4) & 0x0F] + HEX_CHARS[h0 & 0x0F] +
|
||||||
|
HEX_CHARS[(h0 >>> 12) & 0x0F] + HEX_CHARS[(h0 >>> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h0 >>> 20) & 0x0F] + HEX_CHARS[(h0 >>> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h0 >>> 28) & 0x0F] + HEX_CHARS[(h0 >>> 24) & 0x0F] +
|
||||||
|
HEX_CHARS[(h1 >>> 4) & 0x0F] + HEX_CHARS[h1 & 0x0F] +
|
||||||
|
HEX_CHARS[(h1 >>> 12) & 0x0F] + HEX_CHARS[(h1 >>> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h1 >>> 20) & 0x0F] + HEX_CHARS[(h1 >>> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h1 >>> 28) & 0x0F] + HEX_CHARS[(h1 >>> 24) & 0x0F] +
|
||||||
|
HEX_CHARS[(h2 >>> 4) & 0x0F] + HEX_CHARS[h2 & 0x0F] +
|
||||||
|
HEX_CHARS[(h2 >>> 12) & 0x0F] + HEX_CHARS[(h2 >>> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h2 >>> 20) & 0x0F] + HEX_CHARS[(h2 >>> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h2 >>> 28) & 0x0F] + HEX_CHARS[(h2 >>> 24) & 0x0F] +
|
||||||
|
HEX_CHARS[(h3 >>> 4) & 0x0F] + HEX_CHARS[h3 & 0x0F] +
|
||||||
|
HEX_CHARS[(h3 >>> 12) & 0x0F] + HEX_CHARS[(h3 >>> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h3 >>> 20) & 0x0F] + HEX_CHARS[(h3 >>> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h3 >>> 28) & 0x0F] + HEX_CHARS[(h3 >>> 24) & 0x0F];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method toString
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as hex string
|
||||||
|
* @returns {String} Hex string
|
||||||
|
* @see {@link md5.hex}
|
||||||
|
* @example
|
||||||
|
* hash.toString();
|
||||||
|
*/
|
||||||
|
Md5.prototype.toString = Md5.prototype.hex;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method digest
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @see {@link md5.digest}
|
||||||
|
* @example
|
||||||
|
* hash.digest();
|
||||||
|
*/
|
||||||
|
Md5.prototype.digest = function () {
|
||||||
|
this.finalize();
|
||||||
|
|
||||||
|
var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;
|
||||||
|
return [
|
||||||
|
h0 & 0xFF, (h0 >>> 8) & 0xFF, (h0 >>> 16) & 0xFF, (h0 >>> 24) & 0xFF,
|
||||||
|
h1 & 0xFF, (h1 >>> 8) & 0xFF, (h1 >>> 16) & 0xFF, (h1 >>> 24) & 0xFF,
|
||||||
|
h2 & 0xFF, (h2 >>> 8) & 0xFF, (h2 >>> 16) & 0xFF, (h2 >>> 24) & 0xFF,
|
||||||
|
h3 & 0xFF, (h3 >>> 8) & 0xFF, (h3 >>> 16) & 0xFF, (h3 >>> 24) & 0xFF
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method array
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @see {@link md5.array}
|
||||||
|
* @example
|
||||||
|
* hash.array();
|
||||||
|
*/
|
||||||
|
Md5.prototype.array = Md5.prototype.digest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method arrayBuffer
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @see {@link md5.arrayBuffer}
|
||||||
|
* @example
|
||||||
|
* hash.arrayBuffer();
|
||||||
|
*/
|
||||||
|
Md5.prototype.arrayBuffer = function () {
|
||||||
|
this.finalize();
|
||||||
|
|
||||||
|
var buffer = new ArrayBuffer(16);
|
||||||
|
var blocks = new Uint32Array(buffer);
|
||||||
|
blocks[0] = this.h0;
|
||||||
|
blocks[1] = this.h1;
|
||||||
|
blocks[2] = this.h2;
|
||||||
|
blocks[3] = this.h3;
|
||||||
|
return buffer;
|
||||||
|
};
|
||||||
|
|
||||||
|
var exports = createMethod();
|
||||||
|
exports.md5 = exports;
|
||||||
|
|
||||||
|
if (COMMON_JS) {
|
||||||
|
module.exports = exports;
|
||||||
|
} else {
|
||||||
|
/**
|
||||||
|
* @method md5
|
||||||
|
* @description Md5 hash function, export to global in browsers.
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} md5 hashes
|
||||||
|
* @example
|
||||||
|
* md5(''); // d41d8cd98f00b204e9800998ecf8427e
|
||||||
|
* md5('The quick brown fox jumps over the lazy dog'); // 9e107d9d372bb6826bd81d3542a419d6
|
||||||
|
* md5('The quick brown fox jumps over the lazy dog.'); // e4d909c290d0fb1ca068ffaddf22cbd0
|
||||||
|
*
|
||||||
|
* // It also supports UTF-8 encoding
|
||||||
|
* md5('中文'); // a7bac2239fcdcb3a067903d8077c4a07
|
||||||
|
*
|
||||||
|
* // It also supports byte `Array`, `Uint8Array`, `ArrayBuffer`
|
||||||
|
* md5([]); // d41d8cd98f00b204e9800998ecf8427e
|
||||||
|
* md5(new Uint8Array([])); // d41d8cd98f00b204e9800998ecf8427e
|
||||||
|
*/
|
||||||
|
root.md5 = exports;
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
} (md5$1));
|
||||||
|
|
||||||
|
var md5Exports = md5$1.exports;
|
||||||
|
var md5 = /*@__PURE__*/getDefaultExportFromCjs(md5Exports);
|
||||||
|
|
||||||
|
export { md5 as default, md5 };
|
||||||
+898
@@ -0,0 +1,898 @@
|
|||||||
|
/**
|
||||||
|
* [js-md5]{@link https://github.com/emn178/js-md5}
|
||||||
|
*
|
||||||
|
* @namespace md5
|
||||||
|
* @version 0.9.0
|
||||||
|
* @author Chen, Yi-Cyuan [emn178@gmail.com]
|
||||||
|
* @copyright Chen, Yi-Cyuan 2014-2026
|
||||||
|
* @license MIT
|
||||||
|
*/
|
||||||
|
(function () {
|
||||||
|
|
||||||
|
var INPUT_ERROR = 'input is invalid type';
|
||||||
|
var FINALIZE_ERROR = 'finalize already called';
|
||||||
|
var WINDOW = typeof window === 'object';
|
||||||
|
var root = WINDOW ? window : {};
|
||||||
|
if (root.JS_MD5_NO_WINDOW) {
|
||||||
|
WINDOW = false;
|
||||||
|
}
|
||||||
|
var WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && typeof self !== 'undefined' && self instanceof WorkerGlobalScope;
|
||||||
|
/* istanbul ignore next */
|
||||||
|
var NODE_JS = !root.JS_MD5_NO_NODE_JS && !WINDOW && typeof process === 'object' && process.versions && process.versions.node;
|
||||||
|
if (NODE_JS) {
|
||||||
|
root = global;
|
||||||
|
} else if (WEB_WORKER) {
|
||||||
|
root = self;
|
||||||
|
}
|
||||||
|
var COMMON_JS = !root.JS_MD5_NO_COMMON_JS && typeof module === 'object' && module.exports;
|
||||||
|
var AMD = typeof define === 'function' && define.amd;
|
||||||
|
/* istanbul ignore next */
|
||||||
|
var ARRAY_BUFFER = !root.JS_MD5_NO_ARRAY_BUFFER && typeof ArrayBuffer !== 'undefined' ;
|
||||||
|
var HEX_CHARS = '0123456789abcdef'.split('');
|
||||||
|
var EXTRA = [128, 32768, 8388608, -2147483648];
|
||||||
|
var SHIFT = [0, 8, 16, 24];
|
||||||
|
var OUTPUT_TYPES = ['hex', 'array', 'digest', 'arrayBuffer'];
|
||||||
|
/* istanbul ignore else */
|
||||||
|
{
|
||||||
|
OUTPUT_TYPES.push('buffer');
|
||||||
|
}
|
||||||
|
/* istanbul ignore else */
|
||||||
|
{
|
||||||
|
OUTPUT_TYPES.push('base64');
|
||||||
|
}
|
||||||
|
/* istanbul ignore next */
|
||||||
|
var BASE64_ENCODE_CHAR = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('') ;
|
||||||
|
|
||||||
|
var blocks = [], buffer8;
|
||||||
|
if (ARRAY_BUFFER) {
|
||||||
|
var buffer = new ArrayBuffer(68);
|
||||||
|
buffer8 = new Uint8Array(buffer);
|
||||||
|
blocks = new Uint32Array(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
var isArray = Array.isArray;
|
||||||
|
/* istanbul ignore else */
|
||||||
|
if ((root.JS_MD5_NO_NODE_JS || !isArray)) {
|
||||||
|
isArray = function (obj) {
|
||||||
|
return Object.prototype.toString.call(obj) === '[object Array]';
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
var isView = ArrayBuffer.isView;
|
||||||
|
/* istanbul ignore else */
|
||||||
|
if (ARRAY_BUFFER && (root.JS_MD5_NO_ARRAY_BUFFER_IS_VIEW || !isView)) {
|
||||||
|
isView = function (obj) {
|
||||||
|
return typeof obj === 'object' && obj.buffer && obj.buffer.constructor === ArrayBuffer;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// [message: string, isString: bool]
|
||||||
|
var formatMessage = function (message) {
|
||||||
|
var type = typeof message;
|
||||||
|
if (type === 'string') {
|
||||||
|
return [message, true];
|
||||||
|
}
|
||||||
|
if (type !== 'object' || message === null) {
|
||||||
|
throw new Error(INPUT_ERROR);
|
||||||
|
}
|
||||||
|
if (ARRAY_BUFFER && message.constructor === ArrayBuffer) {
|
||||||
|
return [new Uint8Array(message), false];
|
||||||
|
}
|
||||||
|
if (!isArray(message) && !isView(message)) {
|
||||||
|
throw new Error(INPUT_ERROR);
|
||||||
|
}
|
||||||
|
return [message, false];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method hex
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as hex string
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} Hex string
|
||||||
|
* @example
|
||||||
|
* md5.hex('The quick brown fox jumps over the lazy dog');
|
||||||
|
* // equal to
|
||||||
|
* md5('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method digest
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @example
|
||||||
|
* md5.digest('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method array
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @example
|
||||||
|
* md5.array('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method arrayBuffer
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @example
|
||||||
|
* md5.arrayBuffer('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method buffer
|
||||||
|
* @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @example
|
||||||
|
* md5.buffer('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method base64
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as base64 string
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} base64 string
|
||||||
|
* @example
|
||||||
|
* md5.base64('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
var createOutputMethod = function (outputType) {
|
||||||
|
return function (message) {
|
||||||
|
return new Md5(true).update(message)[outputType]();
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method create
|
||||||
|
* @memberof md5
|
||||||
|
* @description Create Md5 object
|
||||||
|
* @returns {Md5} Md5 object.
|
||||||
|
* @example
|
||||||
|
* var hash = md5.create();
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method update
|
||||||
|
* @memberof md5
|
||||||
|
* @description Create and update Md5 object
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Md5} Md5 object.
|
||||||
|
* @example
|
||||||
|
* var hash = md5.update('The quick brown fox jumps over the lazy dog');
|
||||||
|
* // equal to
|
||||||
|
* var hash = md5.create();
|
||||||
|
* hash.update('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
var createMethod = function () {
|
||||||
|
var method = createOutputMethod('hex');
|
||||||
|
if (NODE_JS) {
|
||||||
|
method = nodeWrap(method);
|
||||||
|
}
|
||||||
|
method.create = function () {
|
||||||
|
return new Md5();
|
||||||
|
};
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
return method;
|
||||||
|
};
|
||||||
|
|
||||||
|
var nodeWrap = function (method) {
|
||||||
|
var crypto = require('crypto');
|
||||||
|
var Buffer = require('buffer').Buffer;
|
||||||
|
var bufferFrom = Buffer.from;
|
||||||
|
if ((root.JS_MD5_NO_BUFFER_FROM || !bufferFrom)) {
|
||||||
|
bufferFrom = function (message) {
|
||||||
|
return new Buffer(message);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
var nodeMethod = function (message) {
|
||||||
|
if (typeof message === 'string') {
|
||||||
|
return crypto.createHash('md5').update(message, 'utf8').digest('hex');
|
||||||
|
} else {
|
||||||
|
if (message === null || message === undefined) {
|
||||||
|
throw new Error(INPUT_ERROR);
|
||||||
|
} else if (message.constructor === ArrayBuffer) {
|
||||||
|
message = new Uint8Array(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isArray(message) || isView(message) ||
|
||||||
|
message.constructor === Buffer) {
|
||||||
|
return crypto.createHash('md5').update(bufferFrom(message)).digest('hex');
|
||||||
|
} else {
|
||||||
|
return method(message);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
return nodeMethod;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @namespace md5.hmac
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method hex
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as hex string
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} Hex string
|
||||||
|
* @example
|
||||||
|
* md5.hmac.hex('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
* // equal to
|
||||||
|
* md5.hmac('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method digest
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @example
|
||||||
|
* md5.hmac.digest('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method array
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @example
|
||||||
|
* md5.hmac.array('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method arrayBuffer
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @example
|
||||||
|
* md5.hmac.arrayBuffer('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method buffer
|
||||||
|
* @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @example
|
||||||
|
* md5.hmac.buffer('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method base64
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as base64 string
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} base64 string
|
||||||
|
* @example
|
||||||
|
* md5.hmac.base64('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
var createHmacOutputMethod = function (outputType) {
|
||||||
|
return function (key, message) {
|
||||||
|
return new HmacMd5(key, true).update(message)[outputType]();
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method create
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Create HmacMd5 object
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @returns {HmacMd5} HmacMd5 object.
|
||||||
|
* @example
|
||||||
|
* var hash = md5.hmac.create('key');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method update
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Create and update HmacMd5 object
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {HmacMd5} HmacMd5 object.
|
||||||
|
* @example
|
||||||
|
* var hash = md5.hmac.update('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
* // equal to
|
||||||
|
* var hash = md5.hmac.create('key');
|
||||||
|
* hash.update('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
var createHmacMethod = function () {
|
||||||
|
var method = createHmacOutputMethod('hex');
|
||||||
|
method.create = function (key) {
|
||||||
|
return new HmacMd5(key);
|
||||||
|
};
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
return method;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Md5 class
|
||||||
|
* @class Md5
|
||||||
|
* @description This is internal class.
|
||||||
|
* @see {@link md5.create}
|
||||||
|
*/
|
||||||
|
function Md5(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;
|
||||||
|
this.buffer8 = buffer8;
|
||||||
|
} else {
|
||||||
|
if (ARRAY_BUFFER) {
|
||||||
|
var buffer = new ArrayBuffer(68);
|
||||||
|
this.buffer8 = new Uint8Array(buffer);
|
||||||
|
this.blocks = new Uint32Array(buffer);
|
||||||
|
} else {
|
||||||
|
this.blocks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.h0 = this.h1 = this.h2 = this.h3 = this.start = this.bytes = this.hBytes = 0;
|
||||||
|
this.finalized = this.hashed = false;
|
||||||
|
this.first = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method update
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Update hash
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Md5} Md5 object.
|
||||||
|
* @see {@link md5.update}
|
||||||
|
*/
|
||||||
|
Md5.prototype.update = function (message) {
|
||||||
|
if (this.finalized) {
|
||||||
|
throw new Error(FINALIZE_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
var result = formatMessage(message);
|
||||||
|
message = result[0];
|
||||||
|
var isString = result[1];
|
||||||
|
var code, index = 0, i, length = message.length, blocks = this.blocks;
|
||||||
|
var buffer8 = this.buffer8;
|
||||||
|
|
||||||
|
while (index < length) {
|
||||||
|
if (this.hashed) {
|
||||||
|
this.hashed = false;
|
||||||
|
blocks[0] = blocks[16];
|
||||||
|
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 (isString) {
|
||||||
|
if (ARRAY_BUFFER) {
|
||||||
|
for (i = this.start; index < length && i < 64; ++index) {
|
||||||
|
code = message.charCodeAt(index);
|
||||||
|
if (code < 0x80) {
|
||||||
|
buffer8[i++] = code;
|
||||||
|
} else if (code < 0x800) {
|
||||||
|
buffer8[i++] = 0xc0 | (code >>> 6);
|
||||||
|
buffer8[i++] = 0x80 | (code & 0x3f);
|
||||||
|
} else if (code < 0xd800 || code >= 0xe000) {
|
||||||
|
buffer8[i++] = 0xe0 | (code >>> 12);
|
||||||
|
buffer8[i++] = 0x80 | ((code >>> 6) & 0x3f);
|
||||||
|
buffer8[i++] = 0x80 | (code & 0x3f);
|
||||||
|
} else {
|
||||||
|
code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
|
||||||
|
buffer8[i++] = 0xf0 | (code >>> 18);
|
||||||
|
buffer8[i++] = 0x80 | ((code >>> 12) & 0x3f);
|
||||||
|
buffer8[i++] = 0x80 | ((code >>> 6) & 0x3f);
|
||||||
|
buffer8[i++] = 0x80 | (code & 0x3f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} 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];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (ARRAY_BUFFER) {
|
||||||
|
for (i = this.start; index < length && i < 64; ++index) {
|
||||||
|
buffer8[i++] = message[index];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (i = this.start; index < length && i < 64; ++index) {
|
||||||
|
blocks[i >>> 2] |= message[index] << SHIFT[i++ & 3];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.lastByteIndex = i;
|
||||||
|
this.bytes += i - this.start;
|
||||||
|
if (i >= 64) {
|
||||||
|
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;
|
||||||
|
};
|
||||||
|
|
||||||
|
Md5.prototype.finalize = function () {
|
||||||
|
if (this.finalized) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.finalized = true;
|
||||||
|
var blocks = this.blocks, i = this.lastByteIndex;
|
||||||
|
blocks[i >>> 2] |= EXTRA[i & 3];
|
||||||
|
if (i >= 56) {
|
||||||
|
if (!this.hashed) {
|
||||||
|
this.hash();
|
||||||
|
}
|
||||||
|
blocks[0] = blocks[16];
|
||||||
|
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.bytes << 3;
|
||||||
|
blocks[15] = this.hBytes << 3 | this.bytes >>> 29;
|
||||||
|
this.hash();
|
||||||
|
};
|
||||||
|
|
||||||
|
Md5.prototype.hash = function () {
|
||||||
|
var a, b, c, d, bc, da, blocks = this.blocks;
|
||||||
|
|
||||||
|
if (this.first) {
|
||||||
|
a = blocks[0] - 680876937;
|
||||||
|
a = (a << 7 | a >>> 25) - 271733879 << 0;
|
||||||
|
d = (-1732584194 ^ a & 2004318071) + blocks[1] - 117830708;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c = (-271733879 ^ (d & (a ^ -271733879))) + blocks[2] - 1126478375;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b = (a ^ (c & (d ^ a))) + blocks[3] - 1316259209;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
} else {
|
||||||
|
a = this.h0;
|
||||||
|
b = this.h1;
|
||||||
|
c = this.h2;
|
||||||
|
d = this.h3;
|
||||||
|
a += (d ^ (b & (c ^ d))) + blocks[0] - 680876936;
|
||||||
|
a = (a << 7 | a >>> 25) + b << 0;
|
||||||
|
d += (c ^ (a & (b ^ c))) + blocks[1] - 389564586;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c += (b ^ (d & (a ^ b))) + blocks[2] + 606105819;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b += (a ^ (c & (d ^ a))) + blocks[3] - 1044525330;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
a += (d ^ (b & (c ^ d))) + blocks[4] - 176418897;
|
||||||
|
a = (a << 7 | a >>> 25) + b << 0;
|
||||||
|
d += (c ^ (a & (b ^ c))) + blocks[5] + 1200080426;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c += (b ^ (d & (a ^ b))) + blocks[6] - 1473231341;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b += (a ^ (c & (d ^ a))) + blocks[7] - 45705983;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
a += (d ^ (b & (c ^ d))) + blocks[8] + 1770035416;
|
||||||
|
a = (a << 7 | a >>> 25) + b << 0;
|
||||||
|
d += (c ^ (a & (b ^ c))) + blocks[9] - 1958414417;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c += (b ^ (d & (a ^ b))) + blocks[10] - 42063;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b += (a ^ (c & (d ^ a))) + blocks[11] - 1990404162;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
a += (d ^ (b & (c ^ d))) + blocks[12] + 1804603682;
|
||||||
|
a = (a << 7 | a >>> 25) + b << 0;
|
||||||
|
d += (c ^ (a & (b ^ c))) + blocks[13] - 40341101;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c += (b ^ (d & (a ^ b))) + blocks[14] - 1502002290;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b += (a ^ (c & (d ^ a))) + blocks[15] + 1236535329;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
a += (c ^ (d & (b ^ c))) + blocks[1] - 165796510;
|
||||||
|
a = (a << 5 | a >>> 27) + b << 0;
|
||||||
|
d += (b ^ (c & (a ^ b))) + blocks[6] - 1069501632;
|
||||||
|
d = (d << 9 | d >>> 23) + a << 0;
|
||||||
|
c += (a ^ (b & (d ^ a))) + blocks[11] + 643717713;
|
||||||
|
c = (c << 14 | c >>> 18) + d << 0;
|
||||||
|
b += (d ^ (a & (c ^ d))) + blocks[0] - 373897302;
|
||||||
|
b = (b << 20 | b >>> 12) + c << 0;
|
||||||
|
a += (c ^ (d & (b ^ c))) + blocks[5] - 701558691;
|
||||||
|
a = (a << 5 | a >>> 27) + b << 0;
|
||||||
|
d += (b ^ (c & (a ^ b))) + blocks[10] + 38016083;
|
||||||
|
d = (d << 9 | d >>> 23) + a << 0;
|
||||||
|
c += (a ^ (b & (d ^ a))) + blocks[15] - 660478335;
|
||||||
|
c = (c << 14 | c >>> 18) + d << 0;
|
||||||
|
b += (d ^ (a & (c ^ d))) + blocks[4] - 405537848;
|
||||||
|
b = (b << 20 | b >>> 12) + c << 0;
|
||||||
|
a += (c ^ (d & (b ^ c))) + blocks[9] + 568446438;
|
||||||
|
a = (a << 5 | a >>> 27) + b << 0;
|
||||||
|
d += (b ^ (c & (a ^ b))) + blocks[14] - 1019803690;
|
||||||
|
d = (d << 9 | d >>> 23) + a << 0;
|
||||||
|
c += (a ^ (b & (d ^ a))) + blocks[3] - 187363961;
|
||||||
|
c = (c << 14 | c >>> 18) + d << 0;
|
||||||
|
b += (d ^ (a & (c ^ d))) + blocks[8] + 1163531501;
|
||||||
|
b = (b << 20 | b >>> 12) + c << 0;
|
||||||
|
a += (c ^ (d & (b ^ c))) + blocks[13] - 1444681467;
|
||||||
|
a = (a << 5 | a >>> 27) + b << 0;
|
||||||
|
d += (b ^ (c & (a ^ b))) + blocks[2] - 51403784;
|
||||||
|
d = (d << 9 | d >>> 23) + a << 0;
|
||||||
|
c += (a ^ (b & (d ^ a))) + blocks[7] + 1735328473;
|
||||||
|
c = (c << 14 | c >>> 18) + d << 0;
|
||||||
|
b += (d ^ (a & (c ^ d))) + blocks[12] - 1926607734;
|
||||||
|
b = (b << 20 | b >>> 12) + c << 0;
|
||||||
|
bc = b ^ c;
|
||||||
|
a += (bc ^ d) + blocks[5] - 378558;
|
||||||
|
a = (a << 4 | a >>> 28) + b << 0;
|
||||||
|
d += (bc ^ a) + blocks[8] - 2022574463;
|
||||||
|
d = (d << 11 | d >>> 21) + a << 0;
|
||||||
|
da = d ^ a;
|
||||||
|
c += (da ^ b) + blocks[11] + 1839030562;
|
||||||
|
c = (c << 16 | c >>> 16) + d << 0;
|
||||||
|
b += (da ^ c) + blocks[14] - 35309556;
|
||||||
|
b = (b << 23 | b >>> 9) + c << 0;
|
||||||
|
bc = b ^ c;
|
||||||
|
a += (bc ^ d) + blocks[1] - 1530992060;
|
||||||
|
a = (a << 4 | a >>> 28) + b << 0;
|
||||||
|
d += (bc ^ a) + blocks[4] + 1272893353;
|
||||||
|
d = (d << 11 | d >>> 21) + a << 0;
|
||||||
|
da = d ^ a;
|
||||||
|
c += (da ^ b) + blocks[7] - 155497632;
|
||||||
|
c = (c << 16 | c >>> 16) + d << 0;
|
||||||
|
b += (da ^ c) + blocks[10] - 1094730640;
|
||||||
|
b = (b << 23 | b >>> 9) + c << 0;
|
||||||
|
bc = b ^ c;
|
||||||
|
a += (bc ^ d) + blocks[13] + 681279174;
|
||||||
|
a = (a << 4 | a >>> 28) + b << 0;
|
||||||
|
d += (bc ^ a) + blocks[0] - 358537222;
|
||||||
|
d = (d << 11 | d >>> 21) + a << 0;
|
||||||
|
da = d ^ a;
|
||||||
|
c += (da ^ b) + blocks[3] - 722521979;
|
||||||
|
c = (c << 16 | c >>> 16) + d << 0;
|
||||||
|
b += (da ^ c) + blocks[6] + 76029189;
|
||||||
|
b = (b << 23 | b >>> 9) + c << 0;
|
||||||
|
bc = b ^ c;
|
||||||
|
a += (bc ^ d) + blocks[9] - 640364487;
|
||||||
|
a = (a << 4 | a >>> 28) + b << 0;
|
||||||
|
d += (bc ^ a) + blocks[12] - 421815835;
|
||||||
|
d = (d << 11 | d >>> 21) + a << 0;
|
||||||
|
da = d ^ a;
|
||||||
|
c += (da ^ b) + blocks[15] + 530742520;
|
||||||
|
c = (c << 16 | c >>> 16) + d << 0;
|
||||||
|
b += (da ^ c) + blocks[2] - 995338651;
|
||||||
|
b = (b << 23 | b >>> 9) + c << 0;
|
||||||
|
a += (c ^ (b | ~d)) + blocks[0] - 198630844;
|
||||||
|
a = (a << 6 | a >>> 26) + b << 0;
|
||||||
|
d += (b ^ (a | ~c)) + blocks[7] + 1126891415;
|
||||||
|
d = (d << 10 | d >>> 22) + a << 0;
|
||||||
|
c += (a ^ (d | ~b)) + blocks[14] - 1416354905;
|
||||||
|
c = (c << 15 | c >>> 17) + d << 0;
|
||||||
|
b += (d ^ (c | ~a)) + blocks[5] - 57434055;
|
||||||
|
b = (b << 21 | b >>> 11) + c << 0;
|
||||||
|
a += (c ^ (b | ~d)) + blocks[12] + 1700485571;
|
||||||
|
a = (a << 6 | a >>> 26) + b << 0;
|
||||||
|
d += (b ^ (a | ~c)) + blocks[3] - 1894986606;
|
||||||
|
d = (d << 10 | d >>> 22) + a << 0;
|
||||||
|
c += (a ^ (d | ~b)) + blocks[10] - 1051523;
|
||||||
|
c = (c << 15 | c >>> 17) + d << 0;
|
||||||
|
b += (d ^ (c | ~a)) + blocks[1] - 2054922799;
|
||||||
|
b = (b << 21 | b >>> 11) + c << 0;
|
||||||
|
a += (c ^ (b | ~d)) + blocks[8] + 1873313359;
|
||||||
|
a = (a << 6 | a >>> 26) + b << 0;
|
||||||
|
d += (b ^ (a | ~c)) + blocks[15] - 30611744;
|
||||||
|
d = (d << 10 | d >>> 22) + a << 0;
|
||||||
|
c += (a ^ (d | ~b)) + blocks[6] - 1560198380;
|
||||||
|
c = (c << 15 | c >>> 17) + d << 0;
|
||||||
|
b += (d ^ (c | ~a)) + blocks[13] + 1309151649;
|
||||||
|
b = (b << 21 | b >>> 11) + c << 0;
|
||||||
|
a += (c ^ (b | ~d)) + blocks[4] - 145523070;
|
||||||
|
a = (a << 6 | a >>> 26) + b << 0;
|
||||||
|
d += (b ^ (a | ~c)) + blocks[11] - 1120210379;
|
||||||
|
d = (d << 10 | d >>> 22) + a << 0;
|
||||||
|
c += (a ^ (d | ~b)) + blocks[2] + 718787259;
|
||||||
|
c = (c << 15 | c >>> 17) + d << 0;
|
||||||
|
b += (d ^ (c | ~a)) + blocks[9] - 343485551;
|
||||||
|
b = (b << 21 | b >>> 11) + c << 0;
|
||||||
|
|
||||||
|
if (this.first) {
|
||||||
|
this.h0 = a + 1732584193 << 0;
|
||||||
|
this.h1 = b - 271733879 << 0;
|
||||||
|
this.h2 = c - 1732584194 << 0;
|
||||||
|
this.h3 = d + 271733878 << 0;
|
||||||
|
this.first = false;
|
||||||
|
} else {
|
||||||
|
this.h0 = this.h0 + a << 0;
|
||||||
|
this.h1 = this.h1 + b << 0;
|
||||||
|
this.h2 = this.h2 + c << 0;
|
||||||
|
this.h3 = this.h3 + d << 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method hex
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as hex string
|
||||||
|
* @returns {String} Hex string
|
||||||
|
* @see {@link md5.hex}
|
||||||
|
* @example
|
||||||
|
* hash.hex();
|
||||||
|
*/
|
||||||
|
Md5.prototype.hex = function () {
|
||||||
|
this.finalize();
|
||||||
|
|
||||||
|
var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;
|
||||||
|
|
||||||
|
return HEX_CHARS[(h0 >>> 4) & 0x0F] + HEX_CHARS[h0 & 0x0F] +
|
||||||
|
HEX_CHARS[(h0 >>> 12) & 0x0F] + HEX_CHARS[(h0 >>> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h0 >>> 20) & 0x0F] + HEX_CHARS[(h0 >>> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h0 >>> 28) & 0x0F] + HEX_CHARS[(h0 >>> 24) & 0x0F] +
|
||||||
|
HEX_CHARS[(h1 >>> 4) & 0x0F] + HEX_CHARS[h1 & 0x0F] +
|
||||||
|
HEX_CHARS[(h1 >>> 12) & 0x0F] + HEX_CHARS[(h1 >>> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h1 >>> 20) & 0x0F] + HEX_CHARS[(h1 >>> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h1 >>> 28) & 0x0F] + HEX_CHARS[(h1 >>> 24) & 0x0F] +
|
||||||
|
HEX_CHARS[(h2 >>> 4) & 0x0F] + HEX_CHARS[h2 & 0x0F] +
|
||||||
|
HEX_CHARS[(h2 >>> 12) & 0x0F] + HEX_CHARS[(h2 >>> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h2 >>> 20) & 0x0F] + HEX_CHARS[(h2 >>> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h2 >>> 28) & 0x0F] + HEX_CHARS[(h2 >>> 24) & 0x0F] +
|
||||||
|
HEX_CHARS[(h3 >>> 4) & 0x0F] + HEX_CHARS[h3 & 0x0F] +
|
||||||
|
HEX_CHARS[(h3 >>> 12) & 0x0F] + HEX_CHARS[(h3 >>> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h3 >>> 20) & 0x0F] + HEX_CHARS[(h3 >>> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h3 >>> 28) & 0x0F] + HEX_CHARS[(h3 >>> 24) & 0x0F];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method toString
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as hex string
|
||||||
|
* @returns {String} Hex string
|
||||||
|
* @see {@link md5.hex}
|
||||||
|
* @example
|
||||||
|
* hash.toString();
|
||||||
|
*/
|
||||||
|
Md5.prototype.toString = Md5.prototype.hex;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method digest
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @see {@link md5.digest}
|
||||||
|
* @example
|
||||||
|
* hash.digest();
|
||||||
|
*/
|
||||||
|
Md5.prototype.digest = function () {
|
||||||
|
this.finalize();
|
||||||
|
|
||||||
|
var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;
|
||||||
|
return [
|
||||||
|
h0 & 0xFF, (h0 >>> 8) & 0xFF, (h0 >>> 16) & 0xFF, (h0 >>> 24) & 0xFF,
|
||||||
|
h1 & 0xFF, (h1 >>> 8) & 0xFF, (h1 >>> 16) & 0xFF, (h1 >>> 24) & 0xFF,
|
||||||
|
h2 & 0xFF, (h2 >>> 8) & 0xFF, (h2 >>> 16) & 0xFF, (h2 >>> 24) & 0xFF,
|
||||||
|
h3 & 0xFF, (h3 >>> 8) & 0xFF, (h3 >>> 16) & 0xFF, (h3 >>> 24) & 0xFF
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method array
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @see {@link md5.array}
|
||||||
|
* @example
|
||||||
|
* hash.array();
|
||||||
|
*/
|
||||||
|
Md5.prototype.array = Md5.prototype.digest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method arrayBuffer
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @see {@link md5.arrayBuffer}
|
||||||
|
* @example
|
||||||
|
* hash.arrayBuffer();
|
||||||
|
*/
|
||||||
|
Md5.prototype.arrayBuffer = function () {
|
||||||
|
this.finalize();
|
||||||
|
|
||||||
|
var buffer = new ArrayBuffer(16);
|
||||||
|
var blocks = new Uint32Array(buffer);
|
||||||
|
blocks[0] = this.h0;
|
||||||
|
blocks[1] = this.h1;
|
||||||
|
blocks[2] = this.h2;
|
||||||
|
blocks[3] = this.h3;
|
||||||
|
return buffer;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method buffer
|
||||||
|
* @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @see {@link md5.buffer}
|
||||||
|
* @example
|
||||||
|
* hash.buffer();
|
||||||
|
*/
|
||||||
|
/* istanbul ignore else */
|
||||||
|
{
|
||||||
|
Md5.prototype.buffer = Md5.prototype.arrayBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method base64
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as base64 string
|
||||||
|
* @returns {String} base64 string
|
||||||
|
* @see {@link md5.base64}
|
||||||
|
* @example
|
||||||
|
* hash.base64();
|
||||||
|
*/
|
||||||
|
/* istanbul ignore else */
|
||||||
|
{
|
||||||
|
Md5.prototype.base64 = function () {
|
||||||
|
var v1, v2, v3, base64Str = '', bytes = this.array();
|
||||||
|
for (var i = 0; i < 15;) {
|
||||||
|
v1 = bytes[i++];
|
||||||
|
v2 = bytes[i++];
|
||||||
|
v3 = bytes[i++];
|
||||||
|
base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] +
|
||||||
|
BASE64_ENCODE_CHAR[(v1 << 4 | v2 >>> 4) & 63] +
|
||||||
|
BASE64_ENCODE_CHAR[(v2 << 2 | v3 >>> 6) & 63] +
|
||||||
|
BASE64_ENCODE_CHAR[v3 & 63];
|
||||||
|
}
|
||||||
|
v1 = bytes[i];
|
||||||
|
base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] +
|
||||||
|
BASE64_ENCODE_CHAR[(v1 << 4) & 63] +
|
||||||
|
'==';
|
||||||
|
return base64Str;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* HmacMd5 class
|
||||||
|
* @class HmacMd5
|
||||||
|
* @extends Md5
|
||||||
|
* @description This is internal class.
|
||||||
|
* @see {@link md5.hmac.create}
|
||||||
|
*/
|
||||||
|
function HmacMd5(key, sharedMemory) {
|
||||||
|
var i, result = formatMessage(key);
|
||||||
|
key = result[0];
|
||||||
|
if (result[1]) {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (key.length > 64) {
|
||||||
|
key = (new Md5(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;
|
||||||
|
}
|
||||||
|
|
||||||
|
Md5.call(this, sharedMemory);
|
||||||
|
|
||||||
|
this.update(iKeyPad);
|
||||||
|
this.oKeyPad = oKeyPad;
|
||||||
|
this.inner = true;
|
||||||
|
this.sharedMemory = sharedMemory;
|
||||||
|
}
|
||||||
|
/* istanbul ignore else */
|
||||||
|
{
|
||||||
|
HmacMd5.prototype = new Md5();
|
||||||
|
|
||||||
|
HmacMd5.prototype.finalize = function () {
|
||||||
|
Md5.prototype.finalize.call(this);
|
||||||
|
if (this.inner) {
|
||||||
|
this.inner = false;
|
||||||
|
var innerHash = this.array();
|
||||||
|
Md5.call(this, this.sharedMemory);
|
||||||
|
this.update(this.oKeyPad);
|
||||||
|
this.update(innerHash);
|
||||||
|
Md5.prototype.finalize.call(this);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
var exports = createMethod();
|
||||||
|
exports.md5 = exports;
|
||||||
|
/* istanbul ignore else */
|
||||||
|
{
|
||||||
|
exports.md5.hmac = createHmacMethod();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (COMMON_JS) {
|
||||||
|
module.exports = exports;
|
||||||
|
} else {
|
||||||
|
/**
|
||||||
|
* @method md5
|
||||||
|
* @description Md5 hash function, export to global in browsers.
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} md5 hashes
|
||||||
|
* @example
|
||||||
|
* md5(''); // d41d8cd98f00b204e9800998ecf8427e
|
||||||
|
* md5('The quick brown fox jumps over the lazy dog'); // 9e107d9d372bb6826bd81d3542a419d6
|
||||||
|
* md5('The quick brown fox jumps over the lazy dog.'); // e4d909c290d0fb1ca068ffaddf22cbd0
|
||||||
|
*
|
||||||
|
* // It also supports UTF-8 encoding
|
||||||
|
* md5('中文'); // a7bac2239fcdcb3a067903d8077c4a07
|
||||||
|
*
|
||||||
|
* // It also supports byte `Array`, `Uint8Array`, `ArrayBuffer`
|
||||||
|
* md5([]); // d41d8cd98f00b204e9800998ecf8427e
|
||||||
|
* md5(new Uint8Array([])); // d41d8cd98f00b204e9800998ecf8427e
|
||||||
|
*/
|
||||||
|
root.md5 = exports;
|
||||||
|
if (AMD) {
|
||||||
|
define(function () {
|
||||||
|
return exports;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})();
|
||||||
Vendored
+3
-3
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+870
@@ -0,0 +1,870 @@
|
|||||||
|
function getDefaultExportFromCjs (x) {
|
||||||
|
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
|
||||||
|
}
|
||||||
|
|
||||||
|
var md5$1 = {exports: {}};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* [js-md5]{@link https://github.com/emn178/js-md5}
|
||||||
|
*
|
||||||
|
* @namespace md5
|
||||||
|
* @version 0.9.0
|
||||||
|
* @author Chen, Yi-Cyuan [emn178@gmail.com]
|
||||||
|
* @copyright Chen, Yi-Cyuan 2014-2026
|
||||||
|
* @license MIT
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function (module) {
|
||||||
|
(function () {
|
||||||
|
|
||||||
|
var INPUT_ERROR = 'input is invalid type';
|
||||||
|
var FINALIZE_ERROR = 'finalize already called';
|
||||||
|
var WINDOW = typeof window === 'object';
|
||||||
|
var root = WINDOW ? window : {};
|
||||||
|
if (root.JS_MD5_NO_WINDOW) {
|
||||||
|
WINDOW = false;
|
||||||
|
}
|
||||||
|
var WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && typeof self !== 'undefined' && self instanceof WorkerGlobalScope;
|
||||||
|
if (WEB_WORKER) {
|
||||||
|
root = self;
|
||||||
|
}
|
||||||
|
var COMMON_JS = !root.JS_MD5_NO_COMMON_JS && 'object' === 'object' && module.exports;
|
||||||
|
/* istanbul ignore next */
|
||||||
|
var ARRAY_BUFFER = !root.JS_MD5_NO_ARRAY_BUFFER && typeof ArrayBuffer !== 'undefined' ;
|
||||||
|
var HEX_CHARS = '0123456789abcdef'.split('');
|
||||||
|
var EXTRA = [128, 32768, 8388608, -2147483648];
|
||||||
|
var SHIFT = [0, 8, 16, 24];
|
||||||
|
var OUTPUT_TYPES = ['hex', 'array', 'digest', 'arrayBuffer'];
|
||||||
|
/* istanbul ignore else */
|
||||||
|
{
|
||||||
|
OUTPUT_TYPES.push('buffer');
|
||||||
|
}
|
||||||
|
/* istanbul ignore else */
|
||||||
|
{
|
||||||
|
OUTPUT_TYPES.push('base64');
|
||||||
|
}
|
||||||
|
/* istanbul ignore next */
|
||||||
|
var BASE64_ENCODE_CHAR = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('') ;
|
||||||
|
|
||||||
|
var blocks = [], buffer8;
|
||||||
|
if (ARRAY_BUFFER) {
|
||||||
|
var buffer = new ArrayBuffer(68);
|
||||||
|
buffer8 = new Uint8Array(buffer);
|
||||||
|
blocks = new Uint32Array(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
var isArray = Array.isArray;
|
||||||
|
/* istanbul ignore else */
|
||||||
|
if ((root.JS_MD5_NO_NODE_JS || !isArray)) {
|
||||||
|
isArray = function (obj) {
|
||||||
|
return Object.prototype.toString.call(obj) === '[object Array]';
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
var isView = ArrayBuffer.isView;
|
||||||
|
/* istanbul ignore else */
|
||||||
|
if (ARRAY_BUFFER && (root.JS_MD5_NO_ARRAY_BUFFER_IS_VIEW || !isView)) {
|
||||||
|
isView = function (obj) {
|
||||||
|
return typeof obj === 'object' && obj.buffer && obj.buffer.constructor === ArrayBuffer;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// [message: string, isString: bool]
|
||||||
|
var formatMessage = function (message) {
|
||||||
|
var type = typeof message;
|
||||||
|
if (type === 'string') {
|
||||||
|
return [message, true];
|
||||||
|
}
|
||||||
|
if (type !== 'object' || message === null) {
|
||||||
|
throw new Error(INPUT_ERROR);
|
||||||
|
}
|
||||||
|
if (ARRAY_BUFFER && message.constructor === ArrayBuffer) {
|
||||||
|
return [new Uint8Array(message), false];
|
||||||
|
}
|
||||||
|
if (!isArray(message) && !isView(message)) {
|
||||||
|
throw new Error(INPUT_ERROR);
|
||||||
|
}
|
||||||
|
return [message, false];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method hex
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as hex string
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} Hex string
|
||||||
|
* @example
|
||||||
|
* md5.hex('The quick brown fox jumps over the lazy dog');
|
||||||
|
* // equal to
|
||||||
|
* md5('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method digest
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @example
|
||||||
|
* md5.digest('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method array
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @example
|
||||||
|
* md5.array('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method arrayBuffer
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @example
|
||||||
|
* md5.arrayBuffer('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method buffer
|
||||||
|
* @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @example
|
||||||
|
* md5.buffer('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method base64
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as base64 string
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} base64 string
|
||||||
|
* @example
|
||||||
|
* md5.base64('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
var createOutputMethod = function (outputType) {
|
||||||
|
return function (message) {
|
||||||
|
return new Md5(true).update(message)[outputType]();
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method create
|
||||||
|
* @memberof md5
|
||||||
|
* @description Create Md5 object
|
||||||
|
* @returns {Md5} Md5 object.
|
||||||
|
* @example
|
||||||
|
* var hash = md5.create();
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method update
|
||||||
|
* @memberof md5
|
||||||
|
* @description Create and update Md5 object
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Md5} Md5 object.
|
||||||
|
* @example
|
||||||
|
* var hash = md5.update('The quick brown fox jumps over the lazy dog');
|
||||||
|
* // equal to
|
||||||
|
* var hash = md5.create();
|
||||||
|
* hash.update('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
var createMethod = function () {
|
||||||
|
var method = createOutputMethod('hex');
|
||||||
|
method.create = function () {
|
||||||
|
return new Md5();
|
||||||
|
};
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
return method;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @namespace md5.hmac
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method hex
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as hex string
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} Hex string
|
||||||
|
* @example
|
||||||
|
* md5.hmac.hex('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
* // equal to
|
||||||
|
* md5.hmac('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method digest
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @example
|
||||||
|
* md5.hmac.digest('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method array
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @example
|
||||||
|
* md5.hmac.array('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method arrayBuffer
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @example
|
||||||
|
* md5.hmac.arrayBuffer('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method buffer
|
||||||
|
* @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @example
|
||||||
|
* md5.hmac.buffer('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method base64
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as base64 string
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} base64 string
|
||||||
|
* @example
|
||||||
|
* md5.hmac.base64('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
var createHmacOutputMethod = function (outputType) {
|
||||||
|
return function (key, message) {
|
||||||
|
return new HmacMd5(key, true).update(message)[outputType]();
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method create
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Create HmacMd5 object
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @returns {HmacMd5} HmacMd5 object.
|
||||||
|
* @example
|
||||||
|
* var hash = md5.hmac.create('key');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method update
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Create and update HmacMd5 object
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {HmacMd5} HmacMd5 object.
|
||||||
|
* @example
|
||||||
|
* var hash = md5.hmac.update('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
* // equal to
|
||||||
|
* var hash = md5.hmac.create('key');
|
||||||
|
* hash.update('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
var createHmacMethod = function () {
|
||||||
|
var method = createHmacOutputMethod('hex');
|
||||||
|
method.create = function (key) {
|
||||||
|
return new HmacMd5(key);
|
||||||
|
};
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
return method;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Md5 class
|
||||||
|
* @class Md5
|
||||||
|
* @description This is internal class.
|
||||||
|
* @see {@link md5.create}
|
||||||
|
*/
|
||||||
|
function Md5(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;
|
||||||
|
this.buffer8 = buffer8;
|
||||||
|
} else {
|
||||||
|
if (ARRAY_BUFFER) {
|
||||||
|
var buffer = new ArrayBuffer(68);
|
||||||
|
this.buffer8 = new Uint8Array(buffer);
|
||||||
|
this.blocks = new Uint32Array(buffer);
|
||||||
|
} else {
|
||||||
|
this.blocks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.h0 = this.h1 = this.h2 = this.h3 = this.start = this.bytes = this.hBytes = 0;
|
||||||
|
this.finalized = this.hashed = false;
|
||||||
|
this.first = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method update
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Update hash
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Md5} Md5 object.
|
||||||
|
* @see {@link md5.update}
|
||||||
|
*/
|
||||||
|
Md5.prototype.update = function (message) {
|
||||||
|
if (this.finalized) {
|
||||||
|
throw new Error(FINALIZE_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
var result = formatMessage(message);
|
||||||
|
message = result[0];
|
||||||
|
var isString = result[1];
|
||||||
|
var code, index = 0, i, length = message.length, blocks = this.blocks;
|
||||||
|
var buffer8 = this.buffer8;
|
||||||
|
|
||||||
|
while (index < length) {
|
||||||
|
if (this.hashed) {
|
||||||
|
this.hashed = false;
|
||||||
|
blocks[0] = blocks[16];
|
||||||
|
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 (isString) {
|
||||||
|
if (ARRAY_BUFFER) {
|
||||||
|
for (i = this.start; index < length && i < 64; ++index) {
|
||||||
|
code = message.charCodeAt(index);
|
||||||
|
if (code < 0x80) {
|
||||||
|
buffer8[i++] = code;
|
||||||
|
} else if (code < 0x800) {
|
||||||
|
buffer8[i++] = 0xc0 | (code >>> 6);
|
||||||
|
buffer8[i++] = 0x80 | (code & 0x3f);
|
||||||
|
} else if (code < 0xd800 || code >= 0xe000) {
|
||||||
|
buffer8[i++] = 0xe0 | (code >>> 12);
|
||||||
|
buffer8[i++] = 0x80 | ((code >>> 6) & 0x3f);
|
||||||
|
buffer8[i++] = 0x80 | (code & 0x3f);
|
||||||
|
} else {
|
||||||
|
code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
|
||||||
|
buffer8[i++] = 0xf0 | (code >>> 18);
|
||||||
|
buffer8[i++] = 0x80 | ((code >>> 12) & 0x3f);
|
||||||
|
buffer8[i++] = 0x80 | ((code >>> 6) & 0x3f);
|
||||||
|
buffer8[i++] = 0x80 | (code & 0x3f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} 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];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (ARRAY_BUFFER) {
|
||||||
|
for (i = this.start; index < length && i < 64; ++index) {
|
||||||
|
buffer8[i++] = message[index];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (i = this.start; index < length && i < 64; ++index) {
|
||||||
|
blocks[i >>> 2] |= message[index] << SHIFT[i++ & 3];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.lastByteIndex = i;
|
||||||
|
this.bytes += i - this.start;
|
||||||
|
if (i >= 64) {
|
||||||
|
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;
|
||||||
|
};
|
||||||
|
|
||||||
|
Md5.prototype.finalize = function () {
|
||||||
|
if (this.finalized) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.finalized = true;
|
||||||
|
var blocks = this.blocks, i = this.lastByteIndex;
|
||||||
|
blocks[i >>> 2] |= EXTRA[i & 3];
|
||||||
|
if (i >= 56) {
|
||||||
|
if (!this.hashed) {
|
||||||
|
this.hash();
|
||||||
|
}
|
||||||
|
blocks[0] = blocks[16];
|
||||||
|
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.bytes << 3;
|
||||||
|
blocks[15] = this.hBytes << 3 | this.bytes >>> 29;
|
||||||
|
this.hash();
|
||||||
|
};
|
||||||
|
|
||||||
|
Md5.prototype.hash = function () {
|
||||||
|
var a, b, c, d, bc, da, blocks = this.blocks;
|
||||||
|
|
||||||
|
if (this.first) {
|
||||||
|
a = blocks[0] - 680876937;
|
||||||
|
a = (a << 7 | a >>> 25) - 271733879 << 0;
|
||||||
|
d = (-1732584194 ^ a & 2004318071) + blocks[1] - 117830708;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c = (-271733879 ^ (d & (a ^ -271733879))) + blocks[2] - 1126478375;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b = (a ^ (c & (d ^ a))) + blocks[3] - 1316259209;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
} else {
|
||||||
|
a = this.h0;
|
||||||
|
b = this.h1;
|
||||||
|
c = this.h2;
|
||||||
|
d = this.h3;
|
||||||
|
a += (d ^ (b & (c ^ d))) + blocks[0] - 680876936;
|
||||||
|
a = (a << 7 | a >>> 25) + b << 0;
|
||||||
|
d += (c ^ (a & (b ^ c))) + blocks[1] - 389564586;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c += (b ^ (d & (a ^ b))) + blocks[2] + 606105819;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b += (a ^ (c & (d ^ a))) + blocks[3] - 1044525330;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
a += (d ^ (b & (c ^ d))) + blocks[4] - 176418897;
|
||||||
|
a = (a << 7 | a >>> 25) + b << 0;
|
||||||
|
d += (c ^ (a & (b ^ c))) + blocks[5] + 1200080426;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c += (b ^ (d & (a ^ b))) + blocks[6] - 1473231341;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b += (a ^ (c & (d ^ a))) + blocks[7] - 45705983;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
a += (d ^ (b & (c ^ d))) + blocks[8] + 1770035416;
|
||||||
|
a = (a << 7 | a >>> 25) + b << 0;
|
||||||
|
d += (c ^ (a & (b ^ c))) + blocks[9] - 1958414417;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c += (b ^ (d & (a ^ b))) + blocks[10] - 42063;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b += (a ^ (c & (d ^ a))) + blocks[11] - 1990404162;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
a += (d ^ (b & (c ^ d))) + blocks[12] + 1804603682;
|
||||||
|
a = (a << 7 | a >>> 25) + b << 0;
|
||||||
|
d += (c ^ (a & (b ^ c))) + blocks[13] - 40341101;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c += (b ^ (d & (a ^ b))) + blocks[14] - 1502002290;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b += (a ^ (c & (d ^ a))) + blocks[15] + 1236535329;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
a += (c ^ (d & (b ^ c))) + blocks[1] - 165796510;
|
||||||
|
a = (a << 5 | a >>> 27) + b << 0;
|
||||||
|
d += (b ^ (c & (a ^ b))) + blocks[6] - 1069501632;
|
||||||
|
d = (d << 9 | d >>> 23) + a << 0;
|
||||||
|
c += (a ^ (b & (d ^ a))) + blocks[11] + 643717713;
|
||||||
|
c = (c << 14 | c >>> 18) + d << 0;
|
||||||
|
b += (d ^ (a & (c ^ d))) + blocks[0] - 373897302;
|
||||||
|
b = (b << 20 | b >>> 12) + c << 0;
|
||||||
|
a += (c ^ (d & (b ^ c))) + blocks[5] - 701558691;
|
||||||
|
a = (a << 5 | a >>> 27) + b << 0;
|
||||||
|
d += (b ^ (c & (a ^ b))) + blocks[10] + 38016083;
|
||||||
|
d = (d << 9 | d >>> 23) + a << 0;
|
||||||
|
c += (a ^ (b & (d ^ a))) + blocks[15] - 660478335;
|
||||||
|
c = (c << 14 | c >>> 18) + d << 0;
|
||||||
|
b += (d ^ (a & (c ^ d))) + blocks[4] - 405537848;
|
||||||
|
b = (b << 20 | b >>> 12) + c << 0;
|
||||||
|
a += (c ^ (d & (b ^ c))) + blocks[9] + 568446438;
|
||||||
|
a = (a << 5 | a >>> 27) + b << 0;
|
||||||
|
d += (b ^ (c & (a ^ b))) + blocks[14] - 1019803690;
|
||||||
|
d = (d << 9 | d >>> 23) + a << 0;
|
||||||
|
c += (a ^ (b & (d ^ a))) + blocks[3] - 187363961;
|
||||||
|
c = (c << 14 | c >>> 18) + d << 0;
|
||||||
|
b += (d ^ (a & (c ^ d))) + blocks[8] + 1163531501;
|
||||||
|
b = (b << 20 | b >>> 12) + c << 0;
|
||||||
|
a += (c ^ (d & (b ^ c))) + blocks[13] - 1444681467;
|
||||||
|
a = (a << 5 | a >>> 27) + b << 0;
|
||||||
|
d += (b ^ (c & (a ^ b))) + blocks[2] - 51403784;
|
||||||
|
d = (d << 9 | d >>> 23) + a << 0;
|
||||||
|
c += (a ^ (b & (d ^ a))) + blocks[7] + 1735328473;
|
||||||
|
c = (c << 14 | c >>> 18) + d << 0;
|
||||||
|
b += (d ^ (a & (c ^ d))) + blocks[12] - 1926607734;
|
||||||
|
b = (b << 20 | b >>> 12) + c << 0;
|
||||||
|
bc = b ^ c;
|
||||||
|
a += (bc ^ d) + blocks[5] - 378558;
|
||||||
|
a = (a << 4 | a >>> 28) + b << 0;
|
||||||
|
d += (bc ^ a) + blocks[8] - 2022574463;
|
||||||
|
d = (d << 11 | d >>> 21) + a << 0;
|
||||||
|
da = d ^ a;
|
||||||
|
c += (da ^ b) + blocks[11] + 1839030562;
|
||||||
|
c = (c << 16 | c >>> 16) + d << 0;
|
||||||
|
b += (da ^ c) + blocks[14] - 35309556;
|
||||||
|
b = (b << 23 | b >>> 9) + c << 0;
|
||||||
|
bc = b ^ c;
|
||||||
|
a += (bc ^ d) + blocks[1] - 1530992060;
|
||||||
|
a = (a << 4 | a >>> 28) + b << 0;
|
||||||
|
d += (bc ^ a) + blocks[4] + 1272893353;
|
||||||
|
d = (d << 11 | d >>> 21) + a << 0;
|
||||||
|
da = d ^ a;
|
||||||
|
c += (da ^ b) + blocks[7] - 155497632;
|
||||||
|
c = (c << 16 | c >>> 16) + d << 0;
|
||||||
|
b += (da ^ c) + blocks[10] - 1094730640;
|
||||||
|
b = (b << 23 | b >>> 9) + c << 0;
|
||||||
|
bc = b ^ c;
|
||||||
|
a += (bc ^ d) + blocks[13] + 681279174;
|
||||||
|
a = (a << 4 | a >>> 28) + b << 0;
|
||||||
|
d += (bc ^ a) + blocks[0] - 358537222;
|
||||||
|
d = (d << 11 | d >>> 21) + a << 0;
|
||||||
|
da = d ^ a;
|
||||||
|
c += (da ^ b) + blocks[3] - 722521979;
|
||||||
|
c = (c << 16 | c >>> 16) + d << 0;
|
||||||
|
b += (da ^ c) + blocks[6] + 76029189;
|
||||||
|
b = (b << 23 | b >>> 9) + c << 0;
|
||||||
|
bc = b ^ c;
|
||||||
|
a += (bc ^ d) + blocks[9] - 640364487;
|
||||||
|
a = (a << 4 | a >>> 28) + b << 0;
|
||||||
|
d += (bc ^ a) + blocks[12] - 421815835;
|
||||||
|
d = (d << 11 | d >>> 21) + a << 0;
|
||||||
|
da = d ^ a;
|
||||||
|
c += (da ^ b) + blocks[15] + 530742520;
|
||||||
|
c = (c << 16 | c >>> 16) + d << 0;
|
||||||
|
b += (da ^ c) + blocks[2] - 995338651;
|
||||||
|
b = (b << 23 | b >>> 9) + c << 0;
|
||||||
|
a += (c ^ (b | ~d)) + blocks[0] - 198630844;
|
||||||
|
a = (a << 6 | a >>> 26) + b << 0;
|
||||||
|
d += (b ^ (a | ~c)) + blocks[7] + 1126891415;
|
||||||
|
d = (d << 10 | d >>> 22) + a << 0;
|
||||||
|
c += (a ^ (d | ~b)) + blocks[14] - 1416354905;
|
||||||
|
c = (c << 15 | c >>> 17) + d << 0;
|
||||||
|
b += (d ^ (c | ~a)) + blocks[5] - 57434055;
|
||||||
|
b = (b << 21 | b >>> 11) + c << 0;
|
||||||
|
a += (c ^ (b | ~d)) + blocks[12] + 1700485571;
|
||||||
|
a = (a << 6 | a >>> 26) + b << 0;
|
||||||
|
d += (b ^ (a | ~c)) + blocks[3] - 1894986606;
|
||||||
|
d = (d << 10 | d >>> 22) + a << 0;
|
||||||
|
c += (a ^ (d | ~b)) + blocks[10] - 1051523;
|
||||||
|
c = (c << 15 | c >>> 17) + d << 0;
|
||||||
|
b += (d ^ (c | ~a)) + blocks[1] - 2054922799;
|
||||||
|
b = (b << 21 | b >>> 11) + c << 0;
|
||||||
|
a += (c ^ (b | ~d)) + blocks[8] + 1873313359;
|
||||||
|
a = (a << 6 | a >>> 26) + b << 0;
|
||||||
|
d += (b ^ (a | ~c)) + blocks[15] - 30611744;
|
||||||
|
d = (d << 10 | d >>> 22) + a << 0;
|
||||||
|
c += (a ^ (d | ~b)) + blocks[6] - 1560198380;
|
||||||
|
c = (c << 15 | c >>> 17) + d << 0;
|
||||||
|
b += (d ^ (c | ~a)) + blocks[13] + 1309151649;
|
||||||
|
b = (b << 21 | b >>> 11) + c << 0;
|
||||||
|
a += (c ^ (b | ~d)) + blocks[4] - 145523070;
|
||||||
|
a = (a << 6 | a >>> 26) + b << 0;
|
||||||
|
d += (b ^ (a | ~c)) + blocks[11] - 1120210379;
|
||||||
|
d = (d << 10 | d >>> 22) + a << 0;
|
||||||
|
c += (a ^ (d | ~b)) + blocks[2] + 718787259;
|
||||||
|
c = (c << 15 | c >>> 17) + d << 0;
|
||||||
|
b += (d ^ (c | ~a)) + blocks[9] - 343485551;
|
||||||
|
b = (b << 21 | b >>> 11) + c << 0;
|
||||||
|
|
||||||
|
if (this.first) {
|
||||||
|
this.h0 = a + 1732584193 << 0;
|
||||||
|
this.h1 = b - 271733879 << 0;
|
||||||
|
this.h2 = c - 1732584194 << 0;
|
||||||
|
this.h3 = d + 271733878 << 0;
|
||||||
|
this.first = false;
|
||||||
|
} else {
|
||||||
|
this.h0 = this.h0 + a << 0;
|
||||||
|
this.h1 = this.h1 + b << 0;
|
||||||
|
this.h2 = this.h2 + c << 0;
|
||||||
|
this.h3 = this.h3 + d << 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method hex
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as hex string
|
||||||
|
* @returns {String} Hex string
|
||||||
|
* @see {@link md5.hex}
|
||||||
|
* @example
|
||||||
|
* hash.hex();
|
||||||
|
*/
|
||||||
|
Md5.prototype.hex = function () {
|
||||||
|
this.finalize();
|
||||||
|
|
||||||
|
var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;
|
||||||
|
|
||||||
|
return HEX_CHARS[(h0 >>> 4) & 0x0F] + HEX_CHARS[h0 & 0x0F] +
|
||||||
|
HEX_CHARS[(h0 >>> 12) & 0x0F] + HEX_CHARS[(h0 >>> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h0 >>> 20) & 0x0F] + HEX_CHARS[(h0 >>> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h0 >>> 28) & 0x0F] + HEX_CHARS[(h0 >>> 24) & 0x0F] +
|
||||||
|
HEX_CHARS[(h1 >>> 4) & 0x0F] + HEX_CHARS[h1 & 0x0F] +
|
||||||
|
HEX_CHARS[(h1 >>> 12) & 0x0F] + HEX_CHARS[(h1 >>> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h1 >>> 20) & 0x0F] + HEX_CHARS[(h1 >>> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h1 >>> 28) & 0x0F] + HEX_CHARS[(h1 >>> 24) & 0x0F] +
|
||||||
|
HEX_CHARS[(h2 >>> 4) & 0x0F] + HEX_CHARS[h2 & 0x0F] +
|
||||||
|
HEX_CHARS[(h2 >>> 12) & 0x0F] + HEX_CHARS[(h2 >>> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h2 >>> 20) & 0x0F] + HEX_CHARS[(h2 >>> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h2 >>> 28) & 0x0F] + HEX_CHARS[(h2 >>> 24) & 0x0F] +
|
||||||
|
HEX_CHARS[(h3 >>> 4) & 0x0F] + HEX_CHARS[h3 & 0x0F] +
|
||||||
|
HEX_CHARS[(h3 >>> 12) & 0x0F] + HEX_CHARS[(h3 >>> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h3 >>> 20) & 0x0F] + HEX_CHARS[(h3 >>> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h3 >>> 28) & 0x0F] + HEX_CHARS[(h3 >>> 24) & 0x0F];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method toString
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as hex string
|
||||||
|
* @returns {String} Hex string
|
||||||
|
* @see {@link md5.hex}
|
||||||
|
* @example
|
||||||
|
* hash.toString();
|
||||||
|
*/
|
||||||
|
Md5.prototype.toString = Md5.prototype.hex;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method digest
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @see {@link md5.digest}
|
||||||
|
* @example
|
||||||
|
* hash.digest();
|
||||||
|
*/
|
||||||
|
Md5.prototype.digest = function () {
|
||||||
|
this.finalize();
|
||||||
|
|
||||||
|
var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;
|
||||||
|
return [
|
||||||
|
h0 & 0xFF, (h0 >>> 8) & 0xFF, (h0 >>> 16) & 0xFF, (h0 >>> 24) & 0xFF,
|
||||||
|
h1 & 0xFF, (h1 >>> 8) & 0xFF, (h1 >>> 16) & 0xFF, (h1 >>> 24) & 0xFF,
|
||||||
|
h2 & 0xFF, (h2 >>> 8) & 0xFF, (h2 >>> 16) & 0xFF, (h2 >>> 24) & 0xFF,
|
||||||
|
h3 & 0xFF, (h3 >>> 8) & 0xFF, (h3 >>> 16) & 0xFF, (h3 >>> 24) & 0xFF
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method array
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @see {@link md5.array}
|
||||||
|
* @example
|
||||||
|
* hash.array();
|
||||||
|
*/
|
||||||
|
Md5.prototype.array = Md5.prototype.digest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method arrayBuffer
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @see {@link md5.arrayBuffer}
|
||||||
|
* @example
|
||||||
|
* hash.arrayBuffer();
|
||||||
|
*/
|
||||||
|
Md5.prototype.arrayBuffer = function () {
|
||||||
|
this.finalize();
|
||||||
|
|
||||||
|
var buffer = new ArrayBuffer(16);
|
||||||
|
var blocks = new Uint32Array(buffer);
|
||||||
|
blocks[0] = this.h0;
|
||||||
|
blocks[1] = this.h1;
|
||||||
|
blocks[2] = this.h2;
|
||||||
|
blocks[3] = this.h3;
|
||||||
|
return buffer;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method buffer
|
||||||
|
* @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @see {@link md5.buffer}
|
||||||
|
* @example
|
||||||
|
* hash.buffer();
|
||||||
|
*/
|
||||||
|
/* istanbul ignore else */
|
||||||
|
{
|
||||||
|
Md5.prototype.buffer = Md5.prototype.arrayBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method base64
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as base64 string
|
||||||
|
* @returns {String} base64 string
|
||||||
|
* @see {@link md5.base64}
|
||||||
|
* @example
|
||||||
|
* hash.base64();
|
||||||
|
*/
|
||||||
|
/* istanbul ignore else */
|
||||||
|
{
|
||||||
|
Md5.prototype.base64 = function () {
|
||||||
|
var v1, v2, v3, base64Str = '', bytes = this.array();
|
||||||
|
for (var i = 0; i < 15;) {
|
||||||
|
v1 = bytes[i++];
|
||||||
|
v2 = bytes[i++];
|
||||||
|
v3 = bytes[i++];
|
||||||
|
base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] +
|
||||||
|
BASE64_ENCODE_CHAR[(v1 << 4 | v2 >>> 4) & 63] +
|
||||||
|
BASE64_ENCODE_CHAR[(v2 << 2 | v3 >>> 6) & 63] +
|
||||||
|
BASE64_ENCODE_CHAR[v3 & 63];
|
||||||
|
}
|
||||||
|
v1 = bytes[i];
|
||||||
|
base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] +
|
||||||
|
BASE64_ENCODE_CHAR[(v1 << 4) & 63] +
|
||||||
|
'==';
|
||||||
|
return base64Str;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* HmacMd5 class
|
||||||
|
* @class HmacMd5
|
||||||
|
* @extends Md5
|
||||||
|
* @description This is internal class.
|
||||||
|
* @see {@link md5.hmac.create}
|
||||||
|
*/
|
||||||
|
function HmacMd5(key, sharedMemory) {
|
||||||
|
var i, result = formatMessage(key);
|
||||||
|
key = result[0];
|
||||||
|
if (result[1]) {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (key.length > 64) {
|
||||||
|
key = (new Md5(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;
|
||||||
|
}
|
||||||
|
|
||||||
|
Md5.call(this, sharedMemory);
|
||||||
|
|
||||||
|
this.update(iKeyPad);
|
||||||
|
this.oKeyPad = oKeyPad;
|
||||||
|
this.inner = true;
|
||||||
|
this.sharedMemory = sharedMemory;
|
||||||
|
}
|
||||||
|
/* istanbul ignore else */
|
||||||
|
{
|
||||||
|
HmacMd5.prototype = new Md5();
|
||||||
|
|
||||||
|
HmacMd5.prototype.finalize = function () {
|
||||||
|
Md5.prototype.finalize.call(this);
|
||||||
|
if (this.inner) {
|
||||||
|
this.inner = false;
|
||||||
|
var innerHash = this.array();
|
||||||
|
Md5.call(this, this.sharedMemory);
|
||||||
|
this.update(this.oKeyPad);
|
||||||
|
this.update(innerHash);
|
||||||
|
Md5.prototype.finalize.call(this);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
var exports = createMethod();
|
||||||
|
exports.md5 = exports;
|
||||||
|
/* istanbul ignore else */
|
||||||
|
{
|
||||||
|
exports.md5.hmac = createHmacMethod();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (COMMON_JS) {
|
||||||
|
module.exports = exports;
|
||||||
|
} else {
|
||||||
|
/**
|
||||||
|
* @method md5
|
||||||
|
* @description Md5 hash function, export to global in browsers.
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} md5 hashes
|
||||||
|
* @example
|
||||||
|
* md5(''); // d41d8cd98f00b204e9800998ecf8427e
|
||||||
|
* md5('The quick brown fox jumps over the lazy dog'); // 9e107d9d372bb6826bd81d3542a419d6
|
||||||
|
* md5('The quick brown fox jumps over the lazy dog.'); // e4d909c290d0fb1ca068ffaddf22cbd0
|
||||||
|
*
|
||||||
|
* // It also supports UTF-8 encoding
|
||||||
|
* md5('中文'); // a7bac2239fcdcb3a067903d8077c4a07
|
||||||
|
*
|
||||||
|
* // It also supports byte `Array`, `Uint8Array`, `ArrayBuffer`
|
||||||
|
* md5([]); // d41d8cd98f00b204e9800998ecf8427e
|
||||||
|
* md5(new Uint8Array([])); // d41d8cd98f00b204e9800998ecf8427e
|
||||||
|
*/
|
||||||
|
root.md5 = exports;
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
} (md5$1));
|
||||||
|
|
||||||
|
var md5Exports = md5$1.exports;
|
||||||
|
var md5 = /*@__PURE__*/getDefaultExportFromCjs(md5Exports);
|
||||||
|
|
||||||
|
export { md5 as default, md5 };
|
||||||
@@ -0,0 +1,852 @@
|
|||||||
|
/**
|
||||||
|
* [js-md5]{@link https://github.com/emn178/js-md5}
|
||||||
|
*
|
||||||
|
* @namespace md5
|
||||||
|
* @version 0.9.0
|
||||||
|
* @author Chen, Yi-Cyuan [emn178@gmail.com]
|
||||||
|
* @copyright Chen, Yi-Cyuan 2014-2026
|
||||||
|
* @license MIT
|
||||||
|
*/
|
||||||
|
(function () {
|
||||||
|
|
||||||
|
var INPUT_ERROR = 'input is invalid type';
|
||||||
|
var FINALIZE_ERROR = 'finalize already called';
|
||||||
|
var WINDOW = typeof window === 'object';
|
||||||
|
var root = WINDOW ? window : {};
|
||||||
|
if (root.JS_MD5_NO_WINDOW) {
|
||||||
|
WINDOW = false;
|
||||||
|
}
|
||||||
|
var WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && typeof self !== 'undefined' && self instanceof WorkerGlobalScope;
|
||||||
|
/* istanbul ignore next */
|
||||||
|
var NODE_JS = !root.JS_MD5_NO_NODE_JS && !WINDOW && typeof process === 'object' && process.versions && process.versions.node;
|
||||||
|
if (NODE_JS) {
|
||||||
|
root = global;
|
||||||
|
} else if (WEB_WORKER) {
|
||||||
|
root = self;
|
||||||
|
}
|
||||||
|
var COMMON_JS = !root.JS_MD5_NO_COMMON_JS && typeof module === 'object' && module.exports;
|
||||||
|
var AMD = typeof define === 'function' && define.amd;
|
||||||
|
var HEX_CHARS = '0123456789abcdef'.split('');
|
||||||
|
var EXTRA = [128, 32768, 8388608, -2147483648];
|
||||||
|
var OUTPUT_TYPES = ['hex', 'array', 'digest', 'arrayBuffer'];
|
||||||
|
/* istanbul ignore else */
|
||||||
|
{
|
||||||
|
OUTPUT_TYPES.push('buffer');
|
||||||
|
}
|
||||||
|
/* istanbul ignore else */
|
||||||
|
{
|
||||||
|
OUTPUT_TYPES.push('base64');
|
||||||
|
}
|
||||||
|
/* istanbul ignore next */
|
||||||
|
var BASE64_ENCODE_CHAR = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('') ;
|
||||||
|
|
||||||
|
var blocks = [], buffer8;
|
||||||
|
{
|
||||||
|
var buffer = new ArrayBuffer(68);
|
||||||
|
buffer8 = new Uint8Array(buffer);
|
||||||
|
blocks = new Uint32Array(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
var isArray = Array.isArray;
|
||||||
|
|
||||||
|
var isView = ArrayBuffer.isView;
|
||||||
|
|
||||||
|
// [message: string, isString: bool]
|
||||||
|
var formatMessage = function (message) {
|
||||||
|
var type = typeof message;
|
||||||
|
if (type === 'string') {
|
||||||
|
return [message, true];
|
||||||
|
}
|
||||||
|
if (type !== 'object' || message === null) {
|
||||||
|
throw new Error(INPUT_ERROR);
|
||||||
|
}
|
||||||
|
if (message.constructor === ArrayBuffer) {
|
||||||
|
return [new Uint8Array(message), false];
|
||||||
|
}
|
||||||
|
if (!isArray(message) && !isView(message)) {
|
||||||
|
throw new Error(INPUT_ERROR);
|
||||||
|
}
|
||||||
|
return [message, false];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method hex
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as hex string
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} Hex string
|
||||||
|
* @example
|
||||||
|
* md5.hex('The quick brown fox jumps over the lazy dog');
|
||||||
|
* // equal to
|
||||||
|
* md5('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method digest
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @example
|
||||||
|
* md5.digest('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method array
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @example
|
||||||
|
* md5.array('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method arrayBuffer
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @example
|
||||||
|
* md5.arrayBuffer('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method buffer
|
||||||
|
* @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @example
|
||||||
|
* md5.buffer('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method base64
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as base64 string
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} base64 string
|
||||||
|
* @example
|
||||||
|
* md5.base64('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
var createOutputMethod = function (outputType) {
|
||||||
|
return function (message) {
|
||||||
|
return new Md5(true).update(message)[outputType]();
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method create
|
||||||
|
* @memberof md5
|
||||||
|
* @description Create Md5 object
|
||||||
|
* @returns {Md5} Md5 object.
|
||||||
|
* @example
|
||||||
|
* var hash = md5.create();
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method update
|
||||||
|
* @memberof md5
|
||||||
|
* @description Create and update Md5 object
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Md5} Md5 object.
|
||||||
|
* @example
|
||||||
|
* var hash = md5.update('The quick brown fox jumps over the lazy dog');
|
||||||
|
* // equal to
|
||||||
|
* var hash = md5.create();
|
||||||
|
* hash.update('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
var createMethod = function () {
|
||||||
|
var method = createOutputMethod('hex');
|
||||||
|
if (NODE_JS) {
|
||||||
|
method = nodeWrap(method);
|
||||||
|
}
|
||||||
|
method.create = function () {
|
||||||
|
return new Md5();
|
||||||
|
};
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
return method;
|
||||||
|
};
|
||||||
|
|
||||||
|
var nodeWrap = function (method) {
|
||||||
|
var crypto = require('crypto');
|
||||||
|
var Buffer = require('buffer').Buffer;
|
||||||
|
var bufferFrom = Buffer.from;
|
||||||
|
var nodeMethod = function (message) {
|
||||||
|
if (typeof message === 'string') {
|
||||||
|
return crypto.createHash('md5').update(message, 'utf8').digest('hex');
|
||||||
|
} else {
|
||||||
|
if (message === null || message === undefined) {
|
||||||
|
throw new Error(INPUT_ERROR);
|
||||||
|
} else if (message.constructor === ArrayBuffer) {
|
||||||
|
message = new Uint8Array(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isArray(message) || isView(message) ||
|
||||||
|
message.constructor === Buffer) {
|
||||||
|
return crypto.createHash('md5').update(bufferFrom(message)).digest('hex');
|
||||||
|
} else {
|
||||||
|
return method(message);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
return nodeMethod;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @namespace md5.hmac
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method hex
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as hex string
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} Hex string
|
||||||
|
* @example
|
||||||
|
* md5.hmac.hex('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
* // equal to
|
||||||
|
* md5.hmac('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method digest
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @example
|
||||||
|
* md5.hmac.digest('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method array
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @example
|
||||||
|
* md5.hmac.array('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method arrayBuffer
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @example
|
||||||
|
* md5.hmac.arrayBuffer('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method buffer
|
||||||
|
* @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @example
|
||||||
|
* md5.hmac.buffer('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method base64
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as base64 string
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} base64 string
|
||||||
|
* @example
|
||||||
|
* md5.hmac.base64('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
var createHmacOutputMethod = function (outputType) {
|
||||||
|
return function (key, message) {
|
||||||
|
return new HmacMd5(key, true).update(message)[outputType]();
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method create
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Create HmacMd5 object
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @returns {HmacMd5} HmacMd5 object.
|
||||||
|
* @example
|
||||||
|
* var hash = md5.hmac.create('key');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method update
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Create and update HmacMd5 object
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {HmacMd5} HmacMd5 object.
|
||||||
|
* @example
|
||||||
|
* var hash = md5.hmac.update('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
* // equal to
|
||||||
|
* var hash = md5.hmac.create('key');
|
||||||
|
* hash.update('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
var createHmacMethod = function () {
|
||||||
|
var method = createHmacOutputMethod('hex');
|
||||||
|
method.create = function (key) {
|
||||||
|
return new HmacMd5(key);
|
||||||
|
};
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
return method;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Md5 class
|
||||||
|
* @class Md5
|
||||||
|
* @description This is internal class.
|
||||||
|
* @see {@link md5.create}
|
||||||
|
*/
|
||||||
|
function Md5(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;
|
||||||
|
this.buffer8 = buffer8;
|
||||||
|
} else {
|
||||||
|
{
|
||||||
|
var buffer = new ArrayBuffer(68);
|
||||||
|
this.buffer8 = new Uint8Array(buffer);
|
||||||
|
this.blocks = new Uint32Array(buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.h0 = this.h1 = this.h2 = this.h3 = this.start = this.bytes = this.hBytes = 0;
|
||||||
|
this.finalized = this.hashed = false;
|
||||||
|
this.first = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method update
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Update hash
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Md5} Md5 object.
|
||||||
|
* @see {@link md5.update}
|
||||||
|
*/
|
||||||
|
Md5.prototype.update = function (message) {
|
||||||
|
if (this.finalized) {
|
||||||
|
throw new Error(FINALIZE_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
var result = formatMessage(message);
|
||||||
|
message = result[0];
|
||||||
|
var isString = result[1];
|
||||||
|
var code, index = 0, i, length = message.length, blocks = this.blocks;
|
||||||
|
var buffer8 = this.buffer8;
|
||||||
|
|
||||||
|
while (index < length) {
|
||||||
|
if (this.hashed) {
|
||||||
|
this.hashed = false;
|
||||||
|
blocks[0] = blocks[16];
|
||||||
|
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 (isString) {
|
||||||
|
{
|
||||||
|
for (i = this.start; index < length && i < 64; ++index) {
|
||||||
|
code = message.charCodeAt(index);
|
||||||
|
if (code < 0x80) {
|
||||||
|
buffer8[i++] = code;
|
||||||
|
} else if (code < 0x800) {
|
||||||
|
buffer8[i++] = 0xc0 | (code >>> 6);
|
||||||
|
buffer8[i++] = 0x80 | (code & 0x3f);
|
||||||
|
} else if (code < 0xd800 || code >= 0xe000) {
|
||||||
|
buffer8[i++] = 0xe0 | (code >>> 12);
|
||||||
|
buffer8[i++] = 0x80 | ((code >>> 6) & 0x3f);
|
||||||
|
buffer8[i++] = 0x80 | (code & 0x3f);
|
||||||
|
} else {
|
||||||
|
code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
|
||||||
|
buffer8[i++] = 0xf0 | (code >>> 18);
|
||||||
|
buffer8[i++] = 0x80 | ((code >>> 12) & 0x3f);
|
||||||
|
buffer8[i++] = 0x80 | ((code >>> 6) & 0x3f);
|
||||||
|
buffer8[i++] = 0x80 | (code & 0x3f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
{
|
||||||
|
for (i = this.start; index < length && i < 64; ++index) {
|
||||||
|
buffer8[i++] = message[index];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.lastByteIndex = i;
|
||||||
|
this.bytes += i - this.start;
|
||||||
|
if (i >= 64) {
|
||||||
|
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;
|
||||||
|
};
|
||||||
|
|
||||||
|
Md5.prototype.finalize = function () {
|
||||||
|
if (this.finalized) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.finalized = true;
|
||||||
|
var blocks = this.blocks, i = this.lastByteIndex;
|
||||||
|
blocks[i >>> 2] |= EXTRA[i & 3];
|
||||||
|
if (i >= 56) {
|
||||||
|
if (!this.hashed) {
|
||||||
|
this.hash();
|
||||||
|
}
|
||||||
|
blocks[0] = blocks[16];
|
||||||
|
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.bytes << 3;
|
||||||
|
blocks[15] = this.hBytes << 3 | this.bytes >>> 29;
|
||||||
|
this.hash();
|
||||||
|
};
|
||||||
|
|
||||||
|
Md5.prototype.hash = function () {
|
||||||
|
var a, b, c, d, bc, da, blocks = this.blocks;
|
||||||
|
|
||||||
|
if (this.first) {
|
||||||
|
a = blocks[0] - 680876937;
|
||||||
|
a = (a << 7 | a >>> 25) - 271733879 << 0;
|
||||||
|
d = (-1732584194 ^ a & 2004318071) + blocks[1] - 117830708;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c = (-271733879 ^ (d & (a ^ -271733879))) + blocks[2] - 1126478375;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b = (a ^ (c & (d ^ a))) + blocks[3] - 1316259209;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
} else {
|
||||||
|
a = this.h0;
|
||||||
|
b = this.h1;
|
||||||
|
c = this.h2;
|
||||||
|
d = this.h3;
|
||||||
|
a += (d ^ (b & (c ^ d))) + blocks[0] - 680876936;
|
||||||
|
a = (a << 7 | a >>> 25) + b << 0;
|
||||||
|
d += (c ^ (a & (b ^ c))) + blocks[1] - 389564586;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c += (b ^ (d & (a ^ b))) + blocks[2] + 606105819;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b += (a ^ (c & (d ^ a))) + blocks[3] - 1044525330;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
a += (d ^ (b & (c ^ d))) + blocks[4] - 176418897;
|
||||||
|
a = (a << 7 | a >>> 25) + b << 0;
|
||||||
|
d += (c ^ (a & (b ^ c))) + blocks[5] + 1200080426;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c += (b ^ (d & (a ^ b))) + blocks[6] - 1473231341;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b += (a ^ (c & (d ^ a))) + blocks[7] - 45705983;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
a += (d ^ (b & (c ^ d))) + blocks[8] + 1770035416;
|
||||||
|
a = (a << 7 | a >>> 25) + b << 0;
|
||||||
|
d += (c ^ (a & (b ^ c))) + blocks[9] - 1958414417;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c += (b ^ (d & (a ^ b))) + blocks[10] - 42063;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b += (a ^ (c & (d ^ a))) + blocks[11] - 1990404162;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
a += (d ^ (b & (c ^ d))) + blocks[12] + 1804603682;
|
||||||
|
a = (a << 7 | a >>> 25) + b << 0;
|
||||||
|
d += (c ^ (a & (b ^ c))) + blocks[13] - 40341101;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c += (b ^ (d & (a ^ b))) + blocks[14] - 1502002290;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b += (a ^ (c & (d ^ a))) + blocks[15] + 1236535329;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
a += (c ^ (d & (b ^ c))) + blocks[1] - 165796510;
|
||||||
|
a = (a << 5 | a >>> 27) + b << 0;
|
||||||
|
d += (b ^ (c & (a ^ b))) + blocks[6] - 1069501632;
|
||||||
|
d = (d << 9 | d >>> 23) + a << 0;
|
||||||
|
c += (a ^ (b & (d ^ a))) + blocks[11] + 643717713;
|
||||||
|
c = (c << 14 | c >>> 18) + d << 0;
|
||||||
|
b += (d ^ (a & (c ^ d))) + blocks[0] - 373897302;
|
||||||
|
b = (b << 20 | b >>> 12) + c << 0;
|
||||||
|
a += (c ^ (d & (b ^ c))) + blocks[5] - 701558691;
|
||||||
|
a = (a << 5 | a >>> 27) + b << 0;
|
||||||
|
d += (b ^ (c & (a ^ b))) + blocks[10] + 38016083;
|
||||||
|
d = (d << 9 | d >>> 23) + a << 0;
|
||||||
|
c += (a ^ (b & (d ^ a))) + blocks[15] - 660478335;
|
||||||
|
c = (c << 14 | c >>> 18) + d << 0;
|
||||||
|
b += (d ^ (a & (c ^ d))) + blocks[4] - 405537848;
|
||||||
|
b = (b << 20 | b >>> 12) + c << 0;
|
||||||
|
a += (c ^ (d & (b ^ c))) + blocks[9] + 568446438;
|
||||||
|
a = (a << 5 | a >>> 27) + b << 0;
|
||||||
|
d += (b ^ (c & (a ^ b))) + blocks[14] - 1019803690;
|
||||||
|
d = (d << 9 | d >>> 23) + a << 0;
|
||||||
|
c += (a ^ (b & (d ^ a))) + blocks[3] - 187363961;
|
||||||
|
c = (c << 14 | c >>> 18) + d << 0;
|
||||||
|
b += (d ^ (a & (c ^ d))) + blocks[8] + 1163531501;
|
||||||
|
b = (b << 20 | b >>> 12) + c << 0;
|
||||||
|
a += (c ^ (d & (b ^ c))) + blocks[13] - 1444681467;
|
||||||
|
a = (a << 5 | a >>> 27) + b << 0;
|
||||||
|
d += (b ^ (c & (a ^ b))) + blocks[2] - 51403784;
|
||||||
|
d = (d << 9 | d >>> 23) + a << 0;
|
||||||
|
c += (a ^ (b & (d ^ a))) + blocks[7] + 1735328473;
|
||||||
|
c = (c << 14 | c >>> 18) + d << 0;
|
||||||
|
b += (d ^ (a & (c ^ d))) + blocks[12] - 1926607734;
|
||||||
|
b = (b << 20 | b >>> 12) + c << 0;
|
||||||
|
bc = b ^ c;
|
||||||
|
a += (bc ^ d) + blocks[5] - 378558;
|
||||||
|
a = (a << 4 | a >>> 28) + b << 0;
|
||||||
|
d += (bc ^ a) + blocks[8] - 2022574463;
|
||||||
|
d = (d << 11 | d >>> 21) + a << 0;
|
||||||
|
da = d ^ a;
|
||||||
|
c += (da ^ b) + blocks[11] + 1839030562;
|
||||||
|
c = (c << 16 | c >>> 16) + d << 0;
|
||||||
|
b += (da ^ c) + blocks[14] - 35309556;
|
||||||
|
b = (b << 23 | b >>> 9) + c << 0;
|
||||||
|
bc = b ^ c;
|
||||||
|
a += (bc ^ d) + blocks[1] - 1530992060;
|
||||||
|
a = (a << 4 | a >>> 28) + b << 0;
|
||||||
|
d += (bc ^ a) + blocks[4] + 1272893353;
|
||||||
|
d = (d << 11 | d >>> 21) + a << 0;
|
||||||
|
da = d ^ a;
|
||||||
|
c += (da ^ b) + blocks[7] - 155497632;
|
||||||
|
c = (c << 16 | c >>> 16) + d << 0;
|
||||||
|
b += (da ^ c) + blocks[10] - 1094730640;
|
||||||
|
b = (b << 23 | b >>> 9) + c << 0;
|
||||||
|
bc = b ^ c;
|
||||||
|
a += (bc ^ d) + blocks[13] + 681279174;
|
||||||
|
a = (a << 4 | a >>> 28) + b << 0;
|
||||||
|
d += (bc ^ a) + blocks[0] - 358537222;
|
||||||
|
d = (d << 11 | d >>> 21) + a << 0;
|
||||||
|
da = d ^ a;
|
||||||
|
c += (da ^ b) + blocks[3] - 722521979;
|
||||||
|
c = (c << 16 | c >>> 16) + d << 0;
|
||||||
|
b += (da ^ c) + blocks[6] + 76029189;
|
||||||
|
b = (b << 23 | b >>> 9) + c << 0;
|
||||||
|
bc = b ^ c;
|
||||||
|
a += (bc ^ d) + blocks[9] - 640364487;
|
||||||
|
a = (a << 4 | a >>> 28) + b << 0;
|
||||||
|
d += (bc ^ a) + blocks[12] - 421815835;
|
||||||
|
d = (d << 11 | d >>> 21) + a << 0;
|
||||||
|
da = d ^ a;
|
||||||
|
c += (da ^ b) + blocks[15] + 530742520;
|
||||||
|
c = (c << 16 | c >>> 16) + d << 0;
|
||||||
|
b += (da ^ c) + blocks[2] - 995338651;
|
||||||
|
b = (b << 23 | b >>> 9) + c << 0;
|
||||||
|
a += (c ^ (b | ~d)) + blocks[0] - 198630844;
|
||||||
|
a = (a << 6 | a >>> 26) + b << 0;
|
||||||
|
d += (b ^ (a | ~c)) + blocks[7] + 1126891415;
|
||||||
|
d = (d << 10 | d >>> 22) + a << 0;
|
||||||
|
c += (a ^ (d | ~b)) + blocks[14] - 1416354905;
|
||||||
|
c = (c << 15 | c >>> 17) + d << 0;
|
||||||
|
b += (d ^ (c | ~a)) + blocks[5] - 57434055;
|
||||||
|
b = (b << 21 | b >>> 11) + c << 0;
|
||||||
|
a += (c ^ (b | ~d)) + blocks[12] + 1700485571;
|
||||||
|
a = (a << 6 | a >>> 26) + b << 0;
|
||||||
|
d += (b ^ (a | ~c)) + blocks[3] - 1894986606;
|
||||||
|
d = (d << 10 | d >>> 22) + a << 0;
|
||||||
|
c += (a ^ (d | ~b)) + blocks[10] - 1051523;
|
||||||
|
c = (c << 15 | c >>> 17) + d << 0;
|
||||||
|
b += (d ^ (c | ~a)) + blocks[1] - 2054922799;
|
||||||
|
b = (b << 21 | b >>> 11) + c << 0;
|
||||||
|
a += (c ^ (b | ~d)) + blocks[8] + 1873313359;
|
||||||
|
a = (a << 6 | a >>> 26) + b << 0;
|
||||||
|
d += (b ^ (a | ~c)) + blocks[15] - 30611744;
|
||||||
|
d = (d << 10 | d >>> 22) + a << 0;
|
||||||
|
c += (a ^ (d | ~b)) + blocks[6] - 1560198380;
|
||||||
|
c = (c << 15 | c >>> 17) + d << 0;
|
||||||
|
b += (d ^ (c | ~a)) + blocks[13] + 1309151649;
|
||||||
|
b = (b << 21 | b >>> 11) + c << 0;
|
||||||
|
a += (c ^ (b | ~d)) + blocks[4] - 145523070;
|
||||||
|
a = (a << 6 | a >>> 26) + b << 0;
|
||||||
|
d += (b ^ (a | ~c)) + blocks[11] - 1120210379;
|
||||||
|
d = (d << 10 | d >>> 22) + a << 0;
|
||||||
|
c += (a ^ (d | ~b)) + blocks[2] + 718787259;
|
||||||
|
c = (c << 15 | c >>> 17) + d << 0;
|
||||||
|
b += (d ^ (c | ~a)) + blocks[9] - 343485551;
|
||||||
|
b = (b << 21 | b >>> 11) + c << 0;
|
||||||
|
|
||||||
|
if (this.first) {
|
||||||
|
this.h0 = a + 1732584193 << 0;
|
||||||
|
this.h1 = b - 271733879 << 0;
|
||||||
|
this.h2 = c - 1732584194 << 0;
|
||||||
|
this.h3 = d + 271733878 << 0;
|
||||||
|
this.first = false;
|
||||||
|
} else {
|
||||||
|
this.h0 = this.h0 + a << 0;
|
||||||
|
this.h1 = this.h1 + b << 0;
|
||||||
|
this.h2 = this.h2 + c << 0;
|
||||||
|
this.h3 = this.h3 + d << 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method hex
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as hex string
|
||||||
|
* @returns {String} Hex string
|
||||||
|
* @see {@link md5.hex}
|
||||||
|
* @example
|
||||||
|
* hash.hex();
|
||||||
|
*/
|
||||||
|
Md5.prototype.hex = function () {
|
||||||
|
this.finalize();
|
||||||
|
|
||||||
|
var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;
|
||||||
|
|
||||||
|
return HEX_CHARS[(h0 >>> 4) & 0x0F] + HEX_CHARS[h0 & 0x0F] +
|
||||||
|
HEX_CHARS[(h0 >>> 12) & 0x0F] + HEX_CHARS[(h0 >>> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h0 >>> 20) & 0x0F] + HEX_CHARS[(h0 >>> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h0 >>> 28) & 0x0F] + HEX_CHARS[(h0 >>> 24) & 0x0F] +
|
||||||
|
HEX_CHARS[(h1 >>> 4) & 0x0F] + HEX_CHARS[h1 & 0x0F] +
|
||||||
|
HEX_CHARS[(h1 >>> 12) & 0x0F] + HEX_CHARS[(h1 >>> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h1 >>> 20) & 0x0F] + HEX_CHARS[(h1 >>> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h1 >>> 28) & 0x0F] + HEX_CHARS[(h1 >>> 24) & 0x0F] +
|
||||||
|
HEX_CHARS[(h2 >>> 4) & 0x0F] + HEX_CHARS[h2 & 0x0F] +
|
||||||
|
HEX_CHARS[(h2 >>> 12) & 0x0F] + HEX_CHARS[(h2 >>> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h2 >>> 20) & 0x0F] + HEX_CHARS[(h2 >>> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h2 >>> 28) & 0x0F] + HEX_CHARS[(h2 >>> 24) & 0x0F] +
|
||||||
|
HEX_CHARS[(h3 >>> 4) & 0x0F] + HEX_CHARS[h3 & 0x0F] +
|
||||||
|
HEX_CHARS[(h3 >>> 12) & 0x0F] + HEX_CHARS[(h3 >>> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h3 >>> 20) & 0x0F] + HEX_CHARS[(h3 >>> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h3 >>> 28) & 0x0F] + HEX_CHARS[(h3 >>> 24) & 0x0F];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method toString
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as hex string
|
||||||
|
* @returns {String} Hex string
|
||||||
|
* @see {@link md5.hex}
|
||||||
|
* @example
|
||||||
|
* hash.toString();
|
||||||
|
*/
|
||||||
|
Md5.prototype.toString = Md5.prototype.hex;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method digest
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @see {@link md5.digest}
|
||||||
|
* @example
|
||||||
|
* hash.digest();
|
||||||
|
*/
|
||||||
|
Md5.prototype.digest = function () {
|
||||||
|
this.finalize();
|
||||||
|
|
||||||
|
var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;
|
||||||
|
return [
|
||||||
|
h0 & 0xFF, (h0 >>> 8) & 0xFF, (h0 >>> 16) & 0xFF, (h0 >>> 24) & 0xFF,
|
||||||
|
h1 & 0xFF, (h1 >>> 8) & 0xFF, (h1 >>> 16) & 0xFF, (h1 >>> 24) & 0xFF,
|
||||||
|
h2 & 0xFF, (h2 >>> 8) & 0xFF, (h2 >>> 16) & 0xFF, (h2 >>> 24) & 0xFF,
|
||||||
|
h3 & 0xFF, (h3 >>> 8) & 0xFF, (h3 >>> 16) & 0xFF, (h3 >>> 24) & 0xFF
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method array
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @see {@link md5.array}
|
||||||
|
* @example
|
||||||
|
* hash.array();
|
||||||
|
*/
|
||||||
|
Md5.prototype.array = Md5.prototype.digest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method arrayBuffer
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @see {@link md5.arrayBuffer}
|
||||||
|
* @example
|
||||||
|
* hash.arrayBuffer();
|
||||||
|
*/
|
||||||
|
Md5.prototype.arrayBuffer = function () {
|
||||||
|
this.finalize();
|
||||||
|
|
||||||
|
var buffer = new ArrayBuffer(16);
|
||||||
|
var blocks = new Uint32Array(buffer);
|
||||||
|
blocks[0] = this.h0;
|
||||||
|
blocks[1] = this.h1;
|
||||||
|
blocks[2] = this.h2;
|
||||||
|
blocks[3] = this.h3;
|
||||||
|
return buffer;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method buffer
|
||||||
|
* @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @see {@link md5.buffer}
|
||||||
|
* @example
|
||||||
|
* hash.buffer();
|
||||||
|
*/
|
||||||
|
/* istanbul ignore else */
|
||||||
|
{
|
||||||
|
Md5.prototype.buffer = Md5.prototype.arrayBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method base64
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as base64 string
|
||||||
|
* @returns {String} base64 string
|
||||||
|
* @see {@link md5.base64}
|
||||||
|
* @example
|
||||||
|
* hash.base64();
|
||||||
|
*/
|
||||||
|
/* istanbul ignore else */
|
||||||
|
{
|
||||||
|
Md5.prototype.base64 = function () {
|
||||||
|
var v1, v2, v3, base64Str = '', bytes = this.array();
|
||||||
|
for (var i = 0; i < 15;) {
|
||||||
|
v1 = bytes[i++];
|
||||||
|
v2 = bytes[i++];
|
||||||
|
v3 = bytes[i++];
|
||||||
|
base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] +
|
||||||
|
BASE64_ENCODE_CHAR[(v1 << 4 | v2 >>> 4) & 63] +
|
||||||
|
BASE64_ENCODE_CHAR[(v2 << 2 | v3 >>> 6) & 63] +
|
||||||
|
BASE64_ENCODE_CHAR[v3 & 63];
|
||||||
|
}
|
||||||
|
v1 = bytes[i];
|
||||||
|
base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] +
|
||||||
|
BASE64_ENCODE_CHAR[(v1 << 4) & 63] +
|
||||||
|
'==';
|
||||||
|
return base64Str;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* HmacMd5 class
|
||||||
|
* @class HmacMd5
|
||||||
|
* @extends Md5
|
||||||
|
* @description This is internal class.
|
||||||
|
* @see {@link md5.hmac.create}
|
||||||
|
*/
|
||||||
|
function HmacMd5(key, sharedMemory) {
|
||||||
|
var i, result = formatMessage(key);
|
||||||
|
key = result[0];
|
||||||
|
if (result[1]) {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (key.length > 64) {
|
||||||
|
key = (new Md5(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;
|
||||||
|
}
|
||||||
|
|
||||||
|
Md5.call(this, sharedMemory);
|
||||||
|
|
||||||
|
this.update(iKeyPad);
|
||||||
|
this.oKeyPad = oKeyPad;
|
||||||
|
this.inner = true;
|
||||||
|
this.sharedMemory = sharedMemory;
|
||||||
|
}
|
||||||
|
/* istanbul ignore else */
|
||||||
|
{
|
||||||
|
HmacMd5.prototype = new Md5();
|
||||||
|
|
||||||
|
HmacMd5.prototype.finalize = function () {
|
||||||
|
Md5.prototype.finalize.call(this);
|
||||||
|
if (this.inner) {
|
||||||
|
this.inner = false;
|
||||||
|
var innerHash = this.array();
|
||||||
|
Md5.call(this, this.sharedMemory);
|
||||||
|
this.update(this.oKeyPad);
|
||||||
|
this.update(innerHash);
|
||||||
|
Md5.prototype.finalize.call(this);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
var exports = createMethod();
|
||||||
|
exports.md5 = exports;
|
||||||
|
/* istanbul ignore else */
|
||||||
|
{
|
||||||
|
exports.md5.hmac = createHmacMethod();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (COMMON_JS) {
|
||||||
|
module.exports = exports;
|
||||||
|
} else {
|
||||||
|
/**
|
||||||
|
* @method md5
|
||||||
|
* @description Md5 hash function, export to global in browsers.
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} md5 hashes
|
||||||
|
* @example
|
||||||
|
* md5(''); // d41d8cd98f00b204e9800998ecf8427e
|
||||||
|
* md5('The quick brown fox jumps over the lazy dog'); // 9e107d9d372bb6826bd81d3542a419d6
|
||||||
|
* md5('The quick brown fox jumps over the lazy dog.'); // e4d909c290d0fb1ca068ffaddf22cbd0
|
||||||
|
*
|
||||||
|
* // It also supports UTF-8 encoding
|
||||||
|
* md5('中文'); // a7bac2239fcdcb3a067903d8077c4a07
|
||||||
|
*
|
||||||
|
* // It also supports byte `Array`, `Uint8Array`, `ArrayBuffer`
|
||||||
|
* md5([]); // d41d8cd98f00b204e9800998ecf8427e
|
||||||
|
* md5(new Uint8Array([])); // d41d8cd98f00b204e9800998ecf8427e
|
||||||
|
*/
|
||||||
|
root.md5 = exports;
|
||||||
|
if (AMD) {
|
||||||
|
define(function () {
|
||||||
|
return exports;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})();
|
||||||
Vendored
+10
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,829 @@
|
|||||||
|
function getDefaultExportFromCjs (x) {
|
||||||
|
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
|
||||||
|
}
|
||||||
|
|
||||||
|
var md5$1 = {exports: {}};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* [js-md5]{@link https://github.com/emn178/js-md5}
|
||||||
|
*
|
||||||
|
* @namespace md5
|
||||||
|
* @version 0.9.0
|
||||||
|
* @author Chen, Yi-Cyuan [emn178@gmail.com]
|
||||||
|
* @copyright Chen, Yi-Cyuan 2014-2026
|
||||||
|
* @license MIT
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function (module) {
|
||||||
|
(function () {
|
||||||
|
|
||||||
|
var INPUT_ERROR = 'input is invalid type';
|
||||||
|
var FINALIZE_ERROR = 'finalize already called';
|
||||||
|
var WINDOW = typeof window === 'object';
|
||||||
|
var root = WINDOW ? window : {};
|
||||||
|
if (root.JS_MD5_NO_WINDOW) {
|
||||||
|
WINDOW = false;
|
||||||
|
}
|
||||||
|
var WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && typeof self !== 'undefined' && self instanceof WorkerGlobalScope;
|
||||||
|
if (WEB_WORKER) {
|
||||||
|
root = self;
|
||||||
|
}
|
||||||
|
var COMMON_JS = !root.JS_MD5_NO_COMMON_JS && 'object' === 'object' && module.exports;
|
||||||
|
var HEX_CHARS = '0123456789abcdef'.split('');
|
||||||
|
var EXTRA = [128, 32768, 8388608, -2147483648];
|
||||||
|
var OUTPUT_TYPES = ['hex', 'array', 'digest', 'arrayBuffer'];
|
||||||
|
/* istanbul ignore else */
|
||||||
|
{
|
||||||
|
OUTPUT_TYPES.push('buffer');
|
||||||
|
}
|
||||||
|
/* istanbul ignore else */
|
||||||
|
{
|
||||||
|
OUTPUT_TYPES.push('base64');
|
||||||
|
}
|
||||||
|
/* istanbul ignore next */
|
||||||
|
var BASE64_ENCODE_CHAR = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('') ;
|
||||||
|
|
||||||
|
var blocks = [], buffer8;
|
||||||
|
{
|
||||||
|
var buffer = new ArrayBuffer(68);
|
||||||
|
buffer8 = new Uint8Array(buffer);
|
||||||
|
blocks = new Uint32Array(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
var isArray = Array.isArray;
|
||||||
|
|
||||||
|
var isView = ArrayBuffer.isView;
|
||||||
|
|
||||||
|
// [message: string, isString: bool]
|
||||||
|
var formatMessage = function (message) {
|
||||||
|
var type = typeof message;
|
||||||
|
if (type === 'string') {
|
||||||
|
return [message, true];
|
||||||
|
}
|
||||||
|
if (type !== 'object' || message === null) {
|
||||||
|
throw new Error(INPUT_ERROR);
|
||||||
|
}
|
||||||
|
if (message.constructor === ArrayBuffer) {
|
||||||
|
return [new Uint8Array(message), false];
|
||||||
|
}
|
||||||
|
if (!isArray(message) && !isView(message)) {
|
||||||
|
throw new Error(INPUT_ERROR);
|
||||||
|
}
|
||||||
|
return [message, false];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method hex
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as hex string
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} Hex string
|
||||||
|
* @example
|
||||||
|
* md5.hex('The quick brown fox jumps over the lazy dog');
|
||||||
|
* // equal to
|
||||||
|
* md5('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method digest
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @example
|
||||||
|
* md5.digest('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method array
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @example
|
||||||
|
* md5.array('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method arrayBuffer
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @example
|
||||||
|
* md5.arrayBuffer('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method buffer
|
||||||
|
* @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @example
|
||||||
|
* md5.buffer('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method base64
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as base64 string
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} base64 string
|
||||||
|
* @example
|
||||||
|
* md5.base64('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
var createOutputMethod = function (outputType) {
|
||||||
|
return function (message) {
|
||||||
|
return new Md5(true).update(message)[outputType]();
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method create
|
||||||
|
* @memberof md5
|
||||||
|
* @description Create Md5 object
|
||||||
|
* @returns {Md5} Md5 object.
|
||||||
|
* @example
|
||||||
|
* var hash = md5.create();
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method update
|
||||||
|
* @memberof md5
|
||||||
|
* @description Create and update Md5 object
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Md5} Md5 object.
|
||||||
|
* @example
|
||||||
|
* var hash = md5.update('The quick brown fox jumps over the lazy dog');
|
||||||
|
* // equal to
|
||||||
|
* var hash = md5.create();
|
||||||
|
* hash.update('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
var createMethod = function () {
|
||||||
|
var method = createOutputMethod('hex');
|
||||||
|
method.create = function () {
|
||||||
|
return new Md5();
|
||||||
|
};
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
return method;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @namespace md5.hmac
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method hex
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as hex string
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} Hex string
|
||||||
|
* @example
|
||||||
|
* md5.hmac.hex('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
* // equal to
|
||||||
|
* md5.hmac('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method digest
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @example
|
||||||
|
* md5.hmac.digest('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method array
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @example
|
||||||
|
* md5.hmac.array('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method arrayBuffer
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @example
|
||||||
|
* md5.hmac.arrayBuffer('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method buffer
|
||||||
|
* @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @example
|
||||||
|
* md5.hmac.buffer('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method base64
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as base64 string
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} base64 string
|
||||||
|
* @example
|
||||||
|
* md5.hmac.base64('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
var createHmacOutputMethod = function (outputType) {
|
||||||
|
return function (key, message) {
|
||||||
|
return new HmacMd5(key, true).update(message)[outputType]();
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method create
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Create HmacMd5 object
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @returns {HmacMd5} HmacMd5 object.
|
||||||
|
* @example
|
||||||
|
* var hash = md5.hmac.create('key');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method update
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Create and update HmacMd5 object
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {HmacMd5} HmacMd5 object.
|
||||||
|
* @example
|
||||||
|
* var hash = md5.hmac.update('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
* // equal to
|
||||||
|
* var hash = md5.hmac.create('key');
|
||||||
|
* hash.update('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
var createHmacMethod = function () {
|
||||||
|
var method = createHmacOutputMethod('hex');
|
||||||
|
method.create = function (key) {
|
||||||
|
return new HmacMd5(key);
|
||||||
|
};
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
return method;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Md5 class
|
||||||
|
* @class Md5
|
||||||
|
* @description This is internal class.
|
||||||
|
* @see {@link md5.create}
|
||||||
|
*/
|
||||||
|
function Md5(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;
|
||||||
|
this.buffer8 = buffer8;
|
||||||
|
} else {
|
||||||
|
{
|
||||||
|
var buffer = new ArrayBuffer(68);
|
||||||
|
this.buffer8 = new Uint8Array(buffer);
|
||||||
|
this.blocks = new Uint32Array(buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.h0 = this.h1 = this.h2 = this.h3 = this.start = this.bytes = this.hBytes = 0;
|
||||||
|
this.finalized = this.hashed = false;
|
||||||
|
this.first = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method update
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Update hash
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Md5} Md5 object.
|
||||||
|
* @see {@link md5.update}
|
||||||
|
*/
|
||||||
|
Md5.prototype.update = function (message) {
|
||||||
|
if (this.finalized) {
|
||||||
|
throw new Error(FINALIZE_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
var result = formatMessage(message);
|
||||||
|
message = result[0];
|
||||||
|
var isString = result[1];
|
||||||
|
var code, index = 0, i, length = message.length, blocks = this.blocks;
|
||||||
|
var buffer8 = this.buffer8;
|
||||||
|
|
||||||
|
while (index < length) {
|
||||||
|
if (this.hashed) {
|
||||||
|
this.hashed = false;
|
||||||
|
blocks[0] = blocks[16];
|
||||||
|
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 (isString) {
|
||||||
|
{
|
||||||
|
for (i = this.start; index < length && i < 64; ++index) {
|
||||||
|
code = message.charCodeAt(index);
|
||||||
|
if (code < 0x80) {
|
||||||
|
buffer8[i++] = code;
|
||||||
|
} else if (code < 0x800) {
|
||||||
|
buffer8[i++] = 0xc0 | (code >>> 6);
|
||||||
|
buffer8[i++] = 0x80 | (code & 0x3f);
|
||||||
|
} else if (code < 0xd800 || code >= 0xe000) {
|
||||||
|
buffer8[i++] = 0xe0 | (code >>> 12);
|
||||||
|
buffer8[i++] = 0x80 | ((code >>> 6) & 0x3f);
|
||||||
|
buffer8[i++] = 0x80 | (code & 0x3f);
|
||||||
|
} else {
|
||||||
|
code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
|
||||||
|
buffer8[i++] = 0xf0 | (code >>> 18);
|
||||||
|
buffer8[i++] = 0x80 | ((code >>> 12) & 0x3f);
|
||||||
|
buffer8[i++] = 0x80 | ((code >>> 6) & 0x3f);
|
||||||
|
buffer8[i++] = 0x80 | (code & 0x3f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
{
|
||||||
|
for (i = this.start; index < length && i < 64; ++index) {
|
||||||
|
buffer8[i++] = message[index];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.lastByteIndex = i;
|
||||||
|
this.bytes += i - this.start;
|
||||||
|
if (i >= 64) {
|
||||||
|
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;
|
||||||
|
};
|
||||||
|
|
||||||
|
Md5.prototype.finalize = function () {
|
||||||
|
if (this.finalized) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.finalized = true;
|
||||||
|
var blocks = this.blocks, i = this.lastByteIndex;
|
||||||
|
blocks[i >>> 2] |= EXTRA[i & 3];
|
||||||
|
if (i >= 56) {
|
||||||
|
if (!this.hashed) {
|
||||||
|
this.hash();
|
||||||
|
}
|
||||||
|
blocks[0] = blocks[16];
|
||||||
|
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.bytes << 3;
|
||||||
|
blocks[15] = this.hBytes << 3 | this.bytes >>> 29;
|
||||||
|
this.hash();
|
||||||
|
};
|
||||||
|
|
||||||
|
Md5.prototype.hash = function () {
|
||||||
|
var a, b, c, d, bc, da, blocks = this.blocks;
|
||||||
|
|
||||||
|
if (this.first) {
|
||||||
|
a = blocks[0] - 680876937;
|
||||||
|
a = (a << 7 | a >>> 25) - 271733879 << 0;
|
||||||
|
d = (-1732584194 ^ a & 2004318071) + blocks[1] - 117830708;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c = (-271733879 ^ (d & (a ^ -271733879))) + blocks[2] - 1126478375;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b = (a ^ (c & (d ^ a))) + blocks[3] - 1316259209;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
} else {
|
||||||
|
a = this.h0;
|
||||||
|
b = this.h1;
|
||||||
|
c = this.h2;
|
||||||
|
d = this.h3;
|
||||||
|
a += (d ^ (b & (c ^ d))) + blocks[0] - 680876936;
|
||||||
|
a = (a << 7 | a >>> 25) + b << 0;
|
||||||
|
d += (c ^ (a & (b ^ c))) + blocks[1] - 389564586;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c += (b ^ (d & (a ^ b))) + blocks[2] + 606105819;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b += (a ^ (c & (d ^ a))) + blocks[3] - 1044525330;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
a += (d ^ (b & (c ^ d))) + blocks[4] - 176418897;
|
||||||
|
a = (a << 7 | a >>> 25) + b << 0;
|
||||||
|
d += (c ^ (a & (b ^ c))) + blocks[5] + 1200080426;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c += (b ^ (d & (a ^ b))) + blocks[6] - 1473231341;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b += (a ^ (c & (d ^ a))) + blocks[7] - 45705983;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
a += (d ^ (b & (c ^ d))) + blocks[8] + 1770035416;
|
||||||
|
a = (a << 7 | a >>> 25) + b << 0;
|
||||||
|
d += (c ^ (a & (b ^ c))) + blocks[9] - 1958414417;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c += (b ^ (d & (a ^ b))) + blocks[10] - 42063;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b += (a ^ (c & (d ^ a))) + blocks[11] - 1990404162;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
a += (d ^ (b & (c ^ d))) + blocks[12] + 1804603682;
|
||||||
|
a = (a << 7 | a >>> 25) + b << 0;
|
||||||
|
d += (c ^ (a & (b ^ c))) + blocks[13] - 40341101;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c += (b ^ (d & (a ^ b))) + blocks[14] - 1502002290;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b += (a ^ (c & (d ^ a))) + blocks[15] + 1236535329;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
a += (c ^ (d & (b ^ c))) + blocks[1] - 165796510;
|
||||||
|
a = (a << 5 | a >>> 27) + b << 0;
|
||||||
|
d += (b ^ (c & (a ^ b))) + blocks[6] - 1069501632;
|
||||||
|
d = (d << 9 | d >>> 23) + a << 0;
|
||||||
|
c += (a ^ (b & (d ^ a))) + blocks[11] + 643717713;
|
||||||
|
c = (c << 14 | c >>> 18) + d << 0;
|
||||||
|
b += (d ^ (a & (c ^ d))) + blocks[0] - 373897302;
|
||||||
|
b = (b << 20 | b >>> 12) + c << 0;
|
||||||
|
a += (c ^ (d & (b ^ c))) + blocks[5] - 701558691;
|
||||||
|
a = (a << 5 | a >>> 27) + b << 0;
|
||||||
|
d += (b ^ (c & (a ^ b))) + blocks[10] + 38016083;
|
||||||
|
d = (d << 9 | d >>> 23) + a << 0;
|
||||||
|
c += (a ^ (b & (d ^ a))) + blocks[15] - 660478335;
|
||||||
|
c = (c << 14 | c >>> 18) + d << 0;
|
||||||
|
b += (d ^ (a & (c ^ d))) + blocks[4] - 405537848;
|
||||||
|
b = (b << 20 | b >>> 12) + c << 0;
|
||||||
|
a += (c ^ (d & (b ^ c))) + blocks[9] + 568446438;
|
||||||
|
a = (a << 5 | a >>> 27) + b << 0;
|
||||||
|
d += (b ^ (c & (a ^ b))) + blocks[14] - 1019803690;
|
||||||
|
d = (d << 9 | d >>> 23) + a << 0;
|
||||||
|
c += (a ^ (b & (d ^ a))) + blocks[3] - 187363961;
|
||||||
|
c = (c << 14 | c >>> 18) + d << 0;
|
||||||
|
b += (d ^ (a & (c ^ d))) + blocks[8] + 1163531501;
|
||||||
|
b = (b << 20 | b >>> 12) + c << 0;
|
||||||
|
a += (c ^ (d & (b ^ c))) + blocks[13] - 1444681467;
|
||||||
|
a = (a << 5 | a >>> 27) + b << 0;
|
||||||
|
d += (b ^ (c & (a ^ b))) + blocks[2] - 51403784;
|
||||||
|
d = (d << 9 | d >>> 23) + a << 0;
|
||||||
|
c += (a ^ (b & (d ^ a))) + blocks[7] + 1735328473;
|
||||||
|
c = (c << 14 | c >>> 18) + d << 0;
|
||||||
|
b += (d ^ (a & (c ^ d))) + blocks[12] - 1926607734;
|
||||||
|
b = (b << 20 | b >>> 12) + c << 0;
|
||||||
|
bc = b ^ c;
|
||||||
|
a += (bc ^ d) + blocks[5] - 378558;
|
||||||
|
a = (a << 4 | a >>> 28) + b << 0;
|
||||||
|
d += (bc ^ a) + blocks[8] - 2022574463;
|
||||||
|
d = (d << 11 | d >>> 21) + a << 0;
|
||||||
|
da = d ^ a;
|
||||||
|
c += (da ^ b) + blocks[11] + 1839030562;
|
||||||
|
c = (c << 16 | c >>> 16) + d << 0;
|
||||||
|
b += (da ^ c) + blocks[14] - 35309556;
|
||||||
|
b = (b << 23 | b >>> 9) + c << 0;
|
||||||
|
bc = b ^ c;
|
||||||
|
a += (bc ^ d) + blocks[1] - 1530992060;
|
||||||
|
a = (a << 4 | a >>> 28) + b << 0;
|
||||||
|
d += (bc ^ a) + blocks[4] + 1272893353;
|
||||||
|
d = (d << 11 | d >>> 21) + a << 0;
|
||||||
|
da = d ^ a;
|
||||||
|
c += (da ^ b) + blocks[7] - 155497632;
|
||||||
|
c = (c << 16 | c >>> 16) + d << 0;
|
||||||
|
b += (da ^ c) + blocks[10] - 1094730640;
|
||||||
|
b = (b << 23 | b >>> 9) + c << 0;
|
||||||
|
bc = b ^ c;
|
||||||
|
a += (bc ^ d) + blocks[13] + 681279174;
|
||||||
|
a = (a << 4 | a >>> 28) + b << 0;
|
||||||
|
d += (bc ^ a) + blocks[0] - 358537222;
|
||||||
|
d = (d << 11 | d >>> 21) + a << 0;
|
||||||
|
da = d ^ a;
|
||||||
|
c += (da ^ b) + blocks[3] - 722521979;
|
||||||
|
c = (c << 16 | c >>> 16) + d << 0;
|
||||||
|
b += (da ^ c) + blocks[6] + 76029189;
|
||||||
|
b = (b << 23 | b >>> 9) + c << 0;
|
||||||
|
bc = b ^ c;
|
||||||
|
a += (bc ^ d) + blocks[9] - 640364487;
|
||||||
|
a = (a << 4 | a >>> 28) + b << 0;
|
||||||
|
d += (bc ^ a) + blocks[12] - 421815835;
|
||||||
|
d = (d << 11 | d >>> 21) + a << 0;
|
||||||
|
da = d ^ a;
|
||||||
|
c += (da ^ b) + blocks[15] + 530742520;
|
||||||
|
c = (c << 16 | c >>> 16) + d << 0;
|
||||||
|
b += (da ^ c) + blocks[2] - 995338651;
|
||||||
|
b = (b << 23 | b >>> 9) + c << 0;
|
||||||
|
a += (c ^ (b | ~d)) + blocks[0] - 198630844;
|
||||||
|
a = (a << 6 | a >>> 26) + b << 0;
|
||||||
|
d += (b ^ (a | ~c)) + blocks[7] + 1126891415;
|
||||||
|
d = (d << 10 | d >>> 22) + a << 0;
|
||||||
|
c += (a ^ (d | ~b)) + blocks[14] - 1416354905;
|
||||||
|
c = (c << 15 | c >>> 17) + d << 0;
|
||||||
|
b += (d ^ (c | ~a)) + blocks[5] - 57434055;
|
||||||
|
b = (b << 21 | b >>> 11) + c << 0;
|
||||||
|
a += (c ^ (b | ~d)) + blocks[12] + 1700485571;
|
||||||
|
a = (a << 6 | a >>> 26) + b << 0;
|
||||||
|
d += (b ^ (a | ~c)) + blocks[3] - 1894986606;
|
||||||
|
d = (d << 10 | d >>> 22) + a << 0;
|
||||||
|
c += (a ^ (d | ~b)) + blocks[10] - 1051523;
|
||||||
|
c = (c << 15 | c >>> 17) + d << 0;
|
||||||
|
b += (d ^ (c | ~a)) + blocks[1] - 2054922799;
|
||||||
|
b = (b << 21 | b >>> 11) + c << 0;
|
||||||
|
a += (c ^ (b | ~d)) + blocks[8] + 1873313359;
|
||||||
|
a = (a << 6 | a >>> 26) + b << 0;
|
||||||
|
d += (b ^ (a | ~c)) + blocks[15] - 30611744;
|
||||||
|
d = (d << 10 | d >>> 22) + a << 0;
|
||||||
|
c += (a ^ (d | ~b)) + blocks[6] - 1560198380;
|
||||||
|
c = (c << 15 | c >>> 17) + d << 0;
|
||||||
|
b += (d ^ (c | ~a)) + blocks[13] + 1309151649;
|
||||||
|
b = (b << 21 | b >>> 11) + c << 0;
|
||||||
|
a += (c ^ (b | ~d)) + blocks[4] - 145523070;
|
||||||
|
a = (a << 6 | a >>> 26) + b << 0;
|
||||||
|
d += (b ^ (a | ~c)) + blocks[11] - 1120210379;
|
||||||
|
d = (d << 10 | d >>> 22) + a << 0;
|
||||||
|
c += (a ^ (d | ~b)) + blocks[2] + 718787259;
|
||||||
|
c = (c << 15 | c >>> 17) + d << 0;
|
||||||
|
b += (d ^ (c | ~a)) + blocks[9] - 343485551;
|
||||||
|
b = (b << 21 | b >>> 11) + c << 0;
|
||||||
|
|
||||||
|
if (this.first) {
|
||||||
|
this.h0 = a + 1732584193 << 0;
|
||||||
|
this.h1 = b - 271733879 << 0;
|
||||||
|
this.h2 = c - 1732584194 << 0;
|
||||||
|
this.h3 = d + 271733878 << 0;
|
||||||
|
this.first = false;
|
||||||
|
} else {
|
||||||
|
this.h0 = this.h0 + a << 0;
|
||||||
|
this.h1 = this.h1 + b << 0;
|
||||||
|
this.h2 = this.h2 + c << 0;
|
||||||
|
this.h3 = this.h3 + d << 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method hex
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as hex string
|
||||||
|
* @returns {String} Hex string
|
||||||
|
* @see {@link md5.hex}
|
||||||
|
* @example
|
||||||
|
* hash.hex();
|
||||||
|
*/
|
||||||
|
Md5.prototype.hex = function () {
|
||||||
|
this.finalize();
|
||||||
|
|
||||||
|
var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;
|
||||||
|
|
||||||
|
return HEX_CHARS[(h0 >>> 4) & 0x0F] + HEX_CHARS[h0 & 0x0F] +
|
||||||
|
HEX_CHARS[(h0 >>> 12) & 0x0F] + HEX_CHARS[(h0 >>> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h0 >>> 20) & 0x0F] + HEX_CHARS[(h0 >>> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h0 >>> 28) & 0x0F] + HEX_CHARS[(h0 >>> 24) & 0x0F] +
|
||||||
|
HEX_CHARS[(h1 >>> 4) & 0x0F] + HEX_CHARS[h1 & 0x0F] +
|
||||||
|
HEX_CHARS[(h1 >>> 12) & 0x0F] + HEX_CHARS[(h1 >>> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h1 >>> 20) & 0x0F] + HEX_CHARS[(h1 >>> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h1 >>> 28) & 0x0F] + HEX_CHARS[(h1 >>> 24) & 0x0F] +
|
||||||
|
HEX_CHARS[(h2 >>> 4) & 0x0F] + HEX_CHARS[h2 & 0x0F] +
|
||||||
|
HEX_CHARS[(h2 >>> 12) & 0x0F] + HEX_CHARS[(h2 >>> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h2 >>> 20) & 0x0F] + HEX_CHARS[(h2 >>> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h2 >>> 28) & 0x0F] + HEX_CHARS[(h2 >>> 24) & 0x0F] +
|
||||||
|
HEX_CHARS[(h3 >>> 4) & 0x0F] + HEX_CHARS[h3 & 0x0F] +
|
||||||
|
HEX_CHARS[(h3 >>> 12) & 0x0F] + HEX_CHARS[(h3 >>> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h3 >>> 20) & 0x0F] + HEX_CHARS[(h3 >>> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h3 >>> 28) & 0x0F] + HEX_CHARS[(h3 >>> 24) & 0x0F];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method toString
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as hex string
|
||||||
|
* @returns {String} Hex string
|
||||||
|
* @see {@link md5.hex}
|
||||||
|
* @example
|
||||||
|
* hash.toString();
|
||||||
|
*/
|
||||||
|
Md5.prototype.toString = Md5.prototype.hex;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method digest
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @see {@link md5.digest}
|
||||||
|
* @example
|
||||||
|
* hash.digest();
|
||||||
|
*/
|
||||||
|
Md5.prototype.digest = function () {
|
||||||
|
this.finalize();
|
||||||
|
|
||||||
|
var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;
|
||||||
|
return [
|
||||||
|
h0 & 0xFF, (h0 >>> 8) & 0xFF, (h0 >>> 16) & 0xFF, (h0 >>> 24) & 0xFF,
|
||||||
|
h1 & 0xFF, (h1 >>> 8) & 0xFF, (h1 >>> 16) & 0xFF, (h1 >>> 24) & 0xFF,
|
||||||
|
h2 & 0xFF, (h2 >>> 8) & 0xFF, (h2 >>> 16) & 0xFF, (h2 >>> 24) & 0xFF,
|
||||||
|
h3 & 0xFF, (h3 >>> 8) & 0xFF, (h3 >>> 16) & 0xFF, (h3 >>> 24) & 0xFF
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method array
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @see {@link md5.array}
|
||||||
|
* @example
|
||||||
|
* hash.array();
|
||||||
|
*/
|
||||||
|
Md5.prototype.array = Md5.prototype.digest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method arrayBuffer
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @see {@link md5.arrayBuffer}
|
||||||
|
* @example
|
||||||
|
* hash.arrayBuffer();
|
||||||
|
*/
|
||||||
|
Md5.prototype.arrayBuffer = function () {
|
||||||
|
this.finalize();
|
||||||
|
|
||||||
|
var buffer = new ArrayBuffer(16);
|
||||||
|
var blocks = new Uint32Array(buffer);
|
||||||
|
blocks[0] = this.h0;
|
||||||
|
blocks[1] = this.h1;
|
||||||
|
blocks[2] = this.h2;
|
||||||
|
blocks[3] = this.h3;
|
||||||
|
return buffer;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method buffer
|
||||||
|
* @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @see {@link md5.buffer}
|
||||||
|
* @example
|
||||||
|
* hash.buffer();
|
||||||
|
*/
|
||||||
|
/* istanbul ignore else */
|
||||||
|
{
|
||||||
|
Md5.prototype.buffer = Md5.prototype.arrayBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method base64
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as base64 string
|
||||||
|
* @returns {String} base64 string
|
||||||
|
* @see {@link md5.base64}
|
||||||
|
* @example
|
||||||
|
* hash.base64();
|
||||||
|
*/
|
||||||
|
/* istanbul ignore else */
|
||||||
|
{
|
||||||
|
Md5.prototype.base64 = function () {
|
||||||
|
var v1, v2, v3, base64Str = '', bytes = this.array();
|
||||||
|
for (var i = 0; i < 15;) {
|
||||||
|
v1 = bytes[i++];
|
||||||
|
v2 = bytes[i++];
|
||||||
|
v3 = bytes[i++];
|
||||||
|
base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] +
|
||||||
|
BASE64_ENCODE_CHAR[(v1 << 4 | v2 >>> 4) & 63] +
|
||||||
|
BASE64_ENCODE_CHAR[(v2 << 2 | v3 >>> 6) & 63] +
|
||||||
|
BASE64_ENCODE_CHAR[v3 & 63];
|
||||||
|
}
|
||||||
|
v1 = bytes[i];
|
||||||
|
base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] +
|
||||||
|
BASE64_ENCODE_CHAR[(v1 << 4) & 63] +
|
||||||
|
'==';
|
||||||
|
return base64Str;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* HmacMd5 class
|
||||||
|
* @class HmacMd5
|
||||||
|
* @extends Md5
|
||||||
|
* @description This is internal class.
|
||||||
|
* @see {@link md5.hmac.create}
|
||||||
|
*/
|
||||||
|
function HmacMd5(key, sharedMemory) {
|
||||||
|
var i, result = formatMessage(key);
|
||||||
|
key = result[0];
|
||||||
|
if (result[1]) {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (key.length > 64) {
|
||||||
|
key = (new Md5(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;
|
||||||
|
}
|
||||||
|
|
||||||
|
Md5.call(this, sharedMemory);
|
||||||
|
|
||||||
|
this.update(iKeyPad);
|
||||||
|
this.oKeyPad = oKeyPad;
|
||||||
|
this.inner = true;
|
||||||
|
this.sharedMemory = sharedMemory;
|
||||||
|
}
|
||||||
|
/* istanbul ignore else */
|
||||||
|
{
|
||||||
|
HmacMd5.prototype = new Md5();
|
||||||
|
|
||||||
|
HmacMd5.prototype.finalize = function () {
|
||||||
|
Md5.prototype.finalize.call(this);
|
||||||
|
if (this.inner) {
|
||||||
|
this.inner = false;
|
||||||
|
var innerHash = this.array();
|
||||||
|
Md5.call(this, this.sharedMemory);
|
||||||
|
this.update(this.oKeyPad);
|
||||||
|
this.update(innerHash);
|
||||||
|
Md5.prototype.finalize.call(this);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
var exports = createMethod();
|
||||||
|
exports.md5 = exports;
|
||||||
|
/* istanbul ignore else */
|
||||||
|
{
|
||||||
|
exports.md5.hmac = createHmacMethod();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (COMMON_JS) {
|
||||||
|
module.exports = exports;
|
||||||
|
} else {
|
||||||
|
/**
|
||||||
|
* @method md5
|
||||||
|
* @description Md5 hash function, export to global in browsers.
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} md5 hashes
|
||||||
|
* @example
|
||||||
|
* md5(''); // d41d8cd98f00b204e9800998ecf8427e
|
||||||
|
* md5('The quick brown fox jumps over the lazy dog'); // 9e107d9d372bb6826bd81d3542a419d6
|
||||||
|
* md5('The quick brown fox jumps over the lazy dog.'); // e4d909c290d0fb1ca068ffaddf22cbd0
|
||||||
|
*
|
||||||
|
* // It also supports UTF-8 encoding
|
||||||
|
* md5('中文'); // a7bac2239fcdcb3a067903d8077c4a07
|
||||||
|
*
|
||||||
|
* // It also supports byte `Array`, `Uint8Array`, `ArrayBuffer`
|
||||||
|
* md5([]); // d41d8cd98f00b204e9800998ecf8427e
|
||||||
|
* md5(new Uint8Array([])); // d41d8cd98f00b204e9800998ecf8427e
|
||||||
|
*/
|
||||||
|
root.md5 = exports;
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
} (md5$1));
|
||||||
|
|
||||||
|
var md5Exports = md5$1.exports;
|
||||||
|
var md5 = /*@__PURE__*/getDefaultExportFromCjs(md5Exports);
|
||||||
|
|
||||||
|
export { md5 as default, md5 };
|
||||||
@@ -0,0 +1,865 @@
|
|||||||
|
import require$$0 from 'crypto';
|
||||||
|
import require$$1 from 'buffer';
|
||||||
|
|
||||||
|
var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
|
||||||
|
|
||||||
|
function getDefaultExportFromCjs (x) {
|
||||||
|
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
|
||||||
|
}
|
||||||
|
|
||||||
|
var md5$1 = {exports: {}};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* [js-md5]{@link https://github.com/emn178/js-md5}
|
||||||
|
*
|
||||||
|
* @namespace md5
|
||||||
|
* @version 0.9.0
|
||||||
|
* @author Chen, Yi-Cyuan [emn178@gmail.com]
|
||||||
|
* @copyright Chen, Yi-Cyuan 2014-2026
|
||||||
|
* @license MIT
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function (module) {
|
||||||
|
(function () {
|
||||||
|
|
||||||
|
var INPUT_ERROR = 'input is invalid type';
|
||||||
|
var FINALIZE_ERROR = 'finalize already called';
|
||||||
|
var WINDOW = typeof window === 'object';
|
||||||
|
var root = WINDOW ? window : {};
|
||||||
|
if (root.JS_MD5_NO_WINDOW) {
|
||||||
|
WINDOW = false;
|
||||||
|
}
|
||||||
|
var WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && typeof self !== 'undefined' && self instanceof WorkerGlobalScope;
|
||||||
|
/* istanbul ignore next */
|
||||||
|
var NODE_JS = !root.JS_MD5_NO_NODE_JS && !WINDOW && typeof process === 'object' && process.versions && process.versions.node;
|
||||||
|
if (NODE_JS) {
|
||||||
|
root = commonjsGlobal;
|
||||||
|
} else if (WEB_WORKER) {
|
||||||
|
root = self;
|
||||||
|
}
|
||||||
|
var COMMON_JS = !root.JS_MD5_NO_COMMON_JS && 'object' === 'object' && module.exports;
|
||||||
|
var HEX_CHARS = '0123456789abcdef'.split('');
|
||||||
|
var EXTRA = [128, 32768, 8388608, -2147483648];
|
||||||
|
var OUTPUT_TYPES = ['hex', 'array', 'digest', 'arrayBuffer'];
|
||||||
|
/* istanbul ignore else */
|
||||||
|
{
|
||||||
|
OUTPUT_TYPES.push('buffer');
|
||||||
|
}
|
||||||
|
/* istanbul ignore else */
|
||||||
|
{
|
||||||
|
OUTPUT_TYPES.push('base64');
|
||||||
|
}
|
||||||
|
/* istanbul ignore next */
|
||||||
|
var BASE64_ENCODE_CHAR = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('') ;
|
||||||
|
|
||||||
|
var blocks = [], buffer8;
|
||||||
|
{
|
||||||
|
var buffer = new ArrayBuffer(68);
|
||||||
|
buffer8 = new Uint8Array(buffer);
|
||||||
|
blocks = new Uint32Array(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
var isArray = Array.isArray;
|
||||||
|
|
||||||
|
var isView = ArrayBuffer.isView;
|
||||||
|
|
||||||
|
// [message: string, isString: bool]
|
||||||
|
var formatMessage = function (message) {
|
||||||
|
var type = typeof message;
|
||||||
|
if (type === 'string') {
|
||||||
|
return [message, true];
|
||||||
|
}
|
||||||
|
if (type !== 'object' || message === null) {
|
||||||
|
throw new Error(INPUT_ERROR);
|
||||||
|
}
|
||||||
|
if (message.constructor === ArrayBuffer) {
|
||||||
|
return [new Uint8Array(message), false];
|
||||||
|
}
|
||||||
|
if (!isArray(message) && !isView(message)) {
|
||||||
|
throw new Error(INPUT_ERROR);
|
||||||
|
}
|
||||||
|
return [message, false];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method hex
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as hex string
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} Hex string
|
||||||
|
* @example
|
||||||
|
* md5.hex('The quick brown fox jumps over the lazy dog');
|
||||||
|
* // equal to
|
||||||
|
* md5('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method digest
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @example
|
||||||
|
* md5.digest('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method array
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @example
|
||||||
|
* md5.array('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method arrayBuffer
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @example
|
||||||
|
* md5.arrayBuffer('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method buffer
|
||||||
|
* @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @example
|
||||||
|
* md5.buffer('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method base64
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as base64 string
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} base64 string
|
||||||
|
* @example
|
||||||
|
* md5.base64('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
var createOutputMethod = function (outputType) {
|
||||||
|
return function (message) {
|
||||||
|
return new Md5(true).update(message)[outputType]();
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method create
|
||||||
|
* @memberof md5
|
||||||
|
* @description Create Md5 object
|
||||||
|
* @returns {Md5} Md5 object.
|
||||||
|
* @example
|
||||||
|
* var hash = md5.create();
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method update
|
||||||
|
* @memberof md5
|
||||||
|
* @description Create and update Md5 object
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Md5} Md5 object.
|
||||||
|
* @example
|
||||||
|
* var hash = md5.update('The quick brown fox jumps over the lazy dog');
|
||||||
|
* // equal to
|
||||||
|
* var hash = md5.create();
|
||||||
|
* hash.update('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
var createMethod = function () {
|
||||||
|
var method = createOutputMethod('hex');
|
||||||
|
if (NODE_JS) {
|
||||||
|
method = nodeWrap(method);
|
||||||
|
}
|
||||||
|
method.create = function () {
|
||||||
|
return new Md5();
|
||||||
|
};
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
return method;
|
||||||
|
};
|
||||||
|
|
||||||
|
var nodeWrap = function (method) {
|
||||||
|
var crypto = require$$0;
|
||||||
|
var Buffer = require$$1.Buffer;
|
||||||
|
var bufferFrom = Buffer.from;
|
||||||
|
var nodeMethod = function (message) {
|
||||||
|
if (typeof message === 'string') {
|
||||||
|
return crypto.createHash('md5').update(message, 'utf8').digest('hex');
|
||||||
|
} else {
|
||||||
|
if (message === null || message === undefined) {
|
||||||
|
throw new Error(INPUT_ERROR);
|
||||||
|
} else if (message.constructor === ArrayBuffer) {
|
||||||
|
message = new Uint8Array(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isArray(message) || isView(message) ||
|
||||||
|
message.constructor === Buffer) {
|
||||||
|
return crypto.createHash('md5').update(bufferFrom(message)).digest('hex');
|
||||||
|
} else {
|
||||||
|
return method(message);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
return nodeMethod;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @namespace md5.hmac
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method hex
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as hex string
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} Hex string
|
||||||
|
* @example
|
||||||
|
* md5.hmac.hex('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
* // equal to
|
||||||
|
* md5.hmac('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method digest
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @example
|
||||||
|
* md5.hmac.digest('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method array
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @example
|
||||||
|
* md5.hmac.array('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method arrayBuffer
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @example
|
||||||
|
* md5.hmac.arrayBuffer('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method buffer
|
||||||
|
* @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @example
|
||||||
|
* md5.hmac.buffer('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method base64
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as base64 string
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} base64 string
|
||||||
|
* @example
|
||||||
|
* md5.hmac.base64('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
var createHmacOutputMethod = function (outputType) {
|
||||||
|
return function (key, message) {
|
||||||
|
return new HmacMd5(key, true).update(message)[outputType]();
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method create
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Create HmacMd5 object
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @returns {HmacMd5} HmacMd5 object.
|
||||||
|
* @example
|
||||||
|
* var hash = md5.hmac.create('key');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method update
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Create and update HmacMd5 object
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {HmacMd5} HmacMd5 object.
|
||||||
|
* @example
|
||||||
|
* var hash = md5.hmac.update('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
* // equal to
|
||||||
|
* var hash = md5.hmac.create('key');
|
||||||
|
* hash.update('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
var createHmacMethod = function () {
|
||||||
|
var method = createHmacOutputMethod('hex');
|
||||||
|
method.create = function (key) {
|
||||||
|
return new HmacMd5(key);
|
||||||
|
};
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
return method;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Md5 class
|
||||||
|
* @class Md5
|
||||||
|
* @description This is internal class.
|
||||||
|
* @see {@link md5.create}
|
||||||
|
*/
|
||||||
|
function Md5(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;
|
||||||
|
this.buffer8 = buffer8;
|
||||||
|
} else {
|
||||||
|
{
|
||||||
|
var buffer = new ArrayBuffer(68);
|
||||||
|
this.buffer8 = new Uint8Array(buffer);
|
||||||
|
this.blocks = new Uint32Array(buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.h0 = this.h1 = this.h2 = this.h3 = this.start = this.bytes = this.hBytes = 0;
|
||||||
|
this.finalized = this.hashed = false;
|
||||||
|
this.first = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method update
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Update hash
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Md5} Md5 object.
|
||||||
|
* @see {@link md5.update}
|
||||||
|
*/
|
||||||
|
Md5.prototype.update = function (message) {
|
||||||
|
if (this.finalized) {
|
||||||
|
throw new Error(FINALIZE_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
var result = formatMessage(message);
|
||||||
|
message = result[0];
|
||||||
|
var isString = result[1];
|
||||||
|
var code, index = 0, i, length = message.length, blocks = this.blocks;
|
||||||
|
var buffer8 = this.buffer8;
|
||||||
|
|
||||||
|
while (index < length) {
|
||||||
|
if (this.hashed) {
|
||||||
|
this.hashed = false;
|
||||||
|
blocks[0] = blocks[16];
|
||||||
|
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 (isString) {
|
||||||
|
{
|
||||||
|
for (i = this.start; index < length && i < 64; ++index) {
|
||||||
|
code = message.charCodeAt(index);
|
||||||
|
if (code < 0x80) {
|
||||||
|
buffer8[i++] = code;
|
||||||
|
} else if (code < 0x800) {
|
||||||
|
buffer8[i++] = 0xc0 | (code >>> 6);
|
||||||
|
buffer8[i++] = 0x80 | (code & 0x3f);
|
||||||
|
} else if (code < 0xd800 || code >= 0xe000) {
|
||||||
|
buffer8[i++] = 0xe0 | (code >>> 12);
|
||||||
|
buffer8[i++] = 0x80 | ((code >>> 6) & 0x3f);
|
||||||
|
buffer8[i++] = 0x80 | (code & 0x3f);
|
||||||
|
} else {
|
||||||
|
code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
|
||||||
|
buffer8[i++] = 0xf0 | (code >>> 18);
|
||||||
|
buffer8[i++] = 0x80 | ((code >>> 12) & 0x3f);
|
||||||
|
buffer8[i++] = 0x80 | ((code >>> 6) & 0x3f);
|
||||||
|
buffer8[i++] = 0x80 | (code & 0x3f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
{
|
||||||
|
for (i = this.start; index < length && i < 64; ++index) {
|
||||||
|
buffer8[i++] = message[index];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.lastByteIndex = i;
|
||||||
|
this.bytes += i - this.start;
|
||||||
|
if (i >= 64) {
|
||||||
|
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;
|
||||||
|
};
|
||||||
|
|
||||||
|
Md5.prototype.finalize = function () {
|
||||||
|
if (this.finalized) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.finalized = true;
|
||||||
|
var blocks = this.blocks, i = this.lastByteIndex;
|
||||||
|
blocks[i >>> 2] |= EXTRA[i & 3];
|
||||||
|
if (i >= 56) {
|
||||||
|
if (!this.hashed) {
|
||||||
|
this.hash();
|
||||||
|
}
|
||||||
|
blocks[0] = blocks[16];
|
||||||
|
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.bytes << 3;
|
||||||
|
blocks[15] = this.hBytes << 3 | this.bytes >>> 29;
|
||||||
|
this.hash();
|
||||||
|
};
|
||||||
|
|
||||||
|
Md5.prototype.hash = function () {
|
||||||
|
var a, b, c, d, bc, da, blocks = this.blocks;
|
||||||
|
|
||||||
|
if (this.first) {
|
||||||
|
a = blocks[0] - 680876937;
|
||||||
|
a = (a << 7 | a >>> 25) - 271733879 << 0;
|
||||||
|
d = (-1732584194 ^ a & 2004318071) + blocks[1] - 117830708;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c = (-271733879 ^ (d & (a ^ -271733879))) + blocks[2] - 1126478375;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b = (a ^ (c & (d ^ a))) + blocks[3] - 1316259209;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
} else {
|
||||||
|
a = this.h0;
|
||||||
|
b = this.h1;
|
||||||
|
c = this.h2;
|
||||||
|
d = this.h3;
|
||||||
|
a += (d ^ (b & (c ^ d))) + blocks[0] - 680876936;
|
||||||
|
a = (a << 7 | a >>> 25) + b << 0;
|
||||||
|
d += (c ^ (a & (b ^ c))) + blocks[1] - 389564586;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c += (b ^ (d & (a ^ b))) + blocks[2] + 606105819;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b += (a ^ (c & (d ^ a))) + blocks[3] - 1044525330;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
a += (d ^ (b & (c ^ d))) + blocks[4] - 176418897;
|
||||||
|
a = (a << 7 | a >>> 25) + b << 0;
|
||||||
|
d += (c ^ (a & (b ^ c))) + blocks[5] + 1200080426;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c += (b ^ (d & (a ^ b))) + blocks[6] - 1473231341;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b += (a ^ (c & (d ^ a))) + blocks[7] - 45705983;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
a += (d ^ (b & (c ^ d))) + blocks[8] + 1770035416;
|
||||||
|
a = (a << 7 | a >>> 25) + b << 0;
|
||||||
|
d += (c ^ (a & (b ^ c))) + blocks[9] - 1958414417;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c += (b ^ (d & (a ^ b))) + blocks[10] - 42063;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b += (a ^ (c & (d ^ a))) + blocks[11] - 1990404162;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
a += (d ^ (b & (c ^ d))) + blocks[12] + 1804603682;
|
||||||
|
a = (a << 7 | a >>> 25) + b << 0;
|
||||||
|
d += (c ^ (a & (b ^ c))) + blocks[13] - 40341101;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c += (b ^ (d & (a ^ b))) + blocks[14] - 1502002290;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b += (a ^ (c & (d ^ a))) + blocks[15] + 1236535329;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
a += (c ^ (d & (b ^ c))) + blocks[1] - 165796510;
|
||||||
|
a = (a << 5 | a >>> 27) + b << 0;
|
||||||
|
d += (b ^ (c & (a ^ b))) + blocks[6] - 1069501632;
|
||||||
|
d = (d << 9 | d >>> 23) + a << 0;
|
||||||
|
c += (a ^ (b & (d ^ a))) + blocks[11] + 643717713;
|
||||||
|
c = (c << 14 | c >>> 18) + d << 0;
|
||||||
|
b += (d ^ (a & (c ^ d))) + blocks[0] - 373897302;
|
||||||
|
b = (b << 20 | b >>> 12) + c << 0;
|
||||||
|
a += (c ^ (d & (b ^ c))) + blocks[5] - 701558691;
|
||||||
|
a = (a << 5 | a >>> 27) + b << 0;
|
||||||
|
d += (b ^ (c & (a ^ b))) + blocks[10] + 38016083;
|
||||||
|
d = (d << 9 | d >>> 23) + a << 0;
|
||||||
|
c += (a ^ (b & (d ^ a))) + blocks[15] - 660478335;
|
||||||
|
c = (c << 14 | c >>> 18) + d << 0;
|
||||||
|
b += (d ^ (a & (c ^ d))) + blocks[4] - 405537848;
|
||||||
|
b = (b << 20 | b >>> 12) + c << 0;
|
||||||
|
a += (c ^ (d & (b ^ c))) + blocks[9] + 568446438;
|
||||||
|
a = (a << 5 | a >>> 27) + b << 0;
|
||||||
|
d += (b ^ (c & (a ^ b))) + blocks[14] - 1019803690;
|
||||||
|
d = (d << 9 | d >>> 23) + a << 0;
|
||||||
|
c += (a ^ (b & (d ^ a))) + blocks[3] - 187363961;
|
||||||
|
c = (c << 14 | c >>> 18) + d << 0;
|
||||||
|
b += (d ^ (a & (c ^ d))) + blocks[8] + 1163531501;
|
||||||
|
b = (b << 20 | b >>> 12) + c << 0;
|
||||||
|
a += (c ^ (d & (b ^ c))) + blocks[13] - 1444681467;
|
||||||
|
a = (a << 5 | a >>> 27) + b << 0;
|
||||||
|
d += (b ^ (c & (a ^ b))) + blocks[2] - 51403784;
|
||||||
|
d = (d << 9 | d >>> 23) + a << 0;
|
||||||
|
c += (a ^ (b & (d ^ a))) + blocks[7] + 1735328473;
|
||||||
|
c = (c << 14 | c >>> 18) + d << 0;
|
||||||
|
b += (d ^ (a & (c ^ d))) + blocks[12] - 1926607734;
|
||||||
|
b = (b << 20 | b >>> 12) + c << 0;
|
||||||
|
bc = b ^ c;
|
||||||
|
a += (bc ^ d) + blocks[5] - 378558;
|
||||||
|
a = (a << 4 | a >>> 28) + b << 0;
|
||||||
|
d += (bc ^ a) + blocks[8] - 2022574463;
|
||||||
|
d = (d << 11 | d >>> 21) + a << 0;
|
||||||
|
da = d ^ a;
|
||||||
|
c += (da ^ b) + blocks[11] + 1839030562;
|
||||||
|
c = (c << 16 | c >>> 16) + d << 0;
|
||||||
|
b += (da ^ c) + blocks[14] - 35309556;
|
||||||
|
b = (b << 23 | b >>> 9) + c << 0;
|
||||||
|
bc = b ^ c;
|
||||||
|
a += (bc ^ d) + blocks[1] - 1530992060;
|
||||||
|
a = (a << 4 | a >>> 28) + b << 0;
|
||||||
|
d += (bc ^ a) + blocks[4] + 1272893353;
|
||||||
|
d = (d << 11 | d >>> 21) + a << 0;
|
||||||
|
da = d ^ a;
|
||||||
|
c += (da ^ b) + blocks[7] - 155497632;
|
||||||
|
c = (c << 16 | c >>> 16) + d << 0;
|
||||||
|
b += (da ^ c) + blocks[10] - 1094730640;
|
||||||
|
b = (b << 23 | b >>> 9) + c << 0;
|
||||||
|
bc = b ^ c;
|
||||||
|
a += (bc ^ d) + blocks[13] + 681279174;
|
||||||
|
a = (a << 4 | a >>> 28) + b << 0;
|
||||||
|
d += (bc ^ a) + blocks[0] - 358537222;
|
||||||
|
d = (d << 11 | d >>> 21) + a << 0;
|
||||||
|
da = d ^ a;
|
||||||
|
c += (da ^ b) + blocks[3] - 722521979;
|
||||||
|
c = (c << 16 | c >>> 16) + d << 0;
|
||||||
|
b += (da ^ c) + blocks[6] + 76029189;
|
||||||
|
b = (b << 23 | b >>> 9) + c << 0;
|
||||||
|
bc = b ^ c;
|
||||||
|
a += (bc ^ d) + blocks[9] - 640364487;
|
||||||
|
a = (a << 4 | a >>> 28) + b << 0;
|
||||||
|
d += (bc ^ a) + blocks[12] - 421815835;
|
||||||
|
d = (d << 11 | d >>> 21) + a << 0;
|
||||||
|
da = d ^ a;
|
||||||
|
c += (da ^ b) + blocks[15] + 530742520;
|
||||||
|
c = (c << 16 | c >>> 16) + d << 0;
|
||||||
|
b += (da ^ c) + blocks[2] - 995338651;
|
||||||
|
b = (b << 23 | b >>> 9) + c << 0;
|
||||||
|
a += (c ^ (b | ~d)) + blocks[0] - 198630844;
|
||||||
|
a = (a << 6 | a >>> 26) + b << 0;
|
||||||
|
d += (b ^ (a | ~c)) + blocks[7] + 1126891415;
|
||||||
|
d = (d << 10 | d >>> 22) + a << 0;
|
||||||
|
c += (a ^ (d | ~b)) + blocks[14] - 1416354905;
|
||||||
|
c = (c << 15 | c >>> 17) + d << 0;
|
||||||
|
b += (d ^ (c | ~a)) + blocks[5] - 57434055;
|
||||||
|
b = (b << 21 | b >>> 11) + c << 0;
|
||||||
|
a += (c ^ (b | ~d)) + blocks[12] + 1700485571;
|
||||||
|
a = (a << 6 | a >>> 26) + b << 0;
|
||||||
|
d += (b ^ (a | ~c)) + blocks[3] - 1894986606;
|
||||||
|
d = (d << 10 | d >>> 22) + a << 0;
|
||||||
|
c += (a ^ (d | ~b)) + blocks[10] - 1051523;
|
||||||
|
c = (c << 15 | c >>> 17) + d << 0;
|
||||||
|
b += (d ^ (c | ~a)) + blocks[1] - 2054922799;
|
||||||
|
b = (b << 21 | b >>> 11) + c << 0;
|
||||||
|
a += (c ^ (b | ~d)) + blocks[8] + 1873313359;
|
||||||
|
a = (a << 6 | a >>> 26) + b << 0;
|
||||||
|
d += (b ^ (a | ~c)) + blocks[15] - 30611744;
|
||||||
|
d = (d << 10 | d >>> 22) + a << 0;
|
||||||
|
c += (a ^ (d | ~b)) + blocks[6] - 1560198380;
|
||||||
|
c = (c << 15 | c >>> 17) + d << 0;
|
||||||
|
b += (d ^ (c | ~a)) + blocks[13] + 1309151649;
|
||||||
|
b = (b << 21 | b >>> 11) + c << 0;
|
||||||
|
a += (c ^ (b | ~d)) + blocks[4] - 145523070;
|
||||||
|
a = (a << 6 | a >>> 26) + b << 0;
|
||||||
|
d += (b ^ (a | ~c)) + blocks[11] - 1120210379;
|
||||||
|
d = (d << 10 | d >>> 22) + a << 0;
|
||||||
|
c += (a ^ (d | ~b)) + blocks[2] + 718787259;
|
||||||
|
c = (c << 15 | c >>> 17) + d << 0;
|
||||||
|
b += (d ^ (c | ~a)) + blocks[9] - 343485551;
|
||||||
|
b = (b << 21 | b >>> 11) + c << 0;
|
||||||
|
|
||||||
|
if (this.first) {
|
||||||
|
this.h0 = a + 1732584193 << 0;
|
||||||
|
this.h1 = b - 271733879 << 0;
|
||||||
|
this.h2 = c - 1732584194 << 0;
|
||||||
|
this.h3 = d + 271733878 << 0;
|
||||||
|
this.first = false;
|
||||||
|
} else {
|
||||||
|
this.h0 = this.h0 + a << 0;
|
||||||
|
this.h1 = this.h1 + b << 0;
|
||||||
|
this.h2 = this.h2 + c << 0;
|
||||||
|
this.h3 = this.h3 + d << 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method hex
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as hex string
|
||||||
|
* @returns {String} Hex string
|
||||||
|
* @see {@link md5.hex}
|
||||||
|
* @example
|
||||||
|
* hash.hex();
|
||||||
|
*/
|
||||||
|
Md5.prototype.hex = function () {
|
||||||
|
this.finalize();
|
||||||
|
|
||||||
|
var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;
|
||||||
|
|
||||||
|
return HEX_CHARS[(h0 >>> 4) & 0x0F] + HEX_CHARS[h0 & 0x0F] +
|
||||||
|
HEX_CHARS[(h0 >>> 12) & 0x0F] + HEX_CHARS[(h0 >>> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h0 >>> 20) & 0x0F] + HEX_CHARS[(h0 >>> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h0 >>> 28) & 0x0F] + HEX_CHARS[(h0 >>> 24) & 0x0F] +
|
||||||
|
HEX_CHARS[(h1 >>> 4) & 0x0F] + HEX_CHARS[h1 & 0x0F] +
|
||||||
|
HEX_CHARS[(h1 >>> 12) & 0x0F] + HEX_CHARS[(h1 >>> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h1 >>> 20) & 0x0F] + HEX_CHARS[(h1 >>> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h1 >>> 28) & 0x0F] + HEX_CHARS[(h1 >>> 24) & 0x0F] +
|
||||||
|
HEX_CHARS[(h2 >>> 4) & 0x0F] + HEX_CHARS[h2 & 0x0F] +
|
||||||
|
HEX_CHARS[(h2 >>> 12) & 0x0F] + HEX_CHARS[(h2 >>> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h2 >>> 20) & 0x0F] + HEX_CHARS[(h2 >>> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h2 >>> 28) & 0x0F] + HEX_CHARS[(h2 >>> 24) & 0x0F] +
|
||||||
|
HEX_CHARS[(h3 >>> 4) & 0x0F] + HEX_CHARS[h3 & 0x0F] +
|
||||||
|
HEX_CHARS[(h3 >>> 12) & 0x0F] + HEX_CHARS[(h3 >>> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h3 >>> 20) & 0x0F] + HEX_CHARS[(h3 >>> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h3 >>> 28) & 0x0F] + HEX_CHARS[(h3 >>> 24) & 0x0F];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method toString
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as hex string
|
||||||
|
* @returns {String} Hex string
|
||||||
|
* @see {@link md5.hex}
|
||||||
|
* @example
|
||||||
|
* hash.toString();
|
||||||
|
*/
|
||||||
|
Md5.prototype.toString = Md5.prototype.hex;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method digest
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @see {@link md5.digest}
|
||||||
|
* @example
|
||||||
|
* hash.digest();
|
||||||
|
*/
|
||||||
|
Md5.prototype.digest = function () {
|
||||||
|
this.finalize();
|
||||||
|
|
||||||
|
var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;
|
||||||
|
return [
|
||||||
|
h0 & 0xFF, (h0 >>> 8) & 0xFF, (h0 >>> 16) & 0xFF, (h0 >>> 24) & 0xFF,
|
||||||
|
h1 & 0xFF, (h1 >>> 8) & 0xFF, (h1 >>> 16) & 0xFF, (h1 >>> 24) & 0xFF,
|
||||||
|
h2 & 0xFF, (h2 >>> 8) & 0xFF, (h2 >>> 16) & 0xFF, (h2 >>> 24) & 0xFF,
|
||||||
|
h3 & 0xFF, (h3 >>> 8) & 0xFF, (h3 >>> 16) & 0xFF, (h3 >>> 24) & 0xFF
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method array
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @see {@link md5.array}
|
||||||
|
* @example
|
||||||
|
* hash.array();
|
||||||
|
*/
|
||||||
|
Md5.prototype.array = Md5.prototype.digest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method arrayBuffer
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @see {@link md5.arrayBuffer}
|
||||||
|
* @example
|
||||||
|
* hash.arrayBuffer();
|
||||||
|
*/
|
||||||
|
Md5.prototype.arrayBuffer = function () {
|
||||||
|
this.finalize();
|
||||||
|
|
||||||
|
var buffer = new ArrayBuffer(16);
|
||||||
|
var blocks = new Uint32Array(buffer);
|
||||||
|
blocks[0] = this.h0;
|
||||||
|
blocks[1] = this.h1;
|
||||||
|
blocks[2] = this.h2;
|
||||||
|
blocks[3] = this.h3;
|
||||||
|
return buffer;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method buffer
|
||||||
|
* @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @see {@link md5.buffer}
|
||||||
|
* @example
|
||||||
|
* hash.buffer();
|
||||||
|
*/
|
||||||
|
/* istanbul ignore else */
|
||||||
|
{
|
||||||
|
Md5.prototype.buffer = Md5.prototype.arrayBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method base64
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as base64 string
|
||||||
|
* @returns {String} base64 string
|
||||||
|
* @see {@link md5.base64}
|
||||||
|
* @example
|
||||||
|
* hash.base64();
|
||||||
|
*/
|
||||||
|
/* istanbul ignore else */
|
||||||
|
{
|
||||||
|
Md5.prototype.base64 = function () {
|
||||||
|
var v1, v2, v3, base64Str = '', bytes = this.array();
|
||||||
|
for (var i = 0; i < 15;) {
|
||||||
|
v1 = bytes[i++];
|
||||||
|
v2 = bytes[i++];
|
||||||
|
v3 = bytes[i++];
|
||||||
|
base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] +
|
||||||
|
BASE64_ENCODE_CHAR[(v1 << 4 | v2 >>> 4) & 63] +
|
||||||
|
BASE64_ENCODE_CHAR[(v2 << 2 | v3 >>> 6) & 63] +
|
||||||
|
BASE64_ENCODE_CHAR[v3 & 63];
|
||||||
|
}
|
||||||
|
v1 = bytes[i];
|
||||||
|
base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] +
|
||||||
|
BASE64_ENCODE_CHAR[(v1 << 4) & 63] +
|
||||||
|
'==';
|
||||||
|
return base64Str;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* HmacMd5 class
|
||||||
|
* @class HmacMd5
|
||||||
|
* @extends Md5
|
||||||
|
* @description This is internal class.
|
||||||
|
* @see {@link md5.hmac.create}
|
||||||
|
*/
|
||||||
|
function HmacMd5(key, sharedMemory) {
|
||||||
|
var i, result = formatMessage(key);
|
||||||
|
key = result[0];
|
||||||
|
if (result[1]) {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (key.length > 64) {
|
||||||
|
key = (new Md5(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;
|
||||||
|
}
|
||||||
|
|
||||||
|
Md5.call(this, sharedMemory);
|
||||||
|
|
||||||
|
this.update(iKeyPad);
|
||||||
|
this.oKeyPad = oKeyPad;
|
||||||
|
this.inner = true;
|
||||||
|
this.sharedMemory = sharedMemory;
|
||||||
|
}
|
||||||
|
/* istanbul ignore else */
|
||||||
|
{
|
||||||
|
HmacMd5.prototype = new Md5();
|
||||||
|
|
||||||
|
HmacMd5.prototype.finalize = function () {
|
||||||
|
Md5.prototype.finalize.call(this);
|
||||||
|
if (this.inner) {
|
||||||
|
this.inner = false;
|
||||||
|
var innerHash = this.array();
|
||||||
|
Md5.call(this, this.sharedMemory);
|
||||||
|
this.update(this.oKeyPad);
|
||||||
|
this.update(innerHash);
|
||||||
|
Md5.prototype.finalize.call(this);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
var exports = createMethod();
|
||||||
|
exports.md5 = exports;
|
||||||
|
/* istanbul ignore else */
|
||||||
|
{
|
||||||
|
exports.md5.hmac = createHmacMethod();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (COMMON_JS) {
|
||||||
|
module.exports = exports;
|
||||||
|
} else {
|
||||||
|
/**
|
||||||
|
* @method md5
|
||||||
|
* @description Md5 hash function, export to global in browsers.
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} md5 hashes
|
||||||
|
* @example
|
||||||
|
* md5(''); // d41d8cd98f00b204e9800998ecf8427e
|
||||||
|
* md5('The quick brown fox jumps over the lazy dog'); // 9e107d9d372bb6826bd81d3542a419d6
|
||||||
|
* md5('The quick brown fox jumps over the lazy dog.'); // e4d909c290d0fb1ca068ffaddf22cbd0
|
||||||
|
*
|
||||||
|
* // It also supports UTF-8 encoding
|
||||||
|
* md5('中文'); // a7bac2239fcdcb3a067903d8077c4a07
|
||||||
|
*
|
||||||
|
* // It also supports byte `Array`, `Uint8Array`, `ArrayBuffer`
|
||||||
|
* md5([]); // d41d8cd98f00b204e9800998ecf8427e
|
||||||
|
* md5(new Uint8Array([])); // d41d8cd98f00b204e9800998ecf8427e
|
||||||
|
*/
|
||||||
|
root.md5 = exports;
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
} (md5$1));
|
||||||
|
|
||||||
|
var md5Exports = md5$1.exports;
|
||||||
|
var md5 = /*@__PURE__*/getDefaultExportFromCjs(md5Exports);
|
||||||
|
|
||||||
|
export { md5 as default, md5 };
|
||||||
@@ -0,0 +1,911 @@
|
|||||||
|
import require$$0 from 'crypto';
|
||||||
|
import require$$1 from 'buffer';
|
||||||
|
|
||||||
|
var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
|
||||||
|
|
||||||
|
function getDefaultExportFromCjs (x) {
|
||||||
|
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
|
||||||
|
}
|
||||||
|
|
||||||
|
var md5$1 = {exports: {}};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* [js-md5]{@link https://github.com/emn178/js-md5}
|
||||||
|
*
|
||||||
|
* @namespace md5
|
||||||
|
* @version 0.9.0
|
||||||
|
* @author Chen, Yi-Cyuan [emn178@gmail.com]
|
||||||
|
* @copyright Chen, Yi-Cyuan 2014-2026
|
||||||
|
* @license MIT
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function (module) {
|
||||||
|
(function () {
|
||||||
|
|
||||||
|
var INPUT_ERROR = 'input is invalid type';
|
||||||
|
var FINALIZE_ERROR = 'finalize already called';
|
||||||
|
var WINDOW = typeof window === 'object';
|
||||||
|
var root = WINDOW ? window : {};
|
||||||
|
if (root.JS_MD5_NO_WINDOW) {
|
||||||
|
WINDOW = false;
|
||||||
|
}
|
||||||
|
var WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && typeof self !== 'undefined' && self instanceof WorkerGlobalScope;
|
||||||
|
/* istanbul ignore next */
|
||||||
|
var NODE_JS = !root.JS_MD5_NO_NODE_JS && !WINDOW && typeof process === 'object' && process.versions && process.versions.node;
|
||||||
|
if (NODE_JS) {
|
||||||
|
root = commonjsGlobal;
|
||||||
|
} else if (WEB_WORKER) {
|
||||||
|
root = self;
|
||||||
|
}
|
||||||
|
var COMMON_JS = !root.JS_MD5_NO_COMMON_JS && 'object' === 'object' && module.exports;
|
||||||
|
/* istanbul ignore next */
|
||||||
|
var ARRAY_BUFFER = !root.JS_MD5_NO_ARRAY_BUFFER && typeof ArrayBuffer !== 'undefined' ;
|
||||||
|
var HEX_CHARS = '0123456789abcdef'.split('');
|
||||||
|
var EXTRA = [128, 32768, 8388608, -2147483648];
|
||||||
|
var SHIFT = [0, 8, 16, 24];
|
||||||
|
var OUTPUT_TYPES = ['hex', 'array', 'digest', 'arrayBuffer'];
|
||||||
|
/* istanbul ignore else */
|
||||||
|
{
|
||||||
|
OUTPUT_TYPES.push('buffer');
|
||||||
|
}
|
||||||
|
/* istanbul ignore else */
|
||||||
|
{
|
||||||
|
OUTPUT_TYPES.push('base64');
|
||||||
|
}
|
||||||
|
/* istanbul ignore next */
|
||||||
|
var BASE64_ENCODE_CHAR = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('') ;
|
||||||
|
|
||||||
|
var blocks = [], buffer8;
|
||||||
|
if (ARRAY_BUFFER) {
|
||||||
|
var buffer = new ArrayBuffer(68);
|
||||||
|
buffer8 = new Uint8Array(buffer);
|
||||||
|
blocks = new Uint32Array(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
var isArray = Array.isArray;
|
||||||
|
/* istanbul ignore else */
|
||||||
|
if ((root.JS_MD5_NO_NODE_JS || !isArray)) {
|
||||||
|
isArray = function (obj) {
|
||||||
|
return Object.prototype.toString.call(obj) === '[object Array]';
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
var isView = ArrayBuffer.isView;
|
||||||
|
/* istanbul ignore else */
|
||||||
|
if (ARRAY_BUFFER && (root.JS_MD5_NO_ARRAY_BUFFER_IS_VIEW || !isView)) {
|
||||||
|
isView = function (obj) {
|
||||||
|
return typeof obj === 'object' && obj.buffer && obj.buffer.constructor === ArrayBuffer;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// [message: string, isString: bool]
|
||||||
|
var formatMessage = function (message) {
|
||||||
|
var type = typeof message;
|
||||||
|
if (type === 'string') {
|
||||||
|
return [message, true];
|
||||||
|
}
|
||||||
|
if (type !== 'object' || message === null) {
|
||||||
|
throw new Error(INPUT_ERROR);
|
||||||
|
}
|
||||||
|
if (ARRAY_BUFFER && message.constructor === ArrayBuffer) {
|
||||||
|
return [new Uint8Array(message), false];
|
||||||
|
}
|
||||||
|
if (!isArray(message) && !isView(message)) {
|
||||||
|
throw new Error(INPUT_ERROR);
|
||||||
|
}
|
||||||
|
return [message, false];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method hex
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as hex string
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} Hex string
|
||||||
|
* @example
|
||||||
|
* md5.hex('The quick brown fox jumps over the lazy dog');
|
||||||
|
* // equal to
|
||||||
|
* md5('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method digest
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @example
|
||||||
|
* md5.digest('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method array
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @example
|
||||||
|
* md5.array('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method arrayBuffer
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @example
|
||||||
|
* md5.arrayBuffer('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method buffer
|
||||||
|
* @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @example
|
||||||
|
* md5.buffer('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method base64
|
||||||
|
* @memberof md5
|
||||||
|
* @description Output hash as base64 string
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} base64 string
|
||||||
|
* @example
|
||||||
|
* md5.base64('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
var createOutputMethod = function (outputType) {
|
||||||
|
return function (message) {
|
||||||
|
return new Md5(true).update(message)[outputType]();
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method create
|
||||||
|
* @memberof md5
|
||||||
|
* @description Create Md5 object
|
||||||
|
* @returns {Md5} Md5 object.
|
||||||
|
* @example
|
||||||
|
* var hash = md5.create();
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method update
|
||||||
|
* @memberof md5
|
||||||
|
* @description Create and update Md5 object
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Md5} Md5 object.
|
||||||
|
* @example
|
||||||
|
* var hash = md5.update('The quick brown fox jumps over the lazy dog');
|
||||||
|
* // equal to
|
||||||
|
* var hash = md5.create();
|
||||||
|
* hash.update('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
var createMethod = function () {
|
||||||
|
var method = createOutputMethod('hex');
|
||||||
|
if (NODE_JS) {
|
||||||
|
method = nodeWrap(method);
|
||||||
|
}
|
||||||
|
method.create = function () {
|
||||||
|
return new Md5();
|
||||||
|
};
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
return method;
|
||||||
|
};
|
||||||
|
|
||||||
|
var nodeWrap = function (method) {
|
||||||
|
var crypto = require$$0;
|
||||||
|
var Buffer = require$$1.Buffer;
|
||||||
|
var bufferFrom = Buffer.from;
|
||||||
|
if ((root.JS_MD5_NO_BUFFER_FROM || !bufferFrom)) {
|
||||||
|
bufferFrom = function (message) {
|
||||||
|
return new Buffer(message);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
var nodeMethod = function (message) {
|
||||||
|
if (typeof message === 'string') {
|
||||||
|
return crypto.createHash('md5').update(message, 'utf8').digest('hex');
|
||||||
|
} else {
|
||||||
|
if (message === null || message === undefined) {
|
||||||
|
throw new Error(INPUT_ERROR);
|
||||||
|
} else if (message.constructor === ArrayBuffer) {
|
||||||
|
message = new Uint8Array(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isArray(message) || isView(message) ||
|
||||||
|
message.constructor === Buffer) {
|
||||||
|
return crypto.createHash('md5').update(bufferFrom(message)).digest('hex');
|
||||||
|
} else {
|
||||||
|
return method(message);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
return nodeMethod;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @namespace md5.hmac
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method hex
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as hex string
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} Hex string
|
||||||
|
* @example
|
||||||
|
* md5.hmac.hex('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
* // equal to
|
||||||
|
* md5.hmac('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method digest
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @example
|
||||||
|
* md5.hmac.digest('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method array
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @example
|
||||||
|
* md5.hmac.array('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method arrayBuffer
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @example
|
||||||
|
* md5.hmac.arrayBuffer('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method buffer
|
||||||
|
* @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @example
|
||||||
|
* md5.hmac.buffer('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method base64
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as base64 string
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} base64 string
|
||||||
|
* @example
|
||||||
|
* md5.hmac.base64('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
var createHmacOutputMethod = function (outputType) {
|
||||||
|
return function (key, message) {
|
||||||
|
return new HmacMd5(key, true).update(message)[outputType]();
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method create
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Create HmacMd5 object
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @returns {HmacMd5} HmacMd5 object.
|
||||||
|
* @example
|
||||||
|
* var hash = md5.hmac.create('key');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method update
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Create and update HmacMd5 object
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {HmacMd5} HmacMd5 object.
|
||||||
|
* @example
|
||||||
|
* var hash = md5.hmac.update('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
* // equal to
|
||||||
|
* var hash = md5.hmac.create('key');
|
||||||
|
* hash.update('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
var createHmacMethod = function () {
|
||||||
|
var method = createHmacOutputMethod('hex');
|
||||||
|
method.create = function (key) {
|
||||||
|
return new HmacMd5(key);
|
||||||
|
};
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
return method;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Md5 class
|
||||||
|
* @class Md5
|
||||||
|
* @description This is internal class.
|
||||||
|
* @see {@link md5.create}
|
||||||
|
*/
|
||||||
|
function Md5(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;
|
||||||
|
this.buffer8 = buffer8;
|
||||||
|
} else {
|
||||||
|
if (ARRAY_BUFFER) {
|
||||||
|
var buffer = new ArrayBuffer(68);
|
||||||
|
this.buffer8 = new Uint8Array(buffer);
|
||||||
|
this.blocks = new Uint32Array(buffer);
|
||||||
|
} else {
|
||||||
|
this.blocks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.h0 = this.h1 = this.h2 = this.h3 = this.start = this.bytes = this.hBytes = 0;
|
||||||
|
this.finalized = this.hashed = false;
|
||||||
|
this.first = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method update
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Update hash
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Md5} Md5 object.
|
||||||
|
* @see {@link md5.update}
|
||||||
|
*/
|
||||||
|
Md5.prototype.update = function (message) {
|
||||||
|
if (this.finalized) {
|
||||||
|
throw new Error(FINALIZE_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
var result = formatMessage(message);
|
||||||
|
message = result[0];
|
||||||
|
var isString = result[1];
|
||||||
|
var code, index = 0, i, length = message.length, blocks = this.blocks;
|
||||||
|
var buffer8 = this.buffer8;
|
||||||
|
|
||||||
|
while (index < length) {
|
||||||
|
if (this.hashed) {
|
||||||
|
this.hashed = false;
|
||||||
|
blocks[0] = blocks[16];
|
||||||
|
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 (isString) {
|
||||||
|
if (ARRAY_BUFFER) {
|
||||||
|
for (i = this.start; index < length && i < 64; ++index) {
|
||||||
|
code = message.charCodeAt(index);
|
||||||
|
if (code < 0x80) {
|
||||||
|
buffer8[i++] = code;
|
||||||
|
} else if (code < 0x800) {
|
||||||
|
buffer8[i++] = 0xc0 | (code >>> 6);
|
||||||
|
buffer8[i++] = 0x80 | (code & 0x3f);
|
||||||
|
} else if (code < 0xd800 || code >= 0xe000) {
|
||||||
|
buffer8[i++] = 0xe0 | (code >>> 12);
|
||||||
|
buffer8[i++] = 0x80 | ((code >>> 6) & 0x3f);
|
||||||
|
buffer8[i++] = 0x80 | (code & 0x3f);
|
||||||
|
} else {
|
||||||
|
code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
|
||||||
|
buffer8[i++] = 0xf0 | (code >>> 18);
|
||||||
|
buffer8[i++] = 0x80 | ((code >>> 12) & 0x3f);
|
||||||
|
buffer8[i++] = 0x80 | ((code >>> 6) & 0x3f);
|
||||||
|
buffer8[i++] = 0x80 | (code & 0x3f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} 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];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (ARRAY_BUFFER) {
|
||||||
|
for (i = this.start; index < length && i < 64; ++index) {
|
||||||
|
buffer8[i++] = message[index];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (i = this.start; index < length && i < 64; ++index) {
|
||||||
|
blocks[i >>> 2] |= message[index] << SHIFT[i++ & 3];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.lastByteIndex = i;
|
||||||
|
this.bytes += i - this.start;
|
||||||
|
if (i >= 64) {
|
||||||
|
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;
|
||||||
|
};
|
||||||
|
|
||||||
|
Md5.prototype.finalize = function () {
|
||||||
|
if (this.finalized) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.finalized = true;
|
||||||
|
var blocks = this.blocks, i = this.lastByteIndex;
|
||||||
|
blocks[i >>> 2] |= EXTRA[i & 3];
|
||||||
|
if (i >= 56) {
|
||||||
|
if (!this.hashed) {
|
||||||
|
this.hash();
|
||||||
|
}
|
||||||
|
blocks[0] = blocks[16];
|
||||||
|
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.bytes << 3;
|
||||||
|
blocks[15] = this.hBytes << 3 | this.bytes >>> 29;
|
||||||
|
this.hash();
|
||||||
|
};
|
||||||
|
|
||||||
|
Md5.prototype.hash = function () {
|
||||||
|
var a, b, c, d, bc, da, blocks = this.blocks;
|
||||||
|
|
||||||
|
if (this.first) {
|
||||||
|
a = blocks[0] - 680876937;
|
||||||
|
a = (a << 7 | a >>> 25) - 271733879 << 0;
|
||||||
|
d = (-1732584194 ^ a & 2004318071) + blocks[1] - 117830708;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c = (-271733879 ^ (d & (a ^ -271733879))) + blocks[2] - 1126478375;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b = (a ^ (c & (d ^ a))) + blocks[3] - 1316259209;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
} else {
|
||||||
|
a = this.h0;
|
||||||
|
b = this.h1;
|
||||||
|
c = this.h2;
|
||||||
|
d = this.h3;
|
||||||
|
a += (d ^ (b & (c ^ d))) + blocks[0] - 680876936;
|
||||||
|
a = (a << 7 | a >>> 25) + b << 0;
|
||||||
|
d += (c ^ (a & (b ^ c))) + blocks[1] - 389564586;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c += (b ^ (d & (a ^ b))) + blocks[2] + 606105819;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b += (a ^ (c & (d ^ a))) + blocks[3] - 1044525330;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
a += (d ^ (b & (c ^ d))) + blocks[4] - 176418897;
|
||||||
|
a = (a << 7 | a >>> 25) + b << 0;
|
||||||
|
d += (c ^ (a & (b ^ c))) + blocks[5] + 1200080426;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c += (b ^ (d & (a ^ b))) + blocks[6] - 1473231341;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b += (a ^ (c & (d ^ a))) + blocks[7] - 45705983;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
a += (d ^ (b & (c ^ d))) + blocks[8] + 1770035416;
|
||||||
|
a = (a << 7 | a >>> 25) + b << 0;
|
||||||
|
d += (c ^ (a & (b ^ c))) + blocks[9] - 1958414417;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c += (b ^ (d & (a ^ b))) + blocks[10] - 42063;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b += (a ^ (c & (d ^ a))) + blocks[11] - 1990404162;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
a += (d ^ (b & (c ^ d))) + blocks[12] + 1804603682;
|
||||||
|
a = (a << 7 | a >>> 25) + b << 0;
|
||||||
|
d += (c ^ (a & (b ^ c))) + blocks[13] - 40341101;
|
||||||
|
d = (d << 12 | d >>> 20) + a << 0;
|
||||||
|
c += (b ^ (d & (a ^ b))) + blocks[14] - 1502002290;
|
||||||
|
c = (c << 17 | c >>> 15) + d << 0;
|
||||||
|
b += (a ^ (c & (d ^ a))) + blocks[15] + 1236535329;
|
||||||
|
b = (b << 22 | b >>> 10) + c << 0;
|
||||||
|
a += (c ^ (d & (b ^ c))) + blocks[1] - 165796510;
|
||||||
|
a = (a << 5 | a >>> 27) + b << 0;
|
||||||
|
d += (b ^ (c & (a ^ b))) + blocks[6] - 1069501632;
|
||||||
|
d = (d << 9 | d >>> 23) + a << 0;
|
||||||
|
c += (a ^ (b & (d ^ a))) + blocks[11] + 643717713;
|
||||||
|
c = (c << 14 | c >>> 18) + d << 0;
|
||||||
|
b += (d ^ (a & (c ^ d))) + blocks[0] - 373897302;
|
||||||
|
b = (b << 20 | b >>> 12) + c << 0;
|
||||||
|
a += (c ^ (d & (b ^ c))) + blocks[5] - 701558691;
|
||||||
|
a = (a << 5 | a >>> 27) + b << 0;
|
||||||
|
d += (b ^ (c & (a ^ b))) + blocks[10] + 38016083;
|
||||||
|
d = (d << 9 | d >>> 23) + a << 0;
|
||||||
|
c += (a ^ (b & (d ^ a))) + blocks[15] - 660478335;
|
||||||
|
c = (c << 14 | c >>> 18) + d << 0;
|
||||||
|
b += (d ^ (a & (c ^ d))) + blocks[4] - 405537848;
|
||||||
|
b = (b << 20 | b >>> 12) + c << 0;
|
||||||
|
a += (c ^ (d & (b ^ c))) + blocks[9] + 568446438;
|
||||||
|
a = (a << 5 | a >>> 27) + b << 0;
|
||||||
|
d += (b ^ (c & (a ^ b))) + blocks[14] - 1019803690;
|
||||||
|
d = (d << 9 | d >>> 23) + a << 0;
|
||||||
|
c += (a ^ (b & (d ^ a))) + blocks[3] - 187363961;
|
||||||
|
c = (c << 14 | c >>> 18) + d << 0;
|
||||||
|
b += (d ^ (a & (c ^ d))) + blocks[8] + 1163531501;
|
||||||
|
b = (b << 20 | b >>> 12) + c << 0;
|
||||||
|
a += (c ^ (d & (b ^ c))) + blocks[13] - 1444681467;
|
||||||
|
a = (a << 5 | a >>> 27) + b << 0;
|
||||||
|
d += (b ^ (c & (a ^ b))) + blocks[2] - 51403784;
|
||||||
|
d = (d << 9 | d >>> 23) + a << 0;
|
||||||
|
c += (a ^ (b & (d ^ a))) + blocks[7] + 1735328473;
|
||||||
|
c = (c << 14 | c >>> 18) + d << 0;
|
||||||
|
b += (d ^ (a & (c ^ d))) + blocks[12] - 1926607734;
|
||||||
|
b = (b << 20 | b >>> 12) + c << 0;
|
||||||
|
bc = b ^ c;
|
||||||
|
a += (bc ^ d) + blocks[5] - 378558;
|
||||||
|
a = (a << 4 | a >>> 28) + b << 0;
|
||||||
|
d += (bc ^ a) + blocks[8] - 2022574463;
|
||||||
|
d = (d << 11 | d >>> 21) + a << 0;
|
||||||
|
da = d ^ a;
|
||||||
|
c += (da ^ b) + blocks[11] + 1839030562;
|
||||||
|
c = (c << 16 | c >>> 16) + d << 0;
|
||||||
|
b += (da ^ c) + blocks[14] - 35309556;
|
||||||
|
b = (b << 23 | b >>> 9) + c << 0;
|
||||||
|
bc = b ^ c;
|
||||||
|
a += (bc ^ d) + blocks[1] - 1530992060;
|
||||||
|
a = (a << 4 | a >>> 28) + b << 0;
|
||||||
|
d += (bc ^ a) + blocks[4] + 1272893353;
|
||||||
|
d = (d << 11 | d >>> 21) + a << 0;
|
||||||
|
da = d ^ a;
|
||||||
|
c += (da ^ b) + blocks[7] - 155497632;
|
||||||
|
c = (c << 16 | c >>> 16) + d << 0;
|
||||||
|
b += (da ^ c) + blocks[10] - 1094730640;
|
||||||
|
b = (b << 23 | b >>> 9) + c << 0;
|
||||||
|
bc = b ^ c;
|
||||||
|
a += (bc ^ d) + blocks[13] + 681279174;
|
||||||
|
a = (a << 4 | a >>> 28) + b << 0;
|
||||||
|
d += (bc ^ a) + blocks[0] - 358537222;
|
||||||
|
d = (d << 11 | d >>> 21) + a << 0;
|
||||||
|
da = d ^ a;
|
||||||
|
c += (da ^ b) + blocks[3] - 722521979;
|
||||||
|
c = (c << 16 | c >>> 16) + d << 0;
|
||||||
|
b += (da ^ c) + blocks[6] + 76029189;
|
||||||
|
b = (b << 23 | b >>> 9) + c << 0;
|
||||||
|
bc = b ^ c;
|
||||||
|
a += (bc ^ d) + blocks[9] - 640364487;
|
||||||
|
a = (a << 4 | a >>> 28) + b << 0;
|
||||||
|
d += (bc ^ a) + blocks[12] - 421815835;
|
||||||
|
d = (d << 11 | d >>> 21) + a << 0;
|
||||||
|
da = d ^ a;
|
||||||
|
c += (da ^ b) + blocks[15] + 530742520;
|
||||||
|
c = (c << 16 | c >>> 16) + d << 0;
|
||||||
|
b += (da ^ c) + blocks[2] - 995338651;
|
||||||
|
b = (b << 23 | b >>> 9) + c << 0;
|
||||||
|
a += (c ^ (b | ~d)) + blocks[0] - 198630844;
|
||||||
|
a = (a << 6 | a >>> 26) + b << 0;
|
||||||
|
d += (b ^ (a | ~c)) + blocks[7] + 1126891415;
|
||||||
|
d = (d << 10 | d >>> 22) + a << 0;
|
||||||
|
c += (a ^ (d | ~b)) + blocks[14] - 1416354905;
|
||||||
|
c = (c << 15 | c >>> 17) + d << 0;
|
||||||
|
b += (d ^ (c | ~a)) + blocks[5] - 57434055;
|
||||||
|
b = (b << 21 | b >>> 11) + c << 0;
|
||||||
|
a += (c ^ (b | ~d)) + blocks[12] + 1700485571;
|
||||||
|
a = (a << 6 | a >>> 26) + b << 0;
|
||||||
|
d += (b ^ (a | ~c)) + blocks[3] - 1894986606;
|
||||||
|
d = (d << 10 | d >>> 22) + a << 0;
|
||||||
|
c += (a ^ (d | ~b)) + blocks[10] - 1051523;
|
||||||
|
c = (c << 15 | c >>> 17) + d << 0;
|
||||||
|
b += (d ^ (c | ~a)) + blocks[1] - 2054922799;
|
||||||
|
b = (b << 21 | b >>> 11) + c << 0;
|
||||||
|
a += (c ^ (b | ~d)) + blocks[8] + 1873313359;
|
||||||
|
a = (a << 6 | a >>> 26) + b << 0;
|
||||||
|
d += (b ^ (a | ~c)) + blocks[15] - 30611744;
|
||||||
|
d = (d << 10 | d >>> 22) + a << 0;
|
||||||
|
c += (a ^ (d | ~b)) + blocks[6] - 1560198380;
|
||||||
|
c = (c << 15 | c >>> 17) + d << 0;
|
||||||
|
b += (d ^ (c | ~a)) + blocks[13] + 1309151649;
|
||||||
|
b = (b << 21 | b >>> 11) + c << 0;
|
||||||
|
a += (c ^ (b | ~d)) + blocks[4] - 145523070;
|
||||||
|
a = (a << 6 | a >>> 26) + b << 0;
|
||||||
|
d += (b ^ (a | ~c)) + blocks[11] - 1120210379;
|
||||||
|
d = (d << 10 | d >>> 22) + a << 0;
|
||||||
|
c += (a ^ (d | ~b)) + blocks[2] + 718787259;
|
||||||
|
c = (c << 15 | c >>> 17) + d << 0;
|
||||||
|
b += (d ^ (c | ~a)) + blocks[9] - 343485551;
|
||||||
|
b = (b << 21 | b >>> 11) + c << 0;
|
||||||
|
|
||||||
|
if (this.first) {
|
||||||
|
this.h0 = a + 1732584193 << 0;
|
||||||
|
this.h1 = b - 271733879 << 0;
|
||||||
|
this.h2 = c - 1732584194 << 0;
|
||||||
|
this.h3 = d + 271733878 << 0;
|
||||||
|
this.first = false;
|
||||||
|
} else {
|
||||||
|
this.h0 = this.h0 + a << 0;
|
||||||
|
this.h1 = this.h1 + b << 0;
|
||||||
|
this.h2 = this.h2 + c << 0;
|
||||||
|
this.h3 = this.h3 + d << 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method hex
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as hex string
|
||||||
|
* @returns {String} Hex string
|
||||||
|
* @see {@link md5.hex}
|
||||||
|
* @example
|
||||||
|
* hash.hex();
|
||||||
|
*/
|
||||||
|
Md5.prototype.hex = function () {
|
||||||
|
this.finalize();
|
||||||
|
|
||||||
|
var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;
|
||||||
|
|
||||||
|
return HEX_CHARS[(h0 >>> 4) & 0x0F] + HEX_CHARS[h0 & 0x0F] +
|
||||||
|
HEX_CHARS[(h0 >>> 12) & 0x0F] + HEX_CHARS[(h0 >>> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h0 >>> 20) & 0x0F] + HEX_CHARS[(h0 >>> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h0 >>> 28) & 0x0F] + HEX_CHARS[(h0 >>> 24) & 0x0F] +
|
||||||
|
HEX_CHARS[(h1 >>> 4) & 0x0F] + HEX_CHARS[h1 & 0x0F] +
|
||||||
|
HEX_CHARS[(h1 >>> 12) & 0x0F] + HEX_CHARS[(h1 >>> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h1 >>> 20) & 0x0F] + HEX_CHARS[(h1 >>> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h1 >>> 28) & 0x0F] + HEX_CHARS[(h1 >>> 24) & 0x0F] +
|
||||||
|
HEX_CHARS[(h2 >>> 4) & 0x0F] + HEX_CHARS[h2 & 0x0F] +
|
||||||
|
HEX_CHARS[(h2 >>> 12) & 0x0F] + HEX_CHARS[(h2 >>> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h2 >>> 20) & 0x0F] + HEX_CHARS[(h2 >>> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h2 >>> 28) & 0x0F] + HEX_CHARS[(h2 >>> 24) & 0x0F] +
|
||||||
|
HEX_CHARS[(h3 >>> 4) & 0x0F] + HEX_CHARS[h3 & 0x0F] +
|
||||||
|
HEX_CHARS[(h3 >>> 12) & 0x0F] + HEX_CHARS[(h3 >>> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h3 >>> 20) & 0x0F] + HEX_CHARS[(h3 >>> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h3 >>> 28) & 0x0F] + HEX_CHARS[(h3 >>> 24) & 0x0F];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method toString
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as hex string
|
||||||
|
* @returns {String} Hex string
|
||||||
|
* @see {@link md5.hex}
|
||||||
|
* @example
|
||||||
|
* hash.toString();
|
||||||
|
*/
|
||||||
|
Md5.prototype.toString = Md5.prototype.hex;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method digest
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @see {@link md5.digest}
|
||||||
|
* @example
|
||||||
|
* hash.digest();
|
||||||
|
*/
|
||||||
|
Md5.prototype.digest = function () {
|
||||||
|
this.finalize();
|
||||||
|
|
||||||
|
var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;
|
||||||
|
return [
|
||||||
|
h0 & 0xFF, (h0 >>> 8) & 0xFF, (h0 >>> 16) & 0xFF, (h0 >>> 24) & 0xFF,
|
||||||
|
h1 & 0xFF, (h1 >>> 8) & 0xFF, (h1 >>> 16) & 0xFF, (h1 >>> 24) & 0xFF,
|
||||||
|
h2 & 0xFF, (h2 >>> 8) & 0xFF, (h2 >>> 16) & 0xFF, (h2 >>> 24) & 0xFF,
|
||||||
|
h3 & 0xFF, (h3 >>> 8) & 0xFF, (h3 >>> 16) & 0xFF, (h3 >>> 24) & 0xFF
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method array
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @see {@link md5.array}
|
||||||
|
* @example
|
||||||
|
* hash.array();
|
||||||
|
*/
|
||||||
|
Md5.prototype.array = Md5.prototype.digest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method arrayBuffer
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @see {@link md5.arrayBuffer}
|
||||||
|
* @example
|
||||||
|
* hash.arrayBuffer();
|
||||||
|
*/
|
||||||
|
Md5.prototype.arrayBuffer = function () {
|
||||||
|
this.finalize();
|
||||||
|
|
||||||
|
var buffer = new ArrayBuffer(16);
|
||||||
|
var blocks = new Uint32Array(buffer);
|
||||||
|
blocks[0] = this.h0;
|
||||||
|
blocks[1] = this.h1;
|
||||||
|
blocks[2] = this.h2;
|
||||||
|
blocks[3] = this.h3;
|
||||||
|
return buffer;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method buffer
|
||||||
|
* @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @see {@link md5.buffer}
|
||||||
|
* @example
|
||||||
|
* hash.buffer();
|
||||||
|
*/
|
||||||
|
/* istanbul ignore else */
|
||||||
|
{
|
||||||
|
Md5.prototype.buffer = Md5.prototype.arrayBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method base64
|
||||||
|
* @memberof Md5
|
||||||
|
* @instance
|
||||||
|
* @description Output hash as base64 string
|
||||||
|
* @returns {String} base64 string
|
||||||
|
* @see {@link md5.base64}
|
||||||
|
* @example
|
||||||
|
* hash.base64();
|
||||||
|
*/
|
||||||
|
/* istanbul ignore else */
|
||||||
|
{
|
||||||
|
Md5.prototype.base64 = function () {
|
||||||
|
var v1, v2, v3, base64Str = '', bytes = this.array();
|
||||||
|
for (var i = 0; i < 15;) {
|
||||||
|
v1 = bytes[i++];
|
||||||
|
v2 = bytes[i++];
|
||||||
|
v3 = bytes[i++];
|
||||||
|
base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] +
|
||||||
|
BASE64_ENCODE_CHAR[(v1 << 4 | v2 >>> 4) & 63] +
|
||||||
|
BASE64_ENCODE_CHAR[(v2 << 2 | v3 >>> 6) & 63] +
|
||||||
|
BASE64_ENCODE_CHAR[v3 & 63];
|
||||||
|
}
|
||||||
|
v1 = bytes[i];
|
||||||
|
base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] +
|
||||||
|
BASE64_ENCODE_CHAR[(v1 << 4) & 63] +
|
||||||
|
'==';
|
||||||
|
return base64Str;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* HmacMd5 class
|
||||||
|
* @class HmacMd5
|
||||||
|
* @extends Md5
|
||||||
|
* @description This is internal class.
|
||||||
|
* @see {@link md5.hmac.create}
|
||||||
|
*/
|
||||||
|
function HmacMd5(key, sharedMemory) {
|
||||||
|
var i, result = formatMessage(key);
|
||||||
|
key = result[0];
|
||||||
|
if (result[1]) {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (key.length > 64) {
|
||||||
|
key = (new Md5(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;
|
||||||
|
}
|
||||||
|
|
||||||
|
Md5.call(this, sharedMemory);
|
||||||
|
|
||||||
|
this.update(iKeyPad);
|
||||||
|
this.oKeyPad = oKeyPad;
|
||||||
|
this.inner = true;
|
||||||
|
this.sharedMemory = sharedMemory;
|
||||||
|
}
|
||||||
|
/* istanbul ignore else */
|
||||||
|
{
|
||||||
|
HmacMd5.prototype = new Md5();
|
||||||
|
|
||||||
|
HmacMd5.prototype.finalize = function () {
|
||||||
|
Md5.prototype.finalize.call(this);
|
||||||
|
if (this.inner) {
|
||||||
|
this.inner = false;
|
||||||
|
var innerHash = this.array();
|
||||||
|
Md5.call(this, this.sharedMemory);
|
||||||
|
this.update(this.oKeyPad);
|
||||||
|
this.update(innerHash);
|
||||||
|
Md5.prototype.finalize.call(this);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
var exports = createMethod();
|
||||||
|
exports.md5 = exports;
|
||||||
|
/* istanbul ignore else */
|
||||||
|
{
|
||||||
|
exports.md5.hmac = createHmacMethod();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (COMMON_JS) {
|
||||||
|
module.exports = exports;
|
||||||
|
} else {
|
||||||
|
/**
|
||||||
|
* @method md5
|
||||||
|
* @description Md5 hash function, export to global in browsers.
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} md5 hashes
|
||||||
|
* @example
|
||||||
|
* md5(''); // d41d8cd98f00b204e9800998ecf8427e
|
||||||
|
* md5('The quick brown fox jumps over the lazy dog'); // 9e107d9d372bb6826bd81d3542a419d6
|
||||||
|
* md5('The quick brown fox jumps over the lazy dog.'); // e4d909c290d0fb1ca068ffaddf22cbd0
|
||||||
|
*
|
||||||
|
* // It also supports UTF-8 encoding
|
||||||
|
* md5('中文'); // a7bac2239fcdcb3a067903d8077c4a07
|
||||||
|
*
|
||||||
|
* // It also supports byte `Array`, `Uint8Array`, `ArrayBuffer`
|
||||||
|
* md5([]); // d41d8cd98f00b204e9800998ecf8427e
|
||||||
|
* md5(new Uint8Array([])); // d41d8cd98f00b204e9800998ecf8427e
|
||||||
|
*/
|
||||||
|
root.md5 = exports;
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
} (md5$1));
|
||||||
|
|
||||||
|
var md5Exports = md5$1.exports;
|
||||||
|
var md5 = /*@__PURE__*/getDefaultExportFromCjs(md5Exports);
|
||||||
|
|
||||||
|
export { md5 as default, md5 };
|
||||||
+1263
File diff suppressed because it is too large
Load Diff
+1202
-904
File diff suppressed because it is too large
Load Diff
+5
-3
@@ -214,7 +214,7 @@
|
|||||||
|
|
||||||
<dt class="tag-source">Source:</dt>
|
<dt class="tag-source">Source:</dt>
|
||||||
<dd class="tag-source"><ul class="dummy"><li>
|
<dd class="tag-source"><ul class="dummy"><li>
|
||||||
<a href="md5.js.html">md5.js</a>, <a href="md5.js.html#line655">line 655</a>
|
<a href="md5.js.html">md5.js</a>, <a href="md5.js.html#line882">line 882</a>
|
||||||
</li></ul></dd>
|
</li></ul></dd>
|
||||||
|
|
||||||
|
|
||||||
@@ -237,6 +237,8 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<h5>Returns:</h5>
|
<h5>Returns:</h5>
|
||||||
|
|
||||||
|
|
||||||
@@ -294,13 +296,13 @@ md5(new Uint8Array([])); // d41d8cd98f00b204e9800998ecf8427e</code></pre>
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<nav>
|
<nav>
|
||||||
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="Md5_.html">Md5</a></li></ul><h3>Namespaces</h3><ul><li><a href="md5.html">md5</a></li></ul><h3>Global</h3><ul><li><a href="global.html#md5%2508">md5</a></li></ul>
|
<h2><a href="index.html">Home</a></h2><h3>Namespaces</h3><ul><li><a href="md5_.html">md5</a></li><li><a href="md5.hmac.html">hmac</a></li></ul><h3>Classes</h3><ul><li><a href="HmacMd5.html">HmacMd5</a></li><li><a href="Md5.html">Md5</a></li></ul><h3>Global</h3><ul><li><a href="global.html#md5%2508">md5</a></li></ul>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
<br class="clear">
|
<br class="clear">
|
||||||
|
|
||||||
<footer>
|
<footer>
|
||||||
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Sun Oct 29 2017 20:15:53 GMT+0800 (CST)
|
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a> on Mon Jul 20 2026 10:47:41 GMT+0800 (Taipei Standard Time)
|
||||||
</footer>
|
</footer>
|
||||||
|
|
||||||
<script> prettyPrint(); </script>
|
<script> prettyPrint(); </script>
|
||||||
|
|||||||
+126
-18
@@ -43,24 +43,123 @@
|
|||||||
|
|
||||||
|
|
||||||
<section>
|
<section>
|
||||||
<article><h1>js-md5</h1><p><a href="https://travis-ci.org/emn178/js-md5"><img src="https://travis-ci.org/emn178/js-md5.svg?branch=master" alt="Build Status"></a>
|
<article><h1>js-md5</h1>
|
||||||
<a href="https://coveralls.io/r/emn178/js-md5?branch=master"><img src="https://coveralls.io/repos/emn178/js-md5/badge.svg?branch=master" alt="Coverage Status"></a><br><a href="https://nodei.co/npm/js-md5/"><img src="https://nodei.co/npm/js-md5.png?stars&downloads" alt="NPM"></a></p>
|
<p><a href="https://github.com/emn178/js-md5/actions/workflows/ci.yml"><img src="https://github.com/emn178/js-md5/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
|
||||||
<p>A simple MD5 hash function for JavaScript supports UTF-8 encoding.</p>
|
<a href="https://coveralls.io/r/emn178/js-md5?branch=master"><img src="https://coveralls.io/repos/emn178/js-md5/badge.svg?branch=master" alt="Coverage Status"></a><br>
|
||||||
<h2>Demo</h2><p><a href="http://emn178.github.io/online-tools/md5.html">MD5 Online</a><br><a href="http://emn178.github.io/online-tools/md5_checksum.html">MD5 File Checksum Online</a></p>
|
<a href="https://nodei.co/npm/js-md5/"><img src="https://nodei.co/npm/js-md5.png?stars&downloads" alt="NPM"></a></p>
|
||||||
<h2>Download</h2><p><a href="https://raw.github.com/emn178/js-md5/master/build/md5.min.js">Compress</a><br><a href="https://raw.github.com/emn178/js-md5/master/src/md5.js">Uncompress</a></p>
|
<p>A simple and fast MD5 hash function for JavaScript supports UTF-8 encoding.</p>
|
||||||
<h2>Installation</h2><p>You can also install js-md5 by using Bower.</p>
|
<h2>Demo</h2>
|
||||||
<pre class="prettyprint source"><code>bower install md5</code></pre><p>For node.js, you can use this command to install:</p>
|
<p><a href="http://emn178.github.io/online-tools/md5.html">MD5 Online</a><br>
|
||||||
<pre class="prettyprint source"><code>npm install js-md5</code></pre><h2>Notice</h2><p><code>buffer</code> method is deprecated. This maybe confuse with Buffer in node.js. Please use <code>arrayBuffer</code> instead.</p>
|
<a href="http://emn178.github.io/online-tools/md5_checksum.html">MD5 File Checksum Online</a></p>
|
||||||
<h2>Usage</h2><p>You could use like this:</p>
|
<h2>Download</h2>
|
||||||
|
<ul>
|
||||||
|
<li><a href="https://raw.github.com/emn178/js-md5/master/build/md5.min.js">Compress</a></li>
|
||||||
|
<li><a href="https://raw.github.com/emn178/js-md5/master/build/md5.js">Uncompressed build</a></li>
|
||||||
|
<li><a href="https://raw.github.com/emn178/js-md5/master/build/md5.modern.min.js">Modern</a></li>
|
||||||
|
<li><a href="https://raw.github.com/emn178/js-md5/master/build/md5.modern.js">Modern uncompressed</a></li>
|
||||||
|
<li><a href="https://raw.github.com/emn178/js-md5/master/build/md5-lite.min.js">Lite</a></li>
|
||||||
|
<li><a href="https://raw.github.com/emn178/js-md5/master/build/md5-lite.js">Lite uncompressed</a></li>
|
||||||
|
<li><a href="https://raw.github.com/emn178/js-md5/master/src/md5.js">Uncompress</a></li>
|
||||||
|
</ul>
|
||||||
|
<h3>Builds</h3>
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Build</th>
|
||||||
|
<th>Legacy fallbacks</th>
|
||||||
|
<th>Node acceleration</th>
|
||||||
|
<th>HMAC</th>
|
||||||
|
<th>Base64</th>
|
||||||
|
<th>Deprecated <code>buffer</code></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td><code>md5.js</code> / <code>md5.min.js</code></td>
|
||||||
|
<td>Yes</td>
|
||||||
|
<td>Yes</td>
|
||||||
|
<td>Yes</td>
|
||||||
|
<td>Yes</td>
|
||||||
|
<td>Yes</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><code>md5.modern.js</code> / <code>md5.modern.min.js</code></td>
|
||||||
|
<td>No</td>
|
||||||
|
<td>Yes</td>
|
||||||
|
<td>Yes</td>
|
||||||
|
<td>Yes</td>
|
||||||
|
<td>Yes</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><code>md5-lite.js</code> / <code>md5-lite.min.js</code></td>
|
||||||
|
<td>No</td>
|
||||||
|
<td>No</td>
|
||||||
|
<td>No</td>
|
||||||
|
<td>No</td>
|
||||||
|
<td>No</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<p>The modern and lite builds require <code>Array.isArray</code>, <code>ArrayBuffer</code>, typed arrays,
|
||||||
|
and <code>ArrayBuffer.isView</code>. The lite build keeps the one-shot and streaming MD5
|
||||||
|
APIs, including <code>hex</code>, <code>array</code>, <code>digest</code>, and <code>arrayBuffer</code> output.</p>
|
||||||
|
<h2>Benchmark</h2>
|
||||||
|
<ul>
|
||||||
|
<li><a href="https://measurethat.net/Benchmarks/Show/29171/0/md5-performance-comparison-v2">Benchmark (measurethat.net) - Short String</a></li>
|
||||||
|
<li><a href="https://measurethat.net/Benchmarks/Show/29172/0/md5-performance-comparison-long-text-v2">Benchmark (measurethat.net) - Long String</a></li>
|
||||||
|
<li><a href="https://jsperf.app/jonuhi/6">Benchmark (jsperf.app) - Long String</a></li>
|
||||||
|
<li><a href="https://measurethat.net/Benchmarks/Show/29173/0/md5-performance-comparison-very-long-text">Benchmark (measurethat.net) - Very Long String</a></li>
|
||||||
|
<li><a href="https://jsperf.app/jonuhi/8">Benchmark (jsperf.app) - Very Long String</a></li>
|
||||||
|
<li><a href="https://measurethat.net/Benchmarks/Show/29176/0/md5-performance-comparison-very-long-text-v6">Async Benchmark (measurethat.net)</a></li>
|
||||||
|
<li><a href="https://jsperf.app/jonuhi/9">Async Benchmark (jsperf.app)</a></li>
|
||||||
|
</ul>
|
||||||
|
<ul>
|
||||||
|
<li>js-md5 is the fastest synchronous MD5 library, but slower than Hash-WASM</li>
|
||||||
|
</ul>
|
||||||
|
<ul>
|
||||||
|
<li><a href="https://github.com/emn178/js-md5/issues/19">File Benchmark - Issue #19</a></li>
|
||||||
|
<li><a href="https://github.com/emn178/js-md5/issues/42">File Benchmark - Issue #42</a></li>
|
||||||
|
</ul>
|
||||||
|
<h2>Installation</h2>
|
||||||
|
<p>You can also install js-md5 by using Bower.</p>
|
||||||
|
<pre><code>bower install md5
|
||||||
|
</code></pre>
|
||||||
|
<p>For node.js, you can use this command to install:</p>
|
||||||
|
<pre><code>npm install js-md5
|
||||||
|
</code></pre>
|
||||||
|
<h2>Notice</h2>
|
||||||
|
<p><code>buffer</code> method is deprecated. This maybe confuse with Buffer in node.js. Please use <code>arrayBuffer</code> instead.</p>
|
||||||
|
<h2>Usage</h2>
|
||||||
|
<p>You could use like this:</p>
|
||||||
<pre class="prettyprint source lang-JavaScript"><code>md5('Message to hash');
|
<pre class="prettyprint source lang-JavaScript"><code>md5('Message to hash');
|
||||||
var hash = md5.create();
|
var hash = md5.create();
|
||||||
hash.update('Message to hash');
|
hash.update('Message to hash');
|
||||||
hash.hex();</code></pre><p>If you use node.js, you should require the module first:</p>
|
hash.hex();
|
||||||
<pre class="prettyprint source lang-JavaScript"><code>md5 = require('js-md5');</code></pre><p>It supports AMD:</p>
|
|
||||||
|
// HMAC
|
||||||
|
md5.hmac('key', 'Message to hash');
|
||||||
|
|
||||||
|
var hash = md5.hmac.create('key');
|
||||||
|
hash.update('Message to hash');
|
||||||
|
hash.hex();
|
||||||
|
</code></pre>
|
||||||
|
<h3>Node.js</h3>
|
||||||
|
<p>If you use node.js, you should require the module first:</p>
|
||||||
|
<pre class="prettyprint source lang-JavaScript"><code>var md5 = require('js-md5');
|
||||||
|
</code></pre>
|
||||||
|
<h3>TypeScript</h3>
|
||||||
|
<p>If you use TypeScript, you can import like this:</p>
|
||||||
|
<pre class="prettyprint source lang-TypeScript"><code>import { md5 } from 'js-md5';
|
||||||
|
</code></pre>
|
||||||
|
<h2>RequireJS</h2>
|
||||||
|
<p>It supports AMD:</p>
|
||||||
<pre class="prettyprint source lang-JavaScript"><code>require(['your/path/md5.js'], function(md5) {
|
<pre class="prettyprint source lang-JavaScript"><code>require(['your/path/md5.js'], function(md5) {
|
||||||
// ...
|
// ...
|
||||||
});</code></pre><p><a href="https://emn178.github.com/js-md5/doc/">See document</a></p>
|
});
|
||||||
<h2>Example</h2><pre class="prettyprint source lang-JavaScript"><code>md5(''); // d41d8cd98f00b204e9800998ecf8427e
|
</code></pre>
|
||||||
|
<p><a href="https://emn178.github.com/js-md5/doc/">See document</a></p>
|
||||||
|
<h2>Example</h2>
|
||||||
|
<pre class="prettyprint source lang-JavaScript"><code>md5(''); // d41d8cd98f00b204e9800998ecf8427e
|
||||||
md5('The quick brown fox jumps over the lazy dog'); // 9e107d9d372bb6826bd81d3542a419d6
|
md5('The quick brown fox jumps over the lazy dog'); // 9e107d9d372bb6826bd81d3542a419d6
|
||||||
md5('The quick brown fox jumps over the lazy dog.'); // e4d909c290d0fb1ca068ffaddf22cbd0
|
md5('The quick brown fox jumps over the lazy dog.'); // e4d909c290d0fb1ca068ffaddf22cbd0
|
||||||
|
|
||||||
@@ -77,9 +176,18 @@ md5.hex(''); // d41d8cd98f00b204e9800998ecf8427e
|
|||||||
md5.array(''); // [212, 29, 140, 217, 143, 0, 178, 4, 233, 128, 9, 152, 236, 248, 66, 126]
|
md5.array(''); // [212, 29, 140, 217, 143, 0, 178, 4, 233, 128, 9, 152, 236, 248, 66, 126]
|
||||||
md5.digest(''); // [212, 29, 140, 217, 143, 0, 178, 4, 233, 128, 9, 152, 236, 248, 66, 126]
|
md5.digest(''); // [212, 29, 140, 217, 143, 0, 178, 4, 233, 128, 9, 152, 236, 248, 66, 126]
|
||||||
md5.arrayBuffer(''); // ArrayBuffer
|
md5.arrayBuffer(''); // ArrayBuffer
|
||||||
md5.buffer(''); // ArrayBuffer, deprecated, This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.
|
md5.base64(''); // 1B2M2Y8AsgTpgAmY7PhCfg==
|
||||||
md5.base64(''); // 1B2M2Y8AsgTpgAmY7PhCfg==</code></pre><h2>License</h2><p>The project is released under the <a href="http://www.opensource.org/licenses/MIT">MIT license</a>.</p>
|
|
||||||
<h2>Contact</h2><p>The project's website is located at https://github.com/emn178/js-md5<br>Author: Chen, Yi-Cyuan (emn178@gmail.com)</p></article>
|
// HMAC
|
||||||
|
md5.hmac.hex('key', 'Message to hash');
|
||||||
|
md5.hmac.array('key', 'Message to hash');
|
||||||
|
// ...
|
||||||
|
</code></pre>
|
||||||
|
<h2>License</h2>
|
||||||
|
<p>The project is released under the <a href="https://opensource.org/license/mit/">MIT license</a>.</p>
|
||||||
|
<h2>Contact</h2>
|
||||||
|
<p>The project's website is located at https://github.com/emn178/js-md5<br>
|
||||||
|
Author: Chen, Yi-Cyuan (emn178@gmail.com)</p></article>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
|
||||||
@@ -90,13 +198,13 @@ md5.base64(''); // 1B2M2Y8AsgTpgAmY7PhCfg==</code></pre><h2>License</h2><p>The p
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<nav>
|
<nav>
|
||||||
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="Md5_.html">Md5</a></li></ul><h3>Namespaces</h3><ul><li><a href="md5.html">md5</a></li></ul><h3>Global</h3><ul><li><a href="global.html#md5%2508">md5</a></li></ul>
|
<h2><a href="index.html">Home</a></h2><h3>Namespaces</h3><ul><li><a href="md5_.html">md5</a></li><li><a href="md5.hmac.html">hmac</a></li></ul><h3>Classes</h3><ul><li><a href="HmacMd5.html">HmacMd5</a></li><li><a href="Md5.html">Md5</a></li></ul><h3>Global</h3><ul><li><a href="global.html#md5%2508">md5</a></li></ul>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
<br class="clear">
|
<br class="clear">
|
||||||
|
|
||||||
<footer>
|
<footer>
|
||||||
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Sun Oct 29 2017 20:15:53 GMT+0800 (CST)
|
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a> on Mon Jul 20 2026 10:47:41 GMT+0800 (Taipei Standard Time)
|
||||||
</footer>
|
</footer>
|
||||||
|
|
||||||
<script> prettyPrint(); </script>
|
<script> prettyPrint(); </script>
|
||||||
|
|||||||
+1750
File diff suppressed because it is too large
Load Diff
+262
-519
File diff suppressed because it is too large
Load Diff
+330
-103
@@ -30,22 +30,29 @@
|
|||||||
* [js-md5]{@link https://github.com/emn178/js-md5}
|
* [js-md5]{@link https://github.com/emn178/js-md5}
|
||||||
*
|
*
|
||||||
* @namespace md5
|
* @namespace md5
|
||||||
* @version 0.7.0
|
* @version 0.9.0
|
||||||
* @author Chen, Yi-Cyuan [emn178@gmail.com]
|
* @author Chen, Yi-Cyuan [emn178@gmail.com]
|
||||||
* @copyright Chen, Yi-Cyuan 2014-2017
|
* @copyright Chen, Yi-Cyuan 2014-2026
|
||||||
* @license MIT
|
* @license MIT
|
||||||
*/
|
*/
|
||||||
(function () {
|
(function () {
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var ERROR = 'input is invalid type';
|
var FEATURE_LEGACY = true;
|
||||||
|
var FEATURE_HMAC = true;
|
||||||
|
var FEATURE_BASE64 = true;
|
||||||
|
var FEATURE_BUFFER = true;
|
||||||
|
|
||||||
|
var INPUT_ERROR = 'input is invalid type';
|
||||||
|
var FINALIZE_ERROR = 'finalize already called';
|
||||||
var WINDOW = typeof window === 'object';
|
var WINDOW = typeof window === 'object';
|
||||||
var root = WINDOW ? window : {};
|
var root = WINDOW ? window : {};
|
||||||
if (root.JS_MD5_NO_WINDOW) {
|
if (root.JS_MD5_NO_WINDOW) {
|
||||||
WINDOW = false;
|
WINDOW = false;
|
||||||
}
|
}
|
||||||
var WEB_WORKER = !WINDOW && typeof self === 'object';
|
var WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && typeof self !== 'undefined' && self instanceof WorkerGlobalScope;
|
||||||
var NODE_JS = !root.JS_MD5_NO_NODE_JS && typeof process === 'object' && process.versions && process.versions.node;
|
/* istanbul ignore next */
|
||||||
|
var NODE_JS = !root.JS_MD5_NO_NODE_JS && !WINDOW && typeof process === 'object' && process.versions && process.versions.node;
|
||||||
if (NODE_JS) {
|
if (NODE_JS) {
|
||||||
root = global;
|
root = global;
|
||||||
} else if (WEB_WORKER) {
|
} else if (WEB_WORKER) {
|
||||||
@@ -53,12 +60,24 @@
|
|||||||
}
|
}
|
||||||
var COMMON_JS = !root.JS_MD5_NO_COMMON_JS && typeof module === 'object' && module.exports;
|
var COMMON_JS = !root.JS_MD5_NO_COMMON_JS && typeof module === 'object' && module.exports;
|
||||||
var AMD = typeof define === 'function' && define.amd;
|
var AMD = typeof define === 'function' && define.amd;
|
||||||
var ARRAY_BUFFER = !root.JS_MD5_NO_ARRAY_BUFFER && typeof ArrayBuffer !== 'undefined';
|
/* istanbul ignore next */
|
||||||
|
var ARRAY_BUFFER = FEATURE_LEGACY ?
|
||||||
|
!root.JS_MD5_NO_ARRAY_BUFFER && typeof ArrayBuffer !== 'undefined' : true;
|
||||||
var HEX_CHARS = '0123456789abcdef'.split('');
|
var HEX_CHARS = '0123456789abcdef'.split('');
|
||||||
var EXTRA = [128, 32768, 8388608, -2147483648];
|
var EXTRA = [128, 32768, 8388608, -2147483648];
|
||||||
var SHIFT = [0, 8, 16, 24];
|
var SHIFT = [0, 8, 16, 24];
|
||||||
var OUTPUT_TYPES = ['hex', 'array', 'digest', 'buffer', 'arrayBuffer', 'base64'];
|
var OUTPUT_TYPES = ['hex', 'array', 'digest', 'arrayBuffer'];
|
||||||
var BASE64_ENCODE_CHAR = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');
|
/* istanbul ignore else */
|
||||||
|
if (FEATURE_BUFFER) {
|
||||||
|
OUTPUT_TYPES.push('buffer');
|
||||||
|
}
|
||||||
|
/* istanbul ignore else */
|
||||||
|
if (FEATURE_BASE64) {
|
||||||
|
OUTPUT_TYPES.push('base64');
|
||||||
|
}
|
||||||
|
/* istanbul ignore next */
|
||||||
|
var BASE64_ENCODE_CHAR = FEATURE_BASE64 ?
|
||||||
|
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('') : null;
|
||||||
|
|
||||||
var blocks = [], buffer8;
|
var blocks = [], buffer8;
|
||||||
if (ARRAY_BUFFER) {
|
if (ARRAY_BUFFER) {
|
||||||
@@ -67,18 +86,40 @@
|
|||||||
blocks = new Uint32Array(buffer);
|
blocks = new Uint32Array(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (root.JS_MD5_NO_NODE_JS || !Array.isArray) {
|
var isArray = Array.isArray;
|
||||||
Array.isArray = function (obj) {
|
/* istanbul ignore else */
|
||||||
|
if (FEATURE_LEGACY && (root.JS_MD5_NO_NODE_JS || !isArray)) {
|
||||||
|
isArray = function (obj) {
|
||||||
return Object.prototype.toString.call(obj) === '[object Array]';
|
return Object.prototype.toString.call(obj) === '[object Array]';
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ARRAY_BUFFER && (root.JS_MD5_NO_ARRAY_BUFFER_IS_VIEW || !ArrayBuffer.isView)) {
|
var isView = ArrayBuffer.isView;
|
||||||
ArrayBuffer.isView = function (obj) {
|
/* istanbul ignore else */
|
||||||
|
if (FEATURE_LEGACY && ARRAY_BUFFER && (root.JS_MD5_NO_ARRAY_BUFFER_IS_VIEW || !isView)) {
|
||||||
|
isView = function (obj) {
|
||||||
return typeof obj === 'object' && obj.buffer && obj.buffer.constructor === ArrayBuffer;
|
return typeof obj === 'object' && obj.buffer && obj.buffer.constructor === ArrayBuffer;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// [message: string, isString: bool]
|
||||||
|
var formatMessage = function (message) {
|
||||||
|
var type = typeof message;
|
||||||
|
if (type === 'string') {
|
||||||
|
return [message, true];
|
||||||
|
}
|
||||||
|
if (type !== 'object' || message === null) {
|
||||||
|
throw new Error(INPUT_ERROR);
|
||||||
|
}
|
||||||
|
if (ARRAY_BUFFER && message.constructor === ArrayBuffer) {
|
||||||
|
return [new Uint8Array(message), false];
|
||||||
|
}
|
||||||
|
if (!isArray(message) && !isView(message)) {
|
||||||
|
throw new Error(INPUT_ERROR);
|
||||||
|
}
|
||||||
|
return [message, false];
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @method hex
|
* @method hex
|
||||||
* @memberof md5
|
* @memberof md5
|
||||||
@@ -181,21 +222,27 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
var nodeWrap = function (method) {
|
var nodeWrap = function (method) {
|
||||||
var crypto = eval("require('crypto')");
|
var crypto = require('crypto')
|
||||||
var Buffer = eval("require('buffer').Buffer");
|
var Buffer = require('buffer').Buffer;
|
||||||
|
var bufferFrom = Buffer.from;
|
||||||
|
if (FEATURE_LEGACY && (root.JS_MD5_NO_BUFFER_FROM || !bufferFrom)) {
|
||||||
|
bufferFrom = function (message) {
|
||||||
|
return new Buffer(message);
|
||||||
|
};
|
||||||
|
}
|
||||||
var nodeMethod = function (message) {
|
var nodeMethod = function (message) {
|
||||||
if (typeof message === 'string') {
|
if (typeof message === 'string') {
|
||||||
return crypto.createHash('md5').update(message, 'utf8').digest('hex');
|
return crypto.createHash('md5').update(message, 'utf8').digest('hex');
|
||||||
} else {
|
} else {
|
||||||
if (message === null || message === undefined) {
|
if (message === null || message === undefined) {
|
||||||
throw ERROR;
|
throw new Error(INPUT_ERROR);
|
||||||
} else if (message.constructor === ArrayBuffer) {
|
} else if (message.constructor === ArrayBuffer) {
|
||||||
message = new Uint8Array(message);
|
message = new Uint8Array(message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (Array.isArray(message) || ArrayBuffer.isView(message) ||
|
if (isArray(message) || isView(message) ||
|
||||||
message.constructor === Buffer) {
|
message.constructor === Buffer) {
|
||||||
return crypto.createHash('md5').update(new Buffer(message)).digest('hex');
|
return crypto.createHash('md5').update(bufferFrom(message)).digest('hex');
|
||||||
} else {
|
} else {
|
||||||
return method(message);
|
return method(message);
|
||||||
}
|
}
|
||||||
@@ -203,6 +250,116 @@
|
|||||||
return nodeMethod;
|
return nodeMethod;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @namespace md5.hmac
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method hex
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as hex string
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} Hex string
|
||||||
|
* @example
|
||||||
|
* md5.hmac.hex('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
* // equal to
|
||||||
|
* md5.hmac('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method digest
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @example
|
||||||
|
* md5.hmac.digest('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method array
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @example
|
||||||
|
* md5.hmac.array('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method arrayBuffer
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @example
|
||||||
|
* md5.hmac.arrayBuffer('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method buffer
|
||||||
|
* @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @example
|
||||||
|
* md5.hmac.buffer('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method base64
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as base64 string
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} base64 string
|
||||||
|
* @example
|
||||||
|
* md5.hmac.base64('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
var createHmacOutputMethod = function (outputType) {
|
||||||
|
return function (key, message) {
|
||||||
|
return new HmacMd5(key, true).update(message)[outputType]();
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method create
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Create HmacMd5 object
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @returns {HmacMd5} HmacMd5 object.
|
||||||
|
* @example
|
||||||
|
* var hash = md5.hmac.create('key');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method update
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Create and update HmacMd5 object
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {HmacMd5} HmacMd5 object.
|
||||||
|
* @example
|
||||||
|
* var hash = md5.hmac.update('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
* // equal to
|
||||||
|
* var hash = md5.hmac.create('key');
|
||||||
|
* hash.update('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
var createHmacMethod = function () {
|
||||||
|
var method = createHmacOutputMethod('hex');
|
||||||
|
method.create = function (key) {
|
||||||
|
return new HmacMd5(key);
|
||||||
|
};
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
return method;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Md5 class
|
* Md5 class
|
||||||
* @class Md5
|
* @class Md5
|
||||||
@@ -226,7 +383,7 @@
|
|||||||
this.blocks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
this.blocks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.h0 = this.h1 = this.h2 = this.h3 = this.start = this.bytes = 0;
|
this.h0 = this.h1 = this.h2 = this.h3 = this.start = this.bytes = this.hBytes = 0;
|
||||||
this.finalized = this.hashed = false;
|
this.finalized = this.hashed = false;
|
||||||
this.first = true;
|
this.first = true;
|
||||||
}
|
}
|
||||||
@@ -242,26 +399,12 @@
|
|||||||
*/
|
*/
|
||||||
Md5.prototype.update = function (message) {
|
Md5.prototype.update = function (message) {
|
||||||
if (this.finalized) {
|
if (this.finalized) {
|
||||||
return;
|
throw new Error(FINALIZE_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
var notString, type = typeof message;
|
var result = formatMessage(message);
|
||||||
if (type !== 'string') {
|
message = result[0];
|
||||||
if (type === 'object') {
|
var isString = result[1];
|
||||||
if (message === null) {
|
|
||||||
throw ERROR;
|
|
||||||
} else if (ARRAY_BUFFER && message.constructor === ArrayBuffer) {
|
|
||||||
message = new Uint8Array(message);
|
|
||||||
} else if (!Array.isArray(message)) {
|
|
||||||
if (!ARRAY_BUFFER || !ArrayBuffer.isView(message)) {
|
|
||||||
throw ERROR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
throw ERROR;
|
|
||||||
}
|
|
||||||
notString = true;
|
|
||||||
}
|
|
||||||
var code, index = 0, i, length = message.length, blocks = this.blocks;
|
var code, index = 0, i, length = message.length, blocks = this.blocks;
|
||||||
var buffer8 = this.buffer8;
|
var buffer8 = this.buffer8;
|
||||||
|
|
||||||
@@ -275,34 +418,24 @@
|
|||||||
blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
|
blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (notString) {
|
if (isString) {
|
||||||
if (ARRAY_BUFFER) {
|
|
||||||
for (i = this.start; index < length && i < 64; ++index) {
|
|
||||||
buffer8[i++] = message[index];
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (i = this.start; index < length && i < 64; ++index) {
|
|
||||||
blocks[i >> 2] |= message[index] << SHIFT[i++ & 3];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (ARRAY_BUFFER) {
|
if (ARRAY_BUFFER) {
|
||||||
for (i = this.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) {
|
||||||
buffer8[i++] = code;
|
buffer8[i++] = code;
|
||||||
} else if (code < 0x800) {
|
} else if (code < 0x800) {
|
||||||
buffer8[i++] = 0xc0 | (code >> 6);
|
buffer8[i++] = 0xc0 | (code >>> 6);
|
||||||
buffer8[i++] = 0x80 | (code & 0x3f);
|
buffer8[i++] = 0x80 | (code & 0x3f);
|
||||||
} else if (code < 0xd800 || code >= 0xe000) {
|
} else if (code < 0xd800 || code >= 0xe000) {
|
||||||
buffer8[i++] = 0xe0 | (code >> 12);
|
buffer8[i++] = 0xe0 | (code >>> 12);
|
||||||
buffer8[i++] = 0x80 | ((code >> 6) & 0x3f);
|
buffer8[i++] = 0x80 | ((code >>> 6) & 0x3f);
|
||||||
buffer8[i++] = 0x80 | (code & 0x3f);
|
buffer8[i++] = 0x80 | (code & 0x3f);
|
||||||
} else {
|
} else {
|
||||||
code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
|
code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
|
||||||
buffer8[i++] = 0xf0 | (code >> 18);
|
buffer8[i++] = 0xf0 | (code >>> 18);
|
||||||
buffer8[i++] = 0x80 | ((code >> 12) & 0x3f);
|
buffer8[i++] = 0x80 | ((code >>> 12) & 0x3f);
|
||||||
buffer8[i++] = 0x80 | ((code >> 6) & 0x3f);
|
buffer8[i++] = 0x80 | ((code >>> 6) & 0x3f);
|
||||||
buffer8[i++] = 0x80 | (code & 0x3f);
|
buffer8[i++] = 0x80 | (code & 0x3f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -310,23 +443,33 @@
|
|||||||
for (i = this.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];
|
||||||
} else if (code < 0x800) {
|
} else if (code < 0x800) {
|
||||||
blocks[i >> 2] |= (0xc0 | (code >> 6)) << SHIFT[i++ & 3];
|
blocks[i >>> 2] |= (0xc0 | (code >>> 6)) << SHIFT[i++ & 3];
|
||||||
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
|
blocks[i >>> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
|
||||||
} else if (code < 0xd800 || code >= 0xe000) {
|
} else if (code < 0xd800 || code >= 0xe000) {
|
||||||
blocks[i >> 2] |= (0xe0 | (code >> 12)) << SHIFT[i++ & 3];
|
blocks[i >>> 2] |= (0xe0 | (code >>> 12)) << SHIFT[i++ & 3];
|
||||||
blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
|
blocks[i >>> 2] |= (0x80 | ((code >>> 6) & 0x3f)) << SHIFT[i++ & 3];
|
||||||
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
|
blocks[i >>> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
|
||||||
} else {
|
} else {
|
||||||
code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
|
code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
|
||||||
blocks[i >> 2] |= (0xf0 | (code >> 18)) << SHIFT[i++ & 3];
|
blocks[i >>> 2] |= (0xf0 | (code >>> 18)) << SHIFT[i++ & 3];
|
||||||
blocks[i >> 2] |= (0x80 | ((code >> 12) & 0x3f)) << SHIFT[i++ & 3];
|
blocks[i >>> 2] |= (0x80 | ((code >>> 12) & 0x3f)) << SHIFT[i++ & 3];
|
||||||
blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
|
blocks[i >>> 2] |= (0x80 | ((code >>> 6) & 0x3f)) << SHIFT[i++ & 3];
|
||||||
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
|
blocks[i >>> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
if (ARRAY_BUFFER) {
|
||||||
|
for (i = this.start; index < length && i < 64; ++index) {
|
||||||
|
buffer8[i++] = message[index];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (i = this.start; index < length && i < 64; ++index) {
|
||||||
|
blocks[i >>> 2] |= message[index] << SHIFT[i++ & 3];
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
this.lastByteIndex = i;
|
this.lastByteIndex = i;
|
||||||
this.bytes += i - this.start;
|
this.bytes += i - this.start;
|
||||||
@@ -338,6 +481,10 @@
|
|||||||
this.start = i;
|
this.start = i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (this.bytes > 4294967295) {
|
||||||
|
this.hBytes += this.bytes / 4294967296 << 0;
|
||||||
|
this.bytes = this.bytes % 4294967296;
|
||||||
|
}
|
||||||
return this;
|
return this;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -347,7 +494,7 @@
|
|||||||
}
|
}
|
||||||
this.finalized = true;
|
this.finalized = true;
|
||||||
var blocks = this.blocks, i = this.lastByteIndex;
|
var blocks = this.blocks, i = this.lastByteIndex;
|
||||||
blocks[i >> 2] |= EXTRA[i & 3];
|
blocks[i >>> 2] |= EXTRA[i & 3];
|
||||||
if (i >= 56) {
|
if (i >= 56) {
|
||||||
if (!this.hashed) {
|
if (!this.hashed) {
|
||||||
this.hash();
|
this.hash();
|
||||||
@@ -359,7 +506,7 @@
|
|||||||
blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
|
blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
|
||||||
}
|
}
|
||||||
blocks[14] = this.bytes << 3;
|
blocks[14] = this.bytes << 3;
|
||||||
blocks[15] = this.bytes >> 29;
|
blocks[15] = this.hBytes << 3 | this.bytes >>> 29;
|
||||||
this.hash();
|
this.hash();
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -548,22 +695,22 @@
|
|||||||
|
|
||||||
var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;
|
var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;
|
||||||
|
|
||||||
return HEX_CHARS[(h0 >> 4) & 0x0F] + HEX_CHARS[h0 & 0x0F] +
|
return HEX_CHARS[(h0 >>> 4) & 0x0F] + HEX_CHARS[h0 & 0x0F] +
|
||||||
HEX_CHARS[(h0 >> 12) & 0x0F] + HEX_CHARS[(h0 >> 8) & 0x0F] +
|
HEX_CHARS[(h0 >>> 12) & 0x0F] + HEX_CHARS[(h0 >>> 8) & 0x0F] +
|
||||||
HEX_CHARS[(h0 >> 20) & 0x0F] + HEX_CHARS[(h0 >> 16) & 0x0F] +
|
HEX_CHARS[(h0 >>> 20) & 0x0F] + HEX_CHARS[(h0 >>> 16) & 0x0F] +
|
||||||
HEX_CHARS[(h0 >> 28) & 0x0F] + HEX_CHARS[(h0 >> 24) & 0x0F] +
|
HEX_CHARS[(h0 >>> 28) & 0x0F] + HEX_CHARS[(h0 >>> 24) & 0x0F] +
|
||||||
HEX_CHARS[(h1 >> 4) & 0x0F] + HEX_CHARS[h1 & 0x0F] +
|
HEX_CHARS[(h1 >>> 4) & 0x0F] + HEX_CHARS[h1 & 0x0F] +
|
||||||
HEX_CHARS[(h1 >> 12) & 0x0F] + HEX_CHARS[(h1 >> 8) & 0x0F] +
|
HEX_CHARS[(h1 >>> 12) & 0x0F] + HEX_CHARS[(h1 >>> 8) & 0x0F] +
|
||||||
HEX_CHARS[(h1 >> 20) & 0x0F] + HEX_CHARS[(h1 >> 16) & 0x0F] +
|
HEX_CHARS[(h1 >>> 20) & 0x0F] + HEX_CHARS[(h1 >>> 16) & 0x0F] +
|
||||||
HEX_CHARS[(h1 >> 28) & 0x0F] + HEX_CHARS[(h1 >> 24) & 0x0F] +
|
HEX_CHARS[(h1 >>> 28) & 0x0F] + HEX_CHARS[(h1 >>> 24) & 0x0F] +
|
||||||
HEX_CHARS[(h2 >> 4) & 0x0F] + HEX_CHARS[h2 & 0x0F] +
|
HEX_CHARS[(h2 >>> 4) & 0x0F] + HEX_CHARS[h2 & 0x0F] +
|
||||||
HEX_CHARS[(h2 >> 12) & 0x0F] + HEX_CHARS[(h2 >> 8) & 0x0F] +
|
HEX_CHARS[(h2 >>> 12) & 0x0F] + HEX_CHARS[(h2 >>> 8) & 0x0F] +
|
||||||
HEX_CHARS[(h2 >> 20) & 0x0F] + HEX_CHARS[(h2 >> 16) & 0x0F] +
|
HEX_CHARS[(h2 >>> 20) & 0x0F] + HEX_CHARS[(h2 >>> 16) & 0x0F] +
|
||||||
HEX_CHARS[(h2 >> 28) & 0x0F] + HEX_CHARS[(h2 >> 24) & 0x0F] +
|
HEX_CHARS[(h2 >>> 28) & 0x0F] + HEX_CHARS[(h2 >>> 24) & 0x0F] +
|
||||||
HEX_CHARS[(h3 >> 4) & 0x0F] + HEX_CHARS[h3 & 0x0F] +
|
HEX_CHARS[(h3 >>> 4) & 0x0F] + HEX_CHARS[h3 & 0x0F] +
|
||||||
HEX_CHARS[(h3 >> 12) & 0x0F] + HEX_CHARS[(h3 >> 8) & 0x0F] +
|
HEX_CHARS[(h3 >>> 12) & 0x0F] + HEX_CHARS[(h3 >>> 8) & 0x0F] +
|
||||||
HEX_CHARS[(h3 >> 20) & 0x0F] + HEX_CHARS[(h3 >> 16) & 0x0F] +
|
HEX_CHARS[(h3 >>> 20) & 0x0F] + HEX_CHARS[(h3 >>> 16) & 0x0F] +
|
||||||
HEX_CHARS[(h3 >> 28) & 0x0F] + HEX_CHARS[(h3 >> 24) & 0x0F];
|
HEX_CHARS[(h3 >>> 28) & 0x0F] + HEX_CHARS[(h3 >>> 24) & 0x0F];
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -593,10 +740,10 @@
|
|||||||
|
|
||||||
var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;
|
var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;
|
||||||
return [
|
return [
|
||||||
h0 & 0xFF, (h0 >> 8) & 0xFF, (h0 >> 16) & 0xFF, (h0 >> 24) & 0xFF,
|
h0 & 0xFF, (h0 >>> 8) & 0xFF, (h0 >>> 16) & 0xFF, (h0 >>> 24) & 0xFF,
|
||||||
h1 & 0xFF, (h1 >> 8) & 0xFF, (h1 >> 16) & 0xFF, (h1 >> 24) & 0xFF,
|
h1 & 0xFF, (h1 >>> 8) & 0xFF, (h1 >>> 16) & 0xFF, (h1 >>> 24) & 0xFF,
|
||||||
h2 & 0xFF, (h2 >> 8) & 0xFF, (h2 >> 16) & 0xFF, (h2 >> 24) & 0xFF,
|
h2 & 0xFF, (h2 >>> 8) & 0xFF, (h2 >>> 16) & 0xFF, (h2 >>> 24) & 0xFF,
|
||||||
h3 & 0xFF, (h3 >> 8) & 0xFF, (h3 >> 16) & 0xFF, (h3 >> 24) & 0xFF
|
h3 & 0xFF, (h3 >>> 8) & 0xFF, (h3 >>> 16) & 0xFF, (h3 >>> 24) & 0xFF
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -645,7 +792,10 @@
|
|||||||
* @example
|
* @example
|
||||||
* hash.buffer();
|
* hash.buffer();
|
||||||
*/
|
*/
|
||||||
Md5.prototype.buffer = Md5.prototype.arrayBuffer;
|
/* istanbul ignore else */
|
||||||
|
if (FEATURE_BUFFER) {
|
||||||
|
Md5.prototype.buffer = Md5.prototype.arrayBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @method base64
|
* @method base64
|
||||||
@@ -657,25 +807,102 @@
|
|||||||
* @example
|
* @example
|
||||||
* hash.base64();
|
* hash.base64();
|
||||||
*/
|
*/
|
||||||
Md5.prototype.base64 = function () {
|
/* istanbul ignore else */
|
||||||
var v1, v2, v3, base64Str = '', bytes = this.array();
|
if (FEATURE_BASE64) {
|
||||||
for (var i = 0; i < 15;) {
|
Md5.prototype.base64 = function () {
|
||||||
v1 = bytes[i++];
|
var v1, v2, v3, base64Str = '', bytes = this.array();
|
||||||
v2 = bytes[i++];
|
for (var i = 0; i < 15;) {
|
||||||
v3 = bytes[i++];
|
v1 = bytes[i++];
|
||||||
|
v2 = bytes[i++];
|
||||||
|
v3 = bytes[i++];
|
||||||
|
base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] +
|
||||||
|
BASE64_ENCODE_CHAR[(v1 << 4 | v2 >>> 4) & 63] +
|
||||||
|
BASE64_ENCODE_CHAR[(v2 << 2 | v3 >>> 6) & 63] +
|
||||||
|
BASE64_ENCODE_CHAR[v3 & 63];
|
||||||
|
}
|
||||||
|
v1 = bytes[i];
|
||||||
base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] +
|
base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] +
|
||||||
BASE64_ENCODE_CHAR[(v1 << 4 | v2 >>> 4) & 63] +
|
BASE64_ENCODE_CHAR[(v1 << 4) & 63] +
|
||||||
BASE64_ENCODE_CHAR[(v2 << 2 | v3 >>> 6) & 63] +
|
'==';
|
||||||
BASE64_ENCODE_CHAR[v3 & 63];
|
return base64Str;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* HmacMd5 class
|
||||||
|
* @class HmacMd5
|
||||||
|
* @extends Md5
|
||||||
|
* @description This is internal class.
|
||||||
|
* @see {@link md5.hmac.create}
|
||||||
|
*/
|
||||||
|
function HmacMd5(key, sharedMemory) {
|
||||||
|
var i, result = formatMessage(key);
|
||||||
|
key = result[0];
|
||||||
|
if (result[1]) {
|
||||||
|
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;
|
||||||
}
|
}
|
||||||
v1 = bytes[i];
|
|
||||||
base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] +
|
if (key.length > 64) {
|
||||||
BASE64_ENCODE_CHAR[(v1 << 4) & 63] +
|
key = (new Md5(true)).update(key).array();
|
||||||
'==';
|
}
|
||||||
return base64Str;
|
|
||||||
};
|
var oKeyPad = [], iKeyPad = [];
|
||||||
|
for (i = 0; i < 64; ++i) {
|
||||||
|
var b = key[i] || 0;
|
||||||
|
oKeyPad[i] = 0x5c ^ b;
|
||||||
|
iKeyPad[i] = 0x36 ^ b;
|
||||||
|
}
|
||||||
|
|
||||||
|
Md5.call(this, sharedMemory);
|
||||||
|
|
||||||
|
this.update(iKeyPad);
|
||||||
|
this.oKeyPad = oKeyPad;
|
||||||
|
this.inner = true;
|
||||||
|
this.sharedMemory = sharedMemory;
|
||||||
|
}
|
||||||
|
/* istanbul ignore else */
|
||||||
|
if (FEATURE_HMAC) {
|
||||||
|
HmacMd5.prototype = new Md5();
|
||||||
|
|
||||||
|
HmacMd5.prototype.finalize = function () {
|
||||||
|
Md5.prototype.finalize.call(this);
|
||||||
|
if (this.inner) {
|
||||||
|
this.inner = false;
|
||||||
|
var innerHash = this.array();
|
||||||
|
Md5.call(this, this.sharedMemory);
|
||||||
|
this.update(this.oKeyPad);
|
||||||
|
this.update(innerHash);
|
||||||
|
Md5.prototype.finalize.call(this);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
var exports = createMethod();
|
var exports = createMethod();
|
||||||
|
exports.md5 = exports;
|
||||||
|
/* istanbul ignore else */
|
||||||
|
if (FEATURE_HMAC) {
|
||||||
|
exports.md5.hmac = createHmacMethod();
|
||||||
|
}
|
||||||
|
|
||||||
if (COMMON_JS) {
|
if (COMMON_JS) {
|
||||||
module.exports = exports;
|
module.exports = exports;
|
||||||
@@ -715,13 +942,13 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<nav>
|
<nav>
|
||||||
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="Md5_.html">Md5</a></li></ul><h3>Namespaces</h3><ul><li><a href="md5.html">md5</a></li></ul><h3>Global</h3><ul><li><a href="global.html#md5%2508">md5</a></li></ul>
|
<h2><a href="index.html">Home</a></h2><h3>Namespaces</h3><ul><li><a href="md5_.html">md5</a></li><li><a href="md5.hmac.html">hmac</a></li></ul><h3>Classes</h3><ul><li><a href="HmacMd5.html">HmacMd5</a></li><li><a href="Md5.html">Md5</a></li></ul><h3>Global</h3><ul><li><a href="global.html#md5%2508">md5</a></li></ul>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
<br class="clear">
|
<br class="clear">
|
||||||
|
|
||||||
<footer>
|
<footer>
|
||||||
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Sun Oct 29 2017 20:15:53 GMT+0800 (CST)
|
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a> on Mon Jul 20 2026 10:47:41 GMT+0800 (Taipei Standard Time)
|
||||||
</footer>
|
</footer>
|
||||||
|
|
||||||
<script> prettyPrint(); </script>
|
<script> prettyPrint(); </script>
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
/*global document */
|
/*global document */
|
||||||
(function() {
|
(() => {
|
||||||
var source = document.getElementsByClassName('prettyprint source linenums');
|
const source = document.getElementsByClassName('prettyprint source linenums');
|
||||||
var i = 0;
|
let i = 0;
|
||||||
var lineNumber = 0;
|
let lineNumber = 0;
|
||||||
var lineId;
|
let lineId;
|
||||||
var lines;
|
let lines;
|
||||||
var totalLines;
|
let totalLines;
|
||||||
var anchorHash;
|
let anchorHash;
|
||||||
|
|
||||||
if (source && source[0]) {
|
if (source && source[0]) {
|
||||||
anchorHash = document.location.hash.substring(1);
|
anchorHash = document.location.hash.substring(1);
|
||||||
@@ -15,7 +15,7 @@
|
|||||||
|
|
||||||
for (; i < totalLines; i++) {
|
for (; i < totalLines; i++) {
|
||||||
lineNumber++;
|
lineNumber++;
|
||||||
lineId = 'line' + lineNumber;
|
lineId = `line${lineNumber}`;
|
||||||
lines[i].id = lineId;
|
lines[i].id = lineId;
|
||||||
if (lineId === anchorHash) {
|
if (lineId === anchorHash) {
|
||||||
lines[i].className += ' selected';
|
lines[i].className += ' selected';
|
||||||
|
|||||||
@@ -273,7 +273,7 @@ tr > th:last-child { border-right: 1px solid #ddd; }
|
|||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.prettyprint
|
.source
|
||||||
{
|
{
|
||||||
border: 1px solid #ddd;
|
border: 1px solid #ddd;
|
||||||
width: 80%;
|
width: 80%;
|
||||||
@@ -284,7 +284,7 @@ tr > th:last-child { border-right: 1px solid #ddd; }
|
|||||||
width: inherit;
|
width: inherit;
|
||||||
}
|
}
|
||||||
|
|
||||||
.prettyprint code
|
.source code
|
||||||
{
|
{
|
||||||
font-size: 100%;
|
font-size: 100%;
|
||||||
line-height: 18px;
|
line-height: 18px;
|
||||||
|
|||||||
Vendored
+168
@@ -0,0 +1,168 @@
|
|||||||
|
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[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return hash in base64 string.
|
||||||
|
*/
|
||||||
|
base64(): string;
|
||||||
|
}
|
||||||
|
|
||||||
|
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[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return hash in base64 string.
|
||||||
|
*
|
||||||
|
* @param secretKey The Secret Key
|
||||||
|
* @param message The message you want to hash.
|
||||||
|
*/
|
||||||
|
base64(secretKey: Message, message: Message): string;
|
||||||
|
}
|
||||||
|
|
||||||
|
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[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return hash in base64 string.
|
||||||
|
*
|
||||||
|
* @param message The message you want to hash.
|
||||||
|
*/
|
||||||
|
base64(message: Message): string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* HMAC interface
|
||||||
|
*/
|
||||||
|
hmac: Hmac;
|
||||||
|
}
|
||||||
|
|
||||||
|
export var md5: Hash;
|
||||||
Generated
+3935
-452
File diff suppressed because it is too large
Load Diff
+52
-10
@@ -1,23 +1,56 @@
|
|||||||
{
|
{
|
||||||
"name": "js-md5",
|
"name": "js-md5",
|
||||||
"version": "0.7.0",
|
"version": "0.9.0",
|
||||||
"description": "A simple MD5 hash function for JavaScript supports UTF-8 encoding.",
|
"description": "A simple MD5 hash function for JavaScript supports UTF-8 encoding.",
|
||||||
"main": "src/md5.js",
|
"main": "src/md5.js",
|
||||||
|
"module": "build/md5.mjs",
|
||||||
|
"exports": {
|
||||||
|
".": {
|
||||||
|
"types": "./index.d.ts",
|
||||||
|
"node": {
|
||||||
|
"import": "./build/md5.node.mjs",
|
||||||
|
"require": "./src/md5.js"
|
||||||
|
},
|
||||||
|
"import": "./build/md5.mjs",
|
||||||
|
"require": "./src/md5.js",
|
||||||
|
"default": "./src/md5.js"
|
||||||
|
},
|
||||||
|
"./src/md5.js": "./src/md5.js",
|
||||||
|
"./build/md5.js": "./build/md5.js",
|
||||||
|
"./build/md5.min.js": "./build/md5.min.js",
|
||||||
|
"./build/md5.mjs": "./build/md5.mjs",
|
||||||
|
"./build/md5.min.mjs": "./build/md5.min.mjs",
|
||||||
|
"./build/md5.node.mjs": "./build/md5.node.mjs",
|
||||||
|
"./build/md5.modern.js": "./build/md5.modern.js",
|
||||||
|
"./build/md5.modern.min.js": "./build/md5.modern.min.js",
|
||||||
|
"./build/md5.modern.mjs": "./build/md5.modern.mjs",
|
||||||
|
"./build/md5.modern.min.mjs": "./build/md5.modern.min.mjs",
|
||||||
|
"./build/md5.modern.node.mjs": "./build/md5.modern.node.mjs",
|
||||||
|
"./build/md5-lite.js": "./build/md5-lite.js",
|
||||||
|
"./build/md5-lite.min.js": "./build/md5-lite.min.js",
|
||||||
|
"./build/md5-lite.mjs": "./build/md5-lite.mjs",
|
||||||
|
"./build/md5-lite.min.mjs": "./build/md5-lite.min.mjs",
|
||||||
|
"./build/md5-lite.node.mjs": "./build/md5-lite.node.mjs",
|
||||||
|
"./package.json": "./package.json"
|
||||||
|
},
|
||||||
|
"types": "./index.d.ts",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@rollup/plugin-commonjs": "^29.0.3",
|
||||||
|
"@rollup/plugin-terser": "^1.0.0",
|
||||||
"expect.js": "~0.3.1",
|
"expect.js": "~0.3.1",
|
||||||
"jscoverage": "~0.5.9",
|
"jsdoc": "~4.0.2",
|
||||||
"jsdoc": "^3.4.0",
|
"mocha": "^11.7.6",
|
||||||
"mocha": "~2.3.4",
|
"nyc": "^18.0.0",
|
||||||
"requirejs": "^2.1.22",
|
"requirejs": "^2.1.22",
|
||||||
"uglify-js": "~2.4.10",
|
"rollup": "^4.43.0",
|
||||||
"webworker-threads": "^0.7.11"
|
"tiny-worker": "^2.3.0"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "mocha tests/node-test.js -r jscoverage",
|
"test": "npm run compress && nyc mocha tests/node-test.js && node tests/build-test.js && node tests/esm-test.mjs",
|
||||||
"report": "mocha tests/node-test.js -r jscoverage --covout=html",
|
"report": "nyc --reporter=html --reporter=text mocha tests/node-test.js",
|
||||||
"coveralls": "mocha tests/node-test.js -R mocha-lcov-reporter -r jscoverage | coveralls",
|
"coveralls": "nyc report --reporter=text-lcov | coveralls",
|
||||||
"doc": "rm -rf doc;jsdoc src README.md -d doc",
|
"doc": "rm -rf doc;jsdoc src README.md -d doc",
|
||||||
"compress": "uglifyjs src/md5.js --compress --mangle --comments --output build/md5.min.js",
|
"compress": "rollup -c",
|
||||||
"build": "npm run-script compress;npm run-script doc"
|
"build": "npm run-script compress;npm run-script doc"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
@@ -36,5 +69,14 @@
|
|||||||
"homepage": "https://github.com/emn178/js-md5",
|
"homepage": "https://github.com/emn178/js-md5",
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/emn178/js-md5/issues"
|
"url": "https://github.com/emn178/js-md5/issues"
|
||||||
|
},
|
||||||
|
"nyc": {
|
||||||
|
"exclude": [
|
||||||
|
"tests"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"browser": {
|
||||||
|
"crypto": false,
|
||||||
|
"buffer": false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,106 @@
|
|||||||
|
import commonjs from '@rollup/plugin-commonjs';
|
||||||
|
import terser from '@rollup/plugin-terser';
|
||||||
|
|
||||||
|
const featureNames = {
|
||||||
|
legacy: 'FEATURE_LEGACY',
|
||||||
|
hmac: 'FEATURE_HMAC',
|
||||||
|
base64: 'FEATURE_BASE64',
|
||||||
|
buffer: 'FEATURE_BUFFER'
|
||||||
|
};
|
||||||
|
|
||||||
|
const variants = [
|
||||||
|
{
|
||||||
|
name: 'md5',
|
||||||
|
features: {legacy: true, hmac: true, base64: true, buffer: true}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'md5.modern',
|
||||||
|
features: {legacy: false, hmac: true, base64: true, buffer: true}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'md5-lite',
|
||||||
|
features: {legacy: false, hmac: false, base64: false, buffer: false}
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
const disableNodeJs = {
|
||||||
|
name: 'disable-node-js',
|
||||||
|
transform(code, id) {
|
||||||
|
if (id.endsWith('/src/md5.js')) {
|
||||||
|
const nodeJsDeclaration = /^\s*var NODE_JS = .*;$/m;
|
||||||
|
if (!nodeJsDeclaration.test(code)) {
|
||||||
|
this.error('Could not find the NODE_JS declaration');
|
||||||
|
}
|
||||||
|
return code.replace(nodeJsDeclaration, ' var NODE_JS = false;');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const setFeatures = (features) => {
|
||||||
|
return {
|
||||||
|
name: 'set-features',
|
||||||
|
transform(code, id) {
|
||||||
|
if (id.endsWith('/src/md5.js')) {
|
||||||
|
Object.entries(featureNames).forEach(([feature, name]) => {
|
||||||
|
const declaration = `var ${name} = true;`;
|
||||||
|
if (!code.includes(declaration)) {
|
||||||
|
throw new Error(`Could not find declaration for ${name}`);
|
||||||
|
}
|
||||||
|
code = code.replace(declaration, `var ${name} = ${features[feature]};`);
|
||||||
|
});
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function build(variant) {
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
input: 'src/md5.js',
|
||||||
|
output: {
|
||||||
|
file: `build/${variant.name}.js`
|
||||||
|
},
|
||||||
|
plugins: [setFeatures(variant.features)]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: 'src/md5.mjs',
|
||||||
|
external: ['crypto', 'buffer'],
|
||||||
|
output: {
|
||||||
|
file: `build/${variant.name}.node.mjs`,
|
||||||
|
format: 'es'
|
||||||
|
},
|
||||||
|
plugins: [setFeatures(variant.features), commonjs({
|
||||||
|
strictRequires: false
|
||||||
|
})]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: 'src/md5.mjs',
|
||||||
|
output: {
|
||||||
|
file: `build/${variant.name}.mjs`,
|
||||||
|
format: 'es'
|
||||||
|
},
|
||||||
|
plugins: [setFeatures(variant.features), disableNodeJs, commonjs({
|
||||||
|
strictRequires: false,
|
||||||
|
ignore: ['crypto', 'buffer']
|
||||||
|
})]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: `build/${variant.name}.js`,
|
||||||
|
output: {
|
||||||
|
file: `build/${variant.name}.min.js`
|
||||||
|
},
|
||||||
|
plugins: [terser()]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: `build/${variant.name}.mjs`,
|
||||||
|
output: {
|
||||||
|
file: `build/${variant.name}.min.mjs`,
|
||||||
|
format: 'es'
|
||||||
|
},
|
||||||
|
plugins: [terser()]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
export default [...variants.map((variant) => build(variant))].flat();
|
||||||
+328
-101
@@ -2,22 +2,29 @@
|
|||||||
* [js-md5]{@link https://github.com/emn178/js-md5}
|
* [js-md5]{@link https://github.com/emn178/js-md5}
|
||||||
*
|
*
|
||||||
* @namespace md5
|
* @namespace md5
|
||||||
* @version 0.7.0
|
* @version 0.9.0
|
||||||
* @author Chen, Yi-Cyuan [emn178@gmail.com]
|
* @author Chen, Yi-Cyuan [emn178@gmail.com]
|
||||||
* @copyright Chen, Yi-Cyuan 2014-2017
|
* @copyright Chen, Yi-Cyuan 2014-2026
|
||||||
* @license MIT
|
* @license MIT
|
||||||
*/
|
*/
|
||||||
(function () {
|
(function () {
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var ERROR = 'input is invalid type';
|
var FEATURE_LEGACY = true;
|
||||||
|
var FEATURE_HMAC = true;
|
||||||
|
var FEATURE_BASE64 = true;
|
||||||
|
var FEATURE_BUFFER = true;
|
||||||
|
|
||||||
|
var INPUT_ERROR = 'input is invalid type';
|
||||||
|
var FINALIZE_ERROR = 'finalize already called';
|
||||||
var WINDOW = typeof window === 'object';
|
var WINDOW = typeof window === 'object';
|
||||||
var root = WINDOW ? window : {};
|
var root = WINDOW ? window : {};
|
||||||
if (root.JS_MD5_NO_WINDOW) {
|
if (root.JS_MD5_NO_WINDOW) {
|
||||||
WINDOW = false;
|
WINDOW = false;
|
||||||
}
|
}
|
||||||
var WEB_WORKER = !WINDOW && typeof self === 'object';
|
var WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && typeof self !== 'undefined' && self instanceof WorkerGlobalScope;
|
||||||
var NODE_JS = !root.JS_MD5_NO_NODE_JS && typeof process === 'object' && process.versions && process.versions.node;
|
/* istanbul ignore next */
|
||||||
|
var NODE_JS = !root.JS_MD5_NO_NODE_JS && !WINDOW && typeof process === 'object' && process.versions && process.versions.node;
|
||||||
if (NODE_JS) {
|
if (NODE_JS) {
|
||||||
root = global;
|
root = global;
|
||||||
} else if (WEB_WORKER) {
|
} else if (WEB_WORKER) {
|
||||||
@@ -25,12 +32,24 @@
|
|||||||
}
|
}
|
||||||
var COMMON_JS = !root.JS_MD5_NO_COMMON_JS && typeof module === 'object' && module.exports;
|
var COMMON_JS = !root.JS_MD5_NO_COMMON_JS && typeof module === 'object' && module.exports;
|
||||||
var AMD = typeof define === 'function' && define.amd;
|
var AMD = typeof define === 'function' && define.amd;
|
||||||
var ARRAY_BUFFER = !root.JS_MD5_NO_ARRAY_BUFFER && typeof ArrayBuffer !== 'undefined';
|
/* istanbul ignore next */
|
||||||
|
var ARRAY_BUFFER = FEATURE_LEGACY ?
|
||||||
|
!root.JS_MD5_NO_ARRAY_BUFFER && typeof ArrayBuffer !== 'undefined' : true;
|
||||||
var HEX_CHARS = '0123456789abcdef'.split('');
|
var HEX_CHARS = '0123456789abcdef'.split('');
|
||||||
var EXTRA = [128, 32768, 8388608, -2147483648];
|
var EXTRA = [128, 32768, 8388608, -2147483648];
|
||||||
var SHIFT = [0, 8, 16, 24];
|
var SHIFT = [0, 8, 16, 24];
|
||||||
var OUTPUT_TYPES = ['hex', 'array', 'digest', 'buffer', 'arrayBuffer', 'base64'];
|
var OUTPUT_TYPES = ['hex', 'array', 'digest', 'arrayBuffer'];
|
||||||
var BASE64_ENCODE_CHAR = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');
|
/* istanbul ignore else */
|
||||||
|
if (FEATURE_BUFFER) {
|
||||||
|
OUTPUT_TYPES.push('buffer');
|
||||||
|
}
|
||||||
|
/* istanbul ignore else */
|
||||||
|
if (FEATURE_BASE64) {
|
||||||
|
OUTPUT_TYPES.push('base64');
|
||||||
|
}
|
||||||
|
/* istanbul ignore next */
|
||||||
|
var BASE64_ENCODE_CHAR = FEATURE_BASE64 ?
|
||||||
|
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('') : null;
|
||||||
|
|
||||||
var blocks = [], buffer8;
|
var blocks = [], buffer8;
|
||||||
if (ARRAY_BUFFER) {
|
if (ARRAY_BUFFER) {
|
||||||
@@ -39,18 +58,40 @@
|
|||||||
blocks = new Uint32Array(buffer);
|
blocks = new Uint32Array(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (root.JS_MD5_NO_NODE_JS || !Array.isArray) {
|
var isArray = Array.isArray;
|
||||||
Array.isArray = function (obj) {
|
/* istanbul ignore else */
|
||||||
|
if (FEATURE_LEGACY && (root.JS_MD5_NO_NODE_JS || !isArray)) {
|
||||||
|
isArray = function (obj) {
|
||||||
return Object.prototype.toString.call(obj) === '[object Array]';
|
return Object.prototype.toString.call(obj) === '[object Array]';
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ARRAY_BUFFER && (root.JS_MD5_NO_ARRAY_BUFFER_IS_VIEW || !ArrayBuffer.isView)) {
|
var isView = ArrayBuffer.isView;
|
||||||
ArrayBuffer.isView = function (obj) {
|
/* istanbul ignore else */
|
||||||
|
if (FEATURE_LEGACY && ARRAY_BUFFER && (root.JS_MD5_NO_ARRAY_BUFFER_IS_VIEW || !isView)) {
|
||||||
|
isView = function (obj) {
|
||||||
return typeof obj === 'object' && obj.buffer && obj.buffer.constructor === ArrayBuffer;
|
return typeof obj === 'object' && obj.buffer && obj.buffer.constructor === ArrayBuffer;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// [message: string, isString: bool]
|
||||||
|
var formatMessage = function (message) {
|
||||||
|
var type = typeof message;
|
||||||
|
if (type === 'string') {
|
||||||
|
return [message, true];
|
||||||
|
}
|
||||||
|
if (type !== 'object' || message === null) {
|
||||||
|
throw new Error(INPUT_ERROR);
|
||||||
|
}
|
||||||
|
if (ARRAY_BUFFER && message.constructor === ArrayBuffer) {
|
||||||
|
return [new Uint8Array(message), false];
|
||||||
|
}
|
||||||
|
if (!isArray(message) && !isView(message)) {
|
||||||
|
throw new Error(INPUT_ERROR);
|
||||||
|
}
|
||||||
|
return [message, false];
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @method hex
|
* @method hex
|
||||||
* @memberof md5
|
* @memberof md5
|
||||||
@@ -153,21 +194,27 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
var nodeWrap = function (method) {
|
var nodeWrap = function (method) {
|
||||||
var crypto = eval("require('crypto')");
|
var crypto = require('crypto')
|
||||||
var Buffer = eval("require('buffer').Buffer");
|
var Buffer = require('buffer').Buffer;
|
||||||
|
var bufferFrom = Buffer.from;
|
||||||
|
if (FEATURE_LEGACY && (root.JS_MD5_NO_BUFFER_FROM || !bufferFrom)) {
|
||||||
|
bufferFrom = function (message) {
|
||||||
|
return new Buffer(message);
|
||||||
|
};
|
||||||
|
}
|
||||||
var nodeMethod = function (message) {
|
var nodeMethod = function (message) {
|
||||||
if (typeof message === 'string') {
|
if (typeof message === 'string') {
|
||||||
return crypto.createHash('md5').update(message, 'utf8').digest('hex');
|
return crypto.createHash('md5').update(message, 'utf8').digest('hex');
|
||||||
} else {
|
} else {
|
||||||
if (message === null || message === undefined) {
|
if (message === null || message === undefined) {
|
||||||
throw ERROR;
|
throw new Error(INPUT_ERROR);
|
||||||
} else if (message.constructor === ArrayBuffer) {
|
} else if (message.constructor === ArrayBuffer) {
|
||||||
message = new Uint8Array(message);
|
message = new Uint8Array(message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (Array.isArray(message) || ArrayBuffer.isView(message) ||
|
if (isArray(message) || isView(message) ||
|
||||||
message.constructor === Buffer) {
|
message.constructor === Buffer) {
|
||||||
return crypto.createHash('md5').update(new Buffer(message)).digest('hex');
|
return crypto.createHash('md5').update(bufferFrom(message)).digest('hex');
|
||||||
} else {
|
} else {
|
||||||
return method(message);
|
return method(message);
|
||||||
}
|
}
|
||||||
@@ -175,6 +222,116 @@
|
|||||||
return nodeMethod;
|
return nodeMethod;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @namespace md5.hmac
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method hex
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as hex string
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} Hex string
|
||||||
|
* @example
|
||||||
|
* md5.hmac.hex('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
* // equal to
|
||||||
|
* md5.hmac('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method digest
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @example
|
||||||
|
* md5.hmac.digest('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method array
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as bytes array
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {Array} Bytes array
|
||||||
|
* @example
|
||||||
|
* md5.hmac.array('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method arrayBuffer
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @example
|
||||||
|
* md5.hmac.arrayBuffer('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method buffer
|
||||||
|
* @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as ArrayBuffer
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {ArrayBuffer} ArrayBuffer
|
||||||
|
* @example
|
||||||
|
* md5.hmac.buffer('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method base64
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Output hash as base64 string
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {String} base64 string
|
||||||
|
* @example
|
||||||
|
* md5.hmac.base64('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
var createHmacOutputMethod = function (outputType) {
|
||||||
|
return function (key, message) {
|
||||||
|
return new HmacMd5(key, true).update(message)[outputType]();
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method create
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Create HmacMd5 object
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @returns {HmacMd5} HmacMd5 object.
|
||||||
|
* @example
|
||||||
|
* var hash = md5.hmac.create('key');
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @method update
|
||||||
|
* @memberof md5.hmac
|
||||||
|
* @description Create and update HmacMd5 object
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} key key
|
||||||
|
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
|
||||||
|
* @returns {HmacMd5} HmacMd5 object.
|
||||||
|
* @example
|
||||||
|
* var hash = md5.hmac.update('key', 'The quick brown fox jumps over the lazy dog');
|
||||||
|
* // equal to
|
||||||
|
* var hash = md5.hmac.create('key');
|
||||||
|
* hash.update('The quick brown fox jumps over the lazy dog');
|
||||||
|
*/
|
||||||
|
var createHmacMethod = function () {
|
||||||
|
var method = createHmacOutputMethod('hex');
|
||||||
|
method.create = function (key) {
|
||||||
|
return new HmacMd5(key);
|
||||||
|
};
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
return method;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Md5 class
|
* Md5 class
|
||||||
* @class Md5
|
* @class Md5
|
||||||
@@ -198,7 +355,7 @@
|
|||||||
this.blocks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
this.blocks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.h0 = this.h1 = this.h2 = this.h3 = this.start = this.bytes = 0;
|
this.h0 = this.h1 = this.h2 = this.h3 = this.start = this.bytes = this.hBytes = 0;
|
||||||
this.finalized = this.hashed = false;
|
this.finalized = this.hashed = false;
|
||||||
this.first = true;
|
this.first = true;
|
||||||
}
|
}
|
||||||
@@ -214,26 +371,12 @@
|
|||||||
*/
|
*/
|
||||||
Md5.prototype.update = function (message) {
|
Md5.prototype.update = function (message) {
|
||||||
if (this.finalized) {
|
if (this.finalized) {
|
||||||
return;
|
throw new Error(FINALIZE_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
var notString, type = typeof message;
|
var result = formatMessage(message);
|
||||||
if (type !== 'string') {
|
message = result[0];
|
||||||
if (type === 'object') {
|
var isString = result[1];
|
||||||
if (message === null) {
|
|
||||||
throw ERROR;
|
|
||||||
} else if (ARRAY_BUFFER && message.constructor === ArrayBuffer) {
|
|
||||||
message = new Uint8Array(message);
|
|
||||||
} else if (!Array.isArray(message)) {
|
|
||||||
if (!ARRAY_BUFFER || !ArrayBuffer.isView(message)) {
|
|
||||||
throw ERROR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
throw ERROR;
|
|
||||||
}
|
|
||||||
notString = true;
|
|
||||||
}
|
|
||||||
var code, index = 0, i, length = message.length, blocks = this.blocks;
|
var code, index = 0, i, length = message.length, blocks = this.blocks;
|
||||||
var buffer8 = this.buffer8;
|
var buffer8 = this.buffer8;
|
||||||
|
|
||||||
@@ -247,34 +390,24 @@
|
|||||||
blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
|
blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (notString) {
|
if (isString) {
|
||||||
if (ARRAY_BUFFER) {
|
|
||||||
for (i = this.start; index < length && i < 64; ++index) {
|
|
||||||
buffer8[i++] = message[index];
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (i = this.start; index < length && i < 64; ++index) {
|
|
||||||
blocks[i >> 2] |= message[index] << SHIFT[i++ & 3];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (ARRAY_BUFFER) {
|
if (ARRAY_BUFFER) {
|
||||||
for (i = this.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) {
|
||||||
buffer8[i++] = code;
|
buffer8[i++] = code;
|
||||||
} else if (code < 0x800) {
|
} else if (code < 0x800) {
|
||||||
buffer8[i++] = 0xc0 | (code >> 6);
|
buffer8[i++] = 0xc0 | (code >>> 6);
|
||||||
buffer8[i++] = 0x80 | (code & 0x3f);
|
buffer8[i++] = 0x80 | (code & 0x3f);
|
||||||
} else if (code < 0xd800 || code >= 0xe000) {
|
} else if (code < 0xd800 || code >= 0xe000) {
|
||||||
buffer8[i++] = 0xe0 | (code >> 12);
|
buffer8[i++] = 0xe0 | (code >>> 12);
|
||||||
buffer8[i++] = 0x80 | ((code >> 6) & 0x3f);
|
buffer8[i++] = 0x80 | ((code >>> 6) & 0x3f);
|
||||||
buffer8[i++] = 0x80 | (code & 0x3f);
|
buffer8[i++] = 0x80 | (code & 0x3f);
|
||||||
} else {
|
} else {
|
||||||
code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
|
code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
|
||||||
buffer8[i++] = 0xf0 | (code >> 18);
|
buffer8[i++] = 0xf0 | (code >>> 18);
|
||||||
buffer8[i++] = 0x80 | ((code >> 12) & 0x3f);
|
buffer8[i++] = 0x80 | ((code >>> 12) & 0x3f);
|
||||||
buffer8[i++] = 0x80 | ((code >> 6) & 0x3f);
|
buffer8[i++] = 0x80 | ((code >>> 6) & 0x3f);
|
||||||
buffer8[i++] = 0x80 | (code & 0x3f);
|
buffer8[i++] = 0x80 | (code & 0x3f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -282,23 +415,33 @@
|
|||||||
for (i = this.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];
|
||||||
} else if (code < 0x800) {
|
} else if (code < 0x800) {
|
||||||
blocks[i >> 2] |= (0xc0 | (code >> 6)) << SHIFT[i++ & 3];
|
blocks[i >>> 2] |= (0xc0 | (code >>> 6)) << SHIFT[i++ & 3];
|
||||||
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
|
blocks[i >>> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
|
||||||
} else if (code < 0xd800 || code >= 0xe000) {
|
} else if (code < 0xd800 || code >= 0xe000) {
|
||||||
blocks[i >> 2] |= (0xe0 | (code >> 12)) << SHIFT[i++ & 3];
|
blocks[i >>> 2] |= (0xe0 | (code >>> 12)) << SHIFT[i++ & 3];
|
||||||
blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
|
blocks[i >>> 2] |= (0x80 | ((code >>> 6) & 0x3f)) << SHIFT[i++ & 3];
|
||||||
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
|
blocks[i >>> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
|
||||||
} else {
|
} else {
|
||||||
code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
|
code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
|
||||||
blocks[i >> 2] |= (0xf0 | (code >> 18)) << SHIFT[i++ & 3];
|
blocks[i >>> 2] |= (0xf0 | (code >>> 18)) << SHIFT[i++ & 3];
|
||||||
blocks[i >> 2] |= (0x80 | ((code >> 12) & 0x3f)) << SHIFT[i++ & 3];
|
blocks[i >>> 2] |= (0x80 | ((code >>> 12) & 0x3f)) << SHIFT[i++ & 3];
|
||||||
blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
|
blocks[i >>> 2] |= (0x80 | ((code >>> 6) & 0x3f)) << SHIFT[i++ & 3];
|
||||||
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
|
blocks[i >>> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
if (ARRAY_BUFFER) {
|
||||||
|
for (i = this.start; index < length && i < 64; ++index) {
|
||||||
|
buffer8[i++] = message[index];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (i = this.start; index < length && i < 64; ++index) {
|
||||||
|
blocks[i >>> 2] |= message[index] << SHIFT[i++ & 3];
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
this.lastByteIndex = i;
|
this.lastByteIndex = i;
|
||||||
this.bytes += i - this.start;
|
this.bytes += i - this.start;
|
||||||
@@ -310,6 +453,10 @@
|
|||||||
this.start = i;
|
this.start = i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (this.bytes > 4294967295) {
|
||||||
|
this.hBytes += this.bytes / 4294967296 << 0;
|
||||||
|
this.bytes = this.bytes % 4294967296;
|
||||||
|
}
|
||||||
return this;
|
return this;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -319,7 +466,7 @@
|
|||||||
}
|
}
|
||||||
this.finalized = true;
|
this.finalized = true;
|
||||||
var blocks = this.blocks, i = this.lastByteIndex;
|
var blocks = this.blocks, i = this.lastByteIndex;
|
||||||
blocks[i >> 2] |= EXTRA[i & 3];
|
blocks[i >>> 2] |= EXTRA[i & 3];
|
||||||
if (i >= 56) {
|
if (i >= 56) {
|
||||||
if (!this.hashed) {
|
if (!this.hashed) {
|
||||||
this.hash();
|
this.hash();
|
||||||
@@ -331,7 +478,7 @@
|
|||||||
blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
|
blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
|
||||||
}
|
}
|
||||||
blocks[14] = this.bytes << 3;
|
blocks[14] = this.bytes << 3;
|
||||||
blocks[15] = this.bytes >> 29;
|
blocks[15] = this.hBytes << 3 | this.bytes >>> 29;
|
||||||
this.hash();
|
this.hash();
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -520,22 +667,22 @@
|
|||||||
|
|
||||||
var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;
|
var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;
|
||||||
|
|
||||||
return HEX_CHARS[(h0 >> 4) & 0x0F] + HEX_CHARS[h0 & 0x0F] +
|
return HEX_CHARS[(h0 >>> 4) & 0x0F] + HEX_CHARS[h0 & 0x0F] +
|
||||||
HEX_CHARS[(h0 >> 12) & 0x0F] + HEX_CHARS[(h0 >> 8) & 0x0F] +
|
HEX_CHARS[(h0 >>> 12) & 0x0F] + HEX_CHARS[(h0 >>> 8) & 0x0F] +
|
||||||
HEX_CHARS[(h0 >> 20) & 0x0F] + HEX_CHARS[(h0 >> 16) & 0x0F] +
|
HEX_CHARS[(h0 >>> 20) & 0x0F] + HEX_CHARS[(h0 >>> 16) & 0x0F] +
|
||||||
HEX_CHARS[(h0 >> 28) & 0x0F] + HEX_CHARS[(h0 >> 24) & 0x0F] +
|
HEX_CHARS[(h0 >>> 28) & 0x0F] + HEX_CHARS[(h0 >>> 24) & 0x0F] +
|
||||||
HEX_CHARS[(h1 >> 4) & 0x0F] + HEX_CHARS[h1 & 0x0F] +
|
HEX_CHARS[(h1 >>> 4) & 0x0F] + HEX_CHARS[h1 & 0x0F] +
|
||||||
HEX_CHARS[(h1 >> 12) & 0x0F] + HEX_CHARS[(h1 >> 8) & 0x0F] +
|
HEX_CHARS[(h1 >>> 12) & 0x0F] + HEX_CHARS[(h1 >>> 8) & 0x0F] +
|
||||||
HEX_CHARS[(h1 >> 20) & 0x0F] + HEX_CHARS[(h1 >> 16) & 0x0F] +
|
HEX_CHARS[(h1 >>> 20) & 0x0F] + HEX_CHARS[(h1 >>> 16) & 0x0F] +
|
||||||
HEX_CHARS[(h1 >> 28) & 0x0F] + HEX_CHARS[(h1 >> 24) & 0x0F] +
|
HEX_CHARS[(h1 >>> 28) & 0x0F] + HEX_CHARS[(h1 >>> 24) & 0x0F] +
|
||||||
HEX_CHARS[(h2 >> 4) & 0x0F] + HEX_CHARS[h2 & 0x0F] +
|
HEX_CHARS[(h2 >>> 4) & 0x0F] + HEX_CHARS[h2 & 0x0F] +
|
||||||
HEX_CHARS[(h2 >> 12) & 0x0F] + HEX_CHARS[(h2 >> 8) & 0x0F] +
|
HEX_CHARS[(h2 >>> 12) & 0x0F] + HEX_CHARS[(h2 >>> 8) & 0x0F] +
|
||||||
HEX_CHARS[(h2 >> 20) & 0x0F] + HEX_CHARS[(h2 >> 16) & 0x0F] +
|
HEX_CHARS[(h2 >>> 20) & 0x0F] + HEX_CHARS[(h2 >>> 16) & 0x0F] +
|
||||||
HEX_CHARS[(h2 >> 28) & 0x0F] + HEX_CHARS[(h2 >> 24) & 0x0F] +
|
HEX_CHARS[(h2 >>> 28) & 0x0F] + HEX_CHARS[(h2 >>> 24) & 0x0F] +
|
||||||
HEX_CHARS[(h3 >> 4) & 0x0F] + HEX_CHARS[h3 & 0x0F] +
|
HEX_CHARS[(h3 >>> 4) & 0x0F] + HEX_CHARS[h3 & 0x0F] +
|
||||||
HEX_CHARS[(h3 >> 12) & 0x0F] + HEX_CHARS[(h3 >> 8) & 0x0F] +
|
HEX_CHARS[(h3 >>> 12) & 0x0F] + HEX_CHARS[(h3 >>> 8) & 0x0F] +
|
||||||
HEX_CHARS[(h3 >> 20) & 0x0F] + HEX_CHARS[(h3 >> 16) & 0x0F] +
|
HEX_CHARS[(h3 >>> 20) & 0x0F] + HEX_CHARS[(h3 >>> 16) & 0x0F] +
|
||||||
HEX_CHARS[(h3 >> 28) & 0x0F] + HEX_CHARS[(h3 >> 24) & 0x0F];
|
HEX_CHARS[(h3 >>> 28) & 0x0F] + HEX_CHARS[(h3 >>> 24) & 0x0F];
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -565,10 +712,10 @@
|
|||||||
|
|
||||||
var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;
|
var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3;
|
||||||
return [
|
return [
|
||||||
h0 & 0xFF, (h0 >> 8) & 0xFF, (h0 >> 16) & 0xFF, (h0 >> 24) & 0xFF,
|
h0 & 0xFF, (h0 >>> 8) & 0xFF, (h0 >>> 16) & 0xFF, (h0 >>> 24) & 0xFF,
|
||||||
h1 & 0xFF, (h1 >> 8) & 0xFF, (h1 >> 16) & 0xFF, (h1 >> 24) & 0xFF,
|
h1 & 0xFF, (h1 >>> 8) & 0xFF, (h1 >>> 16) & 0xFF, (h1 >>> 24) & 0xFF,
|
||||||
h2 & 0xFF, (h2 >> 8) & 0xFF, (h2 >> 16) & 0xFF, (h2 >> 24) & 0xFF,
|
h2 & 0xFF, (h2 >>> 8) & 0xFF, (h2 >>> 16) & 0xFF, (h2 >>> 24) & 0xFF,
|
||||||
h3 & 0xFF, (h3 >> 8) & 0xFF, (h3 >> 16) & 0xFF, (h3 >> 24) & 0xFF
|
h3 & 0xFF, (h3 >>> 8) & 0xFF, (h3 >>> 16) & 0xFF, (h3 >>> 24) & 0xFF
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -617,7 +764,10 @@
|
|||||||
* @example
|
* @example
|
||||||
* hash.buffer();
|
* hash.buffer();
|
||||||
*/
|
*/
|
||||||
Md5.prototype.buffer = Md5.prototype.arrayBuffer;
|
/* istanbul ignore else */
|
||||||
|
if (FEATURE_BUFFER) {
|
||||||
|
Md5.prototype.buffer = Md5.prototype.arrayBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @method base64
|
* @method base64
|
||||||
@@ -629,25 +779,102 @@
|
|||||||
* @example
|
* @example
|
||||||
* hash.base64();
|
* hash.base64();
|
||||||
*/
|
*/
|
||||||
Md5.prototype.base64 = function () {
|
/* istanbul ignore else */
|
||||||
var v1, v2, v3, base64Str = '', bytes = this.array();
|
if (FEATURE_BASE64) {
|
||||||
for (var i = 0; i < 15;) {
|
Md5.prototype.base64 = function () {
|
||||||
v1 = bytes[i++];
|
var v1, v2, v3, base64Str = '', bytes = this.array();
|
||||||
v2 = bytes[i++];
|
for (var i = 0; i < 15;) {
|
||||||
v3 = bytes[i++];
|
v1 = bytes[i++];
|
||||||
|
v2 = bytes[i++];
|
||||||
|
v3 = bytes[i++];
|
||||||
|
base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] +
|
||||||
|
BASE64_ENCODE_CHAR[(v1 << 4 | v2 >>> 4) & 63] +
|
||||||
|
BASE64_ENCODE_CHAR[(v2 << 2 | v3 >>> 6) & 63] +
|
||||||
|
BASE64_ENCODE_CHAR[v3 & 63];
|
||||||
|
}
|
||||||
|
v1 = bytes[i];
|
||||||
base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] +
|
base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] +
|
||||||
BASE64_ENCODE_CHAR[(v1 << 4 | v2 >>> 4) & 63] +
|
BASE64_ENCODE_CHAR[(v1 << 4) & 63] +
|
||||||
BASE64_ENCODE_CHAR[(v2 << 2 | v3 >>> 6) & 63] +
|
'==';
|
||||||
BASE64_ENCODE_CHAR[v3 & 63];
|
return base64Str;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* HmacMd5 class
|
||||||
|
* @class HmacMd5
|
||||||
|
* @extends Md5
|
||||||
|
* @description This is internal class.
|
||||||
|
* @see {@link md5.hmac.create}
|
||||||
|
*/
|
||||||
|
function HmacMd5(key, sharedMemory) {
|
||||||
|
var i, result = formatMessage(key);
|
||||||
|
key = result[0];
|
||||||
|
if (result[1]) {
|
||||||
|
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;
|
||||||
}
|
}
|
||||||
v1 = bytes[i];
|
|
||||||
base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] +
|
if (key.length > 64) {
|
||||||
BASE64_ENCODE_CHAR[(v1 << 4) & 63] +
|
key = (new Md5(true)).update(key).array();
|
||||||
'==';
|
}
|
||||||
return base64Str;
|
|
||||||
};
|
var oKeyPad = [], iKeyPad = [];
|
||||||
|
for (i = 0; i < 64; ++i) {
|
||||||
|
var b = key[i] || 0;
|
||||||
|
oKeyPad[i] = 0x5c ^ b;
|
||||||
|
iKeyPad[i] = 0x36 ^ b;
|
||||||
|
}
|
||||||
|
|
||||||
|
Md5.call(this, sharedMemory);
|
||||||
|
|
||||||
|
this.update(iKeyPad);
|
||||||
|
this.oKeyPad = oKeyPad;
|
||||||
|
this.inner = true;
|
||||||
|
this.sharedMemory = sharedMemory;
|
||||||
|
}
|
||||||
|
/* istanbul ignore else */
|
||||||
|
if (FEATURE_HMAC) {
|
||||||
|
HmacMd5.prototype = new Md5();
|
||||||
|
|
||||||
|
HmacMd5.prototype.finalize = function () {
|
||||||
|
Md5.prototype.finalize.call(this);
|
||||||
|
if (this.inner) {
|
||||||
|
this.inner = false;
|
||||||
|
var innerHash = this.array();
|
||||||
|
Md5.call(this, this.sharedMemory);
|
||||||
|
this.update(this.oKeyPad);
|
||||||
|
this.update(innerHash);
|
||||||
|
Md5.prototype.finalize.call(this);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
var exports = createMethod();
|
var exports = createMethod();
|
||||||
|
exports.md5 = exports;
|
||||||
|
/* istanbul ignore else */
|
||||||
|
if (FEATURE_HMAC) {
|
||||||
|
exports.md5.hmac = createHmacMethod();
|
||||||
|
}
|
||||||
|
|
||||||
if (COMMON_JS) {
|
if (COMMON_JS) {
|
||||||
module.exports = exports;
|
module.exports = exports;
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
import md5 from './md5.js';
|
||||||
|
|
||||||
|
export { md5 };
|
||||||
|
export default md5;
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
var expect = require('expect.js');
|
||||||
|
var fs = require('fs');
|
||||||
|
var vm = require('vm');
|
||||||
|
|
||||||
|
var EXPECTED_MD5 = '900150983cd24fb0d6963f7d28e17f72';
|
||||||
|
var EXPECTED_HMAC = 'd2fe98063f876b03193afb49b4979591';
|
||||||
|
|
||||||
|
var load = function (file) {
|
||||||
|
delete require.cache[require.resolve(file)];
|
||||||
|
return require(file);
|
||||||
|
};
|
||||||
|
|
||||||
|
var testCore = function (md5) {
|
||||||
|
expect(md5('abc')).to.be(EXPECTED_MD5);
|
||||||
|
expect(md5.create().update('a').update('bc').hex()).to.be(EXPECTED_MD5);
|
||||||
|
expect(md5.array('abc')).to.have.length(16);
|
||||||
|
expect(md5.digest('abc')).to.have.length(16);
|
||||||
|
expect(md5.arrayBuffer('abc').byteLength).to.be(16);
|
||||||
|
};
|
||||||
|
|
||||||
|
var loadBrowser = function (file) {
|
||||||
|
var context = {
|
||||||
|
window: {},
|
||||||
|
ArrayBuffer: ArrayBuffer,
|
||||||
|
Uint8Array: Uint8Array,
|
||||||
|
Uint32Array: Uint32Array
|
||||||
|
};
|
||||||
|
vm.runInNewContext(fs.readFileSync(file, 'utf8'), context);
|
||||||
|
return context.md5 || context.window.md5;
|
||||||
|
};
|
||||||
|
|
||||||
|
var legacy = load('../build/md5.min.js');
|
||||||
|
testCore(legacy);
|
||||||
|
expect(legacy.base64).to.be.a('function');
|
||||||
|
expect(legacy.buffer).to.be.a('function');
|
||||||
|
expect(legacy.hmac('key', 'abc')).to.be(EXPECTED_HMAC);
|
||||||
|
|
||||||
|
var modern = load('../build/md5.modern.min.js');
|
||||||
|
testCore(modern);
|
||||||
|
expect(modern.base64).to.be.a('function');
|
||||||
|
expect(modern.buffer).to.be.a('function');
|
||||||
|
expect(modern.hmac('key', 'abc')).to.be(EXPECTED_HMAC);
|
||||||
|
|
||||||
|
var lite = load('../build/md5-lite.min.js');
|
||||||
|
testCore(lite);
|
||||||
|
expect(lite.base64).to.be(undefined);
|
||||||
|
expect(lite.buffer).to.be(undefined);
|
||||||
|
expect(lite.hmac).to.be(undefined);
|
||||||
|
|
||||||
|
testCore(load('../build/md5.js'));
|
||||||
|
testCore(load('../build/md5.modern.js'));
|
||||||
|
testCore(load('../build/md5-lite.js'));
|
||||||
|
testCore(loadBrowser('build/md5.modern.min.js'));
|
||||||
|
var browserLite = loadBrowser('build/md5-lite.min.js');
|
||||||
|
testCore(browserLite);
|
||||||
|
expect(browserLite.base64).to.be(undefined);
|
||||||
|
expect(browserLite.buffer).to.be(undefined);
|
||||||
|
expect(browserLite.hmac).to.be(undefined);
|
||||||
|
|
||||||
|
console.log('Build variants: PASS');
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
import expect from 'expect.js';
|
||||||
|
import md5, {md5 as namedMd5} from 'js-md5';
|
||||||
|
import browserMd5 from 'js-md5/build/md5.mjs';
|
||||||
|
import minBrowserMd5 from 'js-md5/build/md5.min.mjs';
|
||||||
|
import modernMd5 from 'js-md5/build/md5.modern.mjs';
|
||||||
|
import minModernMd5 from 'js-md5/build/md5.modern.min.mjs';
|
||||||
|
import liteMd5 from 'js-md5/build/md5-lite.mjs';
|
||||||
|
import minLiteMd5 from 'js-md5/build/md5-lite.min.mjs';
|
||||||
|
|
||||||
|
const EXPECTED_MD5 = '900150983cd24fb0d6963f7d28e17f72';
|
||||||
|
|
||||||
|
[md5, namedMd5, browserMd5, minBrowserMd5, modernMd5, minModernMd5,
|
||||||
|
liteMd5, minLiteMd5].forEach(hash => {
|
||||||
|
expect(hash('abc')).to.be(EXPECTED_MD5);
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(md5.hmac).to.be.a('function');
|
||||||
|
expect(browserMd5.hmac).to.be.a('function');
|
||||||
|
expect(modernMd5.hmac).to.be.a('function');
|
||||||
|
expect(liteMd5.hmac).to.be(undefined);
|
||||||
|
expect(liteMd5.base64).to.be(undefined);
|
||||||
|
expect(liteMd5.buffer).to.be(undefined);
|
||||||
|
|
||||||
|
console.log('ESM imports: PASS');
|
||||||
@@ -0,0 +1,202 @@
|
|||||||
|
(function (md5) {
|
||||||
|
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 = {
|
||||||
|
md5_hmac: {
|
||||||
|
'Test Vectors': {
|
||||||
|
'9294727a3638bb1c13f48ef8158bfc9d': [
|
||||||
|
[0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b],
|
||||||
|
'Hi There'
|
||||||
|
],
|
||||||
|
'750c783e6ab0b503eaa86e310a5db738': [
|
||||||
|
'Jefe',
|
||||||
|
'what do ya want for nothing?'
|
||||||
|
],
|
||||||
|
'56be34521d144c88dbb8c733f0e8b3f6': [
|
||||||
|
[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]
|
||||||
|
],
|
||||||
|
'697eaf0aca3a3aea3a75164746ffaa79': [
|
||||||
|
[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]
|
||||||
|
],
|
||||||
|
'56461ef2342edc00f9bab995690efd4c': [
|
||||||
|
[0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c],
|
||||||
|
'Test With Truncation'
|
||||||
|
],
|
||||||
|
'6b1ab7fe4bd7bf8f0b62e6ce61b9d0cd': [
|
||||||
|
[0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 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'
|
||||||
|
],
|
||||||
|
'6f630fad67cda0ee1fb1f562db3aa53e': [
|
||||||
|
[0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 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 and Larger Than One Block-Size Data'
|
||||||
|
]
|
||||||
|
},
|
||||||
|
'UTF8': {
|
||||||
|
'05fe3b294344f4e93c811e10f9825a38': ['中文', '中文'],
|
||||||
|
'c1bc6df91f38e6332b8562324005103d': ['aécio', 'aécio'],
|
||||||
|
'14eef78533c35078177d11fb4593a19e': ['𠜎', '𠜎']
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!(typeof JS_MD5_NO_ARRAY_BUFFER === 'boolean' && JS_MD5_NO_ARRAY_BUFFER)) {
|
||||||
|
testCases.md5_hmac.Uint8Array = {
|
||||||
|
'72c33c78cac0b7a581ac263a344ed01d': [
|
||||||
|
new Uint8Array(0),
|
||||||
|
'Hi There'
|
||||||
|
]
|
||||||
|
};
|
||||||
|
testCases.md5_hmac.ArrayBuffer = {
|
||||||
|
'72c33c78cac0b7a581ac263a344ed01d': [
|
||||||
|
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();
|
||||||
|
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('md5_hmac', md5.hmac);
|
||||||
|
})(md5);
|
||||||
@@ -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();
|
||||||
|
|||||||
+32
-2
@@ -1,9 +1,10 @@
|
|||||||
expect = require('expect.js');
|
expect = require('expect.js');
|
||||||
Worker = require('webworker-threads').Worker;
|
Worker = require("tiny-worker");
|
||||||
|
|
||||||
function unset() {
|
function unset() {
|
||||||
delete require.cache[require.resolve('../src/md5.js')];
|
delete require.cache[require.resolve('../src/md5.js')];
|
||||||
delete require.cache[require.resolve('./test.js')];
|
delete require.cache[require.resolve('./test.js')];
|
||||||
|
delete require.cache[require.resolve('./hmac-test.js')];
|
||||||
md5 = null;
|
md5 = null;
|
||||||
BUFFER = undefined;
|
BUFFER = undefined;
|
||||||
JS_MD5_NO_WINDOW = undefined;
|
JS_MD5_NO_WINDOW = undefined;
|
||||||
@@ -17,6 +18,7 @@ function unset() {
|
|||||||
function runCommonJsTest() {
|
function runCommonJsTest() {
|
||||||
md5 = require('../src/md5.js');
|
md5 = require('../src/md5.js');
|
||||||
require('./test.js');
|
require('./test.js');
|
||||||
|
require('./hmac-test.js');
|
||||||
unset();
|
unset();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -24,15 +26,41 @@ function runWindowTest() {
|
|||||||
window = global;
|
window = global;
|
||||||
require('../src/md5.js');
|
require('../src/md5.js');
|
||||||
require('./test.js');
|
require('./test.js');
|
||||||
|
require('./hmac-test.js');
|
||||||
unset();
|
unset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function runBrowserWithProcessPolyfillTest() {
|
||||||
|
var Module = require('module');
|
||||||
|
var originalRequire = Module.prototype.require;
|
||||||
|
window = global;
|
||||||
|
Module.prototype.require = function (id) {
|
||||||
|
if (id === 'crypto' || id === 'buffer') {
|
||||||
|
throw new Error('Node.js module loaded in browser environment');
|
||||||
|
}
|
||||||
|
return originalRequire.apply(this, arguments);
|
||||||
|
};
|
||||||
|
try {
|
||||||
|
runCommonJsTest();
|
||||||
|
} finally {
|
||||||
|
Module.prototype.require = originalRequire;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Node.js env
|
// Node.js env
|
||||||
BUFFER = true;
|
BUFFER = true;
|
||||||
runCommonJsTest();
|
runCommonJsTest();
|
||||||
|
|
||||||
|
// Node.js env, no Buffer.from
|
||||||
|
JS_MD5_NO_BUFFER_FROM = true
|
||||||
|
runCommonJsTest();
|
||||||
|
|
||||||
|
// browser env with a Node.js process polyfill
|
||||||
|
runBrowserWithProcessPolyfillTest();
|
||||||
|
|
||||||
// Webpack browser env
|
// Webpack browser env
|
||||||
JS_MD5_NO_NODE_JS = true;
|
JS_MD5_NO_NODE_JS = true;
|
||||||
|
window = global;
|
||||||
runCommonJsTest();
|
runCommonJsTest();
|
||||||
|
|
||||||
// browser env
|
// browser env
|
||||||
@@ -59,6 +87,7 @@ window = global;
|
|||||||
define = function (func) {
|
define = function (func) {
|
||||||
md5 = func();
|
md5 = func();
|
||||||
require('./test.js');
|
require('./test.js');
|
||||||
|
require('./hmac-test.js');
|
||||||
};
|
};
|
||||||
define.amd = true;
|
define.amd = true;
|
||||||
|
|
||||||
@@ -74,12 +103,13 @@ require('./worker-test.js');
|
|||||||
delete require.cache[require.resolve('./worker-test.js')];
|
delete require.cache[require.resolve('./worker-test.js')];
|
||||||
|
|
||||||
// cover webworker
|
// cover webworker
|
||||||
|
WorkerGlobalScope = function () { }
|
||||||
JS_MD5_NO_WINDOW = true;
|
JS_MD5_NO_WINDOW = true;
|
||||||
JS_MD5_NO_NODE_JS = true;
|
JS_MD5_NO_NODE_JS = true;
|
||||||
WORKER = './worker.js';
|
WORKER = './worker.js';
|
||||||
SOURCE = '../src/md5.js';
|
SOURCE = '../src/md5.js';
|
||||||
window = global;
|
window = global;
|
||||||
self = global;
|
self = new WorkerGlobalScope();
|
||||||
|
|
||||||
Worker = function (file) {
|
Worker = function (file) {
|
||||||
require(file);
|
require(file);
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
mocha.setup('bdd');
|
mocha.setup('bdd');
|
||||||
require(['../src/md5.js'], function (md5) {
|
require(['../src/md5.js'], function (md5) {
|
||||||
window.md5 = md5;
|
window.md5 = md5;
|
||||||
require(['test.js'], function () {
|
require(['test.js', 'hmac-test.js'], function () {
|
||||||
mocha.checkLeaks();
|
mocha.checkLeaks();
|
||||||
mocha.run();
|
mocha.run();
|
||||||
});
|
});
|
||||||
|
|||||||
+19
-4
@@ -96,8 +96,8 @@
|
|||||||
|
|
||||||
if (typeof BUFFER === 'boolean' && BUFFER) {
|
if (typeof BUFFER === 'boolean' && BUFFER) {
|
||||||
testCases['Buffer'] = {
|
testCases['Buffer'] = {
|
||||||
'd41d8cd98f00b204e9800998ecf8427e': new Buffer(0),
|
'd41d8cd98f00b204e9800998ecf8427e': Buffer.from([]),
|
||||||
'9e107d9d372bb6826bd81d3542a419d6': 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]))
|
'9e107d9d372bb6826bd81d3542a419d6': 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]))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -186,7 +186,6 @@
|
|||||||
call: function (message) {
|
call: function (message) {
|
||||||
var hash = md5.update(message);
|
var hash = md5.update(message);
|
||||||
hash.hex();
|
hash.hex();
|
||||||
hash.update(message);
|
|
||||||
return hash.hex();
|
return hash.hex();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -241,8 +240,24 @@
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
|
||||||
|
|
||||||
|
context('when update after finalize', function () {
|
||||||
|
it('should throw error', function () {
|
||||||
|
expect(function () {
|
||||||
|
var hash = md5.update('any');
|
||||||
|
hash.hex();
|
||||||
|
hash.update('any');
|
||||||
|
}).to.throwError(/finalize already called/);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
context('when large size', function () {
|
||||||
|
var hash = md5.create();
|
||||||
|
hash.bytes = 4294967295;
|
||||||
|
hash.update('any');
|
||||||
|
expect(hash.hBytes).to.be(1);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('#bas64', function () {
|
describe('#bas64', function () {
|
||||||
for (var testCaseName in base64TestCases) {
|
for (var testCaseName in base64TestCases) {
|
||||||
|
|||||||
@@ -11,6 +11,9 @@
|
|||||||
var worker = new Worker(WORKER);
|
var worker = new Worker(WORKER);
|
||||||
worker.onmessage = function(event) {
|
worker.onmessage = function(event) {
|
||||||
expect(event.data).to.be(hash);
|
expect(event.data).to.be(hash);
|
||||||
|
if (worker.terminate) {
|
||||||
|
worker.terminate();
|
||||||
|
}
|
||||||
done();
|
done();
|
||||||
};
|
};
|
||||||
worker.postMessage(SOURCE);
|
worker.postMessage(SOURCE);
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
</script>
|
</script>
|
||||||
<script src="worker-test.js"></script>
|
<script src="worker-test.js"></script>
|
||||||
<script>
|
<script>
|
||||||
mocha.checkLeaks();
|
|
||||||
mocha.run();
|
mocha.run();
|
||||||
</script>
|
</script>
|
||||||
<script>
|
<script>
|
||||||
|
|||||||
Reference in New Issue
Block a user