removeMessageKeys method

MessageKeys? removeMessageKeys(
  1. ECPublicKey senderEphemeral,
  2. int counter
)

Implementation

MessageKeys? removeMessageKeys(ECPublicKey senderEphemeral, int counter) {
  final chainAndIndex = _getReceiverChain(senderEphemeral);
  if (chainAndIndex == null) {
    return null;
  }
  final chain = chainAndIndex.$1;

  final messageKeyList = LinkedList<Entry<SessionStructureChainMessageKey>>();
  chain.messageKeys.forEach((element) {
    messageKeyList.add(Entry(element));
  });
  final messageKeyIterator = messageKeyList.iterator;
  MessageKeys? result;
  while (messageKeyIterator.moveNext()) {
    final entry = messageKeyIterator.current;
    final messageKey = entry.value;
    if (messageKey.index == counter) {
      final cipherKey = Uint8List.fromList(messageKey.cipherKey);
      final macKey = Uint8List.fromList(messageKey.macKey);
      final iv = Uint8List.fromList(messageKey.iv);
      final index = messageKey.index;
      result = MessageKeys(cipherKey, macKey, iv, index);

      messageKeyList.remove(entry);
      break;
    }
  }

  chain.messageKeys.clear();
  messageKeyList.forEach((entry) {
    chain.messageKeys.add(entry.value);
  });

  _sessionStructure.receiverChains
      .setAll(chainAndIndex.$2, <SessionStructureChain>[chain]);
  return result;
}