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
			| 
								 
											3 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
							 |