# Changelog
## [Unreleased]
+**Attention**: Now requires native libsignal-client version 0.24.0
## [0.11.10] - 2023-05-11
**Attention**: Now requires native libsignal-client version 0.23.1
{"name":"SENDING"}
]
},
+{
+ "name":"org.signal.libsignal.protocol.state.KyberPreKeyStore"
+},
{
"name":"org.signal.libsignal.protocol.state.PreKeyRecord",
"fields":[{"name":"unsafeHandle"}]
"name":"org.asamk.signal.json.JsonTypingMessage",
"allDeclaredFields":true,
"allDeclaredMethods":true,
- "allDeclaredConstructors":true
+ "allDeclaredConstructors":true,
+ "methods":[
+ {"name":"action","parameterTypes":[] },
+ {"name":"groupId","parameterTypes":[] },
+ {"name":"timestamp","parameterTypes":[] }
+ ]
},
{
"name":"org.asamk.signal.jsonrpc.JsonRpcBatchMessage",
{
"pattern":"\\Qjni/x86_64-Linux/libjffi-1.2.so\\E"
},
- {
- "pattern":"\\Qlibsignal_jni.so\\E"
- },
{
"pattern":"\\Qlibsignal_jni.dylib\\E"
},
{
- "pattern":"\\Qsignal_jni.dll\\E"
+ "pattern":"\\Qlibsignal_jni.so\\E"
},
{
"pattern":"\\Qorg/asamk/signal/manager/config/ias.store\\E"
{
"pattern":"\\Qorg/sqlite/native/Linux/x86_64/libsqlitejdbc.so\\E"
},
+ {
+ "pattern":"\\Qsignal_jni.dll\\E"
+ },
{
"pattern":"\\Qsqlite-jdbc.properties\\E"
},
+++ /dev/null
-package org.asamk.signal.manager.actions;
-
-import org.asamk.signal.manager.helper.Context;
-
-public class SendPniIdentityKeyAction implements HandleAction {
-
- private static final SendPniIdentityKeyAction INSTANCE = new SendPniIdentityKeyAction();
-
- private SendPniIdentityKeyAction() {
- }
-
- public static SendPniIdentityKeyAction create() {
- return INSTANCE;
- }
-
- @Override
- public void execute(Context context) throws Throwable {
- context.getSyncHelper().sendPniIdentity();
- }
-}
public static AccountAttributes.Capabilities getCapabilities(boolean isPrimaryDevice) {
final var giftBadges = !isPrimaryDevice;
- return new AccountAttributes.Capabilities(false,
- true,
- false,
- true,
- true,
- true,
- true,
- true,
- giftBadges,
- false,
- false);
+ return new AccountAttributes.Capabilities(false, true, true, true, true, giftBadges, false, false);
}
public static boolean isSignalClientAvailable() {
final var recipientId = account.getRecipientResolver().resolveRecipient(serviceId);
final var address = account.getRecipientAddressResolver().resolveRecipientAddress(recipientId);
- if (account.getAccountCapabilities().getUuid()) {
+ if (false) {
if (serviceId.isUnknown()) {
return null;
}
import org.asamk.signal.manager.actions.RetrieveStorageDataAction;
import org.asamk.signal.manager.actions.SendGroupInfoAction;
import org.asamk.signal.manager.actions.SendGroupInfoRequestAction;
-import org.asamk.signal.manager.actions.SendPniIdentityKeyAction;
import org.asamk.signal.manager.actions.SendProfileKeyAction;
import org.asamk.signal.manager.actions.SendReceiptAction;
import org.asamk.signal.manager.actions.SendRetryMessageRequestAction;
import org.asamk.signal.manager.storage.recipients.Profile;
import org.asamk.signal.manager.storage.recipients.RecipientId;
import org.asamk.signal.manager.storage.stickers.StickerPack;
-import org.asamk.signal.manager.util.KeyUtils;
import org.signal.libsignal.metadata.ProtocolInvalidKeyException;
import org.signal.libsignal.metadata.ProtocolInvalidKeyIdException;
import org.signal.libsignal.metadata.ProtocolInvalidMessageException;
if (rm.isConfigurationRequest()) {
actions.add(SendSyncConfigurationAction.create());
}
- if (rm.isPniIdentityRequest()) {
- actions.add(SendPniIdentityKeyAction.create());
- }
}
if (syncMessage.getGroups().isPresent()) {
try {
.get());
}
}
- if (syncMessage.getPniIdentity().isPresent()) {
- final var pniIdentity = syncMessage.getPniIdentity().get();
- account.setPniIdentityKeyPair(KeyUtils.getIdentityKeyPair(pniIdentity.getPublicKey().toByteArray(),
- pniIdentity.getPrivateKey().toByteArray()));
- actions.add(RefreshPreKeysAction.create());
- }
if (syncMessage.getPniChangeNumber().isPresent()) {
final var pniChangeNumber = syncMessage.getPniChangeNumber().get();
logger.debug("Received PNI change number sync message, applying.");
import org.asamk.signal.manager.api.IncorrectPinException;
import org.asamk.signal.manager.api.Pair;
-import org.asamk.signal.manager.util.PinHashing;
import org.signal.libsignal.protocol.InvalidKeyException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.whispersystems.signalservice.api.KeyBackupServicePinException;
import org.whispersystems.signalservice.api.KeyBackupSystemNoDataException;
import org.whispersystems.signalservice.api.kbs.MasterKey;
+import org.whispersystems.signalservice.api.kbs.PinHashUtil;
import org.whispersystems.signalservice.internal.contacts.crypto.UnauthenticatedResponseException;
import org.whispersystems.signalservice.internal.contacts.entities.TokenResponse;
import org.whispersystems.signalservice.internal.push.LockedException;
String pin, MasterKey masterKey
) throws IOException {
final var pinChangeSession = keyBackupService.newPinChangeSession();
- final var hashedPin = PinHashing.hashPin(pin, pinChangeSession);
+ final var hashedPin = PinHashUtil.hashPin(pin, pinChangeSession.hashSalt());
try {
pinChangeSession.setPin(hashedPin, masterKey);
var session = keyBackupService.newRegistrationSession(basicStorageCredentials, tokenResponse);
try {
- var hashedPin = PinHashing.hashPin(pin, session);
+ var hashedPin = PinHashUtil.hashPin(pin, session.hashSalt());
var kbsData = session.restorePin(hashedPin);
if (kbsData == null) {
throw new AssertionError("Null not expected");
package org.asamk.signal.manager.helper;
-import com.google.protobuf.ByteString;
-
import org.asamk.signal.manager.api.TrustLevel;
import org.asamk.signal.manager.groups.GroupId;
import org.asamk.signal.manager.storage.SignalAccount;
context.getSendHelper().sendSyncMessage(SignalServiceSyncMessage.forConfiguration(configurationMessage));
}
- public void sendPniIdentity() {
- final var pniIdentityKeyPair = account.getPniIdentityKeyPair();
- var pniIdentity = SignalServiceProtos.SyncMessage.PniIdentity.newBuilder()
- .setPrivateKey(ByteString.copyFrom(pniIdentityKeyPair.getPrivateKey().serialize()))
- .setPublicKey(ByteString.copyFrom(pniIdentityKeyPair.getPublicKey().serialize()))
- .build();
- context.getSendHelper().sendSyncMessage(SignalServiceSyncMessage.forPniIdentity(pniIdentity));
- }
-
public void handleSyncDeviceGroups(final InputStream input) {
final var s = new DeviceGroupsInputStream(input);
DeviceGroup g;
try {
return Optional.of(new UnidentifiedAccessPair(new UnidentifiedAccess(recipientUnidentifiedAccessKey,
- senderCertificate), new UnidentifiedAccess(selfUnidentifiedAccessKey, senderCertificate)));
+ senderCertificate,
+ false), new UnidentifiedAccess(selfUnidentifiedAccessKey, senderCertificate, false)));
} catch (InvalidCertificateException e) {
return Optional.empty();
}
try {
return Optional.of(new UnidentifiedAccessPair(new UnidentifiedAccess(selfUnidentifiedAccessKey,
- selfUnidentifiedAccessCertificate),
- new UnidentifiedAccess(selfUnidentifiedAccessKey, selfUnidentifiedAccessCertificate)));
+ selfUnidentifiedAccessCertificate,
+ false),
+ new UnidentifiedAccess(selfUnidentifiedAccessKey, selfUnidentifiedAccessCertificate, false)));
} catch (InvalidCertificateException e) {
return Optional.empty();
}
import org.signal.libsignal.protocol.SignalProtocolAddress;
import org.signal.libsignal.protocol.groups.state.SenderKeyRecord;
import org.signal.libsignal.protocol.state.IdentityKeyStore;
+import org.signal.libsignal.protocol.state.KyberPreKeyRecord;
import org.signal.libsignal.protocol.state.PreKeyRecord;
import org.signal.libsignal.protocol.state.PreKeyStore;
import org.signal.libsignal.protocol.state.SessionRecord;
public boolean isMultiDevice() {
return isMultiDevice.get();
}
+
+ @Override
+ public KyberPreKeyRecord loadKyberPreKey(final int kyberPreKeyId) throws InvalidKeyIdException {
+ // TODO
+ throw new InvalidKeyIdException("Missing kyber prekey with ID: $kyberPreKeyId");
+ }
+
+ @Override
+ public List<KyberPreKeyRecord> loadKyberPreKeys() {
+ // TODO
+ return List.of();
+ }
+
+ @Override
+ public void storeKyberPreKey(final int kyberPreKeyId, final KyberPreKeyRecord record) {
+ // TODO
+ }
+
+ @Override
+ public boolean containsKyberPreKey(final int kyberPreKeyId) {
+ // TODO
+ return false;
+ }
+
+ @Override
+ public void markKyberPreKeyUsed(final int kyberPreKeyId) {
+ // TODO
+ }
}
+++ /dev/null
-package org.asamk.signal.manager.util;
-
-import org.bouncycastle.crypto.generators.Argon2BytesGenerator;
-import org.bouncycastle.crypto.params.Argon2Parameters;
-import org.whispersystems.signalservice.api.KeyBackupService;
-import org.whispersystems.signalservice.api.kbs.HashedPin;
-import org.whispersystems.signalservice.internal.registrationpin.PinHasher;
-
-public final class PinHashing {
-
- private PinHashing() {
- }
-
- public static HashedPin hashPin(String pin, KeyBackupService.HashSession hashSession) {
- final var params = new Argon2Parameters.Builder(Argon2Parameters.ARGON2_id).withParallelism(1)
- .withIterations(32)
- .withVersion(Argon2Parameters.ARGON2_VERSION_13)
- .withMemoryAsKB(16 * 1024)
- .withSalt(hashSession.hashSalt())
- .build();
-
- final var generator = new Argon2BytesGenerator();
- generator.init(params);
-
- return PinHasher.hashPin(PinHasher.normalize(pin), password -> {
- var output = new byte[64];
- generator.generateBytes(password, output);
- return output;
- });
- }
-}
versionCatalogs {
create("libs") {
library("bouncycastle", "org.bouncycastle", "bcprov-jdk15on").version("1.70")
- library("jackson.databind", "com.fasterxml.jackson.core", "jackson-databind").version("2.15.0")
+ library("jackson.databind", "com.fasterxml.jackson.core", "jackson-databind").version("2.15.1")
library("argparse4j", "net.sourceforge.argparse4j", "argparse4j").version("0.9.0")
library("dbusjava", "com.github.hypfvieh", "dbus-java-transport-native-unixsocket").version("4.3.0")
version("slf4j", "2.0.7")
library("logback", "ch.qos.logback", "logback-classic").version("1.4.7")
- library("signalservice", "com.github.turasa", "signal-service-java").version("2.15.3_unofficial_70")
+ library("signalservice", "com.github.turasa", "signal-service-java").version("2.15.3_unofficial_71")
library("protobuf", "com.google.protobuf", "protobuf-javalite").version("3.23.0")
library("sqlite", "org.xerial", "sqlite-jdbc").version("3.41.2.1")
library("hikari", "com.zaxxer", "HikariCP").version("5.0.1")