]> nmode's Git Repositories - signal-cli/commitdiff
Update libsignal-service-java
authorAsamK <asamk@gmx.de>
Sat, 28 Jun 2025 12:35:56 +0000 (14:35 +0200)
committerAsamK <asamk@gmx.de>
Sat, 28 Jun 2025 12:35:56 +0000 (14:35 +0200)
graalvm-config-dir/reflect-config.json
gradle/libs.versions.toml
lib/src/main/java/org/asamk/signal/manager/api/DeviceLinkUrl.java
lib/src/main/java/org/asamk/signal/manager/config/LiveConfig.java
lib/src/main/java/org/asamk/signal/manager/config/StagingConfig.java
lib/src/main/java/org/asamk/signal/manager/helper/AttachmentHelper.java
lib/src/main/java/org/asamk/signal/manager/internal/SignalWebSocketHealthMonitor.java
lib/src/main/java/org/asamk/signal/manager/storage/prekeys/PreKeyStore.java
lib/src/main/java/org/asamk/signal/manager/storage/prekeys/SignedPreKeyStore.java
lib/src/main/java/org/asamk/signal/manager/util/KeyUtils.java
src/main/java/org/asamk/signal/BaseConfig.java

index 0bfd1cdfb5ec6de87be8493ee19bd30f45871bd2..c5459804a4c2594c01b77a0c1d78bcf4b2ca48f9 100644 (file)
 {
   "name":"org.whispersystems.signalservice.internal.storage.protos.GroupV2Record",
   "allDeclaredFields":true,
-  "fields":[{"name":"archived"}, {"name":"avatarColor"}, {"name":"blocked"}, {"name":"dontNotifyForMentionsIfMuted"}, {"name":"hideStory"}, {"name":"markedUnread"}, {"name":"masterKey"}, {"name":"mutedUntilTimestamp"}, {"name":"storySendMode"}, {"name":"whitelisted"}],
   "methods":[{"name":"adapter","parameterTypes":[] }, {"name":"unknownFields","parameterTypes":[] }]
 },
 {
index 4ff08539d97a6dba99cdea807ab15153d6b12966..680ca54ab10236a3764d9166005184da0c4e1de2 100644 (file)
@@ -10,7 +10,7 @@ slf4j-api = { module = "org.slf4j:slf4j-api", version.ref = "slf4j" }
 slf4j-jul = { module = "org.slf4j:jul-to-slf4j", version.ref = "slf4j" }
 logback = "ch.qos.logback:logback-classic:1.5.18"
 
-signalservice = "com.github.turasa:signal-service-java:2.15.3_unofficial_125"
+signalservice = "com.github.turasa:signal-service-java:2.15.3_unofficial_126"
 sqlite = "org.xerial:sqlite-jdbc:3.50.1.0"
 hikari = "com.zaxxer:HikariCP:6.3.0"
 junit-jupiter = "org.junit.jupiter:junit-jupiter:5.13.2"
index 54271dac58784b3c479545f090cf20438da3899d..2bb63507a16e34ff264526c2747953cac6ef7a2a 100644 (file)
@@ -2,7 +2,6 @@ package org.asamk.signal.manager.api;
 
 import org.asamk.signal.manager.util.Utils;
 import org.signal.libsignal.protocol.InvalidKeyException;
-import org.signal.libsignal.protocol.ecc.Curve;
 import org.signal.libsignal.protocol.ecc.ECPublicKey;
 
 import java.net.URI;
@@ -37,7 +36,7 @@ public record DeviceLinkUrl(String deviceIdentifier, ECPublicKey deviceKey) {
         }
         ECPublicKey deviceKey;
         try {
-            deviceKey = Curve.decodePoint(publicKeyBytes, 0);
+            deviceKey = new ECPublicKey(publicKeyBytes);
         } catch (InvalidKeyException e) {
             throw new InvalidDeviceLinkException("Invalid device link", e);
         }
index 111695f6abe5cd4acbd99fd41fdf9107ba2a13fa..890d7081b808aad28b96e07b65873f71a6a7fb7f 100644 (file)
@@ -2,7 +2,6 @@ package org.asamk.signal.manager.config;
 
 import org.signal.libsignal.net.Network.Environment;
 import org.signal.libsignal.protocol.InvalidKeyException;
-import org.signal.libsignal.protocol.ecc.Curve;
 import org.signal.libsignal.protocol.ecc.ECPublicKey;
 import org.whispersystems.signalservice.api.push.TrustStore;
 import org.whispersystems.signalservice.internal.configuration.HttpProxy;
@@ -80,7 +79,7 @@ class LiveConfig {
 
     static ECPublicKey getUnidentifiedSenderTrustRoot() {
         try {
-            return Curve.decodePoint(UNIDENTIFIED_SENDER_TRUST_ROOT, 0);
+            return new ECPublicKey(UNIDENTIFIED_SENDER_TRUST_ROOT);
         } catch (InvalidKeyException e) {
             throw new AssertionError(e);
         }
index e72c66b5e0b7e8c3b81066cd9eac97573d550444..6d8f08c761cb2e97a5fe9dccc9d10d507c03b9f0 100644 (file)
@@ -2,7 +2,6 @@ package org.asamk.signal.manager.config;
 
 import org.signal.libsignal.net.Network;
 import org.signal.libsignal.protocol.InvalidKeyException;
-import org.signal.libsignal.protocol.ecc.Curve;
 import org.signal.libsignal.protocol.ecc.ECPublicKey;
 import org.whispersystems.signalservice.api.push.TrustStore;
 import org.whispersystems.signalservice.internal.configuration.HttpProxy;
@@ -80,7 +79,7 @@ class StagingConfig {
 
     static ECPublicKey getUnidentifiedSenderTrustRoot() {
         try {
-            return Curve.decodePoint(UNIDENTIFIED_SENDER_TRUST_ROOT, 0);
+            return new ECPublicKey(UNIDENTIFIED_SENDER_TRUST_ROOT);
         } catch (InvalidKeyException e) {
             throw new AssertionError(e);
         }
index b55153f061764a6cbbcc22eb6f696b580d41e0a9..08526c726ac33747f2952677a8edf0a2a799a5e0 100644 (file)
@@ -9,6 +9,7 @@ import org.asamk.signal.manager.util.IOUtils;
 import org.signal.libsignal.protocol.InvalidMessageException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.whispersystems.signalservice.api.crypto.AttachmentCipherInputStream;
 import org.whispersystems.signalservice.api.messages.SignalServiceAttachment;
 import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentPointer;
 import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentStream;
@@ -138,9 +139,15 @@ public class AttachmentHelper {
             SignalServiceAttachmentPointer pointer,
             File tmpFile
     ) throws IOException {
+        if (pointer.getDigest().isEmpty()) {
+            throw new IOException("Attachment pointer has no digest.");
+        }
         try {
             return dependencies.getMessageReceiver()
-                    .retrieveAttachment(pointer, tmpFile, ServiceConfig.MAX_ATTACHMENT_SIZE);
+                    .retrieveAttachment(pointer,
+                            tmpFile,
+                            ServiceConfig.MAX_ATTACHMENT_SIZE,
+                            AttachmentCipherInputStream.IntegrityCheck.forEncryptedDigest(pointer.getDigest().get()));
         } catch (MissingConfigurationException | InvalidMessageException e) {
             throw new IOException(e);
         }
index dfae5985f98df198d64e13ac5c40d5424d2b31a0..7d927dddbdbf7c43ae1f63be13976a7745c334fc 100644 (file)
@@ -56,7 +56,10 @@ final class SignalWebSocketHealthMonitor implements HealthMonitor {
                     .distinctUntilChanged()
                     .subscribe(this::onStateChanged);
 
-            webSocket.setKeepAliveChangedListener(this::updateKeepAliveSenderStatus);
+            webSocket.addKeepAliveChangeListener(() -> {
+                executor.execute(this::updateKeepAliveSenderStatus);
+                return Unit.INSTANCE;
+            });
         });
     }
 
@@ -78,7 +81,7 @@ final class SignalWebSocketHealthMonitor implements HealthMonitor {
     public void onMessageError(int status, boolean isIdentifiedWebSocket) {
     }
 
-    private Unit updateKeepAliveSenderStatus() {
+    private void updateKeepAliveSenderStatus() {
         if (keepAliveSender == null && sendKeepAlives()) {
             keepAliveSender = new KeepAliveSender();
             keepAliveSender.start();
@@ -86,7 +89,6 @@ final class SignalWebSocketHealthMonitor implements HealthMonitor {
             keepAliveSender.shutdown();
             keepAliveSender = null;
         }
-        return Unit.INSTANCE;
     }
 
     private boolean sendKeepAlives() {
index d2d557108172d2db1fa397570be35edbd16d8cd4..8e8bd2ab8cdffbfeeb9395ef6b1523fbbbf953fd 100644 (file)
@@ -4,8 +4,9 @@ import org.asamk.signal.manager.storage.Database;
 import org.asamk.signal.manager.storage.Utils;
 import org.signal.libsignal.protocol.InvalidKeyException;
 import org.signal.libsignal.protocol.InvalidKeyIdException;
-import org.signal.libsignal.protocol.ecc.Curve;
 import org.signal.libsignal.protocol.ecc.ECKeyPair;
+import org.signal.libsignal.protocol.ecc.ECPrivateKey;
+import org.signal.libsignal.protocol.ecc.ECPublicKey;
 import org.signal.libsignal.protocol.state.PreKeyRecord;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -176,8 +177,8 @@ public class PreKeyStore implements SignalServicePreKeyStore {
     private PreKeyRecord getPreKeyRecordFromResultSet(ResultSet resultSet) throws SQLException {
         try {
             final var keyId = resultSet.getInt("key_id");
-            final var publicKey = Curve.decodePoint(resultSet.getBytes("public_key"), 0);
-            final var privateKey = Curve.decodePrivatePoint(resultSet.getBytes("private_key"));
+            final var publicKey = new ECPublicKey(resultSet.getBytes("public_key"));
+            final var privateKey = new ECPrivateKey(resultSet.getBytes("private_key"));
             return new PreKeyRecord(keyId, new ECKeyPair(publicKey, privateKey));
         } catch (InvalidKeyException e) {
             return null;
index d62e939d14f8d576c532b62a07ee7def63c54d3c..4644c3ba61ce8ef8cec2d14184083b0350a04953 100644 (file)
@@ -4,8 +4,9 @@ import org.asamk.signal.manager.storage.Database;
 import org.asamk.signal.manager.storage.Utils;
 import org.signal.libsignal.protocol.InvalidKeyException;
 import org.signal.libsignal.protocol.InvalidKeyIdException;
-import org.signal.libsignal.protocol.ecc.Curve;
 import org.signal.libsignal.protocol.ecc.ECKeyPair;
+import org.signal.libsignal.protocol.ecc.ECPrivateKey;
+import org.signal.libsignal.protocol.ecc.ECPublicKey;
 import org.signal.libsignal.protocol.state.SignedPreKeyRecord;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -238,8 +239,8 @@ public class SignedPreKeyStore implements org.signal.libsignal.protocol.state.Si
     private SignedPreKeyRecord getSignedPreKeyRecordFromResultSet(ResultSet resultSet) throws SQLException {
         try {
             final var keyId = resultSet.getInt("key_id");
-            final var publicKey = Curve.decodePoint(resultSet.getBytes("public_key"), 0);
-            final var privateKey = Curve.decodePrivatePoint(resultSet.getBytes("private_key"));
+            final var publicKey = new ECPublicKey(resultSet.getBytes("public_key"));
+            final var privateKey = new ECPrivateKey(resultSet.getBytes("private_key"));
             final var signature = resultSet.getBytes("signature");
             final var timestamp = resultSet.getLong("timestamp");
             return new SignedPreKeyRecord(keyId, timestamp, new ECKeyPair(publicKey, privateKey), signature);
index 37a0bf827a4385f5c5e6ec8c3d0755a43e03fea3..31c3cd3975fe2eaef8b2c49ce0d948debbf55c3a 100644 (file)
@@ -4,7 +4,7 @@ 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;
-import org.signal.libsignal.protocol.ecc.Curve;
+import org.signal.libsignal.protocol.ecc.ECKeyPair;
 import org.signal.libsignal.protocol.ecc.ECPrivateKey;
 import org.signal.libsignal.protocol.kem.KEMKeyPair;
 import org.signal.libsignal.protocol.kem.KEMKeyType;
@@ -33,8 +33,8 @@ public class KeyUtils {
 
     public static IdentityKeyPair getIdentityKeyPair(byte[] publicKeyBytes, byte[] privateKeyBytes) {
         try {
-            IdentityKey publicKey = new IdentityKey(publicKeyBytes);
-            ECPrivateKey privateKey = Curve.decodePrivatePoint(privateKeyBytes);
+            final var publicKey = new IdentityKey(publicKeyBytes);
+            final var privateKey = new ECPrivateKey(privateKeyBytes);
 
             return new IdentityKeyPair(publicKey, privateKey);
         } catch (InvalidKeyException e) {
@@ -43,7 +43,7 @@ public class KeyUtils {
     }
 
     public static IdentityKeyPair generateIdentityKeyPair() {
-        var djbKeyPair = Curve.generateKeyPair();
+        var djbKeyPair = ECKeyPair.generate();
         var djbIdentityKey = new IdentityKey(djbKeyPair.getPublicKey());
         var djbPrivateKey = djbKeyPair.getPrivateKey();
 
@@ -54,7 +54,7 @@ public class KeyUtils {
         var records = new ArrayList<PreKeyRecord>(PREKEY_BATCH_SIZE);
         for (var i = 0; i < PREKEY_BATCH_SIZE; i++) {
             var preKeyId = (offset + i) % PREKEY_MAXIMUM_ID;
-            var keyPair = Curve.generateKeyPair();
+            var keyPair = ECKeyPair.generate();
             var record = new PreKeyRecord(preKeyId, keyPair);
 
             records.add(record);
@@ -66,13 +66,9 @@ public class KeyUtils {
             final int signedPreKeyId,
             final ECPrivateKey privateKey
     ) {
-        var keyPair = Curve.generateKeyPair();
+        var keyPair = ECKeyPair.generate();
         byte[] signature;
-        try {
-            signature = Curve.calculateSignature(privateKey, keyPair.getPublicKey().serialize());
-        } catch (InvalidKeyException e) {
-            throw new AssertionError(e);
-        }
+        signature = privateKey.calculateSignature(keyPair.getPublicKey().serialize());
         return new SignedPreKeyRecord(signedPreKeyId, System.currentTimeMillis(), keyPair, signature);
     }
 
index 1f0922fedf48839c82a8732a9d534ae320249a43..730485bc5a792447fffb73a5b9deb3903e315dfe 100644 (file)
@@ -8,7 +8,7 @@ public class BaseConfig {
     public static final String PROJECT_VERSION = BaseConfig.class.getPackage().getImplementationVersion();
 
     static final String USER_AGENT_SIGNAL_ANDROID = Optional.ofNullable(System.getenv("SIGNAL_CLI_USER_AGENT"))
-            .orElse("Signal-Android/7.46.1");
+            .orElse("Signal-Android/7.47.1");
     static final String USER_AGENT_SIGNAL_CLI = PROJECT_NAME == null
             ? "signal-cli"
             : PROJECT_NAME + "/" + PROJECT_VERSION;