node-aescrypt
Version:
A node implementation of the AES Crypt <https://www.aescrypt.com/> file encryption format.
61 lines • 5.07 kB
JavaScript
import { createHash, createHmac } from 'crypto';
import { readFileSync } from 'fs';
import { resolve as pathResolve } from 'path';
import { Readable, Writable } from 'stream';
const readPackageJson = (path) => JSON.parse(readFileSync(path, 'utf8'));
const pkg = readPackageJson(pathResolve(__dirname, '../../../package.json'));
export const NAME = pkg.name;
export const VERSION = pkg.version;
export const AESCRYPT_FILE_FORMAT_VERSION = 2;
export function getKey(iv, password) {
// This is a clever trick to do all the hashing rounds into a single buffer.
// Note, sha255 is always 32 bytes and unicode is 2 bytes for each character.
const buffer = Buffer.alloc(32 + password.length * 2);
iv.copy(buffer, 0); // Write the IV.
// Looks like the algorithm expects unicode.
for (let i = 0; i < password.length; ++i) {
buffer.writeUInt8(password.charCodeAt(i) & 0xff, 32 + i * 2);
buffer.writeUInt8(password.charCodeAt(i) >>> 8, 32 + i * 2 + 1);
}
let round = 8192;
while (round--) {
// Hash and feed back into same buffer.
createHash('sha256')
.update(buffer)
.digest()
.copy(buffer, 0);
}
return buffer.slice(0, 32);
}
export function getHMAC(key) {
return createHmac('sha256', key);
}
export function toStream(contents) {
let remaining = contents;
return new Readable({
read(size) {
if (size && size >= remaining.length) {
this.push(remaining);
this.push(null);
}
else {
this.push(remaining.slice(0, size));
remaining = remaining.slice(size);
}
},
});
}
export function withStream(cb) {
const buffers = [];
return new Writable({
write(chunk, _, callback) {
buffers.push(chunk);
callback();
},
final(callback) {
cb(Buffer.concat(buffers));
callback();
},
});
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBUSxNQUFNLFFBQVEsQ0FBQztBQUN0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxPQUFPLElBQUksV0FBVyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRTVDLE1BQU0sZUFBZSxHQUFHLENBQUMsSUFBWSxFQUFFLEVBQUUsQ0FDdkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFFekMsTUFBTSxHQUFHLEdBQUcsZUFBZSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsdUJBQXVCLENBQUMsQ0FBQyxDQUFDO0FBRTdFLE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO0FBQzdCLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDO0FBQ25DLE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUFHLENBQUMsQ0FBQztBQUk5QyxNQUFNLFVBQVUsTUFBTSxDQUFDLEVBQVUsRUFBRSxRQUFnQjtJQUNqRCw0RUFBNEU7SUFDNUUsNkVBQTZFO0lBQzdFLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdEQsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0I7SUFDcEMsNENBQTRDO0lBQzVDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1FBQ3hDLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3RCxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0tBQ2pFO0lBQ0QsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDO0lBQ2pCLE9BQU8sS0FBSyxFQUFFLEVBQUU7UUFDZCx1Q0FBdUM7UUFDdkMsVUFBVSxDQUFDLFFBQVEsQ0FBQzthQUNqQixNQUFNLENBQUMsTUFBTSxDQUFDO2FBQ2QsTUFBTSxFQUFFO2FBQ1IsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztLQUNwQjtJQUNELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDN0IsQ0FBQztBQUVELE1BQU0sVUFBVSxPQUFPLENBQUMsR0FBVztJQUNqQyxPQUFPLFVBQVUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDbkMsQ0FBQztBQUVELE1BQU0sVUFBVSxRQUFRLENBQUMsUUFBeUI7SUFDaEQsSUFBSSxTQUFTLEdBQUcsUUFBUSxDQUFDO0lBQ3pCLE9BQU8sSUFBSSxRQUFRLENBQUM7UUFDbEIsSUFBSSxDQUFDLElBQXdCO1lBQzNCLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxTQUFTLENBQUMsTUFBTSxFQUFFO2dCQUNwQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ2pCO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDcEMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDbkM7UUFDSCxDQUFDO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUdELE1BQU0sVUFBVSxVQUFVLENBQUMsRUFBc0I7SUFDL0MsTUFBTSxPQUFPLEdBQWEsRUFBRSxDQUFDO0lBQzdCLE9BQU8sSUFBSSxRQUFRLENBQUM7UUFDbEIsS0FBSyxDQUFDLEtBQWEsRUFBRSxDQUFDLEVBQUUsUUFBUTtZQUM5QixPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3BCLFFBQVEsRUFBRSxDQUFDO1FBQ2IsQ0FBQztRQUNELEtBQUssQ0FBQyxRQUFRO1lBQ1osRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUMzQixRQUFRLEVBQUUsQ0FBQztRQUNiLENBQUM7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDIn0=