From e303570b2fe0bf002a0594a9c157e7c7abe77ba7 Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Thu, 1 Jun 2023 14:05:03 -0400 Subject: [PATCH] Update to libsignal 0.26.0 --- .../messages/protocol/BufferedSessionStore.kt | 21 ++++++++++++------- dependencies.gradle | 2 +- gradle/verification-metadata.xml | 20 +++++++++--------- .../signalservice/api/kbs/PinHashUtil.kt | 2 +- .../signalservice/api/svr/Svr2PinHasher.kt | 5 ++--- .../signalservice/api/svr/Svr2Socket.kt | 5 +++-- .../internal/push/KyberPreKeyEntity.java | 7 ++++++- 7 files changed, 36 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/protocol/BufferedSessionStore.kt b/app/src/main/java/org/thoughtcrime/securesms/messages/protocol/BufferedSessionStore.kt index fb414cb19c..9a13ceaa96 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/protocol/BufferedSessionStore.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/protocol/BufferedSessionStore.kt @@ -34,28 +34,33 @@ class BufferedSessionStore(private val selfServiceId: ServiceId) : SignalService @Throws(NoSessionException::class) override fun loadExistingSessions(addresses: MutableList): List { - val found: MutableList = mutableListOf() - val needsDatabaseLookup: MutableList = mutableListOf() + val found: MutableList = ArrayList(addresses.size) + val needsDatabaseLookup: MutableList> = mutableListOf() - for (address in addresses) { + addresses.forEachIndexed { index, address -> val cached: SessionRecord? = store[address] if (cached != null) { - found += cached + found[index] = cached } else { - needsDatabaseLookup += address + needsDatabaseLookup += (index to address) } } if (needsDatabaseLookup.isNotEmpty()) { - found += SignalDatabase.sessions.load(selfServiceId, needsDatabaseLookup).filterNotNull() + val databaseRecords: List = SignalDatabase.sessions.load(selfServiceId, needsDatabaseLookup.map { (_, address) -> address }) + needsDatabaseLookup.forEachIndexed { databaseLookupIndex, (addressIndex, _) -> + found[addressIndex] = databaseRecords[databaseLookupIndex] + } } - if (found.size != addresses.size) { + val cachedAndLoaded = found.filterNotNull() + + if (cachedAndLoaded.size != addresses.size) { throw NoSessionException("Failed to find one or more sessions.") } - return found + return cachedAndLoaded } override fun storeSession(address: SignalProtocolAddress, record: SessionRecord) { diff --git a/dependencies.gradle b/dependencies.gradle index ddd0a17718..0747c4bc8d 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -13,7 +13,7 @@ dependencyResolutionManagement { version('exoplayer', '2.18.1') version('glide', '4.13.2') version('kotlin', '1.8.10') - version('libsignal-client', '0.25.0') + version('libsignal-client', '0.26.0') version('mp4parser', '1.9.39') version('android-gradle-plugin', '7.4.1') version('accompanist', '0.28.0') diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 2db673e8df..3a3ff5e20f 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -5872,20 +5872,20 @@ https://docs.gradle.org/current/userguide/dependency_verification.html - - - + + + - - + + - - - + + + - - + + diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/kbs/PinHashUtil.kt b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/kbs/PinHashUtil.kt index 2b01c3a295..b8713b9e10 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/kbs/PinHashUtil.kt +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/kbs/PinHashUtil.kt @@ -18,7 +18,7 @@ object PinHashUtil { */ @JvmStatic fun hashPin(pin: String, salt: ByteArray): PinHash { - return Pin.hash(normalize(pin), salt) + return PinHash.svr1(normalize(pin), salt) } /** diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/svr/Svr2PinHasher.kt b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/svr/Svr2PinHasher.kt index 84563dbeae..dbc3c5687e 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/svr/Svr2PinHasher.kt +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/svr/Svr2PinHasher.kt @@ -6,7 +6,6 @@ package org.whispersystems.signalservice.api.svr import org.signal.libsignal.svr2.PinHash -import org.signal.libsignal.svr2.Svr2Client import org.whispersystems.signalservice.internal.push.AuthCredentials /** @@ -14,9 +13,9 @@ import org.whispersystems.signalservice.internal.push.AuthCredentials */ internal class Svr2PinHasher( private val authCredentials: AuthCredentials, - private val client: Svr2Client + private val mrEnclave: ByteArray ) { fun hash(normalizedPin: ByteArray): PinHash { - return client.hashPin(normalizedPin, authCredentials.username().toByteArray(Charsets.UTF_8)) + return PinHash.svr2(normalizedPin, authCredentials.username(), mrEnclave) } } diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/svr/Svr2Socket.kt b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/svr/Svr2Socket.kt index 89cc53ed2e..c96e5baaef 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/svr/Svr2Socket.kt +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/svr/Svr2Socket.kt @@ -97,8 +97,9 @@ internal class Svr2Socket( } Stage.WAITING_FOR_CONNECTION -> { - client = Svr2Client.create(Hex.fromStringCondensed(mrEnclave), bytes.toByteArray(), Instant.now()) - pinHasher = Svr2PinHasher(authorization, client) + val mrEnclave: ByteArray = Hex.fromStringCondensed(mrEnclave) + client = Svr2Client(mrEnclave, bytes.toByteArray(), Instant.now()) + pinHasher = Svr2PinHasher(authorization, mrEnclave) Log.d(TAG, "[onMessage] Sending initial handshake...") webSocket.send(client.initialRequest().toByteString()) diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/internal/push/KyberPreKeyEntity.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/internal/push/KyberPreKeyEntity.java index d123ad4552..7668d549a1 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/internal/push/KyberPreKeyEntity.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/internal/push/KyberPreKeyEntity.java @@ -16,6 +16,7 @@ import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.signal.libsignal.protocol.InvalidKeyException; import org.signal.libsignal.protocol.kem.KEMPublicKey; import org.whispersystems.util.Base64; @@ -66,7 +67,11 @@ public class KyberPreKeyEntity { private static class KEMPublicKeyDeserializer extends JsonDeserializer { @Override public KEMPublicKey deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { - return new KEMPublicKey(Base64.decodeWithoutPadding(p.getValueAsString()), 0); + try { + return new KEMPublicKey(Base64.decodeWithoutPadding(p.getValueAsString()), 0); + } catch (InvalidKeyException e) { + throw new IOException(e); + } } }