A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://github.com/openpgpjs/openpgpjs/commit/22e4540ed9b87c7dd25be048f56d8b6c4fcbced9 below:

OP-01-007 Algorithm Preferences ignored upon Encryption (Low) · openpgpjs/openpgpjs@22e4540 · GitHub

File tree Expand file treeCollapse file tree 3 files changed

+64

-7

lines changed

Filter options

Expand file treeCollapse file tree 3 files changed

+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