"allDeclaredMethods":true,
"allDeclaredClasses":true
},
+{
+ "name":"org.asamk.Signal$Identity",
+ "allDeclaredClasses":true,
+ "queryAllDeclaredMethods":true
+},
{
"name":"org.asamk.Signal$MessageReceived",
"allDeclaredConstructors":true,
"queryAllDeclaredConstructors":true,
"methods":[{"name":"<init>","parameterTypes":["org.freedesktop.dbus.DBusPath","byte[]","java.lang.String"] }]
},
+{
+ "name":"org.asamk.Signal$StructIdentity",
+ "allDeclaredFields":true
+},
{
"name":"org.asamk.Signal$SyncMessageReceived",
"allDeclaredConstructors":true,
"queryAllDeclaredConstructors":true,
"methods":[{"name":"<init>","parameterTypes":[] }]
},
+{
+ "name":"org.whispersystems.signalservice.internal.push.KyberPreKeyEntity",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true
+},
+{
+ "name":"org.whispersystems.signalservice.internal.push.KyberPreKeyEntity$ByteArrayDeserializer",
+ "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+ "name":"org.whispersystems.signalservice.internal.push.KyberPreKeyEntity$KEMPublicKeyDeserializer",
+ "methods":[{"name":"<init>","parameterTypes":[] }]
+},
{
"name":"org.whispersystems.signalservice.internal.push.MismatchedDevices",
"allDeclaredFields":true,
"allDeclaredConstructors":true,
"methods":[{"name":"<init>","parameterTypes":[] }]
},
+{
+ "name":"org.whispersystems.signalservice.internal.push.OneTimePreKeyCounts",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true,
+ "methods":[{"name":"<init>","parameterTypes":[] }]
+},
{
"name":"org.whispersystems.signalservice.internal.push.OutgoingPushMessage",
"allDeclaredFields":true,
import org.whispersystems.signalservice.api.push.exceptions.AuthorizationFailedException;
import org.whispersystems.signalservice.api.push.exceptions.DeprecatedVersionException;
import org.whispersystems.signalservice.api.util.DeviceNameUtil;
+import org.whispersystems.signalservice.internal.push.KyberPreKeyEntity;
import org.whispersystems.signalservice.internal.push.OutgoingPushMessage;
import org.whispersystems.util.Base64UrlSafe;
// TODO create new PNI identity key
final List<OutgoingPushMessage> deviceMessages = null;
final Map<String, SignedPreKeyEntity> devicePniSignedPreKeys = null;
+ final Map<String, KyberPreKeyEntity> devicePniLastResortKyberPrekeys = null;
final Map<String, Integer> pniRegistrationIds = null;
var sessionId = account.getSessionId(account.getNumber());
final var result = NumberVerificationUtils.verifyNumber(sessionId,
account.getPniIdentityKeyPair().getPublicKey(),
deviceMessages,
devicePniSignedPreKeys,
+ devicePniLastResortKyberPrekeys,
pniRegistrationIds)));
});
// TODO handle response
}
}
- final var candidates = Username.generateCandidates(nickname, USERNAME_MIN_LENGTH, USERNAME_MAX_LENGTH);
+ final var candidates = Username.candidatesFrom(nickname, USERNAME_MIN_LENGTH, USERNAME_MAX_LENGTH);
final var candidateHashes = new ArrayList<String>();
for (final var candidate : candidates) {
- candidateHashes.add(Base64UrlSafe.encodeBytesWithoutPadding(Username.hash(candidate)));
+ candidateHashes.add(Base64UrlSafe.encodeBytesWithoutPadding(candidate.getHash()));
}
final var response = dependencies.getAccountManager().reserveUsername(candidateHashes);
}
logger.debug("[reserveUsername] Successfully reserved username.");
- final var username = candidates.get(hashIndex);
+ final var username = candidates.get(hashIndex).getUsername();
dependencies.getAccountManager().confirmUsername(username, response);
account.setUsername(username);
final var whoAmIResponse = dependencies.getAccountManager().getWhoAmI();
final var serverUsernameHash = whoAmIResponse.getUsernameHash();
final var hasServerUsername = !isEmpty(serverUsernameHash);
- final var localUsernameHash = Base64UrlSafe.encodeBytesWithoutPadding(Username.hash(localUsername));
+ final var localUsernameHash = Base64UrlSafe.encodeBytesWithoutPadding(new Username(localUsername).getHash());
if (!hasServerUsername) {
logger.debug("No remote username is set.");
import org.signal.libsignal.protocol.state.SignedPreKeyRecord;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.whispersystems.signalservice.api.account.PreKeyUpload;
import org.whispersystems.signalservice.api.push.ServiceIdType;
import java.io.IOException;
}
public void refreshPreKeysIfNecessary(ServiceIdType serviceIdType) throws IOException {
- if (dependencies.getAccountManager().getPreKeysCount(serviceIdType) < ServiceConfig.PREKEY_MINIMUM_COUNT) {
+ final var preKeyCounts = dependencies.getAccountManager().getPreKeyCounts(serviceIdType);
+ if (preKeyCounts.getEcCount() < ServiceConfig.PREKEY_MINIMUM_COUNT) {
refreshPreKeys(serviceIdType);
}
+ // TODO kyber pre keys
}
public void refreshPreKeys() throws IOException {
final var oneTimePreKeys = generatePreKeys(serviceIdType);
final var signedPreKeyRecord = generateSignedPreKey(serviceIdType, identityKeyPair);
- dependencies.getAccountManager()
- .setPreKeys(serviceIdType, identityKeyPair.getPublicKey(), signedPreKeyRecord, oneTimePreKeys);
+ final var preKeyUpload = new PreKeyUpload(serviceIdType,
+ identityKeyPair.getPublicKey(),
+ signedPreKeyRecord,
+ oneTimePreKeys,
+ null,
+ null);
+ dependencies.getAccountManager().setPreKeys(preKeyUpload);
}
private List<PreKeyRecord> generatePreKeys(ServiceIdType serviceIdType) {
logger.trace("Storing new message from {}", recipientId);
// store message on disk, before acknowledging receipt to the server
cachedMessage[0] = account.getMessageCache().cacheMessage(envelope1, recipientId);
+ try {
+ signalWebSocket.sendAck(it);
+ } catch (IOException e) {
+ logger.warn("Failed to ack envelope to server after storing it: {}", e.getMessage());
+ }
}
- return true;
});
isWaitingForMessage = false;
backOffCounter = 0;
private ACI getRegisteredUserByUsername(String username) throws IOException, BaseUsernameException {
return dependencies.getAccountManager()
- .getAciByUsernameHash(Base64UrlSafe.encodeBytesWithoutPadding(Username.hash(username)));
+ .getAciByUsernameHash(Base64UrlSafe.encodeBytesWithoutPadding(new Username(username).getHash()));
}
public record RegisteredUser(Optional<ACI> aci, Optional<PNI> pni) {
public void markKyberPreKeyUsed(final int kyberPreKeyId) {
// TODO
}
+
+ @Override
+ public List<KyberPreKeyRecord> loadLastResortKyberPreKeys() {
+ // TODO
+ return List.of();
+ }
+
+ @Override
+ public void removeKyberPreKey(final int i) {
+ // TODO
+ }
+
+ @Override
+ public void storeLastResortKyberPreKey(final int i, final KyberPreKeyRecord kyberPreKeyRecord) {
+ // TODO
+ }
}
versionCatalogs {
create("libs") {
library("bouncycastle", "org.bouncycastle", "bcprov-jdk15on").version("1.70")
- library("jackson.databind", "com.fasterxml.jackson.core", "jackson-databind").version("2.15.1")
+ library("jackson.databind", "com.fasterxml.jackson.core", "jackson-databind").version("2.15.2")
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_72")
+ library("signalservice", "com.github.turasa", "signal-service-java").version("2.15.3_unofficial_73")
library("protobuf", "com.google.protobuf", "protobuf-javalite").version("3.23.0")
library("sqlite", "org.xerial", "sqlite-jdbc").version("3.42.0.0")
library("hikari", "com.zaxxer", "HikariCP").version("5.0.1")