({plaintext, senderAddress, detachedSignature, keyringId, lookupKey})
| 272 | } |
| 273 | |
| 274 | export async function verifyDetachedSignature({plaintext, senderAddress, detachedSignature, keyringId, lookupKey}) { |
| 275 | try { |
| 276 | const keyring = await getPreferredKeyring(keyringId); |
| 277 | // determine issuer key id |
| 278 | const signature = await readSignature({armoredSignature: detachedSignature}); |
| 279 | const sigPackets = signature.packets.filterByTag(enums.packet.signature); |
| 280 | const issuerKeyIDs = sigPackets.map(sigPacket => sigPacket.issuerKeyID); |
| 281 | // sync keys to preferred keyring |
| 282 | await syncPublicKeys({keyring, keyIds: issuerKeyIDs, keyringId}); |
| 283 | // check if we have signing keys in local keyring and if not try key discovery |
| 284 | await Promise.all(issuerKeyIDs.map(keyId => acquireSigningKeys({senderAddress, keyring, lookupKey, keyId}))); |
| 285 | const {signatures} = await keyring.getPgpBackend().verify({plaintext, detachedSignature, keyring}); |
| 286 | await updateKeyBinding(keyring, senderAddress, signatures); |
| 287 | await addSignatureDetails({signatures, keyring, senderAddress}); |
| 288 | return {signatures}; |
| 289 | } catch (e) { |
| 290 | throw new MvError(l10n.get('verify_error', [e]), 'VERIFY_ERROR'); |
| 291 | } |
| 292 | } |
| 293 | |
| 294 | async function acquireSigningKeys({senderAddress, keyring, lookupKey, keyId}) { |
| 295 | let {[senderAddress]: signerKeys} = await keyring.getKeyByAddress(senderAddress, {keyId}); |
no test coverage detected