private async Task <OutgoingPushMessage> getEncryptedMessage(PushServiceSocket socket, TextSecureAddress recipient, uint deviceId, byte[] plaintext, bool legacy) { AxolotlAddress axolotlAddress = new AxolotlAddress(recipient.getNumber(), deviceId); TextSecureCipher cipher = new TextSecureCipher(localAddress, store); if (!store.ContainsSession(axolotlAddress)) { try { List <PreKeyBundle> preKeys = await socket.getPreKeys(recipient, deviceId); foreach (PreKeyBundle preKey in preKeys) { try { AxolotlAddress preKeyAddress = new AxolotlAddress(recipient.getNumber(), preKey.getDeviceId()); SessionBuilder sessionBuilder = new SessionBuilder(store, preKeyAddress); sessionBuilder.process(preKey); } catch (libaxolotl.exceptions.UntrustedIdentityException e) { throw new UntrustedIdentityException("Untrusted identity key!", recipient.getNumber(), preKey.getIdentityKey()); } } if (eventListener.HasValue) { eventListener.ForceGetValue().onSecurityEvent(recipient); } } catch (InvalidKeyException e) { throw new Exception(e.Message); } } return(cipher.encrypt(axolotlAddress, plaintext, legacy)); }
private void handleMessage(/*MasterSecretUnion masterSecret, */ TextSecureEnvelope envelope /*, Optional<Long> smsMessageId*/) { try { AxolotlStore axolotlStore = new TextSecureAxolotlStore(); TextSecureAddress localAddress = new TextSecureAddress(TextSecurePreferences.getLocalNumber()); TextSecureCipher cipher = new TextSecureCipher(localAddress, axolotlStore); TextSecureContent content = cipher.decrypt(envelope); if (content.getDataMessage().HasValue) { TextSecureDataMessage message = content.getDataMessage().ForceGetValue(); if (message.isEndSession()) { handleEndSessionMessage(/*masterSecret, */ envelope, message /*, smsMessageId*/); } //else if (message.isGroupUpdate()) handleGroupMessage(masterSecret, envelope, message, smsMessageId); //else if (message.getAttachments().isPresent()) handleMediaMessage(masterSecret, envelope, message, smsMessageId); else { handleTextMessage(/*masterSecret, */ envelope, message /*, smsMessageId*/); } } /*else if (content.getSyncMessage().HasValue) TODO: SYNC enable * { * TextSecureSyncMessage syncMessage = content.getSyncMessage().ForceGetValue(); * * if (syncMessage.getSent().HasValue) handleSynchronizeSentMessage(masterSecret, syncMessage.getSent().ForceGetValue(), smsMessageId); * else if (syncMessage.getRequest().HasValue) handleSynchronizeRequestMessage(masterSecret, syncMessage.getRequest().ForceGetValue()); * }*/ if (envelope.isPreKeyWhisperMessage()) { App.Current.Worker.AddTaskActivities(new RefreshPreKeysTask()); //ApplicationContext.getInstance(context).getJobManager().add(new RefreshPreKeysJob(context)); } } catch (InvalidVersionException e) { //Log.w(TAG, e); //handleInvalidVersionMessage(masterSecret, envelope, smsMessageId); } /* catch (InvalidMessageException | InvalidKeyIdException | InvalidKeyException | MmsException e) { * Log.w(TAG, e); * handleCorruptMessage(masterSecret, envelope, smsMessageId); * } catch (NoSessionException e) * { * Log.w(TAG, e); * handleNoSessionMessage(masterSecret, envelope, smsMessageId); * } * catch (LegacyMessageException e) * { * Log.w(TAG, e); * handleLegacyMessage(masterSecret, envelope, smsMessageId); * } * catch (DuplicateMessageException e) * { * Log.w(TAG, e); * handleDuplicateMessage(masterSecret, envelope, smsMessageId); * } * catch (UntrustedIdentityException e) * { * Log.w(TAG, e); * handleUntrustedIdentityMessage(masterSecret, envelope, smsMessageId); * }*/ }