initial commit
This commit is contained in:
122
node_modules/pbkdf2/lib/async.js
generated
vendored
Normal file
122
node_modules/pbkdf2/lib/async.js
generated
vendored
Normal file
@@ -0,0 +1,122 @@
|
||||
'use strict';
|
||||
|
||||
var Buffer = require('safe-buffer').Buffer;
|
||||
|
||||
var checkParameters = require('./precondition');
|
||||
var defaultEncoding = require('./default-encoding');
|
||||
var sync = require('./sync');
|
||||
var toBuffer = require('./to-buffer');
|
||||
|
||||
var ZERO_BUF;
|
||||
var subtle = global.crypto && global.crypto.subtle;
|
||||
var toBrowser = {
|
||||
sha: 'SHA-1',
|
||||
'sha-1': 'SHA-1',
|
||||
sha1: 'SHA-1',
|
||||
sha256: 'SHA-256',
|
||||
'sha-256': 'SHA-256',
|
||||
sha384: 'SHA-384',
|
||||
'sha-384': 'SHA-384',
|
||||
'sha-512': 'SHA-512',
|
||||
sha512: 'SHA-512'
|
||||
};
|
||||
var checks = [];
|
||||
var nextTick;
|
||||
function getNextTick() {
|
||||
if (nextTick) {
|
||||
return nextTick;
|
||||
}
|
||||
if (global.process && global.process.nextTick) {
|
||||
nextTick = global.process.nextTick;
|
||||
} else if (global.queueMicrotask) {
|
||||
nextTick = global.queueMicrotask;
|
||||
} else if (global.setImmediate) {
|
||||
nextTick = global.setImmediate;
|
||||
} else {
|
||||
nextTick = global.setTimeout;
|
||||
}
|
||||
return nextTick;
|
||||
}
|
||||
function browserPbkdf2(password, salt, iterations, length, algo) {
|
||||
return subtle.importKey('raw', password, { name: 'PBKDF2' }, false, ['deriveBits']).then(function (key) {
|
||||
return subtle.deriveBits({
|
||||
name: 'PBKDF2',
|
||||
salt: salt,
|
||||
iterations: iterations,
|
||||
hash: {
|
||||
name: algo
|
||||
}
|
||||
}, key, length << 3);
|
||||
}).then(function (res) {
|
||||
return Buffer.from(res);
|
||||
});
|
||||
}
|
||||
function checkNative(algo) {
|
||||
if (global.process && !global.process.browser) {
|
||||
return Promise.resolve(false);
|
||||
}
|
||||
if (!subtle || !subtle.importKey || !subtle.deriveBits) {
|
||||
return Promise.resolve(false);
|
||||
}
|
||||
if (checks[algo] !== undefined) {
|
||||
return checks[algo];
|
||||
}
|
||||
ZERO_BUF = ZERO_BUF || Buffer.alloc(8);
|
||||
var prom = browserPbkdf2(ZERO_BUF, ZERO_BUF, 10, 128, algo)
|
||||
.then(
|
||||
function () { return true; },
|
||||
function () { return false; }
|
||||
);
|
||||
checks[algo] = prom;
|
||||
return prom;
|
||||
}
|
||||
|
||||
function resolvePromise(promise, callback) {
|
||||
promise.then(function (out) {
|
||||
getNextTick()(function () {
|
||||
callback(null, out);
|
||||
});
|
||||
}, function (e) {
|
||||
getNextTick()(function () {
|
||||
callback(e);
|
||||
});
|
||||
});
|
||||
}
|
||||
module.exports = function (password, salt, iterations, keylen, digest, callback) {
|
||||
if (typeof digest === 'function') {
|
||||
callback = digest;
|
||||
digest = undefined;
|
||||
}
|
||||
|
||||
checkParameters(iterations, keylen);
|
||||
password = toBuffer(password, defaultEncoding, 'Password');
|
||||
salt = toBuffer(salt, defaultEncoding, 'Salt');
|
||||
if (typeof callback !== 'function') {
|
||||
throw new Error('No callback provided to pbkdf2');
|
||||
}
|
||||
|
||||
digest = digest || 'sha1';
|
||||
var algo = toBrowser[digest.toLowerCase()];
|
||||
|
||||
if (!algo || typeof global.Promise !== 'function') {
|
||||
getNextTick()(function () {
|
||||
var out;
|
||||
try {
|
||||
out = sync(password, salt, iterations, keylen, digest);
|
||||
} catch (e) {
|
||||
callback(e);
|
||||
return;
|
||||
}
|
||||
callback(null, out);
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
resolvePromise(checkNative(algo).then(function (resp) {
|
||||
if (resp) {
|
||||
return browserPbkdf2(password, salt, iterations, keylen, algo);
|
||||
}
|
||||
|
||||
return sync(password, salt, iterations, keylen, digest);
|
||||
}), callback);
|
||||
};
|
||||
14
node_modules/pbkdf2/lib/default-encoding.js
generated
vendored
Normal file
14
node_modules/pbkdf2/lib/default-encoding.js
generated
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
'use strict';
|
||||
|
||||
var defaultEncoding;
|
||||
/* istanbul ignore next */
|
||||
if (global.process && global.process.browser) {
|
||||
defaultEncoding = 'utf-8';
|
||||
} else if (global.process && global.process.version) {
|
||||
var pVersionMajor = parseInt(process.version.split('.')[0].slice(1), 10);
|
||||
|
||||
defaultEncoding = pVersionMajor >= 6 ? 'utf-8' : 'binary';
|
||||
} else {
|
||||
defaultEncoding = 'utf-8';
|
||||
}
|
||||
module.exports = defaultEncoding;
|
||||
22
node_modules/pbkdf2/lib/precondition.js
generated
vendored
Normal file
22
node_modules/pbkdf2/lib/precondition.js
generated
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
'use strict';
|
||||
|
||||
var $isFinite = isFinite;
|
||||
var MAX_ALLOC = Math.pow(2, 30) - 1; // default in iojs
|
||||
|
||||
module.exports = function (iterations, keylen) {
|
||||
if (typeof iterations !== 'number') {
|
||||
throw new TypeError('Iterations not a number');
|
||||
}
|
||||
|
||||
if (iterations < 0 || !$isFinite(iterations)) {
|
||||
throw new TypeError('Bad iterations');
|
||||
}
|
||||
|
||||
if (typeof keylen !== 'number') {
|
||||
throw new TypeError('Key length not a number');
|
||||
}
|
||||
|
||||
if (keylen < 0 || keylen > MAX_ALLOC || keylen !== keylen) { /* eslint no-self-compare: 0 */
|
||||
throw new TypeError('Bad key length');
|
||||
}
|
||||
};
|
||||
131
node_modules/pbkdf2/lib/sync-browser.js
generated
vendored
Normal file
131
node_modules/pbkdf2/lib/sync-browser.js
generated
vendored
Normal file
@@ -0,0 +1,131 @@
|
||||
'use strict';
|
||||
|
||||
var md5 = require('create-hash/md5');
|
||||
var RIPEMD160 = require('ripemd160');
|
||||
var sha = require('sha.js');
|
||||
var Buffer = require('safe-buffer').Buffer;
|
||||
|
||||
var checkParameters = require('./precondition');
|
||||
var defaultEncoding = require('./default-encoding');
|
||||
var toBuffer = require('./to-buffer');
|
||||
|
||||
var ZEROS = Buffer.alloc(128);
|
||||
var sizes = {
|
||||
__proto__: null,
|
||||
md5: 16,
|
||||
sha1: 20,
|
||||
sha224: 28,
|
||||
sha256: 32,
|
||||
sha384: 48,
|
||||
sha512: 64,
|
||||
'sha512-256': 32,
|
||||
ripemd160: 20,
|
||||
rmd160: 20
|
||||
};
|
||||
|
||||
var mapping = {
|
||||
__proto__: null,
|
||||
'sha-1': 'sha1',
|
||||
'sha-224': 'sha224',
|
||||
'sha-256': 'sha256',
|
||||
'sha-384': 'sha384',
|
||||
'sha-512': 'sha512',
|
||||
'ripemd-160': 'ripemd160'
|
||||
};
|
||||
|
||||
function rmd160Func(data) {
|
||||
return new RIPEMD160().update(data).digest();
|
||||
}
|
||||
|
||||
function getDigest(alg) {
|
||||
function shaFunc(data) {
|
||||
return sha(alg).update(data).digest();
|
||||
}
|
||||
|
||||
if (alg === 'rmd160' || alg === 'ripemd160') {
|
||||
return rmd160Func;
|
||||
}
|
||||
if (alg === 'md5') {
|
||||
return md5;
|
||||
}
|
||||
return shaFunc;
|
||||
}
|
||||
|
||||
function Hmac(alg, key, saltLen) {
|
||||
var hash = getDigest(alg);
|
||||
var blocksize = alg === 'sha512' || alg === 'sha384' ? 128 : 64;
|
||||
|
||||
if (key.length > blocksize) {
|
||||
key = hash(key);
|
||||
} else if (key.length < blocksize) {
|
||||
key = Buffer.concat([key, ZEROS], blocksize);
|
||||
}
|
||||
|
||||
var ipad = Buffer.allocUnsafe(blocksize + sizes[alg]);
|
||||
var opad = Buffer.allocUnsafe(blocksize + sizes[alg]);
|
||||
for (var i = 0; i < blocksize; i++) {
|
||||
ipad[i] = key[i] ^ 0x36;
|
||||
opad[i] = key[i] ^ 0x5C;
|
||||
}
|
||||
|
||||
var ipad1 = Buffer.allocUnsafe(blocksize + saltLen + 4);
|
||||
ipad.copy(ipad1, 0, 0, blocksize);
|
||||
this.ipad1 = ipad1;
|
||||
this.ipad2 = ipad;
|
||||
this.opad = opad;
|
||||
this.alg = alg;
|
||||
this.blocksize = blocksize;
|
||||
this.hash = hash;
|
||||
this.size = sizes[alg];
|
||||
}
|
||||
|
||||
Hmac.prototype.run = function (data, ipad) {
|
||||
data.copy(ipad, this.blocksize);
|
||||
var h = this.hash(ipad);
|
||||
h.copy(this.opad, this.blocksize);
|
||||
return this.hash(this.opad);
|
||||
};
|
||||
|
||||
function pbkdf2(password, salt, iterations, keylen, digest) {
|
||||
checkParameters(iterations, keylen);
|
||||
password = toBuffer(password, defaultEncoding, 'Password');
|
||||
salt = toBuffer(salt, defaultEncoding, 'Salt');
|
||||
|
||||
var lowerDigest = (digest || 'sha1').toLowerCase();
|
||||
var mappedDigest = mapping[lowerDigest] || lowerDigest;
|
||||
var size = sizes[mappedDigest];
|
||||
if (typeof size !== 'number' || !size) {
|
||||
throw new TypeError('Digest algorithm not supported: ' + digest);
|
||||
}
|
||||
|
||||
var hmac = new Hmac(mappedDigest, password, salt.length);
|
||||
|
||||
var DK = Buffer.allocUnsafe(keylen);
|
||||
var block1 = Buffer.allocUnsafe(salt.length + 4);
|
||||
salt.copy(block1, 0, 0, salt.length);
|
||||
|
||||
var destPos = 0;
|
||||
var hLen = size;
|
||||
var l = Math.ceil(keylen / hLen);
|
||||
|
||||
for (var i = 1; i <= l; i++) {
|
||||
block1.writeUInt32BE(i, salt.length);
|
||||
|
||||
var T = hmac.run(block1, hmac.ipad1);
|
||||
var U = T;
|
||||
|
||||
for (var j = 1; j < iterations; j++) {
|
||||
U = hmac.run(U, hmac.ipad2);
|
||||
for (var k = 0; k < hLen; k++) {
|
||||
T[k] ^= U[k];
|
||||
}
|
||||
}
|
||||
|
||||
T.copy(DK, destPos);
|
||||
destPos += hLen;
|
||||
}
|
||||
|
||||
return DK;
|
||||
}
|
||||
|
||||
module.exports = pbkdf2;
|
||||
73
node_modules/pbkdf2/lib/sync.js
generated
vendored
Normal file
73
node_modules/pbkdf2/lib/sync.js
generated
vendored
Normal file
@@ -0,0 +1,73 @@
|
||||
'use strict';
|
||||
|
||||
var sizes = {
|
||||
__proto__: null,
|
||||
md5: 16,
|
||||
sha1: 20,
|
||||
sha224: 28,
|
||||
sha256: 32,
|
||||
sha384: 48,
|
||||
sha512: 64,
|
||||
'sha512-256': 32,
|
||||
rmd160: 20,
|
||||
ripemd160: 20
|
||||
};
|
||||
|
||||
var mapping = {
|
||||
__proto__: null,
|
||||
'sha-1': 'sha1',
|
||||
'sha-224': 'sha224',
|
||||
'sha-256': 'sha256',
|
||||
'sha-384': 'sha384',
|
||||
'sha-512': 'sha512',
|
||||
'ripemd-160': 'ripemd160'
|
||||
};
|
||||
|
||||
var createHmac = require('create-hmac');
|
||||
var Buffer = require('safe-buffer').Buffer;
|
||||
|
||||
var checkParameters = require('./precondition');
|
||||
var defaultEncoding = require('./default-encoding');
|
||||
var toBuffer = require('./to-buffer');
|
||||
|
||||
function pbkdf2(password, salt, iterations, keylen, digest) {
|
||||
checkParameters(iterations, keylen);
|
||||
password = toBuffer(password, defaultEncoding, 'Password');
|
||||
salt = toBuffer(salt, defaultEncoding, 'Salt');
|
||||
|
||||
var lowerDigest = (digest || 'sha1').toLowerCase();
|
||||
var mappedDigest = mapping[lowerDigest] || lowerDigest;
|
||||
var size = sizes[mappedDigest];
|
||||
if (typeof size !== 'number' || !size) {
|
||||
throw new TypeError('Digest algorithm not supported: ' + digest);
|
||||
}
|
||||
|
||||
var DK = Buffer.allocUnsafe(keylen);
|
||||
var block1 = Buffer.allocUnsafe(salt.length + 4);
|
||||
salt.copy(block1, 0, 0, salt.length);
|
||||
|
||||
var destPos = 0;
|
||||
var hLen = size;
|
||||
var l = Math.ceil(keylen / hLen);
|
||||
|
||||
for (var i = 1; i <= l; i++) {
|
||||
block1.writeUInt32BE(i, salt.length);
|
||||
|
||||
var T = createHmac(mappedDigest, password).update(block1).digest();
|
||||
var U = T;
|
||||
|
||||
for (var j = 1; j < iterations; j++) {
|
||||
U = createHmac(mappedDigest, password).update(U).digest();
|
||||
for (var k = 0; k < hLen; k++) {
|
||||
T[k] ^= U[k];
|
||||
}
|
||||
}
|
||||
|
||||
T.copy(DK, destPos);
|
||||
destPos += hLen;
|
||||
}
|
||||
|
||||
return DK;
|
||||
}
|
||||
|
||||
module.exports = pbkdf2;
|
||||
20
node_modules/pbkdf2/lib/to-buffer.js
generated
vendored
Normal file
20
node_modules/pbkdf2/lib/to-buffer.js
generated
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
'use strict';
|
||||
|
||||
var Buffer = require('safe-buffer').Buffer;
|
||||
var toBuffer = require('to-buffer');
|
||||
|
||||
var useUint8Array = typeof Uint8Array !== 'undefined';
|
||||
var useArrayBuffer = useUint8Array && typeof ArrayBuffer !== 'undefined';
|
||||
var isView = useArrayBuffer && ArrayBuffer.isView;
|
||||
|
||||
module.exports = function (thing, encoding, name) {
|
||||
if (
|
||||
typeof thing === 'string'
|
||||
|| Buffer.isBuffer(thing)
|
||||
|| (useUint8Array && thing instanceof Uint8Array)
|
||||
|| (isView && isView(thing))
|
||||
) {
|
||||
return toBuffer(thing, encoding);
|
||||
}
|
||||
throw new TypeError(name + ' must be a string, a Buffer, a Uint8Array, or a DataView');
|
||||
};
|
||||
Reference in New Issue
Block a user