Automatic session reset
This commit is contained in:
parent
fe187226bb
commit
98e7e65d25
26 changed files with 803 additions and 225 deletions
|
@ -742,12 +742,7 @@ export default class MessageSender {
|
|||
createSyncMessage(): SyncMessageClass {
|
||||
const syncMessage = new window.textsecure.protobuf.SyncMessage();
|
||||
|
||||
// Generate a random int from 1 and 512
|
||||
const buffer = window.libsignal.crypto.getRandomBytes(1);
|
||||
const paddingLength = (new Uint8Array(buffer)[0] & 0x1ff) + 1;
|
||||
|
||||
// Generate a random padding buffer of the chosen size
|
||||
syncMessage.padding = window.libsignal.crypto.getRandomBytes(paddingLength);
|
||||
syncMessage.padding = this.getRandomPadding();
|
||||
|
||||
return syncMessage;
|
||||
}
|
||||
|
@ -1374,6 +1369,47 @@ export default class MessageSender {
|
|||
);
|
||||
}
|
||||
|
||||
getRandomPadding(): ArrayBuffer {
|
||||
// Generate a random int from 1 and 512
|
||||
const buffer = window.libsignal.crypto.getRandomBytes(2);
|
||||
const paddingLength = (new Uint16Array(buffer)[0] & 0x1ff) + 1;
|
||||
|
||||
// Generate a random padding buffer of the chosen size
|
||||
return window.libsignal.crypto.getRandomBytes(paddingLength);
|
||||
}
|
||||
|
||||
async sendNullMessage(
|
||||
{
|
||||
uuid,
|
||||
e164,
|
||||
padding,
|
||||
}: { uuid?: string; e164?: string; padding?: ArrayBuffer },
|
||||
options?: SendOptionsType
|
||||
): Promise<CallbackResultType> {
|
||||
const nullMessage = new window.textsecure.protobuf.NullMessage();
|
||||
|
||||
const identifier = uuid || e164;
|
||||
if (!identifier) {
|
||||
throw new Error('sendNullMessage: Got neither uuid nor e164!');
|
||||
}
|
||||
|
||||
nullMessage.padding = padding || this.getRandomPadding();
|
||||
|
||||
const contentMessage = new window.textsecure.protobuf.Content();
|
||||
contentMessage.nullMessage = nullMessage;
|
||||
|
||||
// We want the NullMessage to look like a normal outgoing message; not silent
|
||||
const silent = false;
|
||||
const timestamp = Date.now();
|
||||
return this.sendIndividualProto(
|
||||
identifier,
|
||||
contentMessage,
|
||||
timestamp,
|
||||
silent,
|
||||
options
|
||||
);
|
||||
}
|
||||
|
||||
async syncVerification(
|
||||
destinationE164: string,
|
||||
destinationUuid: string,
|
||||
|
@ -1390,26 +1426,12 @@ export default class MessageSender {
|
|||
return Promise.resolve();
|
||||
}
|
||||
|
||||
// Get padding which we can share between null message and verified sync
|
||||
const padding = this.getRandomPadding();
|
||||
|
||||
// First send a null message to mask the sync message.
|
||||
const nullMessage = new window.textsecure.protobuf.NullMessage();
|
||||
|
||||
// Generate a random int from 1 and 512
|
||||
const buffer = window.libsignal.crypto.getRandomBytes(1);
|
||||
const paddingLength = (new Uint8Array(buffer)[0] & 0x1ff) + 1;
|
||||
|
||||
// Generate a random padding buffer of the chosen size
|
||||
nullMessage.padding = window.libsignal.crypto.getRandomBytes(paddingLength);
|
||||
|
||||
const contentMessage = new window.textsecure.protobuf.Content();
|
||||
contentMessage.nullMessage = nullMessage;
|
||||
|
||||
// We want the NullMessage to look like a normal outgoing message; not silent
|
||||
const silent = false;
|
||||
const promise = this.sendIndividualProto(
|
||||
destinationUuid || destinationE164,
|
||||
contentMessage,
|
||||
now,
|
||||
silent,
|
||||
const promise = this.sendNullMessage(
|
||||
{ uuid: destinationUuid, e164: destinationE164, padding },
|
||||
options
|
||||
);
|
||||
|
||||
|
@ -1423,7 +1445,7 @@ export default class MessageSender {
|
|||
verified.destinationUuid = destinationUuid;
|
||||
}
|
||||
verified.identityKey = identityKey;
|
||||
verified.nullMessage = nullMessage.padding;
|
||||
verified.nullMessage = padding;
|
||||
|
||||
const syncMessage = this.createSyncMessage();
|
||||
syncMessage.verified = verified;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue