package com.smack.demo; import java.io.File; import java.util.Scanner; import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.chat2.ChatManager; import org.jivesoftware.smack.packet.Message; import org.jivesoftware.smackx.omemo.OmemoConfiguration; import org.jivesoftware.smackx.omemo.OmemoFingerprint; import org.jivesoftware.smackx.omemo.OmemoManager; import org.jivesoftware.smackx.omemo.OmemoService; import org.jivesoftware.smackx.omemo.element.OmemoVAxolotlElement; import org.jivesoftware.smackx.omemo.exceptions.CannotEstablishOmemoSessionException; import org.jivesoftware.smackx.omemo.exceptions.UndecidedOmemoIdentityException; import org.jivesoftware.smackx.omemo.internal.CipherAndAuthTag; import org.jivesoftware.smackx.omemo.internal.OmemoDevice; import org.jivesoftware.smackx.omemo.internal.OmemoMessageInformation; import org.jivesoftware.smackx.omemo.listener.OmemoMessageListener; import org.jivesoftware.smackx.omemo.signal.SignalOmemoService; import org.jivesoftware.smackx.pep.PEPListener; import org.jivesoftware.smackx.pep.PEPManager; import org.jivesoftware.smackx.pubsub.EventElement; import org.jxmpp.jid.BareJid; import org.jxmpp.jid.EntityBareJid; import org.jxmpp.jid.impl.JidCreate; import org.whispersystems.libsignal.IdentityKeyPair; public class SmackE2E { private static OmemoManager omemoManager; public static void main(String[] args) { try { Scanner sc = new Scanner(System.in); try { System.out.println("enter username"); String username = sc.nextLine(); System.out.println("enter password"); String password = sc.nextLine(); try { SignalOmemoService.acknowledgeLicense(); SignalOmemoService.setup(); PEPListener deviceListUpdateListener = new PEPListener() { @Override public void eventReceived(EntityBareJid arg0, EventElement arg1, Message arg2) { System.out.println( "argo " + arg0 + " event element " + arg1.toXML() + " arg2 " + arg2.toXML()); } }; XMPPConnection connection = GetXmppConnetion.getConnection(username, password); BareJid user = connection.getUser().asBareJid(); PEPManager.getInstanceFor(connection).removePEPListener(deviceListUpdateListener); PEPManager.getInstanceFor(connection).addPEPListener(deviceListUpdateListener); System.out.println("Enter path "); String path = sc.nextLine(); OmemoConfiguration.setFileBasedOmemoStoreDefaultPath(new File(path)); omemoManager = OmemoManager.getInstanceFor(connection); omemoManager.regenerate(); omemoManager.initialize(); int defaultDeviceId = OmemoService.getInstance().getOmemoStoreBackend().getDefaultDeviceId(user); if (defaultDeviceId < 1) { defaultDeviceId = OmemoManager.randomDeviceId(); OmemoService.getInstance().getOmemoStoreBackend().setDefaultDeviceId(user, defaultDeviceId); } OmemoDevice omemodevice = omemoManager.getOwnDevice(); OmemoFingerprint myFingerprint = omemoManager.getFingerprint(omemodevice); omemoManager.trustOmemoIdentity(omemodevice, myFingerprint); omemoManager.addOmemoMessageListener(new OmemoMessageListener() { @Override public void onOmemoKeyTransportReceived(CipherAndAuthTag arg0, Message arg1, Message arg2, OmemoMessageInformation arg3) { System.out.println("received something "); } @Override public void onOmemoMessageReceived(String arg0, Message arg1, Message arg2, OmemoMessageInformation arg3) { System.out.println("decrypted message :- " + arg0); } }); String line1 = " "; OmemoService.getInstance().buildSessionFromOmemoBundle(omemoManager, omemodevice, true); while (!line1.equals("stop")) { Message encrypted = null; System.out.println("enter to address "); String to = sc.nextLine(); System.out.println("message :- "); String message = sc.nextLine(); EntityBareJid recipientJid = JidCreate.entityBareFrom(to + "@" + GetXmppConnetion.strServer); try { omemoManager.buildSessionsWith(recipientJid); byte[] iv = element.getHeader().getIv(); Message m = omemoManager.encryptForExistingSessions(excetion, message); } // In case of undecided devices catch (UndecidedOmemoIdentityException e) { for (OmemoDevice device : e.getUndecidedDevices()) { System.out.println(device); } } // In case we cannot establish session with some devices catch (CannotEstablishOmemoSessionException e) { encrypted = omemoManager.encryptForExistingSessions(e, message.toString()); } // send if (encrypted != null) { OmemoService.getInstance().buildSessionFromOmemoBundle(omemoManager, omemodevice, true); ChatManager.getInstanceFor(connection).chatWith(recipientJid).send(encrypted); } } } catch (Exception e) { e.printStackTrace(); } } catch (Exception e) { e.printStackTrace(); } } catch ( Exception e) { e.printStackTrace(); } } }