processV3 method
Implementation
Future<Optional<int>> processV3(
SessionRecord sessionRecord, PreKeySignalMessage message) async {
if (sessionRecord.hasSessionState(
message.getMessageVersion(), message.getBaseKey().serialize())) {
$log.log(
"We've already setup a session for this V3 message, letting bundled message fall through...");
return const Optional.empty();
}
final ourSignedPreKey = _signedPreKeyStore
.loadSignedPreKey(message.getSignedPreKeyId())
.then((value) => value.getKeyPair());
late final Optional<ECKeyPair> ourOneTimePreKey;
if (message.getPreKeyId().isPresent) {
ourOneTimePreKey = Optional.of(await _preKeyStore
.loadPreKey(message.getPreKeyId().value)
.then((value) => value.getKeyPair()));
} else {
ourOneTimePreKey = const Optional<ECKeyPair>.empty();
}
if (!sessionRecord.isFresh()) sessionRecord.archiveCurrentState();
final parameters = BobSignalProtocolParameters(
theirBaseKey: message.getBaseKey(),
theirIdentityKey: message.getIdentityKey(),
ourIdentityKey: await _identityKeyStore.getIdentityKeyPair(),
ourSignedPreKey: await ourSignedPreKey,
ourRatchetKey: await ourSignedPreKey,
ourOneTimePreKey: ourOneTimePreKey,
);
RatchetingSession.initializeSessionBob(
sessionRecord.sessionState, parameters);
sessionRecord.sessionState.localRegistrationId =
await _identityKeyStore.getLocalRegistrationId();
sessionRecord.sessionState.remoteRegistrationId =
message.getRegistrationId();
sessionRecord.sessionState.aliceBaseKey = message.getBaseKey().serialize();
if (message.getPreKeyId().isPresent) {
return message.getPreKeyId();
} else {
return const Optional.empty();
}
}