diff --git a/dependencies.gradle b/dependencies.gradle
index 8aff7495ff..2d924e8944 100644
--- a/dependencies.gradle
+++ b/dependencies.gradle
@@ -15,7 +15,7 @@ dependencyResolutionManagement {
version('exoplayer', '2.19.0')
version('glide', '4.15.1')
version('kotlin', '1.8.10')
- version('libsignal-client', '0.31.0')
+ version('libsignal-client', '0.32.0')
version('mp4parser', '1.9.39')
version('android-gradle-plugin', '8.0.2')
version('accompanist', '0.28.0')
diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml
index 68044589a9..e4737354b2 100644
--- a/gradle/verification-metadata.xml
+++ b/gradle/verification-metadata.xml
@@ -5249,36 +5249,20 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
-
-
-
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/crypto/EnvelopeContent.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/crypto/EnvelopeContent.java
index ef95b2cc96..af84564696 100644
--- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/crypto/EnvelopeContent.java
+++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/crypto/EnvelopeContent.java
@@ -3,6 +3,7 @@ package org.whispersystems.signalservice.api.crypto;
import org.signal.libsignal.metadata.certificate.SenderCertificate;
import org.signal.libsignal.metadata.protocol.UnidentifiedSenderMessageContent;
import org.signal.libsignal.protocol.InvalidKeyException;
+import org.signal.libsignal.protocol.NoSessionException;
import org.signal.libsignal.protocol.SignalProtocolAddress;
import org.signal.libsignal.protocol.UntrustedIdentityException;
import org.signal.libsignal.protocol.message.CiphertextMessage;
@@ -28,12 +29,12 @@ public interface EnvelopeContent {
SignalSealedSessionCipher sealedSessionCipher,
SignalProtocolAddress destination,
SenderCertificate senderCertificate)
- throws UntrustedIdentityException, InvalidKeyException;
+ throws UntrustedIdentityException, InvalidKeyException, NoSessionException;
/**
* Processes the content using unsealed sender.
*/
- OutgoingPushMessage processUnsealedSender(SignalSessionCipher sessionCipher, SignalProtocolAddress destination) throws UntrustedIdentityException;
+ OutgoingPushMessage processUnsealedSender(SignalSessionCipher sessionCipher, SignalProtocolAddress destination) throws UntrustedIdentityException, NoSessionException;
/**
* An estimated size, in bytes.
@@ -77,7 +78,7 @@ public interface EnvelopeContent {
SignalSealedSessionCipher sealedSessionCipher,
SignalProtocolAddress destination,
SenderCertificate senderCertificate)
- throws UntrustedIdentityException, InvalidKeyException
+ throws UntrustedIdentityException, InvalidKeyException, NoSessionException
{
PushTransportDetails transportDetails = new PushTransportDetails();
CiphertextMessage message = sessionCipher.encrypt(transportDetails.getPaddedMessageBody(content.toByteArray()));
@@ -94,7 +95,7 @@ public interface EnvelopeContent {
}
@Override
- public OutgoingPushMessage processUnsealedSender(SignalSessionCipher sessionCipher, SignalProtocolAddress destination) throws UntrustedIdentityException {
+ public OutgoingPushMessage processUnsealedSender(SignalSessionCipher sessionCipher, SignalProtocolAddress destination) throws UntrustedIdentityException, NoSessionException {
PushTransportDetails transportDetails = new PushTransportDetails();
CiphertextMessage message = sessionCipher.encrypt(transportDetails.getPaddedMessageBody(content.toByteArray()));
int remoteRegistrationId = sessionCipher.getRemoteRegistrationId();
diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/crypto/SignalServiceCipher.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/crypto/SignalServiceCipher.java
index 5080028c52..c91434c0b0 100644
--- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/crypto/SignalServiceCipher.java
+++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/crypto/SignalServiceCipher.java
@@ -29,6 +29,7 @@ import org.signal.libsignal.protocol.InvalidKeyException;
import org.signal.libsignal.protocol.InvalidKeyIdException;
import org.signal.libsignal.protocol.InvalidMessageException;
import org.signal.libsignal.protocol.InvalidRegistrationIdException;
+import org.signal.libsignal.protocol.InvalidSessionException;
import org.signal.libsignal.protocol.InvalidVersionException;
import org.signal.libsignal.protocol.LegacyMessageException;
import org.signal.libsignal.protocol.NoSessionException;
@@ -106,20 +107,23 @@ public class SignalServiceCipher {
return sessionCipher.multiRecipientEncrypt(destinations, messageContent);
}
- public OutgoingPushMessage encrypt(SignalProtocolAddress destination,
+ public OutgoingPushMessage encrypt(SignalProtocolAddress destination,
Optional unidentifiedAccess,
- EnvelopeContent content)
+ EnvelopeContent content)
throws UntrustedIdentityException, InvalidKeyException
{
- if (unidentifiedAccess.isPresent()) {
- SignalSessionCipher sessionCipher = new SignalSessionCipher(sessionLock, new SessionCipher(signalProtocolStore, destination));
- SignalSealedSessionCipher sealedSessionCipher = new SignalSealedSessionCipher(sessionLock, new SealedSessionCipher(signalProtocolStore, localAddress.getServiceId().getRawUuid(), localAddress.getNumber().orElse(null), localDeviceId));
-
- return content.processSealedSender(sessionCipher, sealedSessionCipher, destination, unidentifiedAccess.get().getUnidentifiedCertificate());
- } else {
+ try {
SignalSessionCipher sessionCipher = new SignalSessionCipher(sessionLock, new SessionCipher(signalProtocolStore, destination));
+ if (unidentifiedAccess.isPresent()) {
+ SignalSealedSessionCipher sealedSessionCipher = new SignalSealedSessionCipher(sessionLock, new SealedSessionCipher(signalProtocolStore, localAddress.getServiceId().getRawUuid(), localAddress.getNumber()
+ .orElse(null), localDeviceId));
- return content.processUnsealedSender(sessionCipher, destination);
+ return content.processSealedSender(sessionCipher, sealedSessionCipher, destination, unidentifiedAccess.get().getUnidentifiedCertificate());
+ } else {
+ return content.processUnsealedSender(sessionCipher, destination);
+ }
+ } catch (NoSessionException e) {
+ throw new InvalidSessionException("Session not found.");
}
}
diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/crypto/SignalSessionCipher.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/crypto/SignalSessionCipher.java
index f75844bd09..201302a266 100644
--- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/crypto/SignalSessionCipher.java
+++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/crypto/SignalSessionCipher.java
@@ -27,7 +27,7 @@ public class SignalSessionCipher {
this.cipher = cipher;
}
- public CiphertextMessage encrypt(byte[] paddedMessage) throws org.signal.libsignal.protocol.UntrustedIdentityException {
+ public CiphertextMessage encrypt(byte[] paddedMessage) throws org.signal.libsignal.protocol.UntrustedIdentityException, NoSessionException {
try (SignalSessionLock.Lock unused = lock.acquire()) {
return cipher.encrypt(paddedMessage);
}