diff --git a/src/key.js b/src/key.js index 62729160..f0d0c106 100644 --- a/src/key.js +++ b/src/key.js @@ -1426,7 +1426,10 @@ export async function reformat(options) { } if (!options.subkeys) { - options.subkeys = secretSubkeyPackets.map(() => ({})); + options.subkeys = await Promise.all(secretSubkeyPackets.map(async secretSubkeyPacket => ({ + sign: await options.privateKey.getSigningKey(secretSubkeyPacket.getKeyId(), null) && + !await options.privateKey.getEncryptionKey(secretSubkeyPacket.getKeyId(), null) + }))); } if (options.subkeys.length !== secretSubkeyPackets.length) { diff --git a/test/general/key.js b/test/general/key.js index fbb3c10a..075a87da 100644 --- a/test/general/key.js +++ b/test/general/key.js @@ -1827,7 +1827,7 @@ function versionSpecificTests() { expect(key.users.length).to.equal(1); expect(key.users[0].userId.userid).to.equal(userId); expect(key.users[0].selfCertifications[0].isPrimaryUserID).to.be.true; - expect(key.subKeys).to.have.lengthOf(2); + expect(key.subKeys).to.have.length(2); expect(key.subKeys[0].getAlgorithmInfo().algorithm).to.equal('ecdh'); expect(key.subKeys[1].getAlgorithmInfo().algorithm).to.equal('ecdh'); }); @@ -1836,14 +1836,33 @@ function versionSpecificTests() { it('Generate key - one signing subkey', function() { const userId = 'test '; const opt = {curve: 'curve25519', userIds: [userId], passphrase: '123', subkeys:[{}, {sign: true}]}; - return openpgp.generateKey(opt).then(function(key) { - key = key.key; + return openpgp.generateKey(opt).then(async function({ key }) { expect(key.users.length).to.equal(1); expect(key.users[0].userId.userid).to.equal(userId); expect(key.users[0].selfCertifications[0].isPrimaryUserID).to.be.true; - expect(key.subKeys).to.have.lengthOf(2); + expect(key.subKeys).to.have.length(2); expect(key.subKeys[0].getAlgorithmInfo().algorithm).to.equal('ecdh'); + expect(await key.getEncryptionKey()).to.equal(key.subKeys[0]); expect(key.subKeys[1].getAlgorithmInfo().algorithm).to.equal('eddsa'); + expect(await key.getSigningKey()).to.equal(key.subKeys[1]); + }); + }); + + it('Reformat key - one signing subkey', function() { + const userId = 'test '; + const opt = {curve: 'curve25519', userIds: [userId], passphrase: '123', subkeys:[{}, {sign: true}]}; + return openpgp.generateKey(opt).then(async function({ key }) { + await key.decrypt('123'); + return openpgp.reformatKey({ privateKey: key, userIds: [userId] }); + }).then(async function({ key }) { + expect(key.users.length).to.equal(1); + expect(key.users[0].userId.userid).to.equal(userId); + expect(key.users[0].selfCertifications[0].isPrimaryUserID).to.be.true; + expect(key.subKeys).to.have.length(2); + expect(key.subKeys[0].getAlgorithmInfo().algorithm).to.equal('ecdh'); + expect(await key.getEncryptionKey()).to.equal(key.subKeys[0]); + expect(key.subKeys[1].getAlgorithmInfo().algorithm).to.equal('eddsa'); + expect(await key.getSigningKey()).to.equal(key.subKeys[1]); }); }); diff --git a/test/general/wkd.js b/test/general/wkd.js index 23368388..700399aa 100644 --- a/test/general/wkd.js +++ b/test/general/wkd.js @@ -32,7 +32,7 @@ describe('WKD unit tests', function() { }).then(function(key) { expect(key).to.exist; expect(key).to.have.property('keys'); - expect(key.keys).to.have.lengthOf(1); + expect(key.keys).to.have.length(1); }); });