keyvenant
Version:
Keyvenant is a JavaScript tool to generate and export CovenantSQL keys to facilitate key management locally and in web extensions.
62 lines • 4.47 kB
JavaScript
import { string2Buffer } from './utils';
import crypto from './utils/crypto';
/**
* symmetric encryption
* @param plaintext input text to be encrypted
* @param key serectKey string in hex (16 btyes)
* @param iv iv string in hex (16 btyes because of AES 128bit blocksize)
* @param algo='aes256' symmetric encryption algo, defualt is AES256
* @return encrypted ciphertext in hex (48 btyes)
*/
export function encrypt(plaintext, key, iv, algo = 'aes256') {
if (!isCipherAvailable(algo)) {
throw new Error('crypto cipher ' + algo + ' is not available');
}
// cipher, default as AES256
const cipher = crypto.createCipheriv(algo, string2Buffer(key), string2Buffer(iv));
// encrypt plaintext buffer
const firstHalf = cipher.update(string2Buffer(plaintext));
const lastHalf = cipher.final();
const encrypted = Buffer.concat([firstHalf, lastHalf]);
return encrypted.toString('hex');
}
/**
* symmetric decryption
* @param encrypted encrypted ciphertext in hex (48 btyes)
* @param key serectKey string in hex (16 btyes)
* @param iv iv string in hex (16 btyes because of AES 128bit blocksize)
* @param algo='aes256' symmetric encryption algo, defualt is AES256
* @return decrypted text in hex
*/
export function decrypt(encrypted, // 48 bytes
key, // derivedKey 16 bytes
iv, // 16 btyes
algo = 'aes256') {
if (!isCipherAvailable(algo)) {
throw new Error('crypto cipher ' + algo + ' is not available');
}
// decipher
const decipher = crypto.createDecipheriv(algo, string2Buffer(key), string2Buffer(iv));
// decrypted plaintext buffer
const plaintext = decipher.update(string2Buffer(encrypted));
// return Buffer or string
return plaintext.toString('hex');
}
/**
* randomly generate iv
* @param length default length is 16 btyes because of AES 128bit blocksize
* @return iv in hex
*/
export function generateIv(length = 16) {
let iv = crypto.randomBytes(length);
return iv.toString('hex');
}
/**
* check cipher availablility
* @param algo [description]
* @return boolean of cipher availablility
*/
function isCipherAvailable(algo) {
return crypto.getCiphers().some(cipher => { return cipher === algo; });
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ltbWV0cmljLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9zeW1tZXRyaWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUN2QyxPQUFPLE1BQU0sTUFBTSxnQkFBZ0IsQ0FBQTtBQUVuQzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLE9BQU8sQ0FDckIsU0FBaUIsRUFDakIsR0FBVyxFQUNYLEVBQVUsRUFDVixJQUFJLEdBQUcsUUFBUTtJQUVmLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLGdCQUFnQixHQUFHLElBQUksR0FBRyxtQkFBbUIsQ0FBQyxDQUFBO0tBQy9EO0lBQ0QsNEJBQTRCO0lBQzVCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUVqRiwyQkFBMkI7SUFDM0IsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQTtJQUN6RCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUE7SUFDL0IsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFBO0lBRXRELE9BQU8sU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUNsQyxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxPQUFPLENBQ3JCLFNBQWlCLEVBQUUsV0FBVztBQUM5QixHQUFXLEVBQUUsc0JBQXNCO0FBQ25DLEVBQVUsRUFBRSxXQUFXO0FBQ3ZCLElBQUksR0FBRyxRQUFRO0lBRWYsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUFFO1FBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLG1CQUFtQixDQUFDLENBQUE7S0FDL0Q7SUFFRCxXQUFXO0lBQ1gsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsR0FBRyxDQUFDLEVBQUUsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDckYsNkJBQTZCO0lBQzdCLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUE7SUFFM0QsMEJBQTBCO0lBQzFCLE9BQU8sU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUNsQyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxVQUFVLENBQ3hCLE1BQU0sR0FBRyxFQUFFO0lBRVgsSUFBSSxFQUFFLEdBQVcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUUzQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDM0IsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGlCQUFpQixDQUN4QixJQUFZO0lBRVosT0FBTyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsT0FBTyxNQUFNLEtBQUssSUFBSSxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDdkUsQ0FBQyJ9