From 2bf385fe384b1144e741bda45893d713b41c7094 Mon Sep 17 00:00:00 2001 From: Nicholas Date: Tue, 5 Sep 2023 15:35:41 -0400 Subject: [PATCH] Upgrade libsignal to 0.32.0 --- dependencies.gradle | 2 +- gradle/verification-metadata.xml | 36 ++++++------------- .../api/crypto/EnvelopeContent.java | 9 ++--- .../api/crypto/SignalServiceCipher.java | 22 +++++++----- .../api/crypto/SignalSessionCipher.java | 2 +- 5 files changed, 30 insertions(+), 41 deletions(-) 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); }