First draft of encrypt message function

This commit is contained in:
Thomas Oberndörfer 2013-10-18 20:20:19 +02:00
parent 8baaa7f511
commit 646e370df7
4 changed files with 239 additions and 429 deletions

File diff suppressed because one or more lines are too long

View File

@ -15,6 +15,10 @@
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
var packet = require('./packet');
var enums = require('./enums.js');
/**
* @class
* @classdesc Class that represents an OpenPGP key. Must contain a master key.
@ -22,15 +26,16 @@
* user ids, user attributes.
*/
function openpgp_key() {
this.packets = new openpgp_packetlist();
module.exports = function key() {
/** Returns the master key (secret or public)
this.packets = new packet.list();
/** Returns the primary key (secret or public)
* @returns {openpgp_packet_secret_key|openpgp_packet_public_key|null} */
this.getKey = function() {
for (var i = 0; i < this.packets.length; i++)
if (this.packets[i].tag == openpgp_packets.tags.public_key ||
this.packets[i].tag == openpgp_packets.tags.secret_key)
if (this.packets[i].tag == enums.packet.public_key ||
this.packets[i].tag == enums.packet.secret_key)
return this.packets[i];
return null;
@ -43,8 +48,8 @@ function openpgp_key() {
var subkeys = [];
for (var i = 0; i < this.packets.length; i++)
if (this.packets[i].tag == openpgp_packet.tags.public_subkey ||
this.packets[i].tag == openpgp_packet.tags.secret_subkey)
if (this.packets[i].tag == enums.packet.public_subkey ||
this.packets[i].tag == enums.packet.secret_subkey)
subkeys.push(this.packets[i]);
return subkeys;
@ -84,15 +89,44 @@ function openpgp_key() {
//TODO implement: https://tools.ietf.org/html/rfc4880#section-5.2.3.8
//separate private key preference from digest preferences
return openpgp.config.config.prefer_hash_algorithm;
}
/**
* Finds an encryption key for this key
* @returns null if no encryption key has been found
*/
this.getEncryptionKey = function() {
// V4: by convention subkeys are prefered for encryption service
// V3: keys MUST NOT have subkeys
var isValidSignKey = function(key) {
return key.algorithm != enums.read(enums.publicKey, enums.publicKey.dsa)
&& key.algorithm != enums.read(enums.publicKey, enums.publicKey.rsa_sign)
//TODO verify key
//&& keys.verifyKey()
}
var subKeys = this.getSubkeys();
for (var j = 0; j < subKeys.length; j++) {
if (isValidSignKey(subKeys[j])) {
return subKeys[j];
}
}
// if no valid subkey for encryption, use primary key
var primaryKey = this.getKey();
if (isValidSignKey(primaryKey)) {
return primaryKey;
}
return null;
}
this.decrypt = function(passphrase) {
var keys = this.getAllKeys();
for (var i in keys)
if (keys[i].tag == openpgp_packet.tags.secret_subkey ||
keys[i].tag == openpgp_packet.tags.secret_key)
if (keys[i].tag == enums.packet.secret_subkey ||
keys[i].tag == enums.packet.secret_key)
keys[i].decrypt(passphrase);
}

View File

@ -25,6 +25,9 @@ var armor = require('./encoding/armor.js');
var packet = require('./packet');
var util = require('./util');
var enums = require('./enums.js');
var crypto = require('./crypto');
var key = require('./key.js');
var config = require('./config');
/**
* GPG4Browsers Core interface. A single instance is hold
@ -64,7 +67,45 @@ function _openpgp() {
return packetList;
}
function encryptMessage(publicKeyPacketlist, message) {
function encryptMessage(publicKeys, message) {
var packetList = new packet.list();
var literalDataPacket = new packet.literal();
literalDataPacket.set(message, 'utf8');
//TODO get preferred algo from signature
var sessionKey = crypto.generateSessionKey(enums.read(enums.symmetric, config.encryption_cipher));
publicKeys.forEach(function(publicKeyPacketlist) {
var pubKey = new key();
pubKey.packets = publicKeyPacketlist;
var encryptionKey = pubKey.getEncryptionKey();
if (encryptionKey) {
var pkESKeyPacket = new packet.public_key_encrypted_session_key();
pkESKeyPacket.publicKeyId = encryptionKey.getKeyId();
pkESKeyPacket.publicKeyAlgorithm = encryptionKey.algorithm;
pkESKeyPacket.sessionKey = sessionKey;
//TODO get preferred algo from signature
pkESKeyPacket.sessionKeyAlgorithm = enums.read(enums.symmetric, config.encryption_cipher);
pkESKeyPacket.encrypt(encryptionKey);
packetList.push(pkESKeyPacket);
}
});
var symEncryptedPacket;
if (config.integrity_protect) {
symEncryptedPacket = new packet.sym_encrypted_integrity_protected();
} else {
symEncryptedPacket = new packet.symmetrically_encrypted();
}
symEncryptedPacket.packets = literalDataPacket;
//TODO get preferred algo from signature
symEncryptedPacket.encrypt(enums.read(enums.symmetric, config.encryption_cipher), sessionKey);
packetList.push(symEncryptedPacket);
var armored = armor.encode(3, packetList.write(), config);
return armored;
}
@ -318,7 +359,7 @@ function _openpgp() {
this.generateKeyPair = generateKeyPair;
this.write_signed_message = write_signed_message;
this.write_signed_and_encrypted_message = write_signed_and_encrypted_message;
this.write_encrypted_message = write_encrypted_message;
this.encryptMessage = encryptMessage;
this.readArmoredPackets = readArmoredPackets;
this.readDearmoredPackets = readDearmoredPackets;
}

View File

@ -17,6 +17,7 @@
var util = require('../util'),
type_mpi = require('../type/mpi.js'),
type_keyid = require('../type/keyid.js'),
enums = require('../enums.js'),
crypto = require('../crypto');
@ -122,7 +123,9 @@ module.exports = function packet_public_key() {
* @return {String} A 8 byte key id
*/
this.getKeyId = function() {
return this.getFingerprint().substr(12, 8);
var keyid = new type_keyid();
keyid.read(this.getFingerprint().substr(12, 8));
return keyid;
}
/**