From e74d502ae6a1f9ee7cfd58cdf1db10acca227711 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Wed, 26 May 2021 17:46:58 -0400 Subject: [PATCH] Remove legacy session version. Hasn't been used since the TextSecure days! --- .../api/crypto/SignalServiceCipher.java | 24 +++++++------------ .../internal/push/PushTransportDetails.java | 11 --------- .../push/PushTransportDetailsTest.java | 10 +------- 3 files changed, 10 insertions(+), 35 deletions(-) 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 612ace18c..53f63068d 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 @@ -86,7 +86,7 @@ public class SignalServiceCipher { { if (unidentifiedAccess.isPresent()) { SignalSealedSessionCipher sessionCipher = new SignalSealedSessionCipher(sessionLock, new SealedSessionCipher(signalProtocolStore, localAddress.getUuid().orNull(), localAddress.getNumber().orNull(), 1)); - PushTransportDetails transportDetails = new PushTransportDetails(sessionCipher.getSessionVersion(destination)); + PushTransportDetails transportDetails = new PushTransportDetails(); byte[] ciphertext = sessionCipher.encrypt(destination, unidentifiedAccess.get().getUnidentifiedCertificate(), transportDetails.getPaddedMessageBody(unpaddedMessage)); String body = Base64.encodeBytes(ciphertext); int remoteRegistrationId = sessionCipher.getRemoteRegistrationId(destination); @@ -94,7 +94,7 @@ public class SignalServiceCipher { return new OutgoingPushMessage(Type.UNIDENTIFIED_SENDER_VALUE, destination.getDeviceId(), remoteRegistrationId, body); } else { SignalSessionCipher sessionCipher = new SignalSessionCipher(sessionLock, new SessionCipher(signalProtocolStore, destination)); - PushTransportDetails transportDetails = new PushTransportDetails(sessionCipher.getSessionVersion()); + PushTransportDetails transportDetails = new PushTransportDetails(); CiphertextMessage message = sessionCipher.encrypt(transportDetails.getPaddedMessageBody(unpaddedMessage)); int remoteRegistrationId = sessionCipher.getRemoteRegistrationId(); String body = Base64.encodeBytes(message.serialize()); @@ -169,7 +169,6 @@ public class SignalServiceCipher { byte[] paddedMessage; SignalServiceMetadata metadata; - int sessionVersion; if (!envelope.hasSource() && !envelope.isUnidentifiedSender()) { throw new ProtocolInvalidMessageException(new InvalidMessageException("Non-UD envelope is missing a source!"), null, 0); @@ -179,30 +178,26 @@ public class SignalServiceCipher { SignalProtocolAddress sourceAddress = getPreferredProtocolAddress(signalProtocolStore, envelope.getSourceAddress(), envelope.getSourceDevice()); SignalSessionCipher sessionCipher = new SignalSessionCipher(sessionLock, new SessionCipher(signalProtocolStore, sourceAddress)); - paddedMessage = sessionCipher.decrypt(new PreKeySignalMessage(ciphertext)); - metadata = new SignalServiceMetadata(envelope.getSourceAddress(), envelope.getSourceDevice(), envelope.getTimestamp(), envelope.getServerReceivedTimestamp(), envelope.getServerDeliveredTimestamp(), false, envelope.getServerGuid()); - sessionVersion = sessionCipher.getSessionVersion(); + paddedMessage = sessionCipher.decrypt(new PreKeySignalMessage(ciphertext)); + metadata = new SignalServiceMetadata(envelope.getSourceAddress(), envelope.getSourceDevice(), envelope.getTimestamp(), envelope.getServerReceivedTimestamp(), envelope.getServerDeliveredTimestamp(), false, envelope.getServerGuid()); } else if (envelope.isSignalMessage()) { SignalProtocolAddress sourceAddress = getPreferredProtocolAddress(signalProtocolStore, envelope.getSourceAddress(), envelope.getSourceDevice()); SignalSessionCipher sessionCipher = new SignalSessionCipher(sessionLock, new SessionCipher(signalProtocolStore, sourceAddress)); - paddedMessage = sessionCipher.decrypt(new SignalMessage(ciphertext)); - metadata = new SignalServiceMetadata(envelope.getSourceAddress(), envelope.getSourceDevice(), envelope.getTimestamp(), envelope.getServerReceivedTimestamp(), envelope.getServerDeliveredTimestamp(), false, envelope.getServerGuid()); - sessionVersion = sessionCipher.getSessionVersion(); + paddedMessage = sessionCipher.decrypt(new SignalMessage(ciphertext)); + metadata = new SignalServiceMetadata(envelope.getSourceAddress(), envelope.getSourceDevice(), envelope.getTimestamp(), envelope.getServerReceivedTimestamp(), envelope.getServerDeliveredTimestamp(), false, envelope.getServerGuid()); } else if (envelope.isUnidentifiedSender()) { SignalSealedSessionCipher sealedSessionCipher = new SignalSealedSessionCipher(sessionLock, new SealedSessionCipher(signalProtocolStore, localAddress.getUuid().orNull(), localAddress.getNumber().orNull(), 1)); DecryptionResult result = sealedSessionCipher.decrypt(certificateValidator, ciphertext, envelope.getServerReceivedTimestamp()); SignalServiceAddress resultAddress = new SignalServiceAddress(UuidUtil.parse(result.getSenderUuid()), result.getSenderE164()); - SignalProtocolAddress protocolAddress = getPreferredProtocolAddress(signalProtocolStore, resultAddress, result.getDeviceId()); - paddedMessage = result.getPaddedMessage(); - metadata = new SignalServiceMetadata(resultAddress, result.getDeviceId(), envelope.getTimestamp(), envelope.getServerReceivedTimestamp(), envelope.getServerDeliveredTimestamp(), true, envelope.getServerGuid()); - sessionVersion = sealedSessionCipher.getSessionVersion(protocolAddress); + paddedMessage = result.getPaddedMessage(); + metadata = new SignalServiceMetadata(resultAddress, result.getDeviceId(), envelope.getTimestamp(), envelope.getServerReceivedTimestamp(), envelope.getServerDeliveredTimestamp(), true, envelope.getServerGuid()); } else { throw new InvalidMetadataMessageException("Unknown type: " + envelope.getType()); } - PushTransportDetails transportDetails = new PushTransportDetails(sessionVersion); + PushTransportDetails transportDetails = new PushTransportDetails(); byte[] data = transportDetails.getStrippedPaddingMessageBody(paddedMessage); return new Plaintext(metadata, data); @@ -255,5 +250,4 @@ public class SignalServiceCipher { return data; } } - } diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/internal/push/PushTransportDetails.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/internal/push/PushTransportDetails.java index 13cff09cd..53dd0315a 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/internal/push/PushTransportDetails.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/internal/push/PushTransportDetails.java @@ -13,16 +13,8 @@ public class PushTransportDetails { private static final String TAG = PushTransportDetails.class.getSimpleName(); - private final int messageVersion; - - public PushTransportDetails(int messageVersion) { - this.messageVersion = messageVersion; - } public byte[] getStrippedPaddingMessageBody(byte[] messageWithPadding) { - if (messageVersion < 2) throw new AssertionError("Unknown version: " + messageVersion); - else if (messageVersion == 2) return messageWithPadding; - int paddingStart = 0; for (int i=messageWithPadding.length-1;i>=0;i--) { @@ -42,9 +34,6 @@ public class PushTransportDetails { } public byte[] getPaddedMessageBody(byte[] messageBody) { - if (messageVersion < 2) throw new AssertionError("Unknown version: " + messageVersion); - else if (messageVersion == 2) return messageBody; - // NOTE: This is dumb. We have our own padding scheme, but so does the cipher. // The +1 -1 here is to make sure the Cipher has room to add one padding byte, // otherwise it'll add a full 16 extra bytes. diff --git a/libsignal/service/src/test/java/org/whispersystems/signalservice/push/PushTransportDetailsTest.java b/libsignal/service/src/test/java/org/whispersystems/signalservice/push/PushTransportDetailsTest.java index bcde39b11..26cd13e26 100644 --- a/libsignal/service/src/test/java/org/whispersystems/signalservice/push/PushTransportDetailsTest.java +++ b/libsignal/service/src/test/java/org/whispersystems/signalservice/push/PushTransportDetailsTest.java @@ -6,8 +6,7 @@ import org.whispersystems.signalservice.internal.push.PushTransportDetails; public class PushTransportDetailsTest extends TestCase { - private final PushTransportDetails transportV2 = new PushTransportDetails(2); - private final PushTransportDetails transportV3 = new PushTransportDetails(3); + private final PushTransportDetails transportV3 = new PushTransportDetails(); public void testV3Padding() { for (int i=0;i<159;i++) { @@ -25,11 +24,4 @@ public class PushTransportDetailsTest extends TestCase { assertEquals(transportV3.getPaddedMessageBody(message).length, 479); } } - - public void testV2Padding() { - for (int i=0;i<480;i++) { - byte[] message = new byte[i]; - assertTrue(transportV2.getPaddedMessageBody(message).length == message.length); - } - } }