Move high-level authorisation from message_receivier to libloki.crypto

pull/534/head
sachaaaaa 6 years ago
parent 77bfee8892
commit 4929f8d8db

@ -174,7 +174,78 @@
return signature; return signature;
} }
async function verifyPairingAuthorisation( async function validateAuthorisation(authorisation) {
const {
type,
primaryDevicePubKey,
secondaryDevicePubKey,
requestSignature,
grantSignature,
} = authorisation;
const alreadySecondaryDevice = !!window.storage.get('isSecondaryDevice');
const ourPubKey = textsecure.storage.user.getNumber();
const isRequest =
type === textsecure.protobuf.PairingAuthorisationMessage.Type.REQUEST;
const isGrant =
type === textsecure.protobuf.PairingAuthorisationMessage.Type.GRANT;
if (!primaryDevicePubKey || !secondaryDevicePubKey) {
window.log.warn(
'Received a pairing request with missing pubkeys. Ignored.'
);
return false;
} else if (!requestSignature) {
window.log.warn(
'Received a pairing request with missing request signature. Ignored.'
);
return false;
} else if (isRequest && alreadySecondaryDevice) {
window.log.warn(
'Received a pairing request while being a secondary device. Ignored.'
);
return false;
} else if (isRequest && authorisation.primaryDevicePubKey !== ourPubKey) {
window.log.warn(
'Received a pairing request addressed to another pubkey. Ignored.'
);
return false;
} else if (isRequest && authorisation.secondaryDevicePubKey === ourPubKey) {
window.log.warn('Received a pairing request from ourselves. Ignored.');
return false;
}
try {
await this.verifyPairingSignature(
primaryDevicePubKey,
secondaryDevicePubKey,
dcodeIO.ByteBuffer.wrap(requestSignature).toArrayBuffer(),
textsecure.protobuf.PairingAuthorisationMessage.Type.REQUEST
);
} catch (e) {
window.log.warn(
'Could not verify pairing request authorisation signature. Ignoring message.'
);
window.log.error(e);
return false;
}
if (isGrant) {
try {
await this.verifyPairingSignature(
primaryDevicePubKey,
secondaryDevicePubKey,
dcodeIO.ByteBuffer.wrap(grantSignature).toArrayBuffer(),
textsecure.protobuf.PairingAuthorisationMessage.Type.GRANT
);
} catch (e) {
window.log.warn(
'Could not verify pairing grant authorisation signature. Ignoring message.'
);
window.log.error(e);
return false;
}
}
return true;
}
async function verifyPairingSignature(
primaryDevicePubKey, primaryDevicePubKey,
secondaryPubKey, secondaryPubKey,
signature, signature,
@ -233,7 +304,8 @@
snodeCipher, snodeCipher,
decryptToken, decryptToken,
generateSignatureForPairing, generateSignatureForPairing,
verifyPairingAuthorisation, verifyPairingSignature,
validateAuthorisation,
// for testing // for testing
_LokiSnodeChannel: LokiSnodeChannel, _LokiSnodeChannel: LokiSnodeChannel,
_decodeSnodeAddressToPubKey: decodeSnodeAddressToPubKey, _decodeSnodeAddressToPubKey: decodeSnodeAddressToPubKey,

@ -1047,78 +1047,8 @@ MessageReceiver.prototype.extend({
} }
return this.removeFromCache(envelope); return this.removeFromCache(envelope);
}, },
async validateAuthorisation(authorisation) {
const {
type,
primaryDevicePubKey,
secondaryDevicePubKey,
requestSignature,
grantSignature,
} = authorisation;
const alreadySecondaryDevice = !!window.storage.get('isSecondaryDevice');
const ourPubKey = textsecure.storage.user.getNumber();
const isRequest =
type === textsecure.protobuf.PairingAuthorisationMessage.Type.REQUEST;
const isGrant =
type === textsecure.protobuf.PairingAuthorisationMessage.Type.GRANT;
if (!primaryDevicePubKey || !secondaryDevicePubKey) {
window.log.warn(
'Received a pairing request with missing pubkeys. Ignored.'
);
return false;
} else if (!requestSignature) {
window.log.warn(
'Received a pairing request with missing request signature. Ignored.'
);
return false;
} else if (isRequest && alreadySecondaryDevice) {
window.log.warn(
'Received a pairing request while being a secondary device. Ignored.'
);
return false;
} else if (isRequest && authorisation.primaryDevicePubKey !== ourPubKey) {
window.log.warn(
'Received a pairing request addressed to another pubkey. Ignored.'
);
return false;
} else if (isRequest && authorisation.secondaryDevicePubKey === ourPubKey) {
window.log.warn('Received a pairing request from ourselves. Ignored.');
return false;
}
try {
await libloki.crypto.verifyPairingAuthorisation(
primaryDevicePubKey,
secondaryDevicePubKey,
dcodeIO.ByteBuffer.wrap(requestSignature).toArrayBuffer(),
textsecure.protobuf.PairingAuthorisationMessage.Type.REQUEST
);
} catch (e) {
window.log.warn(
'Could not verify pairing request authorisation signature. Ignoring message.'
);
window.log.error(e);
return false;
}
if (isGrant) {
try {
await libloki.crypto.verifyPairingAuthorisation(
primaryDevicePubKey,
secondaryDevicePubKey,
dcodeIO.ByteBuffer.wrap(grantSignature).toArrayBuffer(),
textsecure.protobuf.PairingAuthorisationMessage.Type.GRANT
);
} catch (e) {
window.log.warn(
'Could not verify pairing grant authorisation signature. Ignoring message.'
);
window.log.error(e);
return false;
}
}
return true;
},
async handlePairingRequest(envelope, pairingRequest) { async handlePairingRequest(envelope, pairingRequest) {
const valid = await this.validateAuthorisation(pairingRequest); const valid = await libloki.crypto.validateAuthorisation(pairingRequest);
if (valid) { if (valid) {
// Pairing dialog is open and is listening // Pairing dialog is open and is listening
if (Whisper.events.isListenedTo('devicePairingRequestReceived')) { if (Whisper.events.isListenedTo('devicePairingRequestReceived')) {
@ -1137,7 +1067,7 @@ MessageReceiver.prototype.extend({
pairingAuthorisation, pairingAuthorisation,
{ dataMessage, syncMessage } { dataMessage, syncMessage }
) { ) {
const valid = await this.validateAuthorisation(pairingAuthorisation); const valid = await libloki.crypto.validateAuthorisation(pairingAuthorisation);
const alreadySecondaryDevice = !!window.storage.get('isSecondaryDevice'); const alreadySecondaryDevice = !!window.storage.get('isSecondaryDevice');
let removedFromCache = false; let removedFromCache = false;
if (alreadySecondaryDevice) { if (alreadySecondaryDevice) {

Loading…
Cancel
Save