private async Task <OutgoingPushMessage> GetEncryptedMessage(CancellationToken token,
                                                                     PushServiceSocket socket,
                                                                     SignalServiceAddress recipient,
                                                                     UnidentifiedAccess?unidentifiedAccess,
                                                                     uint deviceId,
                                                                     byte[] plaintext)
        {
            SignalProtocolAddress signalProtocolAddress = new SignalProtocolAddress(recipient.E164number, deviceId);
            SignalServiceCipher   cipher = new SignalServiceCipher(LocalAddress, Store, null);

            if (!Store.ContainsSession(signalProtocolAddress))
            {
                try
                {
                    List <PreKeyBundle> preKeys = await socket.GetPreKeys(token, recipient, unidentifiedAccess, deviceId);

                    foreach (PreKeyBundle preKey in preKeys)
                    {
                        if (CredentialsProvider.User.Equals(recipient.E164number) && CredentialsProvider.DeviceId == preKey.getDeviceId())
                        {
                            continue;
                        }
                        try
                        {
                            SignalProtocolAddress preKeyAddress  = new SignalProtocolAddress(recipient.E164number, preKey.getDeviceId());
                            SessionBuilder        sessionBuilder = new SessionBuilder(Store, preKeyAddress);
                            sessionBuilder.process(preKey);
                        }
                        catch (libsignal.exceptions.UntrustedIdentityException)
                        {
                            throw new UntrustedIdentityException("Untrusted identity key!", recipient.E164number, preKey.getIdentityKey());
                        }
                    }

                    if (EventListener != null)
                    {
                        EventListener.OnSecurityEvent(recipient);
                    }
                }
                catch (InvalidKeyException e)
                {
                    throw new Exception(e.Message);
                }
            }

            try
            {
                return(cipher.Encrypt(signalProtocolAddress, unidentifiedAccess, plaintext));
            }
            catch (libsignal.exceptions.UntrustedIdentityException e)
            {
                throw new UntrustedIdentityException("Untrusted on send", e.getName(), e.getUntrustedIdentity());
            }
        }