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()); } }