Skip to content

Commit fc6a4b7

Browse files
committed
Update libsignal-service-java
Uses new device link endpoint Fixes #1399
1 parent 2729772 commit fc6a4b7

File tree

6 files changed

+49
-33
lines changed

6 files changed

+49
-33
lines changed

graalvm-config-dir/reflect-config.json

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,7 @@
250250
{
251251
"name":"java.lang.Record",
252252
"allDeclaredFields":true,
253+
"allDeclaredClasses":true,
253254
"queryAllDeclaredMethods":true
254255
},
255256
{
@@ -300,7 +301,7 @@
300301
},
301302
{
302303
"name":"java.lang.reflect.RecordComponent",
303-
"methods":[{"name":"getName","parameterTypes":[] }, {"name":"getType","parameterTypes":[] }]
304+
"methods":[{"name":"getAccessor","parameterTypes":[] }, {"name":"getName","parameterTypes":[] }, {"name":"getType","parameterTypes":[] }]
304305
},
305306
{
306307
"name":"java.net.NetPermission"
@@ -2439,6 +2440,13 @@
24392440
"name":"org.whispersystems.signalservice.internal.push.KyberPreKeyEntity$KEMPublicKeySerializer",
24402441
"methods":[{"name":"<init>","parameterTypes":[] }]
24412442
},
2443+
{
2444+
"name":"org.whispersystems.signalservice.internal.push.LinkDeviceRequest",
2445+
"allDeclaredFields":true,
2446+
"allDeclaredClasses":true,
2447+
"queryAllDeclaredMethods":true,
2448+
"methods":[{"name":"accountAttributes","parameterTypes":[] }, {"name":"aciPqLastResortPreKey","parameterTypes":[] }, {"name":"aciSignedPreKey","parameterTypes":[] }, {"name":"pniPqLastResortPreKey","parameterTypes":[] }, {"name":"pniSignedPreKey","parameterTypes":[] }, {"name":"verificationCode","parameterTypes":[] }]
2449+
},
24422450
{
24432451
"name":"org.whispersystems.signalservice.internal.push.MismatchedDevices",
24442452
"allDeclaredFields":true,

lib/src/main/java/org/asamk/signal/manager/internal/ProvisioningManagerImpl.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
3636
import org.whispersystems.signalservice.api.push.SignalServiceAddress;
3737
import org.whispersystems.signalservice.api.push.exceptions.AuthorizationFailedException;
3838
import org.whispersystems.signalservice.api.util.DeviceNameUtil;
39-
import org.whispersystems.signalservice.internal.push.ConfirmCodeMessage;
4039
import org.whispersystems.signalservice.internal.util.DynamicCredentialsProvider;
4140

4241
import java.io.IOException;
@@ -45,7 +44,7 @@
4544
import java.util.concurrent.TimeoutException;
4645
import java.util.function.Consumer;
4746

48-
import static org.asamk.signal.manager.config.ServiceConfig.getCapabilities;
47+
import static org.asamk.signal.manager.util.KeyUtils.generatePreKeysForType;
4948

5049
public class ProvisioningManagerImpl implements ProvisioningManager {
5150

@@ -140,20 +139,21 @@ public String finishDeviceLink(String deviceName) throws IOException, TimeoutExc
140139
encryptedDeviceName,
141140
ret.getAciIdentity(),
142141
ret.getPniIdentity(),
143-
profileKey);
142+
profileKey,
143+
ret.getMasterKey());
144144

145145
account.getConfigurationStore().setReadReceipts(ret.isReadReceipts());
146146

147+
final var aciPreKeys = generatePreKeysForType(account.getAccountData(ServiceIdType.ACI));
148+
final var pniPreKeys = generatePreKeysForType(account.getAccountData(ServiceIdType.PNI));
149+
147150
logger.debug("Finishing new device registration");
148151
var deviceId = accountManager.finishNewDeviceRegistration(ret.getProvisioningCode(),
149-
new ConfirmCodeMessage(false,
150-
true,
151-
account.getAccountData(ServiceIdType.ACI).getLocalRegistrationId(),
152-
account.getAccountData(ServiceIdType.PNI).getLocalRegistrationId(),
153-
encryptedDeviceName,
154-
getCapabilities(false)));
155-
156-
account.finishLinking(deviceId);
152+
account.getAccountAttributes(null),
153+
aciPreKeys,
154+
pniPreKeys);
155+
156+
account.finishLinking(deviceId, aciPreKeys, pniPreKeys);
157157

158158
ManagerImpl m = null;
159159
try {

lib/src/main/java/org/asamk/signal/manager/internal/RegistrationManagerImpl.java

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@
5252
import java.io.IOException;
5353
import java.util.function.Consumer;
5454

55+
import static org.asamk.signal.manager.util.KeyUtils.generatePreKeysForType;
56+
5557
public class RegistrationManagerImpl implements RegistrationManager {
5658

5759
private static final Logger logger = LoggerFactory.getLogger(RegistrationManagerImpl.class);
@@ -137,8 +139,8 @@ public void verifyAccount(
137139
account.setPniIdentityKeyPair(KeyUtils.generateIdentityKeyPair());
138140
}
139141

140-
final var aciPreKeys = generatePreKeysForType(ServiceIdType.ACI);
141-
final var pniPreKeys = generatePreKeysForType(ServiceIdType.PNI);
142+
final var aciPreKeys = generatePreKeysForType(account.getAccountData(ServiceIdType.ACI));
143+
final var pniPreKeys = generatePreKeysForType(account.getAccountData(ServiceIdType.PNI));
142144
final var result = NumberVerificationUtils.verifyNumber(account.getSessionId(account.getNumber()),
143145
verificationCode,
144146
pin,
@@ -252,21 +254,6 @@ private VerifyAccountResponse verifyAccountWithCode(
252254
true));
253255
}
254256

255-
private PreKeyCollection generatePreKeysForType(ServiceIdType serviceIdType) {
256-
final var accountData = account.getAccountData(serviceIdType);
257-
final var keyPair = accountData.getIdentityKeyPair();
258-
final var preKeyMetadata = accountData.getPreKeyMetadata();
259-
260-
final var nextSignedPreKeyId = preKeyMetadata.getNextSignedPreKeyId();
261-
final var signedPreKey = KeyUtils.generateSignedPreKeyRecord(nextSignedPreKeyId, keyPair.getPrivateKey());
262-
263-
final var privateKey = keyPair.getPrivateKey();
264-
final var kyberPreKeyIdOffset = preKeyMetadata.getNextKyberPreKeyId();
265-
final var lastResortKyberPreKey = KeyUtils.generateKyberPreKeyRecord(kyberPreKeyIdOffset, privateKey);
266-
267-
return new PreKeyCollection(keyPair.getPublicKey(), signedPreKey, lastResortKyberPreKey);
268-
}
269-
270257
@Override
271258
public void close() {
272259
if (account != null) {

lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,8 @@ public void setProvisioningData(
275275
final String encryptedDeviceName,
276276
final IdentityKeyPair aciIdentity,
277277
final IdentityKeyPair pniIdentity,
278-
final ProfileKey profileKey
278+
final ProfileKey profileKey,
279+
final MasterKey masterKey
279280
) {
280281
this.deviceId = 0;
281282
this.number = number;
@@ -290,7 +291,7 @@ public void setProvisioningData(
290291
this.registered = false;
291292
this.isMultiDevice = true;
292293
getKeyValueStore().storeEntry(lastReceiveTimestamp, 0L);
293-
this.pinMasterKey = null;
294+
this.pinMasterKey = masterKey;
294295
getKeyValueStore().storeEntry(storageManifestVersion, -1L);
295296
this.setStorageManifest(null);
296297
this.storageKey = null;
@@ -304,9 +305,13 @@ public void setProvisioningData(
304305
save();
305306
}
306307

307-
public void finishLinking(final int deviceId) {
308+
public void finishLinking(
309+
final int deviceId, final PreKeyCollection aciPreKeys, final PreKeyCollection pniPreKeys
310+
) {
308311
this.registered = true;
309312
this.deviceId = deviceId;
313+
setPreKeys(ServiceIdType.ACI, aciPreKeys);
314+
setPreKeys(ServiceIdType.PNI, pniPreKeys);
310315
save();
311316
}
312317

lib/src/main/java/org/asamk/signal/manager/util/KeyUtils.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.asamk.signal.manager.util;
22

3+
import org.asamk.signal.manager.storage.SignalAccount;
34
import org.signal.libsignal.protocol.IdentityKey;
45
import org.signal.libsignal.protocol.IdentityKeyPair;
56
import org.signal.libsignal.protocol.InvalidKeyException;
@@ -12,6 +13,7 @@
1213
import org.signal.libsignal.protocol.state.SignedPreKeyRecord;
1314
import org.signal.libsignal.zkgroup.InvalidInputException;
1415
import org.signal.libsignal.zkgroup.profiles.ProfileKey;
16+
import org.whispersystems.signalservice.api.account.PreKeyCollection;
1517
import org.whispersystems.signalservice.api.kbs.MasterKey;
1618

1719
import java.security.SecureRandom;
@@ -125,4 +127,18 @@ public static byte[] getSecretBytes(int size) {
125127
public static int getRandomInt(int bound) {
126128
return secureRandom.nextInt(bound);
127129
}
130+
131+
public static PreKeyCollection generatePreKeysForType(final SignalAccount.AccountData<?> accountData) {
132+
final var keyPair = accountData.getIdentityKeyPair();
133+
final var preKeyMetadata = accountData.getPreKeyMetadata();
134+
135+
final var nextSignedPreKeyId = preKeyMetadata.getNextSignedPreKeyId();
136+
final var signedPreKey = generateSignedPreKeyRecord(nextSignedPreKeyId, keyPair.getPrivateKey());
137+
138+
final var privateKey = keyPair.getPrivateKey();
139+
final var kyberPreKeyIdOffset = preKeyMetadata.getNextKyberPreKeyId();
140+
final var lastResortKyberPreKey = generateKyberPreKeyRecord(kyberPreKeyIdOffset, privateKey);
141+
142+
return new PreKeyCollection(keyPair.getPublicKey(), signedPreKey, lastResortKyberPreKey);
143+
}
128144
}

settings.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ dependencyResolutionManagement {
1616
library("logback", "ch.qos.logback", "logback-classic").version("1.4.14")
1717

1818

19-
library("signalservice", "com.github.turasa", "signal-service-java").version("2.15.3_unofficial_89")
19+
library("signalservice", "com.github.turasa", "signal-service-java").version("2.15.3_unofficial_90")
2020
library("sqlite", "org.xerial", "sqlite-jdbc").version("3.44.1.0")
2121
library("hikari", "com.zaxxer", "HikariCP").version("5.1.0")
2222
library("junit.jupiter", "org.junit.jupiter", "junit-jupiter").version("5.10.1")

0 commit comments

Comments
 (0)