Upgrade to libsignal 0.56.0

This commit is contained in:
Cody Henthorne 2024-08-21 10:37:34 -04:00 committed by mtang-signal
parent 9b23264502
commit a76d400bd1
5 changed files with 79 additions and 53 deletions

View file

@ -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;
}

View file

@ -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<Unit> = 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<Unit> = 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

View file

@ -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")

View file

@ -8831,20 +8831,20 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="6eb4422e8a618b3b76cb2096a3619d251f9e27989dc68307a1e5414c3710f2d1" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.signal" name="libsignal-android" version="0.55.0">
<artifact name="libsignal-android-0.55.0.aar">
<sha256 value="f99e0af861795f103a867d3d7448b6923620a91ee075891a0d258a18fa213756" origin="Generated by Gradle"/>
<component group="org.signal" name="libsignal-android" version="0.56.0">
<artifact name="libsignal-android-0.56.0.aar">
<sha256 value="c7eb52e3f3f61d407db1c7913e36b121216a67b07852748d7fd933cc15874f07" origin="Generated by Gradle"/>
</artifact>
<artifact name="libsignal-android-0.55.0.module">
<sha256 value="3d0b9381cad484337e88e734c6f21ec0246659b23027029645a6fa779bf65e37" origin="Generated by Gradle"/>
<artifact name="libsignal-android-0.56.0.module">
<sha256 value="a0831ab319465625dc4cb55694cd7be124dc7d97570551533a6a43d4067c63fe" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.signal" name="libsignal-client" version="0.55.0">
<artifact name="libsignal-client-0.55.0.jar">
<sha256 value="83f2202af279b3765212e9864539ccdad188fa090c372bf9ae3e78b2da7c1857" origin="Generated by Gradle"/>
<component group="org.signal" name="libsignal-client" version="0.56.0">
<artifact name="libsignal-client-0.56.0.jar">
<sha256 value="225327aaae41e2bfb8cdd97a7ea4a1eaf2831afc52e34e4459ce878ee56bc247" origin="Generated by Gradle"/>
</artifact>
<artifact name="libsignal-client-0.55.0.module">
<sha256 value="58d3cf1ef4dca00592ae6030f0d596981c747771a9d48676a296ed9f0c71aad8" origin="Generated by Gradle"/>
<artifact name="libsignal-client-0.56.0.module">
<sha256 value="1377528f87f8e55b519ea97efc82c91b679f52f3bc49b8d9d52d5b42f2410f96" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.signal" name="ringrtc-android" version="2.46.1">

View file

@ -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<KyberPreKeyEntity> 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());
}