From a76d400bd191ea523baf1ae0367b40c456a8e8f5 Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Wed, 21 Aug 2024 10:37:34 -0400 Subject: [PATCH] Upgrade to libsignal 0.56.0 --- .../helpers/PreKeyMigrationHelper.java | 2 +- .../securesms/jobs/PreKeysSyncJob.kt | 24 ++++-- dependencies.gradle.kts | 2 +- gradle/verification-metadata.xml | 20 ++--- .../internal/push/PushServiceSocket.java | 84 ++++++++++++------- 5 files changed, 79 insertions(+), 53 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/PreKeyMigrationHelper.java b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/PreKeyMigrationHelper.java index 1e8f532ac4..04060f90c9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/PreKeyMigrationHelper.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/PreKeyMigrationHelper.java @@ -77,7 +77,7 @@ public final class PreKeyMigrationHelper { contentValues.put(SignedPreKeyTable.TIMESTAMP, signedPreKey.getTimestamp()); database.insert(SignedPreKeyTable.TABLE_NAME, null, contentValues); Log.i(TAG, "Migrated signed prekey: " + signedPreKey.getId()); - } catch (IOException | InvalidMessageException e) { + } catch (IOException | InvalidMessageException | InvalidKeyException e) { Log.w(TAG, e); clean = false; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/PreKeysSyncJob.kt b/app/src/main/java/org/thoughtcrime/securesms/jobs/PreKeysSyncJob.kt index 251bfa37db..aa419886e3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/PreKeysSyncJob.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/PreKeysSyncJob.kt @@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.jobs import androidx.annotation.VisibleForTesting import org.signal.core.util.logging.Log import org.signal.core.util.roundedString +import org.signal.libsignal.protocol.InvalidKeyException import org.signal.libsignal.protocol.state.KyberPreKeyRecord import org.signal.libsignal.protocol.state.PreKeyRecord import org.signal.libsignal.protocol.state.SignalProtocolStore @@ -258,18 +259,23 @@ class PreKeysSyncJob private constructor( @Throws(IOException::class) private fun checkPreKeyConsistency(serviceIdType: ServiceIdType, protocolStore: SignalServiceAccountDataStore, metadataStore: PreKeyMetadataStore): Boolean { - val result: NetworkResult = AppDependencies.signalServiceAccountManager.keysApi.checkRepeatedUseKeys( - serviceIdType = serviceIdType, - identityKey = protocolStore.identityKeyPair.publicKey, - signedPreKeyId = metadataStore.activeSignedPreKeyId, - signedPreKey = protocolStore.loadSignedPreKey(metadataStore.activeSignedPreKeyId).keyPair.publicKey, - lastResortKyberKeyId = metadataStore.lastResortKyberPreKeyId, - lastResortKyberKey = protocolStore.loadKyberPreKey(metadataStore.lastResortKyberPreKeyId).keyPair.publicKey - ) + val result: NetworkResult = try { + AppDependencies.signalServiceAccountManager.keysApi.checkRepeatedUseKeys( + serviceIdType = serviceIdType, + identityKey = protocolStore.identityKeyPair.publicKey, + signedPreKeyId = metadataStore.activeSignedPreKeyId, + signedPreKey = protocolStore.loadSignedPreKey(metadataStore.activeSignedPreKeyId).keyPair.publicKey, + lastResortKyberKeyId = metadataStore.lastResortKyberPreKeyId, + lastResortKyberKey = protocolStore.loadKyberPreKey(metadataStore.lastResortKyberPreKeyId).keyPair.publicKey + ) + } catch (e: InvalidKeyException) { + Log.w(TAG, "Unable to load keys", e) + return false + } return when (result) { is NetworkResult.Success -> true - is NetworkResult.NetworkError -> throw result.exception ?: PushNetworkException("Network error") + is NetworkResult.NetworkError -> throw result.exception is NetworkResult.ApplicationError -> throw result.throwable is NetworkResult.StatusCodeError -> if (result.code == 409) { false diff --git a/dependencies.gradle.kts b/dependencies.gradle.kts index 5df6d2e854..3b23f86e56 100644 --- a/dependencies.gradle.kts +++ b/dependencies.gradle.kts @@ -15,7 +15,7 @@ dependencyResolutionManagement { version("exoplayer", "2.19.0") version("glide", "4.15.1") version("kotlin", "1.9.20") - version("libsignal-client", "0.55.0") + version("libsignal-client", "0.56.0") version("mp4parser", "1.9.39") version("android-gradle-plugin", "8.4.0") version("accompanist", "0.28.0") diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 928be39d5e..66d354362d 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -8831,20 +8831,20 @@ https://docs.gradle.org/current/userguide/dependency_verification.html - - - + + + - - + + - - - + + + - - + + diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/PushServiceSocket.java b/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/PushServiceSocket.java index 014633c96a..22e4d4669c 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/PushServiceSocket.java +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/PushServiceSocket.java @@ -447,30 +447,36 @@ public class PushServiceSocket { gcmRegistrationId = new GcmRegistrationId(fcmToken, true); } - final SignedPreKeyEntity aciSignedPreKey = new SignedPreKeyEntity(Objects.requireNonNull(aciPreKeys.getSignedPreKey()).getId(), - aciPreKeys.getSignedPreKey().getKeyPair().getPublicKey(), - aciPreKeys.getSignedPreKey().getSignature()); - final SignedPreKeyEntity pniSignedPreKey = new SignedPreKeyEntity(Objects.requireNonNull(pniPreKeys.getSignedPreKey()).getId(), - pniPreKeys.getSignedPreKey().getKeyPair().getPublicKey(), - pniPreKeys.getSignedPreKey().getSignature()); - final KyberPreKeyEntity aciLastResortKyberPreKey = new KyberPreKeyEntity(Objects.requireNonNull(aciPreKeys.getLastResortKyberPreKey()).getId(), - aciPreKeys.getLastResortKyberPreKey().getKeyPair().getPublicKey(), - aciPreKeys.getLastResortKyberPreKey().getSignature()); - final KyberPreKeyEntity pniLastResortKyberPreKey = new KyberPreKeyEntity(Objects.requireNonNull(pniPreKeys.getLastResortKyberPreKey()).getId(), - pniPreKeys.getLastResortKyberPreKey().getKeyPair().getPublicKey(), - pniPreKeys.getLastResortKyberPreKey().getSignature()); - RegistrationSessionRequestBody body = new RegistrationSessionRequestBody(sessionId, - recoveryPassword, - attributes, - Base64.encodeWithoutPadding(aciPreKeys.getIdentityKey().serialize()), - Base64.encodeWithoutPadding(pniPreKeys.getIdentityKey().serialize()), - aciSignedPreKey, - pniSignedPreKey, - aciLastResortKyberPreKey, - pniLastResortKyberPreKey, - gcmRegistrationId, - skipDeviceTransfer, - true); + RegistrationSessionRequestBody body; + try { + final SignedPreKeyEntity aciSignedPreKey = new SignedPreKeyEntity(Objects.requireNonNull(aciPreKeys.getSignedPreKey()).getId(), + aciPreKeys.getSignedPreKey().getKeyPair().getPublicKey(), + aciPreKeys.getSignedPreKey().getSignature()); + final SignedPreKeyEntity pniSignedPreKey = new SignedPreKeyEntity(Objects.requireNonNull(pniPreKeys.getSignedPreKey()).getId(), + pniPreKeys.getSignedPreKey().getKeyPair().getPublicKey(), + pniPreKeys.getSignedPreKey().getSignature()); + final KyberPreKeyEntity aciLastResortKyberPreKey = new KyberPreKeyEntity(Objects.requireNonNull(aciPreKeys.getLastResortKyberPreKey()).getId(), + aciPreKeys.getLastResortKyberPreKey().getKeyPair().getPublicKey(), + aciPreKeys.getLastResortKyberPreKey().getSignature()); + final KyberPreKeyEntity pniLastResortKyberPreKey = new KyberPreKeyEntity(Objects.requireNonNull(pniPreKeys.getLastResortKyberPreKey()).getId(), + pniPreKeys.getLastResortKyberPreKey().getKeyPair().getPublicKey(), + pniPreKeys.getLastResortKyberPreKey().getSignature()); + + body = new RegistrationSessionRequestBody(sessionId, + recoveryPassword, + attributes, + Base64.encodeWithoutPadding(aciPreKeys.getIdentityKey().serialize()), + Base64.encodeWithoutPadding(pniPreKeys.getIdentityKey().serialize()), + aciSignedPreKey, + pniSignedPreKey, + aciLastResortKyberPreKey, + pniLastResortKyberPreKey, + gcmRegistrationId, + skipDeviceTransfer, + true); + } catch (InvalidKeyException e) { + throw new AssertionError("unexpected invalid key", e); + } String response = makeServiceRequest(path, "POST", JsonUtil.toJson(body), NO_HEADERS, new RegistrationSessionResponseHandler(), SealedSenderAccess.NONE); return JsonUtil.fromJson(response, VerifyAccountResponse.class); @@ -817,10 +823,14 @@ public class PushServiceSocket { KyberPreKeyEntity lastResortKyberPreKey = null; List oneTimeKyberPreKeys = null; - if (preKeyUpload.getSignedPreKey() != null) { - signedPreKey = new SignedPreKeyEntity(preKeyUpload.getSignedPreKey().getId(), - preKeyUpload.getSignedPreKey().getKeyPair().getPublicKey(), - preKeyUpload.getSignedPreKey().getSignature()); + try { + if (preKeyUpload.getSignedPreKey() != null) { + signedPreKey = new SignedPreKeyEntity(preKeyUpload.getSignedPreKey().getId(), + preKeyUpload.getSignedPreKey().getKeyPair().getPublicKey(), + preKeyUpload.getSignedPreKey().getSignature()); + } + } catch (InvalidKeyException e) { + throw new AssertionError("unexpected invalid key", e); } if (preKeyUpload.getOneTimeEcPreKeys() != null) { @@ -838,16 +848,26 @@ public class PushServiceSocket { } if (preKeyUpload.getLastResortKyberPreKey() != null) { - lastResortKyberPreKey = new KyberPreKeyEntity(preKeyUpload.getLastResortKyberPreKey().getId(), - preKeyUpload.getLastResortKyberPreKey().getKeyPair().getPublicKey(), - preKeyUpload.getLastResortKyberPreKey().getSignature()); + try { + lastResortKyberPreKey = new KyberPreKeyEntity(preKeyUpload.getLastResortKyberPreKey().getId(), + preKeyUpload.getLastResortKyberPreKey().getKeyPair().getPublicKey(), + preKeyUpload.getLastResortKyberPreKey().getSignature()); + } catch (InvalidKeyException e) { + throw new AssertionError("unexpected invalid key", e); + } } if (preKeyUpload.getOneTimeKyberPreKeys() != null) { oneTimeKyberPreKeys = preKeyUpload .getOneTimeKyberPreKeys() .stream() - .map(it -> new KyberPreKeyEntity(it.getId(), it.getKeyPair().getPublicKey(), it.getSignature())) + .map(it -> { + try { + return new KyberPreKeyEntity(it.getId(), it.getKeyPair().getPublicKey(), it.getSignature()); + } catch (InvalidKeyException e) { + throw new AssertionError("unexpected invalid key", e); + } + }) .collect(Collectors.toList()); }