Don't hash when comparing key fingerprints
This commit is contained in:
parent
abce79b509
commit
7253df1632
18
src/key.js
18
src/key.js
|
@ -39,6 +39,7 @@ import util from './util';
|
||||||
* @param {module:packet.List} packetlist The packets that form this key
|
* @param {module:packet.List} packetlist The packets that form this key
|
||||||
* @borrows module:packet.PublicKey#getKeyId as Key#getKeyId
|
* @borrows module:packet.PublicKey#getKeyId as Key#getKeyId
|
||||||
* @borrows module:packet.PublicKey#getFingerprint as Key#getFingerprint
|
* @borrows module:packet.PublicKey#getFingerprint as Key#getFingerprint
|
||||||
|
* @borrows module:packet.PublicKey#hasSameFingerprintAs as Key#hasSameFingerprintAs
|
||||||
* @borrows module:packet.PublicKey#getAlgorithmInfo as Key#getAlgorithmInfo
|
* @borrows module:packet.PublicKey#getAlgorithmInfo as Key#getAlgorithmInfo
|
||||||
* @borrows module:packet.PublicKey#getCreationTime as Key#getCreationTime
|
* @borrows module:packet.PublicKey#getCreationTime as Key#getCreationTime
|
||||||
* @borrows module:packet.PublicKey#isDecrypted as Key#isDecrypted
|
* @borrows module:packet.PublicKey#isDecrypted as Key#isDecrypted
|
||||||
|
@ -575,7 +576,7 @@ Key.prototype.update = async function(key) {
|
||||||
if (await key.verifyPrimaryKey() === enums.keyStatus.invalid) {
|
if (await key.verifyPrimaryKey() === enums.keyStatus.invalid) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (this.getFingerprint() !== key.getFingerprint()) {
|
if (!this.hasSameFingerprintAs(key)) {
|
||||||
throw new Error('Key update method: fingerprints of keys not equal');
|
throw new Error('Key update method: fingerprints of keys not equal');
|
||||||
}
|
}
|
||||||
if (this.isPublic() && key.isPrivate()) {
|
if (this.isPublic() && key.isPrivate()) {
|
||||||
|
@ -583,7 +584,7 @@ Key.prototype.update = async function(key) {
|
||||||
const equal = (this.subKeys.length === key.subKeys.length) &&
|
const equal = (this.subKeys.length === key.subKeys.length) &&
|
||||||
(this.subKeys.every(destSubKey => {
|
(this.subKeys.every(destSubKey => {
|
||||||
return key.subKeys.some(srcSubKey => {
|
return key.subKeys.some(srcSubKey => {
|
||||||
return destSubKey.getFingerprint() === srcSubKey.getFingerprint();
|
return destSubKey.hasSameFingerprintAs(srcSubKey);
|
||||||
});
|
});
|
||||||
}));
|
}));
|
||||||
if (!equal) {
|
if (!equal) {
|
||||||
|
@ -618,7 +619,7 @@ Key.prototype.update = async function(key) {
|
||||||
await Promise.all(key.subKeys.map(async srcSubKey => {
|
await Promise.all(key.subKeys.map(async srcSubKey => {
|
||||||
let found = false;
|
let found = false;
|
||||||
await Promise.all(this.subKeys.map(async dstSubKey => {
|
await Promise.all(this.subKeys.map(async dstSubKey => {
|
||||||
if (srcSubKey.getFingerprint() === dstSubKey.getFingerprint()) {
|
if (dstSubKey.hasSameFingerprintAs(srcSubKey)) {
|
||||||
await dstSubKey.update(srcSubKey, this.keyPacket);
|
await dstSubKey.update(srcSubKey, this.keyPacket);
|
||||||
found = true;
|
found = true;
|
||||||
}
|
}
|
||||||
|
@ -853,7 +854,7 @@ User.prototype.sign = async function(primaryKey, privateKeys) {
|
||||||
if (privateKey.isPublic()) {
|
if (privateKey.isPublic()) {
|
||||||
throw new Error('Need private key for signing');
|
throw new Error('Need private key for signing');
|
||||||
}
|
}
|
||||||
if (privateKey.getFingerprint() === primaryKey.getFingerprint()) {
|
if (privateKey.hasSameFingerprintAs(primaryKey)) {
|
||||||
throw new Error('Not implemented for self signing');
|
throw new Error('Not implemented for self signing');
|
||||||
}
|
}
|
||||||
const signingKey = await privateKey.getSigningKey();
|
const signingKey = await privateKey.getSigningKey();
|
||||||
|
@ -1039,6 +1040,7 @@ User.prototype.update = async function(user, primaryKey) {
|
||||||
* @classdesc Class that represents a subkey packet and the relevant signatures.
|
* @classdesc Class that represents a subkey packet and the relevant signatures.
|
||||||
* @borrows module:packet.PublicSubkey#getKeyId as SubKey#getKeyId
|
* @borrows module:packet.PublicSubkey#getKeyId as SubKey#getKeyId
|
||||||
* @borrows module:packet.PublicSubkey#getFingerprint as SubKey#getFingerprint
|
* @borrows module:packet.PublicSubkey#getFingerprint as SubKey#getFingerprint
|
||||||
|
* @borrows module:packet.PublicSubkey#hasSameFingerprintAs as SubKey#hasSameFingerprintAs
|
||||||
* @borrows module:packet.PublicSubkey#getAlgorithmInfo as SubKey#getAlgorithmInfo
|
* @borrows module:packet.PublicSubkey#getAlgorithmInfo as SubKey#getAlgorithmInfo
|
||||||
* @borrows module:packet.PublicSubkey#getCreationTime as SubKey#getCreationTime
|
* @borrows module:packet.PublicSubkey#getCreationTime as SubKey#getCreationTime
|
||||||
* @borrows module:packet.PublicSubkey#isDecrypted as SubKey#isDecrypted
|
* @borrows module:packet.PublicSubkey#isDecrypted as SubKey#isDecrypted
|
||||||
|
@ -1145,7 +1147,7 @@ SubKey.prototype.update = async function(subKey, primaryKey) {
|
||||||
if (await subKey.verify(primaryKey) === enums.keyStatus.invalid) {
|
if (await subKey.verify(primaryKey) === enums.keyStatus.invalid) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (this.getFingerprint() !== subKey.getFingerprint()) {
|
if (!this.hasSameFingerprintAs(subKey)) {
|
||||||
throw new Error('SubKey update method: fingerprints of subkeys not equal');
|
throw new Error('SubKey update method: fingerprints of subkeys not equal');
|
||||||
}
|
}
|
||||||
// key packet
|
// key packet
|
||||||
|
@ -1209,6 +1211,12 @@ SubKey.prototype.revoke = async function(primaryKey, {
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Key.prototype.hasSameFingerprintAs =
|
||||||
|
SubKey.prototype.hasSameFingerprintAs =
|
||||||
|
function(other) {
|
||||||
|
return this.keyPacket.hasSameFingerprintAs(other.keyPacket || other);
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reads an unarmored OpenPGP key list and returns one or multiple key objects
|
* Reads an unarmored OpenPGP key list and returns one or multiple key objects
|
||||||
* @param {Uint8Array} data to be parsed
|
* @param {Uint8Array} data to be parsed
|
||||||
|
|
|
@ -229,10 +229,18 @@ PublicKey.prototype.getFingerprintBytes = function () {
|
||||||
* Calculates the fingerprint of the key
|
* Calculates the fingerprint of the key
|
||||||
* @returns {String} A string containing the fingerprint in lowercase hex
|
* @returns {String} A string containing the fingerprint in lowercase hex
|
||||||
*/
|
*/
|
||||||
PublicKey.prototype.getFingerprint = function () {
|
PublicKey.prototype.getFingerprint = function() {
|
||||||
return util.Uint8Array_to_hex(this.getFingerprintBytes());
|
return util.Uint8Array_to_hex(this.getFingerprintBytes());
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculates whether two keys have the same fingerprint without actually calculating the fingerprint
|
||||||
|
* @returns {Boolean} Whether the two keys have the same version and public key data
|
||||||
|
*/
|
||||||
|
PublicKey.prototype.hasSameFingerprintAs = function(other) {
|
||||||
|
return this.version === other.version && util.equalsUint8Array(this.writePublicKey(), other.writePublicKey());
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns algorithm information
|
* Returns algorithm information
|
||||||
* @returns {Object} An object of the form {algorithm: String, bits:int, curve:String}
|
* @returns {Object} An object of the form {algorithm: String, bits:int, curve:String}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user