Merge pull request #309 from openpgpjs/symmetric_key_message_encryption
Implement Symmetric-Key Message Encryption using a passphrase
This commit is contained in:
commit
60c2593649
|
@ -177,6 +177,60 @@ Message.prototype.encrypt = function(keys) {
|
||||||
return new Message(packetlist);
|
return new Message(packetlist);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encrypt the message symmetrically using a passphrase.
|
||||||
|
* https://tools.ietf.org/html/rfc4880#section-3.7.2.2
|
||||||
|
* @param {String} passphrase
|
||||||
|
* @return {Array<module:message~Message>} new message with encrypted content
|
||||||
|
*/
|
||||||
|
Message.prototype.symEncrypt = function(passphrase) {
|
||||||
|
if (!passphrase) {
|
||||||
|
throw new Error('The passphrase cannot be empty!');
|
||||||
|
}
|
||||||
|
|
||||||
|
var algo = enums.read(enums.symmetric, config.encryption_cipher);
|
||||||
|
var packetlist = new packet.List();
|
||||||
|
|
||||||
|
// create a Symmetric-key Encrypted Session Key (ESK)
|
||||||
|
var symESKPacket = new packet.SymEncryptedSessionKey();
|
||||||
|
symESKPacket.sessionKeyAlgorithm = algo;
|
||||||
|
symESKPacket.decrypt(passphrase); // generate the session key
|
||||||
|
packetlist.push(symESKPacket);
|
||||||
|
|
||||||
|
// create integrity protected packet
|
||||||
|
var symEncryptedPacket = new packet.SymEncryptedIntegrityProtected();
|
||||||
|
symEncryptedPacket.packets = this.packets;
|
||||||
|
symEncryptedPacket.encrypt(algo, symESKPacket.sessionKey);
|
||||||
|
packetlist.push(symEncryptedPacket);
|
||||||
|
|
||||||
|
// remove packets after encryption
|
||||||
|
symEncryptedPacket.packets = new packet.List();
|
||||||
|
return new Message(packetlist);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Decrypt the message symmetrically using a passphrase.
|
||||||
|
* https://tools.ietf.org/html/rfc4880#section-3.7.2.2
|
||||||
|
* @param {String} passphrase
|
||||||
|
* @return {Array<module:message~Message>} new message with decrypted content
|
||||||
|
*/
|
||||||
|
Message.prototype.symDecrypt = function(passphrase) {
|
||||||
|
var symEncryptedPacketlist = this.packets.filterByTag(enums.packet.symEncryptedSessionKey, enums.packet.symEncryptedIntegrityProtected);
|
||||||
|
|
||||||
|
// decrypt Symmetric-key Encrypted Session Key (ESK)
|
||||||
|
var symESKPacket = symEncryptedPacketlist[0];
|
||||||
|
symESKPacket.decrypt(passphrase);
|
||||||
|
|
||||||
|
// decrypt integrity protected packet
|
||||||
|
var symEncryptedPacket = symEncryptedPacketlist[1];
|
||||||
|
symEncryptedPacket.decrypt(symESKPacket.sessionKeyAlgorithm, symESKPacket.sessionKey);
|
||||||
|
|
||||||
|
var resultMsg = new Message(symEncryptedPacket.packets);
|
||||||
|
// remove packets after decryption
|
||||||
|
symEncryptedPacket.packets = new packet.List();
|
||||||
|
return resultMsg;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sign the message (the literal data packet of the message)
|
* Sign the message (the literal data packet of the message)
|
||||||
* @param {Array<module:key~Key>} privateKey private keys with decrypted secret key data for signing
|
* @param {Array<module:key~Key>} privateKey private keys with decrypted secret key data for signing
|
||||||
|
|
|
@ -323,6 +323,25 @@ describe('Basic', function() {
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('Encrypt message symmetrically using passphrase', function() {
|
||||||
|
it('should encrypt/decrypt successfully', function() {
|
||||||
|
var passphrase = 'passphrase';
|
||||||
|
var plaintext = 'secret stuff';
|
||||||
|
|
||||||
|
// encrypt
|
||||||
|
var msg = openpgp.message.fromText(plaintext);
|
||||||
|
msg = msg.symEncrypt(passphrase);
|
||||||
|
var encrypted = msg.armor();
|
||||||
|
|
||||||
|
// decrypt
|
||||||
|
var msg2 = openpgp.message.readArmored(encrypted);
|
||||||
|
msg2 = msg2.symDecrypt(passphrase);
|
||||||
|
var decrypted = msg2.getText();
|
||||||
|
|
||||||
|
expect(decrypted).to.equal(plaintext);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe("Message 3DES decryption", function() {
|
describe("Message 3DES decryption", function() {
|
||||||
var pgp_msg =
|
var pgp_msg =
|
||||||
['-----BEGIN PGP MESSAGE-----',
|
['-----BEGIN PGP MESSAGE-----',
|
||||||
|
|
Loading…
Reference in New Issue
Block a user