From: AsamK Date: Thu, 14 Dec 2023 17:07:13 +0000 (+0100) Subject: Update libsignal-service-java X-Git-Tag: v0.13.0~63 X-Git-Url: https://git.nmode.ca/signal-cli/commitdiff_plain/fc6a4b78eb797643e6b45ca76bed552b9ecc190f Update libsignal-service-java Uses new device link endpoint Fixes #1399 --- diff --git a/graalvm-config-dir/reflect-config.json b/graalvm-config-dir/reflect-config.json index 82f9c9c3..f907f84e 100644 --- a/graalvm-config-dir/reflect-config.json +++ b/graalvm-config-dir/reflect-config.json @@ -250,6 +250,7 @@ { "name":"java.lang.Record", "allDeclaredFields":true, + "allDeclaredClasses":true, "queryAllDeclaredMethods":true }, { @@ -300,7 +301,7 @@ }, { "name":"java.lang.reflect.RecordComponent", - "methods":[{"name":"getName","parameterTypes":[] }, {"name":"getType","parameterTypes":[] }] + "methods":[{"name":"getAccessor","parameterTypes":[] }, {"name":"getName","parameterTypes":[] }, {"name":"getType","parameterTypes":[] }] }, { "name":"java.net.NetPermission" @@ -2439,6 +2440,13 @@ "name":"org.whispersystems.signalservice.internal.push.KyberPreKeyEntity$KEMPublicKeySerializer", "methods":[{"name":"","parameterTypes":[] }] }, +{ + "name":"org.whispersystems.signalservice.internal.push.LinkDeviceRequest", + "allDeclaredFields":true, + "allDeclaredClasses":true, + "queryAllDeclaredMethods":true, + "methods":[{"name":"accountAttributes","parameterTypes":[] }, {"name":"aciPqLastResortPreKey","parameterTypes":[] }, {"name":"aciSignedPreKey","parameterTypes":[] }, {"name":"pniPqLastResortPreKey","parameterTypes":[] }, {"name":"pniSignedPreKey","parameterTypes":[] }, {"name":"verificationCode","parameterTypes":[] }] +}, { "name":"org.whispersystems.signalservice.internal.push.MismatchedDevices", "allDeclaredFields":true, diff --git a/lib/src/main/java/org/asamk/signal/manager/internal/ProvisioningManagerImpl.java b/lib/src/main/java/org/asamk/signal/manager/internal/ProvisioningManagerImpl.java index 2a7ef9e4..1dbe7e9b 100644 --- a/lib/src/main/java/org/asamk/signal/manager/internal/ProvisioningManagerImpl.java +++ b/lib/src/main/java/org/asamk/signal/manager/internal/ProvisioningManagerImpl.java @@ -36,7 +36,6 @@ import org.whispersystems.signalservice.api.push.ServiceIdType; import org.whispersystems.signalservice.api.push.SignalServiceAddress; import org.whispersystems.signalservice.api.push.exceptions.AuthorizationFailedException; import org.whispersystems.signalservice.api.util.DeviceNameUtil; -import org.whispersystems.signalservice.internal.push.ConfirmCodeMessage; import org.whispersystems.signalservice.internal.util.DynamicCredentialsProvider; import java.io.IOException; @@ -45,7 +44,7 @@ import java.nio.channels.OverlappingFileLockException; import java.util.concurrent.TimeoutException; import java.util.function.Consumer; -import static org.asamk.signal.manager.config.ServiceConfig.getCapabilities; +import static org.asamk.signal.manager.util.KeyUtils.generatePreKeysForType; public class ProvisioningManagerImpl implements ProvisioningManager { @@ -140,20 +139,21 @@ public class ProvisioningManagerImpl implements ProvisioningManager { encryptedDeviceName, ret.getAciIdentity(), ret.getPniIdentity(), - profileKey); + profileKey, + ret.getMasterKey()); account.getConfigurationStore().setReadReceipts(ret.isReadReceipts()); + final var aciPreKeys = generatePreKeysForType(account.getAccountData(ServiceIdType.ACI)); + final var pniPreKeys = generatePreKeysForType(account.getAccountData(ServiceIdType.PNI)); + logger.debug("Finishing new device registration"); var deviceId = accountManager.finishNewDeviceRegistration(ret.getProvisioningCode(), - new ConfirmCodeMessage(false, - true, - account.getAccountData(ServiceIdType.ACI).getLocalRegistrationId(), - account.getAccountData(ServiceIdType.PNI).getLocalRegistrationId(), - encryptedDeviceName, - getCapabilities(false))); - - account.finishLinking(deviceId); + account.getAccountAttributes(null), + aciPreKeys, + pniPreKeys); + + account.finishLinking(deviceId, aciPreKeys, pniPreKeys); ManagerImpl m = null; try { diff --git a/lib/src/main/java/org/asamk/signal/manager/internal/RegistrationManagerImpl.java b/lib/src/main/java/org/asamk/signal/manager/internal/RegistrationManagerImpl.java index ec200966..6a2f3633 100644 --- a/lib/src/main/java/org/asamk/signal/manager/internal/RegistrationManagerImpl.java +++ b/lib/src/main/java/org/asamk/signal/manager/internal/RegistrationManagerImpl.java @@ -52,6 +52,8 @@ import org.whispersystems.signalservice.internal.util.DynamicCredentialsProvider import java.io.IOException; import java.util.function.Consumer; +import static org.asamk.signal.manager.util.KeyUtils.generatePreKeysForType; + public class RegistrationManagerImpl implements RegistrationManager { private static final Logger logger = LoggerFactory.getLogger(RegistrationManagerImpl.class); @@ -137,8 +139,8 @@ public class RegistrationManagerImpl implements RegistrationManager { account.setPniIdentityKeyPair(KeyUtils.generateIdentityKeyPair()); } - final var aciPreKeys = generatePreKeysForType(ServiceIdType.ACI); - final var pniPreKeys = generatePreKeysForType(ServiceIdType.PNI); + final var aciPreKeys = generatePreKeysForType(account.getAccountData(ServiceIdType.ACI)); + final var pniPreKeys = generatePreKeysForType(account.getAccountData(ServiceIdType.PNI)); final var result = NumberVerificationUtils.verifyNumber(account.getSessionId(account.getNumber()), verificationCode, pin, @@ -252,21 +254,6 @@ public class RegistrationManagerImpl implements RegistrationManager { true)); } - private PreKeyCollection generatePreKeysForType(ServiceIdType serviceIdType) { - final var accountData = account.getAccountData(serviceIdType); - final var keyPair = accountData.getIdentityKeyPair(); - final var preKeyMetadata = accountData.getPreKeyMetadata(); - - final var nextSignedPreKeyId = preKeyMetadata.getNextSignedPreKeyId(); - final var signedPreKey = KeyUtils.generateSignedPreKeyRecord(nextSignedPreKeyId, keyPair.getPrivateKey()); - - final var privateKey = keyPair.getPrivateKey(); - final var kyberPreKeyIdOffset = preKeyMetadata.getNextKyberPreKeyId(); - final var lastResortKyberPreKey = KeyUtils.generateKyberPreKeyRecord(kyberPreKeyIdOffset, privateKey); - - return new PreKeyCollection(keyPair.getPublicKey(), signedPreKey, lastResortKyberPreKey); - } - @Override public void close() { if (account != null) { diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java b/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java index 5a6738d1..b95b86e5 100644 --- a/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java +++ b/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java @@ -275,7 +275,8 @@ public class SignalAccount implements Closeable { final String encryptedDeviceName, final IdentityKeyPair aciIdentity, final IdentityKeyPair pniIdentity, - final ProfileKey profileKey + final ProfileKey profileKey, + final MasterKey masterKey ) { this.deviceId = 0; this.number = number; @@ -290,7 +291,7 @@ public class SignalAccount implements Closeable { this.registered = false; this.isMultiDevice = true; getKeyValueStore().storeEntry(lastReceiveTimestamp, 0L); - this.pinMasterKey = null; + this.pinMasterKey = masterKey; getKeyValueStore().storeEntry(storageManifestVersion, -1L); this.setStorageManifest(null); this.storageKey = null; @@ -304,9 +305,13 @@ public class SignalAccount implements Closeable { save(); } - public void finishLinking(final int deviceId) { + public void finishLinking( + final int deviceId, final PreKeyCollection aciPreKeys, final PreKeyCollection pniPreKeys + ) { this.registered = true; this.deviceId = deviceId; + setPreKeys(ServiceIdType.ACI, aciPreKeys); + setPreKeys(ServiceIdType.PNI, pniPreKeys); save(); } diff --git a/lib/src/main/java/org/asamk/signal/manager/util/KeyUtils.java b/lib/src/main/java/org/asamk/signal/manager/util/KeyUtils.java index 758831fc..486e3655 100644 --- a/lib/src/main/java/org/asamk/signal/manager/util/KeyUtils.java +++ b/lib/src/main/java/org/asamk/signal/manager/util/KeyUtils.java @@ -1,5 +1,6 @@ package org.asamk.signal.manager.util; +import org.asamk.signal.manager.storage.SignalAccount; import org.signal.libsignal.protocol.IdentityKey; import org.signal.libsignal.protocol.IdentityKeyPair; import org.signal.libsignal.protocol.InvalidKeyException; @@ -12,6 +13,7 @@ import org.signal.libsignal.protocol.state.PreKeyRecord; import org.signal.libsignal.protocol.state.SignedPreKeyRecord; import org.signal.libsignal.zkgroup.InvalidInputException; import org.signal.libsignal.zkgroup.profiles.ProfileKey; +import org.whispersystems.signalservice.api.account.PreKeyCollection; import org.whispersystems.signalservice.api.kbs.MasterKey; import java.security.SecureRandom; @@ -125,4 +127,18 @@ public class KeyUtils { public static int getRandomInt(int bound) { return secureRandom.nextInt(bound); } + + public static PreKeyCollection generatePreKeysForType(final SignalAccount.AccountData accountData) { + final var keyPair = accountData.getIdentityKeyPair(); + final var preKeyMetadata = accountData.getPreKeyMetadata(); + + final var nextSignedPreKeyId = preKeyMetadata.getNextSignedPreKeyId(); + final var signedPreKey = generateSignedPreKeyRecord(nextSignedPreKeyId, keyPair.getPrivateKey()); + + final var privateKey = keyPair.getPrivateKey(); + final var kyberPreKeyIdOffset = preKeyMetadata.getNextKyberPreKeyId(); + final var lastResortKyberPreKey = generateKyberPreKeyRecord(kyberPreKeyIdOffset, privateKey); + + return new PreKeyCollection(keyPair.getPublicKey(), signedPreKey, lastResortKyberPreKey); + } } diff --git a/settings.gradle.kts b/settings.gradle.kts index 2a83b72a..b4e33068 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -16,7 +16,7 @@ dependencyResolutionManagement { library("logback", "ch.qos.logback", "logback-classic").version("1.4.14") - library("signalservice", "com.github.turasa", "signal-service-java").version("2.15.3_unofficial_89") + library("signalservice", "com.github.turasa", "signal-service-java").version("2.15.3_unofficial_90") library("sqlite", "org.xerial", "sqlite-jdbc").version("3.44.1.0") library("hikari", "com.zaxxer", "HikariCP").version("5.1.0") library("junit.jupiter", "org.junit.jupiter", "junit-jupiter").version("5.10.1")