private byte[] decrypt(TextSecureEnvelope envelope, byte[] ciphertext)

        {
            AxolotlAddress sourceAddress = new AxolotlAddress(envelope.getSource(), envelope.getSourceDevice());
            SessionCipher  sessionCipher = new SessionCipher(axolotlStore, sourceAddress);

            byte[] paddedMessage;

            if (envelope.isPreKeyWhisperMessage())
            {
                paddedMessage = sessionCipher.decrypt(new PreKeyWhisperMessage(ciphertext));
            }
            else if (envelope.isWhisperMessage())
            {
                paddedMessage = sessionCipher.decrypt(new WhisperMessage(ciphertext));
            }
            else
            {
                throw new InvalidMessageException("Unknown type: " + envelope.getType());
            }

            PushTransportDetails transportDetails = new PushTransportDetails(sessionCipher.getSessionVersion());

            return(transportDetails.getStrippedPaddingMessageBody(paddedMessage));
        }
Beispiel #2
0
        /*private void handleGroupMessage(@NonNull MasterSecretUnion masterSecret,
         *                              @NonNull TextSecureEnvelope envelope,
         *                              @NonNull TextSecureDataMessage message,
         *                              @NonNull Optional<Long> smsMessageId)
         * {
         *  GroupMessageProcessor.process(context, masterSecret, envelope, message);
         *
         *  if (smsMessageId.isPresent())
         *  {
         *      DatabaseFactory.getSmsDatabase(context).deleteMessage(smsMessageId.get());
         *  }
         * }
         *
         * private void handleSynchronizeSentMessage(@NonNull MasterSecretUnion masterSecret,
         *                                        @NonNull SentTranscriptMessage message,
         *                                        @NonNull Optional<Long> smsMessageId)
         * throws MmsException
         * {
         * if (message.getMessage().getAttachments().isPresent()) {
         *      handleSynchronizeSentMediaMessage(masterSecret, message, smsMessageId);
         *  } else {
         *      handleSynchronizeSentTextMessage(masterSecret, message, smsMessageId);
         *  }
         * }
         *
         * private void handleSynchronizeRequestMessage(@NonNull MasterSecretUnion masterSecret,
         *                                           @NonNull RequestMessage message)
         * {
         *  if (message.isContactsRequest())
         *  {
         *      ApplicationContext.getInstance(context)
         *                        .getJobManager()
         *                        .add(new MultiDeviceContactUpdateJob(getContext()));
         *  }
         *
         *  if (message.isGroupsRequest())
         *  {
         *      ApplicationContext.getInstance(context)
         *                        .getJobManager()
         *                        .add(new MultiDeviceGroupUpdateJob(getContext()));
         *  }
         * }
         *
         * private void handleMediaMessage(@NonNull MasterSecretUnion masterSecret,
         *                              @NonNull TextSecureEnvelope envelope,
         *                              @NonNull TextSecureDataMessage message,
         *                              @NonNull Optional<Long> smsMessageId)
         * throws MmsException
         * {
         *  MmsDatabase database     = DatabaseFactory.getMmsDatabase(context);
         *  String localNumber  = TextSecurePreferences.getLocalNumber(context);
         *  IncomingMediaMessage mediaMessage = new IncomingMediaMessage(masterSecret, envelope.getSource(),
         *                                                       localNumber, message.getTimestamp(),
         *                                                       Optional.fromNullable(envelope.getRelay()),
         *                                                       message.getBody(),
         *                                                       message.getGroupInfo(),
         *                                                       message.getAttachments());
         *
         *  Pair<Long, Long> messageAndThreadId =  database.insertSecureDecryptedMessageInbox(masterSecret, mediaMessage, -1);
         *
         *  ApplicationContext.getInstance(context)
         *            .getJobManager()
         *            .add(new AttachmentDownloadJob(context, messageAndThreadId.first));
         *
         * if (smsMessageId.isPresent()) {
         *      DatabaseFactory.getSmsDatabase(context).deleteMessage(smsMessageId.get());
         *  }
         *
         *  MessageNotifier.updateNotification(context, masterSecret.getMasterSecret().orNull(), messageAndThreadId.second);
         * }
         *
         * private void handleSynchronizeSentMediaMessage(@NonNull MasterSecretUnion masterSecret,
         *                                             @NonNull SentTranscriptMessage message,
         *                                             @NonNull Optional<Long> smsMessageId)
         * throws MmsException
         * {
         *  MmsDatabase database     = DatabaseFactory.getMmsDatabase(context);
         *  Recipients recipients   = getSyncMessageDestination(message);
         *  OutgoingMediaMessage mediaMessage = new OutgoingMediaMessage(context, masterSecret, recipients,
         *                                                        message.getMessage().getAttachments().get(),
         *                                                        message.getMessage().getBody().orNull());
         *
         *  mediaMessage = new OutgoingSecureMediaMessage(mediaMessage);
         *
         *  long threadId = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(recipients);
         *  long messageId = database.insertMessageOutbox(masterSecret, mediaMessage, threadId, false, message.getTimestamp());
         *
         *  database.markAsSent(messageId, "push".getBytes(), 0);
         *  database.markAsPush(messageId);
         *
         *  ApplicationContext.getInstance(context)
         *                    .getJobManager()
         *                    .add(new AttachmentDownloadJob(context, messageId));
         *
         *  if (smsMessageId.isPresent())
         *  {
         *      DatabaseFactory.getSmsDatabase(context).deleteMessage(smsMessageId.get());
         *  }
         *  }
         */
        private void handleTextMessage(/*@NonNull MasterSecretUnion masterSecret,*/
            TextSecureEnvelope envelope,
            TextSecureDataMessage message /*,
                                           * @NonNull Optional<Long> smsMessageId*/)
        {
            MessageDatabase database = DatabaseFactory.getMessageDatabase();
            String          body     = message.getBody().HasValue ? message.getBody().ForceGetValue() : "";

            /*Pair<Long, Long> messageAndThreadId;
             *
             * if (smsMessageId.hasValue)
             * {
             *  messageAndThreadId = database.updateBundleMessageBody(masterSecret, smsMessageId.get(), body);
             * }
             * else
             * {*/
            IncomingTextMessage textMessage = new IncomingTextMessage(envelope.getSource(),
                                                                      envelope.getSourceDevice(),
                                                                      (long)message.getTimestamp(), body,
                                                                      message.getGroupInfo());

            textMessage = new IncomingEncryptedMessage(textMessage, body);
            /*messageAndThreadId = */ database.insertMessageInbox(/*masterSecret, */ textMessage);

            /*}
             *
             * MessageNotifier.updateNotification(context, masterSecret.getMasterSecret().orNull(), messageAndThreadId.second);*/
        }
Beispiel #3
0
        public void handle(TextSecureEnvelope envelope, bool sendExplicitReceipt)
        {
            if (!isActiveNumber(envelope.getSource()))
            {
                TextSecureDirectory directory           = DatabaseFactory.getDirectoryDatabase();
                ContactTokenDetails contactTokenDetails = new ContactTokenDetails();
                contactTokenDetails.setNumber(envelope.getSource());

                directory.setNumber(contactTokenDetails, true);
            }

            if (envelope.isReceipt())
            {
                handleReceipt(envelope);
            }
            else
            {
                handleMessage(envelope, sendExplicitReceipt);
            }
        }
Beispiel #4
0
        private void handleMessage(TextSecureEnvelope envelope, bool sendExplicitReceipt)
        {
            var  worker    = App.Current.Worker;
            long messageId = DatabaseFactory.getPushDatabase().Insert(envelope);

            if (sendExplicitReceipt)
            {
                /*   worker.AddTaskActivities(new DeliveryReceiptTask(envelope.getSource(),
                 *                                       envelope.getTimestamp(),
                 *                                       envelope.getRelay()));*/
            }

            worker.AddTaskActivities(new PushDecryptTask(messageId, envelope.getSource()));
        }
Beispiel #5
0
        public long Insert(TextSecureEnvelope envelope)
        {
            // TODO check if exists
            var push = new Push()
            {
                Type          = envelope.getType(),
                Source        = envelope.getSource(),
                DeviceId      = envelope.getSourceDevice(),
                LegacyMessage = envelope.hasLegacyMessage() ? Base64.encodeBytes(envelope.getLegacyMessage()) : "",
                Content       = envelope.hasContent() ? Base64.encodeBytes(envelope.getContent()) : "",
                Timestamp     = TimeUtil.GetDateTime(envelope.getTimestamp())
            };

            try
            {
                conn.Insert(push);
            } catch (Exception e) { Debug.WriteLine(e.Message); }


            return(push.PushId);
        }
Beispiel #6
0
 private void handleReceipt(TextSecureEnvelope envelope)
 {
     Debug.WriteLine($"Received receipt: (XXXXX, {envelope.getTimestamp()})");
     DatabaseFactory.getMessageDatabase().incrementDeliveryReceiptCount(envelope.getSource(),
                                                                        (long)envelope.getTimestamp());
 }
        /**
         * Decrypt a received {@link org.whispersystems.textsecure.api.messages.TextSecureEnvelope}
         *
         * @param envelope The received TextSecureEnvelope
         * @return a decrypted TextSecureMessage
         * @throws InvalidVersionException
         * @throws InvalidMessageException
         * @throws InvalidKeyException
         * @throws DuplicateMessageException
         * @throws InvalidKeyIdException
         * @throws UntrustedIdentityException
         * @throws LegacyMessageException
         * @throws NoSessionException
         */
        public TextSecureContent decrypt(TextSecureEnvelope envelope)
        {
            try
            {
                TextSecureContent content = new TextSecureContent();

                if (envelope.hasLegacyMessage())
                {
                    DataMessage message = DataMessage.ParseFrom(decrypt(envelope, envelope.getLegacyMessage()));
                    content = new TextSecureContent(createTextSecureMessage(envelope, message));
                }
                else if (envelope.hasContent())
                {
                    Content message = Content.ParseFrom(decrypt(envelope, envelope.getContent()));

                    if (message.HasDataMessage)
                    {
                        content = new TextSecureContent(createTextSecureMessage(envelope, message.DataMessage));
                    }
                    else if (message.HasSyncMessage && localAddress.getNumber().Equals(envelope.getSource()))
                    {
                        content = new TextSecureContent(createSynchronizeMessage(envelope, message.SyncMessage));
                    }
                }

                return(content);
            }
            catch (InvalidProtocolBufferException e)
            {
                throw new InvalidMessageException(e);
            }
        }