Merge subkey binding signatures in key update method
This commit is contained in:
parent
b21bab2e42
commit
4a55905a8f
|
@ -863,16 +863,23 @@ SubKey.prototype.getExpirationTime = function() {
|
||||||
* @param {module:packet/signature} primaryKey primary key used for validation
|
* @param {module:packet/signature} primaryKey primary key used for validation
|
||||||
*/
|
*/
|
||||||
SubKey.prototype.update = function(subKey, primaryKey) {
|
SubKey.prototype.update = function(subKey, primaryKey) {
|
||||||
if (this.verify(primaryKey) === enums.keyStatus.invalid) {
|
if (subKey.verify(primaryKey) === enums.keyStatus.invalid) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (this.subKey.getFingerprint() !== subKey.subKey.getFingerprint()) {
|
if (this.subKey.getFingerprint() !== subKey.subKey.getFingerprint()) {
|
||||||
throw new Error('SubKey update method: fingerprints of subkeys not equal');
|
throw new Error('SubKey update method: fingerprints of subkeys not equal');
|
||||||
}
|
}
|
||||||
|
// key packet
|
||||||
if (this.subKey.tag === enums.packet.publicSubkey &&
|
if (this.subKey.tag === enums.packet.publicSubkey &&
|
||||||
subKey.subKey.tag === enums.packet.secretSubkey) {
|
subKey.subKey.tag === enums.packet.secretSubkey) {
|
||||||
this.subKey = subKey.subKey;
|
this.subKey = subKey.subKey;
|
||||||
}
|
}
|
||||||
|
// binding signature
|
||||||
|
if (!this.bindingSignature && subKey.bindingSignature &&
|
||||||
|
(subKey.bindingSignature.verified ||
|
||||||
|
subKey.bindingSignature.verify(primaryKey, {key: primaryKey, bind: this.subKey}))) {
|
||||||
|
this.bindingSignature = subKey.bindingSignature;
|
||||||
|
}
|
||||||
// revocation signature
|
// revocation signature
|
||||||
if (!this.revocationSignature && subKey.revocationSignature && !subKey.revocationSignature.isExpired() &&
|
if (!this.revocationSignature && subKey.revocationSignature && !subKey.revocationSignature.isExpired() &&
|
||||||
(subKey.revocationSignature.verified ||
|
(subKey.revocationSignature.verified ||
|
||||||
|
|
|
@ -303,6 +303,94 @@ describe('Key', function() {
|
||||||
'=MVfN',
|
'=MVfN',
|
||||||
'-----END PGP PUBLIC KEY BLOCK-----'].join('\n');
|
'-----END PGP PUBLIC KEY BLOCK-----'].join('\n');
|
||||||
|
|
||||||
|
var pgp_desktop_pub =
|
||||||
|
['-----BEGIN PGP PUBLIC KEY BLOCK-----',
|
||||||
|
'Version: Encryption Desktop 10.3.0 (Build 9307)',
|
||||||
|
'',
|
||||||
|
'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',
|
||||||
|
'=dVeR',
|
||||||
|
'-----END PGP PUBLIC KEY BLOCK-----'].join('\n');
|
||||||
|
|
||||||
|
var pgp_desktop_priv =
|
||||||
|
['-----BEGIN PGP PRIVATE KEY BLOCK-----',
|
||||||
|
'Version: Encryption Desktop 10.3.0 (Build 9307)',
|
||||||
|
'',
|
||||||
|
'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',
|
||||||
|
'5g==',
|
||||||
|
'=63Nq',
|
||||||
|
'-----END PGP PRIVATE KEY BLOCK-----'].join('\n');
|
||||||
|
|
||||||
|
|
||||||
it('Parsing armored text with two keys', function(done) {
|
it('Parsing armored text with two keys', function(done) {
|
||||||
var pubKeys = openpgp.key.readArmored(twoKeys);
|
var pubKeys = openpgp.key.readArmored(twoKeys);
|
||||||
|
@ -495,6 +583,17 @@ describe('Key', function() {
|
||||||
expect(dest.update.bind(dest, source)).to.throw('Cannot update public key with private key if subkey mismatch');
|
expect(dest.update.bind(dest, source)).to.throw('Cannot update public key with private key if subkey mismatch');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('update() - merge subkey binding signatures', function() {
|
||||||
|
var source = openpgp.key.readArmored(pgp_desktop_pub).keys[0];
|
||||||
|
var dest = openpgp.key.readArmored(pgp_desktop_priv).keys[0];
|
||||||
|
expect(source.subKeys[0].bindingSignature).to.exist;
|
||||||
|
expect(source.subKeys[0].verify(source.primaryKey)).to.equal(openpgp.enums.keyStatus.valid);
|
||||||
|
expect(dest.subKeys[0].bindingSignature).to.not.exist;
|
||||||
|
dest.update(source);
|
||||||
|
expect(dest.subKeys[0].bindingSignature).to.exist;
|
||||||
|
expect(dest.subKeys[0].verify(source.primaryKey)).to.equal(openpgp.enums.keyStatus.valid);
|
||||||
|
});
|
||||||
|
|
||||||
it('getPreferredSymAlgo() - one key - AES256', function() {
|
it('getPreferredSymAlgo() - one key - AES256', function() {
|
||||||
var key1 = openpgp.key.readArmored(twoKeys).keys[0];
|
var key1 = openpgp.key.readArmored(twoKeys).keys[0];
|
||||||
var prefAlgo = openpgp.key.getPreferredSymAlgo([key1]);
|
var prefAlgo = openpgp.key.getPreferredSymAlgo([key1]);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user