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; options.keyType = options.keyType || enums.publicKey.rsa_encrypt_sign;
// RSA Encrypt-Only and RSA Sign-Only are deprecated and SHOULD NOT be generated if (options.keyType !== enums.publicKey.rsa_encrypt_sign) { // RSA Encrypt-Only and RSA Sign-Only are deprecated and SHOULD NOT be generated
if (options.keyType !== enums.publicKey.rsa_encrypt_sign) {
throw new Error('Only RSA Encrypt or Sign supported'); throw new Error('Only RSA Encrypt or Sign supported');
} }
// Key without passphrase is unlocked by definition
if (!options.passphrase) { if (!options.passphrase) { // Key without passphrase is unlocked by definition
options.unlocked = true; options.unlocked = true;
} }
if (String.prototype.isPrototypeOf(options.userIds) || typeof options.userIds === 'string') { if (String.prototype.isPrototypeOf(options.userIds) || typeof options.userIds === 'string') {
options.userIds = [options.userIds]; 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(() => {
const keyObj = sessionKey || this.decryptSessionKey(privateKey, password);
if (!keyObj || !util.isUint8Array(keyObj.data) || !util.isString(keyObj.algorithm)) { if (!keyObj || !util.isUint8Array(keyObj.data) || !util.isString(keyObj.algorithm)) {
throw new Error('Invalid session key for decryption.'); 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,7 +215,8 @@ 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;
return new Promise(resolve => resolve()).then(() => {
if (keys) { if (keys) {
symAlgo = keyModule.getPreferredSymAlgo(keys); symAlgo = keyModule.getPreferredSymAlgo(keys);
} else if (passwords) { } else if (passwords) {
@ -221,10 +225,9 @@ Message.prototype.encrypt = function(keys, passwords) {
throw new Error('No keys or passwords'); 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) {
@ -234,7 +237,9 @@ Message.prototype.encrypt = function(keys, passwords) {
} }
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;