Wrap code into promises to globally catch errors

This commit is contained in:
Tankred Hase 2016-03-23 21:19:02 +08:00
parent 453a9cee07
commit 1e3d6468d6
2 changed files with 52 additions and 50 deletions

View File

@ -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();

View File

@ -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;