How to implement OMEMO encryption for chat stanza of XMPP android

759 Views Asked by At

Good day!!!

I tried encryption using OMEMO for chatting using XMPP, but getting device listing issue while doing actual encryption.

followed below steps,

  1. OMEMO service registration
  2. Device id generated
  3. Fingerprints generated
  4. Trust OMEMO identity
  5. Encrypt using OMEMO manager
  6. Send a message using the XMPP connection object.

    Please check below code, Note that, I don't have an idea about store file so I created a local file and given here. I didn't find any documentation about the same. Please let me know the same too if anyone knows about it.

       try {
    
            var messageToSend = tMessagetext!!.text.toString();
    
    
            var mFriendJID = "abc@localhost/yyy";
    
    
            val jidFriend = JidCreate.from(mFriendJID);
    
            val jidBare = JidCreate.bareFrom(mFriendJID);
    
            val msg = Message(jidFriend, Message.Type.chat);
    
            msg.setBody(messageToSend);
    
            SignalOmemoService.acknowledgeLicense();
            if (!SignalOmemoService.isServiceRegistered())
                SignalOmemoService.setup();
    
            val service = SignalOmemoService.getInstance()
    
            val file = File(Environment.getExternalStorageDirectory().absolutePath,"myAppFile.txt");
    
            OmemoConfiguration.setFileBasedOmemoStoreDefaultPath(file);
    
    
            val memomanager = OmemoManager.getInstanceFor(ChatService.xmppConnection)
    
            val  device = memomanager.ownDevice
    
    
            Log.e(TAG, device.deviceId.toString()+", "+device.jid);
            val fingerPrint = memomanager.getFingerprint(device)
    
    
            Log.e(TAG, fingerPrint.toString());
            memomanager.trustOmemoIdentity(device, fingerPrint);
    
            val encryptedMessage = memomanager!!.encrypt(jidBare, messageToSend)
    
            ChatService.xmppConnection!!.sendStanza(encryptedMessage)
            tMessagetext!!.text.clear();
    
        }catch (e :java.lang.Exception){
            e.printStackTrace()
        }
    

And error I am getting is,

OmemoService: Could not fetch device list of abc@localhost: org.jivesoftware.smack.XMPPException$XMPPErrorException: XMPP error reply received from abc@localhost: XMPPError: service-unavailable - cancel
    org.jivesoftware.smack.XMPPException$XMPPErrorException: XMPP error reply received from abc@localhost: XMPPError: service-unavailable - cancel
        at org.jivesoftware.smack.StanzaCollector.nextResultOrThrow(StanzaCollector.java:268)
        at org.jivesoftware.smack.StanzaCollector.nextResultOrThrow(StanzaCollector.java:219)
        at org.jivesoftware.smackx.pubsub.LeafNode.getItems(LeafNode.java:196)
        at org.jivesoftware.smackx.pubsub.LeafNode.getItems(LeafNode.java:189)
        at org.jivesoftware.smackx.pubsub.LeafNode.getItems(LeafNode.java:136)
        at org.jivesoftware.smackx.pubsub.PubSubManager.getLeafNodeProsodyWorkaround(PubSubManager.java:350)
        at org.jivesoftware.smackx.pubsub.PubSubManager.getLeafNode(PubSubManager.java:333)
        at org.jivesoftware.smackx.omemo.OmemoService.fetchDeviceListNode(OmemoService.java:435)
        at org.jivesoftware.smackx.omemo.OmemoService.fetchDeviceList(OmemoService.java:452)
        at org.jivesoftware.smackx.omemo.OmemoService.refreshDeviceList(OmemoService.java:504)
        at org.jivesoftware.smackx.omemo.OmemoService.buildOrCreateOmemoSessionsFromBundles(OmemoService.java:605)
        at org.jivesoftware.smackx.omemo.OmemoService.processSendingMessage(OmemoService.java:810)
        at org.jivesoftware.smackx.omemo.OmemoService.processSendingMessage(OmemoService.java:787)
        at org.jivesoftware.smackx.omemo.OmemoManager.encrypt(OmemoManager.java:209)
        at com.abcd.androidChatapp.MainActivity.onSendMessage(MainActivity.kt:347)
        at java.lang.reflect.Method.invoke(Native Method)
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385)
        at android.view.View.performClick(View.java:6312)
        at android.view.View$PerformClick.run(View.java:24943)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:192)
        at android.app.ActivityThread.main(ActivityThread.java:6754)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:549)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:828)

Please let me know the issue in this code so that I can go ahead and progress. Let me know if you have proper documentation about the same So that I can go in too deep to understand what is exactly happening in this process.

Thanking you in advance.

1

There are 1 best solutions below

0
James Chan On

Here is the code what I used.

//Setup stream
SignalOmemoService.acknowledgeLicense();
SignalOmemoService.setup();

SignalOmemoService service = (SignalOmemoService) SignalOmemoService.getInstance();
service.setOmemoStoreBackend(new SignalCachingOmemoStore(new SignalFileBasedOmemoStore(mContext.getFilesDir())));

omemoManager = OmemoManager.getInstanceFor(getSafeConnection(), deviceId);
omemoManager.setTrustCallback(this);
omemoManager.addOmemoMessageListener(this);
omemoManager.addOmemoMucMessageListener(this);

//After login
omemoManager.purgeDeviceList();
omemoManager.initialize();

//send message
BareJid bareJid = JidCreate.bareFrom(jid);
OmemoMessage.Sent encMesage = omemoManager.encrypt(bareJid, msgText);
Message newMessage = encMesage.asMessage(bareJid);
xmppStream.sendMessage(newMessage);

Also you need to check this