| 
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -39085,8 +39085,7 @@ MessageReceiver.prototype.extend({
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            console.log('Got SyncMessage Request');
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            return this.removeFromCache(envelope);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        } else if (syncMessage.read && syncMessage.read.length) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            console.log('read messages',
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                    'from', envelope.source + '.' + envelope.sourceDevice);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            console.log('read messages from', this.getEnvelopeId(envelope));
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            return this.handleRead(envelope, syncMessage.read);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        } else if (syncMessage.verified) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            return this.handleVerified(envelope, syncMessage.verified);
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -40095,39 +40094,44 @@ MessageSender.prototype = {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    syncVerification: function(destination, state, identityKey) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        var myNumber = textsecure.storage.user.getNumber();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        var myDevice = textsecure.storage.user.getDeviceId();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        if (myDevice != 1) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            // First send a null message to mask the sync message.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            var nullMessage = new textsecure.protobuf.NullMessage();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        var now = Date.now();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        if (myDevice === 1) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            return Promise.resolve();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            // Generate a random int from 1 and 512
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        // First send a null message to mask the sync message.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        var nullMessage = new textsecure.protobuf.NullMessage();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        // Generate a random int from 1 and 512
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            var buffer = libsignal.crypto.getRandomBytes(1);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            var paddingLength = (new Uint8Array(buffer)[0] & 0x1ff) + 1;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        var paddingLength = (new Uint8Array(buffer)[0] & 0x1ff) + 1;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            // Generate a random padding buffer of the chosen size
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            nullMessage.padding = libsignal.crypto.getRandomBytes(paddingLength);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        // Generate a random padding buffer of the chosen size
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        nullMessage.padding = libsignal.crypto.getRandomBytes(paddingLength);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            var contentMessage = new textsecure.protobuf.Content();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            contentMessage.nullMessage = nullMessage;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        var contentMessage = new textsecure.protobuf.Content();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        contentMessage.nullMessage = nullMessage;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            var silent = true;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            return this.sendIndividualProto(destination, contentMessage, Date.now(), silent).then(function() {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                var verified = new textsecure.protobuf.Verified();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                verified.state = state;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                verified.destination = destination;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                verified.identityKey = identityKey;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                verified.nullMessage = nullMessage.padding;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        // We want the NullMessage to look like a normal outgoing message; not silent
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        const promise = this.sendIndividualProto(destination, contentMessage, now);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                var syncMessage = this.createSyncMessage();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                syncMessage.verified = verified;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        return promise.then(function() {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            var verified = new textsecure.protobuf.Verified();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            verified.state = state;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            verified.destination = destination;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            verified.identityKey = identityKey;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            verified.nullMessage = nullMessage.padding;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                var contentMessage = new textsecure.protobuf.Content();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                contentMessage.syncMessage = syncMessage;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            var syncMessage = this.createSyncMessage();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            syncMessage.verified = verified;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                return this.sendIndividualProto(myNumber, contentMessage, Date.now(), silent);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            }.bind(this));
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            var contentMessage = new textsecure.protobuf.Content();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            contentMessage.syncMessage = syncMessage;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        return Promise.resolve();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            var silent = true;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            return this.sendIndividualProto(myNumber, contentMessage, now, silent);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        }.bind(this));
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    },
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    sendGroupProto: function(numbers, proto, timestamp) {
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
			
			 | 
			 | 
			
				
 
 |