Wrap code into promises to globally catch errors
This commit is contained in:
parent
453a9cee07
commit
1e3d6468d6
29
src/key.js
29
src/key.js
|
@ -933,24 +933,21 @@ export function readArmored(armoredText) {
|
||||||
*/
|
*/
|
||||||
export function generate(options) {
|
export function generate(options) {
|
||||||
var packetlist, secretKeyPacket, userIdPacket, dataToSign, signaturePacket, secretSubkeyPacket, subkeySignaturePacket;
|
var packetlist, secretKeyPacket, userIdPacket, dataToSign, signaturePacket, secretSubkeyPacket, subkeySignaturePacket;
|
||||||
|
return new Promise(resolve => resolve()).then(() => {
|
||||||
|
options.keyType = options.keyType || enums.publicKey.rsa_encrypt_sign;
|
||||||
|
if (options.keyType !== enums.publicKey.rsa_encrypt_sign) { // RSA Encrypt-Only and RSA Sign-Only are deprecated and SHOULD NOT be generated
|
||||||
|
throw new Error('Only RSA Encrypt or Sign supported');
|
||||||
|
}
|
||||||
|
|
||||||
options.keyType = options.keyType || enums.publicKey.rsa_encrypt_sign;
|
if (!options.passphrase) { // Key without passphrase is unlocked by definition
|
||||||
// RSA Encrypt-Only and RSA Sign-Only are deprecated and SHOULD NOT be generated
|
options.unlocked = true;
|
||||||
if (options.keyType !== enums.publicKey.rsa_encrypt_sign) {
|
}
|
||||||
throw new Error('Only RSA Encrypt or Sign supported');
|
if (String.prototype.isPrototypeOf(options.userIds) || typeof options.userIds === 'string') {
|
||||||
}
|
options.userIds = [options.userIds];
|
||||||
// Key without passphrase is unlocked by definition
|
}
|
||||||
if (!options.passphrase) {
|
|
||||||
options.unlocked = true;
|
|
||||||
}
|
|
||||||
if (String.prototype.isPrototypeOf(options.userIds) || typeof options.userIds === 'string') {
|
|
||||||
options.userIds = [options.userIds];
|
|
||||||
}
|
|
||||||
|
|
||||||
// generate
|
return Promise.all([generateSecretKey(), generateSecretSubkey()]).then(wrapKeyObject);
|
||||||
var genSecretKey = generateSecretKey();
|
});
|
||||||
var genSecretSubkey = generateSecretSubkey();
|
|
||||||
return Promise.all([genSecretKey, genSecretSubkey]).then(wrapKeyObject);
|
|
||||||
|
|
||||||
function generateSecretKey() {
|
function generateSecretKey() {
|
||||||
secretKeyPacket = new packet.SecretKey();
|
secretKeyPacket = new packet.SecretKey();
|
||||||
|
|
|
@ -92,26 +92,29 @@ Message.prototype.getSigningKeyIds = function() {
|
||||||
* @return {Message} new message with decrypted content
|
* @return {Message} new message with decrypted content
|
||||||
*/
|
*/
|
||||||
Message.prototype.decrypt = function(privateKey, sessionKey, password) {
|
Message.prototype.decrypt = function(privateKey, sessionKey, password) {
|
||||||
var keyObj = sessionKey || this.decryptSessionKey(privateKey, password);
|
return new Promise(resolve => resolve()).then(() => {
|
||||||
if (!keyObj || !util.isUint8Array(keyObj.data) || !util.isString(keyObj.algorithm)) {
|
const keyObj = sessionKey || this.decryptSessionKey(privateKey, password);
|
||||||
throw new Error('Invalid session key for decryption.');
|
if (!keyObj || !util.isUint8Array(keyObj.data) || !util.isString(keyObj.algorithm)) {
|
||||||
}
|
throw new Error('Invalid session key for decryption.');
|
||||||
|
}
|
||||||
|
|
||||||
var symEncryptedPacketlist = this.packets.filterByTag(
|
const symEncryptedPacketlist = this.packets.filterByTag(
|
||||||
enums.packet.symmetricallyEncrypted,
|
enums.packet.symmetricallyEncrypted,
|
||||||
enums.packet.symEncryptedIntegrityProtected,
|
enums.packet.symEncryptedIntegrityProtected,
|
||||||
enums.packet.symEncryptedAEADProtected
|
enums.packet.symEncryptedAEADProtected
|
||||||
);
|
);
|
||||||
|
|
||||||
if (symEncryptedPacketlist.length !== 0) {
|
if (symEncryptedPacketlist.length === 0) {
|
||||||
var symEncryptedPacket = symEncryptedPacketlist[0];
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const symEncryptedPacket = symEncryptedPacketlist[0];
|
||||||
return symEncryptedPacket.decrypt(keyObj.algorithm, keyObj.data).then(() => {
|
return symEncryptedPacket.decrypt(keyObj.algorithm, keyObj.data).then(() => {
|
||||||
var resultMsg = new Message(symEncryptedPacket.packets);
|
const resultMsg = new Message(symEncryptedPacket.packets);
|
||||||
symEncryptedPacket.packets = new packet.List(); // remove packets after decryption
|
symEncryptedPacket.packets = new packet.List(); // remove packets after decryption
|
||||||
return resultMsg;
|
return resultMsg;
|
||||||
});
|
});
|
||||||
}
|
});
|
||||||
return Promise.resolve();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -212,29 +215,31 @@ Message.prototype.getText = function() {
|
||||||
* @return {Message} new message with encrypted content
|
* @return {Message} new message with encrypted content
|
||||||
*/
|
*/
|
||||||
Message.prototype.encrypt = function(keys, passwords) {
|
Message.prototype.encrypt = function(keys, passwords) {
|
||||||
var symAlgo;
|
let symAlgo, msg, symEncryptedPacket;
|
||||||
if (keys) {
|
return new Promise(resolve => resolve()).then(() => {
|
||||||
symAlgo = keyModule.getPreferredSymAlgo(keys);
|
if (keys) {
|
||||||
} else if (passwords) {
|
symAlgo = keyModule.getPreferredSymAlgo(keys);
|
||||||
symAlgo = config.encryption_cipher;
|
} else if (passwords) {
|
||||||
} else {
|
symAlgo = config.encryption_cipher;
|
||||||
throw new Error('No keys or passwords');
|
} else {
|
||||||
}
|
throw new Error('No keys or passwords');
|
||||||
|
}
|
||||||
|
|
||||||
var sessionKey = crypto.generateSessionKey(enums.read(enums.symmetric, symAlgo));
|
let sessionKey = crypto.generateSessionKey(enums.read(enums.symmetric, symAlgo));
|
||||||
var msg = encryptSessionKey(sessionKey, enums.read(enums.symmetric, symAlgo), keys, passwords);
|
msg = encryptSessionKey(sessionKey, enums.read(enums.symmetric, symAlgo), keys, passwords);
|
||||||
|
|
||||||
var symEncryptedPacket;
|
if (config.aead_protect) {
|
||||||
if (config.aead_protect) {
|
symEncryptedPacket = new packet.SymEncryptedAEADProtected();
|
||||||
symEncryptedPacket = new packet.SymEncryptedAEADProtected();
|
} else if (config.integrity_protect) {
|
||||||
} else if (config.integrity_protect) {
|
symEncryptedPacket = new packet.SymEncryptedIntegrityProtected();
|
||||||
symEncryptedPacket = new packet.SymEncryptedIntegrityProtected();
|
} else {
|
||||||
} else {
|
symEncryptedPacket = new packet.SymmetricallyEncrypted();
|
||||||
symEncryptedPacket = new packet.SymmetricallyEncrypted();
|
}
|
||||||
}
|
symEncryptedPacket.packets = this.packets;
|
||||||
symEncryptedPacket.packets = this.packets;
|
|
||||||
|
|
||||||
return symEncryptedPacket.encrypt(enums.read(enums.symmetric, symAlgo), sessionKey).then(() => {
|
return symEncryptedPacket.encrypt(enums.read(enums.symmetric, symAlgo), sessionKey);
|
||||||
|
|
||||||
|
}).then(() => {
|
||||||
msg.packets.push(symEncryptedPacket);
|
msg.packets.push(symEncryptedPacket);
|
||||||
symEncryptedPacket.packets = new packet.List(); // remove packets after encryption
|
symEncryptedPacket.packets = new packet.List(); // remove packets after encryption
|
||||||
return msg;
|
return msg;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user