+64
-7
lines changedFilter options
+64
-7
lines changed Original file line number Diff line number Diff line change
@@ -939,6 +939,40 @@ function generate(keyType, numBits, userId, passphrase) {
939
939
return new Key(packetlist);
940
940
}
941
941
942
+
/**
943
+
* Returns the preferred symmetric algorithm for a set of keys
944
+
* @param {Array<module:key~Key>} keys Set of keys
945
+
* @return {enums.symmetric} Preferred symmetric algorithm
946
+
*/
947
+
function getPreferredSymAlgo(keys) {
948
+
var prioMap = {};
949
+
for (var i = 0; i < keys.length; i++) {
950
+
var primaryUser = keys[i].getPrimaryUser();
951
+
if (!primaryUser || !primaryUser.selfCertificate.preferredSymmetricAlgorithms) {
952
+
return config.encryption_cipher;
953
+
}
954
+
primaryUser.selfCertificate.preferredSymmetricAlgorithms.forEach(function(algo, index) {
955
+
var entry = prioMap[algo] || (prioMap[algo] = {prio: 0, count: 0, algo: algo});
956
+
entry.prio += 64 >> index;
957
+
entry.count++;
958
+
});
959
+
}
960
+
var prefAlgo = {prio: 0, algo: config.encryption_cipher};
961
+
for (var algo in prioMap) {
962
+
try {
963
+
if (algo !== enums.symmetric.plaintext &&
964
+
algo !== enums.symmetric.idea && // not implemented
965
+
enums.read(enums.symmetric, algo) && // known algorithm
966
+
prioMap[algo].count === keys.length && // available for all keys
967
+
prioMap[algo].prio > prefAlgo.prio) {
968
+
prefAlgo = prioMap[algo];
969
+
}
970
+
} catch (e) {}
971
+
}
972
+
return prefAlgo.algo;
973
+
}
974
+
942
975
exports.Key = Key;
943
976
exports.readArmored = readArmored;
944
977
exports.generate = generate;
978
+
exports.getPreferredSymAlgo = getPreferredSymAlgo;
Original file line number Diff line number Diff line change
@@ -28,7 +28,8 @@ var packet = require('./packet'),
28
28
enums = require('./enums.js'),
29
29
armor = require('./encoding/armor.js'),
30
30
config = require('./config'),
31
-
crypto = require('./crypto');
31
+
crypto = require('./crypto'),
32
+
keyModule = require('./key.js');
32
33
33
34
/**
34
35
* @class
@@ -144,17 +145,16 @@ Message.prototype.getText = function() {
144
145
*/
145
146
Message.prototype.encrypt = function(keys) {
146
147
var packetlist = new packet.List();
147
-
//TODO get preferred algo from signature
148
-
var sessionKey = crypto.generateSessionKey(enums.read(enums.symmetric, config.encryption_cipher));
148
+
var symAlgo = keyModule.getPreferredSymAlgo(keys);
149
+
var sessionKey = crypto.generateSessionKey(enums.read(enums.symmetric, symAlgo));
149
150
keys.forEach(function(key) {
150
151
var encryptionKeyPacket = key.getEncryptionKeyPacket();
151
152
if (encryptionKeyPacket) {
152
153
var pkESKeyPacket = new packet.PublicKeyEncryptedSessionKey();
153
154
pkESKeyPacket.publicKeyId = encryptionKeyPacket.getKeyId();
154
155
pkESKeyPacket.publicKeyAlgorithm = encryptionKeyPacket.algorithm;
155
156
pkESKeyPacket.sessionKey = sessionKey;
156
-
//TODO get preferred algo from signature
157
-
pkESKeyPacket.sessionKeyAlgorithm = enums.read(enums.symmetric, config.encryption_cipher);
157
+
pkESKeyPacket.sessionKeyAlgorithm = enums.read(enums.symmetric, symAlgo);
158
158
pkESKeyPacket.encrypt(encryptionKeyPacket);
159
159
packetlist.push(pkESKeyPacket);
160
160
} else {
@@ -168,8 +168,7 @@ Message.prototype.encrypt = function(keys) {
168
168
symEncryptedPacket = new packet.SymmetricallyEncrypted();
169
169
}
170
170
symEncryptedPacket.packets = this.packets;
171
-
//TODO get preferred algo from signature
172
-
symEncryptedPacket.encrypt(enums.read(enums.symmetric, config.encryption_cipher), sessionKey);
171
+
symEncryptedPacket.encrypt(enums.read(enums.symmetric, symAlgo), sessionKey);
173
172
packetlist.push(symEncryptedPacket);
174
173
// remove packets after encryption
175
174
symEncryptedPacket.packets = new packet.List();
Original file line number Diff line number Diff line change
@@ -454,5 +454,29 @@ describe('Key', function() {
454
454
expect(dest.update.bind(dest, source)).to.throw('Cannot update public key with private key if subkey mismatch');
455
455
});
456
456
457
+
it('getPreferredSymAlgo() - one key - AES256', function() {
458
+
var key1 = openpgp.key.readArmored(twoKeys).keys[0];
459
+
var prefAlgo = openpgp.key.getPreferredSymAlgo([key1]);
460
+
expect(prefAlgo).to.equal(openpgp.enums.symmetric.aes256);
461
+
});
462
+
463
+
it('getPreferredSymAlgo() - two key - AES192', function() {
464
+
var keys = openpgp.key.readArmored(twoKeys).keys;
465
+
var key1 = keys[0];
466
+
var key2 = keys[1];
467
+
key2.getPrimaryUser().selfCertificate.preferredSymmetricAlgorithms = [6,8,3];
468
+
var prefAlgo = openpgp.key.getPreferredSymAlgo([key1, key2]);
469
+
expect(prefAlgo).to.equal(openpgp.enums.symmetric.aes192);
470
+
});
471
+
472
+
it('getPreferredSymAlgo() - two key - one without pref', function() {
473
+
var keys = openpgp.key.readArmored(twoKeys).keys;
474
+
var key1 = keys[0];
475
+
var key2 = keys[1];
476
+
key2.getPrimaryUser().selfCertificate.preferredSymmetricAlgorithms = null;
477
+
var prefAlgo = openpgp.key.getPreferredSymAlgo([key1, key2]);
478
+
expect(prefAlgo).to.equal(openpgp.config.encryption_cipher);
479
+
});
480
+
457
481
});
458
482
You can’t perform that action at this time.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4