import org.asamk.signal.manager.util.Utils;
import org.signal.libsignal.protocol.IdentityKeyPair;
import org.signal.libsignal.protocol.InvalidKeyException;
+import org.signal.libsignal.protocol.state.KyberPreKeyRecord;
import org.signal.libsignal.protocol.state.SignedPreKeyRecord;
import org.signal.libsignal.usernames.BaseUsernameException;
import org.signal.libsignal.usernames.Username;
// TODO check and update remote storage
context.getUnidentifiedAccessHelper().rotateSenderCertificates();
dependencies.resetAfterAddressChange();
+ context.getGroupV2Helper().clearAuthCredentialCache();
context.getAccountFileUpdater().updateAccountIdentifiers(account.getNumber(), account.getAci());
}
public void setPni(
final PNI updatedPni,
final IdentityKeyPair pniIdentityKeyPair,
+ final String number,
+ final int localPniRegistrationId,
final SignedPreKeyRecord pniSignedPreKey,
- final int localPniRegistrationId
+ final KyberPreKeyRecord lastResortKyberPreKey
) throws IOException {
- account.setPni(updatedPni, pniIdentityKeyPair, pniSignedPreKey, localPniRegistrationId);
+ updateSelfIdentifiers(number != null ? number : account.getNumber(), account.getAci(), updatedPni);
+ account.setNewPniIdentity(pniIdentityKeyPair, pniSignedPreKey, lastResortKyberPreKey, localPniRegistrationId);
context.getPreKeyHelper().refreshPreKeysIfNecessary(ServiceIdType.PNI);
- if (account.getPni() == null || !account.getPni().equals(updatedPni)) {
- context.getGroupV2Helper().clearAuthCredentialCache();
- }
}
public void startChangeNumber(
import org.signal.libsignal.protocol.InvalidMessageException;
import org.signal.libsignal.protocol.groups.GroupSessionBuilder;
import org.signal.libsignal.protocol.message.DecryptionErrorMessage;
+import org.signal.libsignal.protocol.state.KyberPreKeyRecord;
import org.signal.libsignal.protocol.state.SignedPreKeyRecord;
import org.signal.libsignal.zkgroup.InvalidInputException;
import org.signal.libsignal.zkgroup.profiles.ProfileKey;
context.getAccountHelper()
.setPni(updatedPni,
new IdentityKeyPair(pniChangeNumber.getIdentityKeyPair().toByteArray()),
+ pniChangeNumber.hasNewE164() ? pniChangeNumber.getNewE164() : null,
+ pniChangeNumber.getRegistrationId(),
new SignedPreKeyRecord(pniChangeNumber.getSignedPreKey().toByteArray()),
- pniChangeNumber.getRegistrationId());
+ pniChangeNumber.hasLastResortKyberPreKey()
+ ? new KyberPreKeyRecord(pniChangeNumber.getLastResortKyberPreKey()
+ .toByteArray())
+ : null);
} catch (Exception e) {
logger.warn("Failed to handle change number message", e);
}
save();
}
- public void setPni(
- final PNI updatedPni,
+ public void setNewPniIdentity(
final IdentityKeyPair pniIdentityKeyPair,
final SignedPreKeyRecord pniSignedPreKey,
+ final KyberPreKeyRecord lastResortKyberPreKey,
final int localPniRegistrationId
) {
- setPni(updatedPni);
-
setPniIdentityKeyPair(pniIdentityKeyPair);
- addSignedPreKey(ServiceIdType.PNI, pniSignedPreKey);
setLocalPniRegistrationId(localPniRegistrationId);
+
+ final var preKeyMetadata = getAccountData(ServiceIdType.PNI).getPreKeyMetadata();
+ preKeyMetadata.nextSignedPreKeyId = pniSignedPreKey.getId();
+ addSignedPreKey(ServiceIdType.PNI, pniSignedPreKey);
+ if (lastResortKyberPreKey != null) {
+ preKeyMetadata.kyberPreKeyIdOffset = lastResortKyberPreKey.getId();
+ addLastResortKyberPreKey(ServiceIdType.PNI, lastResortKyberPreKey);
+ }
}
public SignalServiceAddress getSelfAddress() {