public void SetMessageKeys(IEcPublicKey senderEphemeral, MessageKeys messageKeys) { Pair <SessionStructure.Types.Chain, uint> chainAndIndex = GetReceiverChain(senderEphemeral); SessionStructure.Types.Chain chain = chainAndIndex.First(); SessionStructure.Types.Chain.Types.MessageKey messageKeyStructure = new SessionStructure.Types.Chain.Types.MessageKey { CipherKey = ByteString.CopyFrom(messageKeys.GetCipherKey()), MacKey = ByteString.CopyFrom(messageKeys.GetMacKey()), Index = messageKeys.GetCounter(), Iv = ByteString.CopyFrom(messageKeys.GetIv()) }; chain.MessageKeys.Add(messageKeyStructure); if (chain.MessageKeys.Count > MaxMessageKeys) { chain.MessageKeys.RemoveAt(0); } _sessionStructure.ReceiverChains[(int)chainAndIndex.Second()] = chain; }
public MessageKeys RemoveMessageKeys(IEcPublicKey senderEphemeral, uint counter) { Pair <SessionStructure.Types.Chain, uint> chainAndIndex = GetReceiverChain(senderEphemeral); SessionStructure.Types.Chain chain = chainAndIndex.First(); if (chain == null) { return(null); } List <SessionStructure.Types.Chain.Types.MessageKey> messageKeyList = new List <SessionStructure.Types.Chain.Types.MessageKey>(chain.MessageKeys); IEnumerator <SessionStructure.Types.Chain.Types.MessageKey> messageKeyIterator = messageKeyList.GetEnumerator(); MessageKeys result = null; while (messageKeyIterator.MoveNext()) //hasNext() { SessionStructure.Types.Chain.Types.MessageKey messageKey = messageKeyIterator.Current; // next() if (messageKey.Index == counter) { result = new MessageKeys(messageKey.CipherKey.ToByteArray(), messageKey.MacKey.ToByteArray(), messageKey.Iv.ToByteArray(), messageKey.Index); messageKeyList.Remove(messageKey); //messageKeyIterator.remove(); break; } } chain.MessageKeys.Clear(); chain.MessageKeys.AddRange(messageKeyList); _sessionStructure.ReceiverChains[(int)chainAndIndex.Second()] = chain; return(result); }