@codingtools/cdt
Version:
CLI for Developers
98 lines • 4.78 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const command_1 = require("@oclif/command");
const crypto_js_1 = tslib_1.__importDefault(require("crypto-js"));
const logger_1 = tslib_1.__importDefault(require("../utilities/logger"));
const utilities_1 = tslib_1.__importDefault(require("../utilities/utilities"));
class Crypto extends command_1.Command {
//need INPUT_STRING, TYPE_OF_CRYPTO , KEY, MODE
async run() {
const { args, flags } = this.parse(Crypto);
args.string = utilities_1.default.getInputString(this, flags, args); //always add input to args
args.type = flags.encryption ? flags.encryption : flags.decryption; //type like AES,DES
this.checkParameters(flags, args);
return flags.encryption ? this.Encrypt(flags, args) : this.Decrypt(flags, args);
}
Encrypt(flags, args) {
let crypto = this.getCryptoType(args.type);
logger_1.default.info(this, `Encryption: ${flags.encryption.toUpperCase()}`);
// @ts-ignore // as crypto will never be undefined and reach here
let encrypted = crypto.encrypt(args.string, flags.key, {
mode: this.getCryptoMode(flags)
}).toString();
logger_1.default.success(this, `${encrypted}`);
return encrypted;
}
Decrypt(flags, args) {
let crypto = this.getCryptoType(args.type);
logger_1.default.info(this, `Decryption: ${flags.decryption.toUpperCase()}`);
// @ts-ignore // as crypto will never be undefined and reach here
let decrypted = crypto.decrypt(args.string, flags.key, {
mode: this.getCryptoMode(flags)
}).toString(crypto_js_1.default.enc.Utf8);
logger_1.default.success(this, `${decrypted}`);
return decrypted;
}
getCryptoType(type) {
switch (type.toUpperCase()) {
case 'AES':
return crypto_js_1.default.AES;
case 'DES':
return crypto_js_1.default.DES;
case '3DES':
return crypto_js_1.default.TripleDES;
case 'RABBIT':
return crypto_js_1.default.Rabbit;
case 'RC4':
return crypto_js_1.default.RC4;
case 'RC4DROP':
return crypto_js_1.default.RC4Drop;
default:
logger_1.default.error(this, 'Invalid or Unsupported Encryption/Decryption type');
}
}
// to check required parameters passed or not
checkParameters(flags, args) {
if (!flags.key)
logger_1.default.error(this, 'Key is not passed');
if (args.string === undefined || args.string === '')
logger_1.default.error(this, 'Input string is empty or undefined');
if (flags.encryption && flags.decryption)
logger_1.default.error(this, 'Both encryption and decryption methods passed');
if (!(flags.encryption || flags.decryption))
logger_1.default.error(this, 'Neither encryption or decryption methods passed');
}
getCryptoMode(flags) {
if (!flags.mode) //set default
flags.mode = 'CBC'; // it will not set to flags.mode there in run() but we do not require it
logger_1.default.info(this, 'Block Mode: ' + flags.mode);
switch (flags.mode.toUpperCase()) {
case 'CBC':
return crypto_js_1.default.mode.CBC;
case 'CFB':
return crypto_js_1.default.mode.CFB;
case 'OFB':
return crypto_js_1.default.mode.OFB;
case 'ECB':
return crypto_js_1.default.mode.ECB;
default:
logger_1.default.error(this, 'Invalid or Unsupported Block Mode');
}
}
}
exports.default = Crypto;
Crypto.ENCRYPTION = 'encryption';
Crypto.DECRYPTION = 'decryption';
Crypto.description = 'Encryption and Decryption functionality for File/String';
Crypto.flags = {
help: command_1.flags.help({ char: 'h' }),
encryption: command_1.flags.string({ char: 'e', description: 'encryption type, Supported [AES, DES, 3DES, Rabbit, RC4, RC4Drop]' }),
decryption: command_1.flags.string({ char: 'd', description: 'decryption type, Supported [AES, DES, 3DES, Rabbit, RC4, RC4Drop]' }),
string: command_1.flags.string({ char: 's', description: 'string to be encrypted/decrypted' }),
file: command_1.flags.string({ char: 'f', description: 'file to be encrypted/decrypted' }),
key: command_1.flags.string({ char: 'k', description: 'key for encryption/decryption' }),
mode: command_1.flags.string({ char: 'm', description: 'Block Mode, Supported [CBC, CFB, CTR, OFB, ECB]' })
};
Crypto.args = [{ name: 'string' }];
//# sourceMappingURL=crypto.js.map