You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
2.2 KiB
66 lines
2.2 KiB
2 years ago
|
'use strict';
|
||
|
|
||
|
var crypto = require('crypto');
|
||
|
|
||
|
var Encryptor = {
|
||
|
/**
|
||
|
* Calculate a hash of the concatenated buffers with the given algorithm.
|
||
|
* @param {string} algorithm - The hash algorithm.
|
||
|
* @returns {Buffer} The hash
|
||
|
*/
|
||
|
hash: function hash(algorithm) {
|
||
|
var hash = crypto.createHash(algorithm);
|
||
|
|
||
|
for (var _len = arguments.length, buffers = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
||
|
buffers[_key - 1] = arguments[_key];
|
||
|
}
|
||
|
|
||
|
hash.update(Buffer.concat(buffers));
|
||
|
return hash.digest();
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Convert a password into an encryption key
|
||
|
* @param {string} password - The password
|
||
|
* @param {string} hashAlgorithm - The hash algoritm
|
||
|
* @param {string} saltValue - The salt value
|
||
|
* @param {number} spinCount - The spin count
|
||
|
* @param {number} keyBits - The length of the key in bits
|
||
|
* @param {Buffer} blockKey - The block key
|
||
|
* @returns {Buffer} The encryption key
|
||
|
*/
|
||
|
convertPasswordToHash: function convertPasswordToHash(password, hashAlgorithm, saltValue, spinCount) {
|
||
|
hashAlgorithm = hashAlgorithm.toLowerCase();
|
||
|
var hashes = crypto.getHashes();
|
||
|
|
||
|
if (hashes.indexOf(hashAlgorithm) < 0) {
|
||
|
throw new Error("Hash algorithm '".concat(hashAlgorithm, "' not supported!"));
|
||
|
} // Password must be in unicode buffer
|
||
|
|
||
|
|
||
|
var passwordBuffer = Buffer.from(password, 'utf16le'); // Generate the initial hash
|
||
|
|
||
|
var key = this.hash(hashAlgorithm, Buffer.from(saltValue, 'base64'), passwordBuffer); // Now regenerate until spin count
|
||
|
|
||
|
for (var i = 0; i < spinCount; i++) {
|
||
|
var iterator = Buffer.alloc(4); // this is the 'special' element of Excel password hashing
|
||
|
// that stops us from using crypto.pbkdf2()
|
||
|
|
||
|
iterator.writeUInt32LE(i, 0);
|
||
|
key = this.hash(hashAlgorithm, key, iterator);
|
||
|
}
|
||
|
|
||
|
return key.toString('base64');
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Generates cryptographically strong pseudo-random data.
|
||
|
* @param size The size argument is a number indicating the number of bytes to generate.
|
||
|
*/
|
||
|
randomBytes: function randomBytes(size) {
|
||
|
return crypto.randomBytes(size);
|
||
|
}
|
||
|
};
|
||
|
module.exports = Encryptor;
|
||
|
//# sourceMappingURL=encryptor.js.map
|