Upgrade to libsignal 0.56.0
This commit is contained in:
parent
9b23264502
commit
a76d400bd1
5 changed files with 79 additions and 53 deletions
|
@ -77,7 +77,7 @@ public final class PreKeyMigrationHelper {
|
||||||
contentValues.put(SignedPreKeyTable.TIMESTAMP, signedPreKey.getTimestamp());
|
contentValues.put(SignedPreKeyTable.TIMESTAMP, signedPreKey.getTimestamp());
|
||||||
database.insert(SignedPreKeyTable.TABLE_NAME, null, contentValues);
|
database.insert(SignedPreKeyTable.TABLE_NAME, null, contentValues);
|
||||||
Log.i(TAG, "Migrated signed prekey: " + signedPreKey.getId());
|
Log.i(TAG, "Migrated signed prekey: " + signedPreKey.getId());
|
||||||
} catch (IOException | InvalidMessageException e) {
|
} catch (IOException | InvalidMessageException | InvalidKeyException e) {
|
||||||
Log.w(TAG, e);
|
Log.w(TAG, e);
|
||||||
clean = false;
|
clean = false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.jobs
|
||||||
import androidx.annotation.VisibleForTesting
|
import androidx.annotation.VisibleForTesting
|
||||||
import org.signal.core.util.logging.Log
|
import org.signal.core.util.logging.Log
|
||||||
import org.signal.core.util.roundedString
|
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.KyberPreKeyRecord
|
||||||
import org.signal.libsignal.protocol.state.PreKeyRecord
|
import org.signal.libsignal.protocol.state.PreKeyRecord
|
||||||
import org.signal.libsignal.protocol.state.SignalProtocolStore
|
import org.signal.libsignal.protocol.state.SignalProtocolStore
|
||||||
|
@ -258,18 +259,23 @@ class PreKeysSyncJob private constructor(
|
||||||
|
|
||||||
@Throws(IOException::class)
|
@Throws(IOException::class)
|
||||||
private fun checkPreKeyConsistency(serviceIdType: ServiceIdType, protocolStore: SignalServiceAccountDataStore, metadataStore: PreKeyMetadataStore): Boolean {
|
private fun checkPreKeyConsistency(serviceIdType: ServiceIdType, protocolStore: SignalServiceAccountDataStore, metadataStore: PreKeyMetadataStore): Boolean {
|
||||||
val result: NetworkResult<Unit> = AppDependencies.signalServiceAccountManager.keysApi.checkRepeatedUseKeys(
|
val result: NetworkResult<Unit> = try {
|
||||||
serviceIdType = serviceIdType,
|
AppDependencies.signalServiceAccountManager.keysApi.checkRepeatedUseKeys(
|
||||||
identityKey = protocolStore.identityKeyPair.publicKey,
|
serviceIdType = serviceIdType,
|
||||||
signedPreKeyId = metadataStore.activeSignedPreKeyId,
|
identityKey = protocolStore.identityKeyPair.publicKey,
|
||||||
signedPreKey = protocolStore.loadSignedPreKey(metadataStore.activeSignedPreKeyId).keyPair.publicKey,
|
signedPreKeyId = metadataStore.activeSignedPreKeyId,
|
||||||
lastResortKyberKeyId = metadataStore.lastResortKyberPreKeyId,
|
signedPreKey = protocolStore.loadSignedPreKey(metadataStore.activeSignedPreKeyId).keyPair.publicKey,
|
||||||
lastResortKyberKey = protocolStore.loadKyberPreKey(metadataStore.lastResortKyberPreKeyId).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) {
|
return when (result) {
|
||||||
is NetworkResult.Success -> true
|
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.ApplicationError -> throw result.throwable
|
||||||
is NetworkResult.StatusCodeError -> if (result.code == 409) {
|
is NetworkResult.StatusCodeError -> if (result.code == 409) {
|
||||||
false
|
false
|
||||||
|
|
|
@ -15,7 +15,7 @@ dependencyResolutionManagement {
|
||||||
version("exoplayer", "2.19.0")
|
version("exoplayer", "2.19.0")
|
||||||
version("glide", "4.15.1")
|
version("glide", "4.15.1")
|
||||||
version("kotlin", "1.9.20")
|
version("kotlin", "1.9.20")
|
||||||
version("libsignal-client", "0.55.0")
|
version("libsignal-client", "0.56.0")
|
||||||
version("mp4parser", "1.9.39")
|
version("mp4parser", "1.9.39")
|
||||||
version("android-gradle-plugin", "8.4.0")
|
version("android-gradle-plugin", "8.4.0")
|
||||||
version("accompanist", "0.28.0")
|
version("accompanist", "0.28.0")
|
||||||
|
|
|
@ -8831,20 +8831,20 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
|
||||||
<sha256 value="6eb4422e8a618b3b76cb2096a3619d251f9e27989dc68307a1e5414c3710f2d1" origin="Generated by Gradle"/>
|
<sha256 value="6eb4422e8a618b3b76cb2096a3619d251f9e27989dc68307a1e5414c3710f2d1" origin="Generated by Gradle"/>
|
||||||
</artifact>
|
</artifact>
|
||||||
</component>
|
</component>
|
||||||
<component group="org.signal" name="libsignal-android" version="0.55.0">
|
<component group="org.signal" name="libsignal-android" version="0.56.0">
|
||||||
<artifact name="libsignal-android-0.55.0.aar">
|
<artifact name="libsignal-android-0.56.0.aar">
|
||||||
<sha256 value="f99e0af861795f103a867d3d7448b6923620a91ee075891a0d258a18fa213756" origin="Generated by Gradle"/>
|
<sha256 value="c7eb52e3f3f61d407db1c7913e36b121216a67b07852748d7fd933cc15874f07" origin="Generated by Gradle"/>
|
||||||
</artifact>
|
</artifact>
|
||||||
<artifact name="libsignal-android-0.55.0.module">
|
<artifact name="libsignal-android-0.56.0.module">
|
||||||
<sha256 value="3d0b9381cad484337e88e734c6f21ec0246659b23027029645a6fa779bf65e37" origin="Generated by Gradle"/>
|
<sha256 value="a0831ab319465625dc4cb55694cd7be124dc7d97570551533a6a43d4067c63fe" origin="Generated by Gradle"/>
|
||||||
</artifact>
|
</artifact>
|
||||||
</component>
|
</component>
|
||||||
<component group="org.signal" name="libsignal-client" version="0.55.0">
|
<component group="org.signal" name="libsignal-client" version="0.56.0">
|
||||||
<artifact name="libsignal-client-0.55.0.jar">
|
<artifact name="libsignal-client-0.56.0.jar">
|
||||||
<sha256 value="83f2202af279b3765212e9864539ccdad188fa090c372bf9ae3e78b2da7c1857" origin="Generated by Gradle"/>
|
<sha256 value="225327aaae41e2bfb8cdd97a7ea4a1eaf2831afc52e34e4459ce878ee56bc247" origin="Generated by Gradle"/>
|
||||||
</artifact>
|
</artifact>
|
||||||
<artifact name="libsignal-client-0.55.0.module">
|
<artifact name="libsignal-client-0.56.0.module">
|
||||||
<sha256 value="58d3cf1ef4dca00592ae6030f0d596981c747771a9d48676a296ed9f0c71aad8" origin="Generated by Gradle"/>
|
<sha256 value="1377528f87f8e55b519ea97efc82c91b679f52f3bc49b8d9d52d5b42f2410f96" origin="Generated by Gradle"/>
|
||||||
</artifact>
|
</artifact>
|
||||||
</component>
|
</component>
|
||||||
<component group="org.signal" name="ringrtc-android" version="2.46.1">
|
<component group="org.signal" name="ringrtc-android" version="2.46.1">
|
||||||
|
|
|
@ -447,30 +447,36 @@ public class PushServiceSocket {
|
||||||
gcmRegistrationId = new GcmRegistrationId(fcmToken, true);
|
gcmRegistrationId = new GcmRegistrationId(fcmToken, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
final SignedPreKeyEntity aciSignedPreKey = new SignedPreKeyEntity(Objects.requireNonNull(aciPreKeys.getSignedPreKey()).getId(),
|
RegistrationSessionRequestBody body;
|
||||||
aciPreKeys.getSignedPreKey().getKeyPair().getPublicKey(),
|
try {
|
||||||
aciPreKeys.getSignedPreKey().getSignature());
|
final SignedPreKeyEntity aciSignedPreKey = new SignedPreKeyEntity(Objects.requireNonNull(aciPreKeys.getSignedPreKey()).getId(),
|
||||||
final SignedPreKeyEntity pniSignedPreKey = new SignedPreKeyEntity(Objects.requireNonNull(pniPreKeys.getSignedPreKey()).getId(),
|
aciPreKeys.getSignedPreKey().getKeyPair().getPublicKey(),
|
||||||
pniPreKeys.getSignedPreKey().getKeyPair().getPublicKey(),
|
aciPreKeys.getSignedPreKey().getSignature());
|
||||||
pniPreKeys.getSignedPreKey().getSignature());
|
final SignedPreKeyEntity pniSignedPreKey = new SignedPreKeyEntity(Objects.requireNonNull(pniPreKeys.getSignedPreKey()).getId(),
|
||||||
final KyberPreKeyEntity aciLastResortKyberPreKey = new KyberPreKeyEntity(Objects.requireNonNull(aciPreKeys.getLastResortKyberPreKey()).getId(),
|
pniPreKeys.getSignedPreKey().getKeyPair().getPublicKey(),
|
||||||
aciPreKeys.getLastResortKyberPreKey().getKeyPair().getPublicKey(),
|
pniPreKeys.getSignedPreKey().getSignature());
|
||||||
aciPreKeys.getLastResortKyberPreKey().getSignature());
|
final KyberPreKeyEntity aciLastResortKyberPreKey = new KyberPreKeyEntity(Objects.requireNonNull(aciPreKeys.getLastResortKyberPreKey()).getId(),
|
||||||
final KyberPreKeyEntity pniLastResortKyberPreKey = new KyberPreKeyEntity(Objects.requireNonNull(pniPreKeys.getLastResortKyberPreKey()).getId(),
|
aciPreKeys.getLastResortKyberPreKey().getKeyPair().getPublicKey(),
|
||||||
pniPreKeys.getLastResortKyberPreKey().getKeyPair().getPublicKey(),
|
aciPreKeys.getLastResortKyberPreKey().getSignature());
|
||||||
pniPreKeys.getLastResortKyberPreKey().getSignature());
|
final KyberPreKeyEntity pniLastResortKyberPreKey = new KyberPreKeyEntity(Objects.requireNonNull(pniPreKeys.getLastResortKyberPreKey()).getId(),
|
||||||
RegistrationSessionRequestBody body = new RegistrationSessionRequestBody(sessionId,
|
pniPreKeys.getLastResortKyberPreKey().getKeyPair().getPublicKey(),
|
||||||
recoveryPassword,
|
pniPreKeys.getLastResortKyberPreKey().getSignature());
|
||||||
attributes,
|
|
||||||
Base64.encodeWithoutPadding(aciPreKeys.getIdentityKey().serialize()),
|
body = new RegistrationSessionRequestBody(sessionId,
|
||||||
Base64.encodeWithoutPadding(pniPreKeys.getIdentityKey().serialize()),
|
recoveryPassword,
|
||||||
aciSignedPreKey,
|
attributes,
|
||||||
pniSignedPreKey,
|
Base64.encodeWithoutPadding(aciPreKeys.getIdentityKey().serialize()),
|
||||||
aciLastResortKyberPreKey,
|
Base64.encodeWithoutPadding(pniPreKeys.getIdentityKey().serialize()),
|
||||||
pniLastResortKyberPreKey,
|
aciSignedPreKey,
|
||||||
gcmRegistrationId,
|
pniSignedPreKey,
|
||||||
skipDeviceTransfer,
|
aciLastResortKyberPreKey,
|
||||||
true);
|
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);
|
String response = makeServiceRequest(path, "POST", JsonUtil.toJson(body), NO_HEADERS, new RegistrationSessionResponseHandler(), SealedSenderAccess.NONE);
|
||||||
return JsonUtil.fromJson(response, VerifyAccountResponse.class);
|
return JsonUtil.fromJson(response, VerifyAccountResponse.class);
|
||||||
|
@ -817,10 +823,14 @@ public class PushServiceSocket {
|
||||||
KyberPreKeyEntity lastResortKyberPreKey = null;
|
KyberPreKeyEntity lastResortKyberPreKey = null;
|
||||||
List<KyberPreKeyEntity> oneTimeKyberPreKeys = null;
|
List<KyberPreKeyEntity> oneTimeKyberPreKeys = null;
|
||||||
|
|
||||||
if (preKeyUpload.getSignedPreKey() != null) {
|
try {
|
||||||
signedPreKey = new SignedPreKeyEntity(preKeyUpload.getSignedPreKey().getId(),
|
if (preKeyUpload.getSignedPreKey() != null) {
|
||||||
preKeyUpload.getSignedPreKey().getKeyPair().getPublicKey(),
|
signedPreKey = new SignedPreKeyEntity(preKeyUpload.getSignedPreKey().getId(),
|
||||||
preKeyUpload.getSignedPreKey().getSignature());
|
preKeyUpload.getSignedPreKey().getKeyPair().getPublicKey(),
|
||||||
|
preKeyUpload.getSignedPreKey().getSignature());
|
||||||
|
}
|
||||||
|
} catch (InvalidKeyException e) {
|
||||||
|
throw new AssertionError("unexpected invalid key", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (preKeyUpload.getOneTimeEcPreKeys() != null) {
|
if (preKeyUpload.getOneTimeEcPreKeys() != null) {
|
||||||
|
@ -838,16 +848,26 @@ public class PushServiceSocket {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (preKeyUpload.getLastResortKyberPreKey() != null) {
|
if (preKeyUpload.getLastResortKyberPreKey() != null) {
|
||||||
lastResortKyberPreKey = new KyberPreKeyEntity(preKeyUpload.getLastResortKyberPreKey().getId(),
|
try {
|
||||||
preKeyUpload.getLastResortKyberPreKey().getKeyPair().getPublicKey(),
|
lastResortKyberPreKey = new KyberPreKeyEntity(preKeyUpload.getLastResortKyberPreKey().getId(),
|
||||||
preKeyUpload.getLastResortKyberPreKey().getSignature());
|
preKeyUpload.getLastResortKyberPreKey().getKeyPair().getPublicKey(),
|
||||||
|
preKeyUpload.getLastResortKyberPreKey().getSignature());
|
||||||
|
} catch (InvalidKeyException e) {
|
||||||
|
throw new AssertionError("unexpected invalid key", e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (preKeyUpload.getOneTimeKyberPreKeys() != null) {
|
if (preKeyUpload.getOneTimeKyberPreKeys() != null) {
|
||||||
oneTimeKyberPreKeys = preKeyUpload
|
oneTimeKyberPreKeys = preKeyUpload
|
||||||
.getOneTimeKyberPreKeys()
|
.getOneTimeKyberPreKeys()
|
||||||
.stream()
|
.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());
|
.collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue