From: AsamK Date: Thu, 11 Aug 2022 17:09:41 +0000 (+0200) Subject: Update libsignal-service-java X-Git-Tag: v0.10.11~3 X-Git-Url: https://git.nmode.ca/signal-cli/commitdiff_plain/6843643aad90a6ba6380e297411f8b6e487946e1 Update libsignal-service-java --- diff --git a/graalvm-config-dir/reflect-config.json b/graalvm-config-dir/reflect-config.json index 389c947c..6777c329 100644 --- a/graalvm-config-dir/reflect-config.json +++ b/graalvm-config-dir/reflect-config.json @@ -2995,6 +2995,7 @@ {"name":"messageRequestResponse_"}, {"name":"outgoingPayment_"}, {"name":"padding_"}, + {"name":"pniChangeNumber_"}, {"name":"pniIdentity_"}, {"name":"read_"}, {"name":"request_"}, diff --git a/lib/build.gradle.kts b/lib/build.gradle.kts index f525c917..12020430 100644 --- a/lib/build.gradle.kts +++ b/lib/build.gradle.kts @@ -14,7 +14,7 @@ repositories { } dependencies { - implementation("com.github.turasa", "signal-service-java", "2.15.3_unofficial_54") + implementation("com.github.turasa", "signal-service-java", "2.15.3_unofficial_55") implementation("com.fasterxml.jackson.core", "jackson-databind", "2.13.3") implementation("com.google.protobuf", "protobuf-javalite", "3.11.4") implementation("org.bouncycastle", "bcprov-jdk15on", "1.70") diff --git a/lib/src/main/java/org/asamk/signal/manager/ProvisioningManagerImpl.java b/lib/src/main/java/org/asamk/signal/manager/ProvisioningManagerImpl.java index e405f54c..17569401 100644 --- a/lib/src/main/java/org/asamk/signal/manager/ProvisioningManagerImpl.java +++ b/lib/src/main/java/org/asamk/signal/manager/ProvisioningManagerImpl.java @@ -33,6 +33,7 @@ import org.whispersystems.signalservice.api.groupsv2.GroupsV2Operations; 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; @@ -54,6 +55,7 @@ class ProvisioningManagerImpl implements ProvisioningManager { private final SignalServiceAccountManager accountManager; private final IdentityKeyPair tempIdentityKey; private final int registrationId; + private final int pniRegistrationId; private final String password; ProvisioningManagerImpl( @@ -71,6 +73,7 @@ class ProvisioningManagerImpl implements ProvisioningManager { tempIdentityKey = KeyUtils.generateIdentityKeyPair(); registrationId = KeyHelper.generateRegistrationId(false); + pniRegistrationId = KeyHelper.generateRegistrationId(false); password = KeyUtils.createPassword(); GroupsV2Operations groupsV2Operations; try { @@ -123,10 +126,7 @@ class ProvisioningManagerImpl implements ProvisioningManager { logger.debug("Finishing new device registration"); var deviceId = accountManager.finishNewDeviceRegistration(ret.getProvisioningCode(), - false, - true, - registrationId, - encryptedDeviceName); + new ConfirmCodeMessage(false, true, registrationId, pniRegistrationId, encryptedDeviceName, null)); // Create new account with the synced identity var profileKey = ret.getProfileKey() == null ? KeyUtils.createProfileKey() : ret.getProfileKey(); @@ -145,6 +145,7 @@ class ProvisioningManagerImpl implements ProvisioningManager { ret.getAciIdentity(), ret.getPniIdentity(), registrationId, + pniRegistrationId, profileKey, TrustNewIdentity.ON_FIRST_USE); diff --git a/lib/src/main/java/org/asamk/signal/manager/RegistrationManagerImpl.java b/lib/src/main/java/org/asamk/signal/manager/RegistrationManagerImpl.java index 5a99b827..337aa348 100644 --- a/lib/src/main/java/org/asamk/signal/manager/RegistrationManagerImpl.java +++ b/lib/src/main/java/org/asamk/signal/manager/RegistrationManagerImpl.java @@ -187,7 +187,8 @@ class RegistrationManagerImpl implements RegistrationManager { account.isUnrestrictedUnidentifiedAccess(), capabilities, account.isDiscoverableByPhoneNumber(), - account.getEncryptedDeviceName()); + account.getEncryptedDeviceName(), + account.getLocalPniRegistrationId()); account.setRegistered(true); logger.info("Reactivated existing account, verify is not necessary."); if (newManagerListener != null) { @@ -216,7 +217,8 @@ class RegistrationManagerImpl implements RegistrationManager { account.getSelfUnidentifiedAccessKey(), account.isUnrestrictedUnidentifiedAccess(), ServiceConfig.capabilities, - account.isDiscoverableByPhoneNumber()); + account.isDiscoverableByPhoneNumber(), + account.getLocalPniRegistrationId()); } else { return accountManager.verifyAccountWithRegistrationLockPin(verificationCode, account.getLocalRegistrationId(), @@ -225,7 +227,8 @@ class RegistrationManagerImpl implements RegistrationManager { account.getSelfUnidentifiedAccessKey(), account.isUnrestrictedUnidentifiedAccess(), ServiceConfig.capabilities, - account.isDiscoverableByPhoneNumber()); + account.isDiscoverableByPhoneNumber(), + account.getLocalPniRegistrationId()); } } diff --git a/lib/src/main/java/org/asamk/signal/manager/SignalAccountFiles.java b/lib/src/main/java/org/asamk/signal/manager/SignalAccountFiles.java index f397b534..95fd453d 100644 --- a/lib/src/main/java/org/asamk/signal/manager/SignalAccountFiles.java +++ b/lib/src/main/java/org/asamk/signal/manager/SignalAccountFiles.java @@ -149,6 +149,7 @@ public class SignalAccountFiles { var aciIdentityKey = KeyUtils.generateIdentityKeyPair(); var pniIdentityKey = KeyUtils.generateIdentityKeyPair(); var registrationId = KeyHelper.generateRegistrationId(false); + var pniRegistrationId = KeyHelper.generateRegistrationId(false); var profileKey = KeyUtils.createProfileKey(); var account = SignalAccount.create(pathConfig.dataPath(), @@ -158,6 +159,7 @@ public class SignalAccountFiles { aciIdentityKey, pniIdentityKey, registrationId, + pniRegistrationId, profileKey, trustNewIdentity); diff --git a/lib/src/main/java/org/asamk/signal/manager/helper/AccountHelper.java b/lib/src/main/java/org/asamk/signal/manager/helper/AccountHelper.java index 0c66a182..78cffa23 100644 --- a/lib/src/main/java/org/asamk/signal/manager/helper/AccountHelper.java +++ b/lib/src/main/java/org/asamk/signal/manager/helper/AccountHelper.java @@ -13,12 +13,17 @@ import org.asamk.signal.manager.util.NumberVerificationUtils; import org.signal.libsignal.protocol.InvalidKeyException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.whispersystems.signalservice.api.account.ChangePhoneNumberRequest; import org.whispersystems.signalservice.api.push.ACI; import org.whispersystems.signalservice.api.push.PNI; +import org.whispersystems.signalservice.api.push.SignedPreKeyEntity; import org.whispersystems.signalservice.api.push.exceptions.AuthorizationFailedException; import org.whispersystems.signalservice.api.util.DeviceNameUtil; +import org.whispersystems.signalservice.internal.push.OutgoingPushMessage; import java.io.IOException; +import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.concurrent.TimeUnit; @@ -103,11 +108,21 @@ public class AccountHelper { public void finishChangeNumber( String newNumber, String verificationCode, String pin ) throws IncorrectPinException, PinLockedException, IOException { + // TODO create new PNI identity key + final List deviceMessages = null; + final Map devicePniSignedPreKeys = null; + final Map pniRegistrationIds = null; final var result = NumberVerificationUtils.verifyNumber(verificationCode, pin, context.getPinHelper(), (verificationCode1, registrationLock) -> dependencies.getAccountManager() - .changeNumber(verificationCode1, newNumber, registrationLock)); + .changeNumber(new ChangePhoneNumberRequest(newNumber, + verificationCode1, + registrationLock, + account.getPniIdentityKeyPair().getPublicKey(), + deviceMessages, + devicePniSignedPreKeys, + pniRegistrationIds))); // TODO handle response updateSelfIdentifiers(newNumber, account.getAci(), PNI.parseOrThrow(result.first().getPni())); } @@ -129,7 +144,8 @@ public class AccountHelper { account.isUnrestrictedUnidentifiedAccess(), ServiceConfig.capabilities, account.isDiscoverableByPhoneNumber(), - account.getEncryptedDeviceName()); + account.getEncryptedDeviceName(), + account.getLocalPniRegistrationId()); } public void addDevice(DeviceLinkInfo deviceLinkInfo) throws IOException, InvalidDeviceLinkException { diff --git a/lib/src/main/java/org/asamk/signal/manager/helper/IncomingMessageHandler.java b/lib/src/main/java/org/asamk/signal/manager/helper/IncomingMessageHandler.java index 1d4678fa..d89c5177 100644 --- a/lib/src/main/java/org/asamk/signal/manager/helper/IncomingMessageHandler.java +++ b/lib/src/main/java/org/asamk/signal/manager/helper/IncomingMessageHandler.java @@ -492,6 +492,7 @@ public final class IncomingMessageHandler { pniIdentity.getPrivateKey().toByteArray())); actions.add(RefreshPreKeysAction.create()); } + // TODO handle PniChangeNumber return actions; } 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 b797290a..b3345153 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 @@ -45,6 +45,7 @@ import org.signal.libsignal.protocol.SignalProtocolAddress; import org.signal.libsignal.protocol.state.PreKeyRecord; import org.signal.libsignal.protocol.state.SessionRecord; import org.signal.libsignal.protocol.state.SignedPreKeyRecord; +import org.signal.libsignal.protocol.util.KeyHelper; import org.signal.libsignal.protocol.util.Medium; import org.signal.libsignal.zkgroup.InvalidInputException; import org.signal.libsignal.zkgroup.profiles.ProfileKey; @@ -125,6 +126,7 @@ public class SignalAccount implements Closeable { private IdentityKeyPair aciIdentityKeyPair; private IdentityKeyPair pniIdentityKeyPair; private int localRegistrationId; + private int localPniRegistrationId; private TrustNewIdentity trustNewIdentity; private long lastReceiveTimestamp = 0; @@ -186,6 +188,7 @@ public class SignalAccount implements Closeable { IdentityKeyPair aciIdentityKey, IdentityKeyPair pniIdentityKey, int registrationId, + int pniRegistrationId, ProfileKey profileKey, final TrustNewIdentity trustNewIdentity ) throws IOException { @@ -207,6 +210,7 @@ public class SignalAccount implements Closeable { signalAccount.aciIdentityKeyPair = aciIdentityKey; signalAccount.pniIdentityKeyPair = pniIdentityKey; signalAccount.localRegistrationId = registrationId; + signalAccount.localPniRegistrationId = pniRegistrationId; signalAccount.trustNewIdentity = trustNewIdentity; signalAccount.groupStore = new GroupStore(getGroupCachePath(dataPath, accountPath), signalAccount.getRecipientResolver(), @@ -236,6 +240,7 @@ public class SignalAccount implements Closeable { IdentityKeyPair aciIdentityKey, IdentityKeyPair pniIdentityKey, int registrationId, + int pniRegistrationId, ProfileKey profileKey, final TrustNewIdentity trustNewIdentity ) throws IOException { @@ -254,6 +259,7 @@ public class SignalAccount implements Closeable { aciIdentityKey, pniIdentityKey, registrationId, + pniRegistrationId, profileKey, trustNewIdentity); } @@ -305,6 +311,7 @@ public class SignalAccount implements Closeable { IdentityKeyPair aciIdentityKey, IdentityKeyPair pniIdentityKey, int registrationId, + int pniRegistrationId, ProfileKey profileKey, final TrustNewIdentity trustNewIdentity ) throws IOException { @@ -318,6 +325,7 @@ public class SignalAccount implements Closeable { signalAccount.accountPath = accountPath; signalAccount.serviceEnvironment = serviceEnvironment; signalAccount.localRegistrationId = registrationId; + signalAccount.localPniRegistrationId = pniRegistrationId; signalAccount.trustNewIdentity = trustNewIdentity; signalAccount.setProvisioningData(number, aci, @@ -549,6 +557,11 @@ public class SignalAccount implements Closeable { if (rootNode.hasNonNull("registrationId")) { registrationId = rootNode.get("registrationId").asInt(); } + if (rootNode.hasNonNull("pniRegistrationId")) { + localPniRegistrationId = rootNode.get("pniRegistrationId").asInt(); + } else { + localPniRegistrationId = KeyHelper.generateRegistrationId(false); + } IdentityKeyPair aciIdentityKeyPair = null; if (rootNode.hasNonNull("identityPrivateKey") && rootNode.hasNonNull("identityKey")) { final var publicKeyBytes = Base64.getDecoder().decode(rootNode.get("identityKey").asText()); @@ -855,6 +868,7 @@ public class SignalAccount implements Closeable { .put("lastReceiveTimestamp", lastReceiveTimestamp) .put("password", password) .put("registrationId", localRegistrationId) + .put("pniRegistrationId", localPniRegistrationId) .put("identityPrivateKey", Base64.getEncoder().encodeToString(aciIdentityKeyPair.getPrivateKey().serialize())) .put("identityKey", @@ -1245,6 +1259,10 @@ public class SignalAccount implements Closeable { return localRegistrationId; } + public int getLocalPniRegistrationId() { + return localPniRegistrationId; + } + public String getPassword() { return password; }