public MessageKeys RemoveMessageKeys(IEcPublicKey senderEphemeral, uint counter) { Pair <StorageProtos.SessionStructure.Types.Chain, uint> chainAndIndex = GetReceiverChain(senderEphemeral); StorageProtos.SessionStructure.Types.Chain chain = chainAndIndex.First(); if (chain == null) { return(null); } List <StorageProtos.SessionStructure.Types.Chain.Types.MessageKey> messageKeyList = new List <StorageProtos.SessionStructure.Types.Chain.Types.MessageKey>(chain.MessageKeysList); IEnumerator <StorageProtos.SessionStructure.Types.Chain.Types.MessageKey> messageKeyIterator = messageKeyList.GetEnumerator(); MessageKeys result = null; while (messageKeyIterator.MoveNext()) //hasNext() { StorageProtos.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; } } StorageProtos.SessionStructure.Types.Chain updatedChain = chain.ToBuilder().ClearMessageKeys() .AddRangeMessageKeys(messageKeyList) // AddAllMessageKeys .Build(); _sessionStructure = _sessionStructure.ToBuilder() .SetReceiverChains((int)chainAndIndex.Second(), updatedChain) // TODO: conv .Build(); return(result); }
public void SetMessageKeys(IEcPublicKey senderEphemeral, MessageKeys messageKeys) { Pair <StorageProtos.SessionStructure.Types.Chain, uint> chainAndIndex = GetReceiverChain(senderEphemeral); StorageProtos.SessionStructure.Types.Chain chain = chainAndIndex.First(); StorageProtos.SessionStructure.Types.Chain.Types.MessageKey messageKeyStructure = StorageProtos.SessionStructure.Types.Chain.Types.MessageKey.CreateBuilder() .SetCipherKey(ByteString.CopyFrom(messageKeys.GetCipherKey() /*.getEncoded()*/)) .SetMacKey(ByteString.CopyFrom(messageKeys.GetMacKey() /*.getEncoded()*/)) .SetIndex(messageKeys.GetCounter()) .SetIv(ByteString.CopyFrom(messageKeys.GetIv() /*.getIV()*/)) .Build(); StorageProtos.SessionStructure.Types.Chain.Builder updatedChain = chain.ToBuilder().AddMessageKeys(messageKeyStructure); if (updatedChain.MessageKeysList.Count > MaxMessageKeys) { updatedChain.MessageKeysList.RemoveAt(0); } _sessionStructure = _sessionStructure.ToBuilder() .SetReceiverChains((int)chainAndIndex.Second(), updatedChain.Build()) // TODO: conv .Build(); }
public bool HasMessageKeys(IEcPublicKey senderEphemeral, uint counter) { Pair <StorageProtos.SessionStructure.Types.Chain, uint> chainAndIndex = GetReceiverChain(senderEphemeral); StorageProtos.SessionStructure.Types.Chain chain = chainAndIndex.First(); if (chain == null) { return(false); } IList <StorageProtos.SessionStructure.Types.Chain.Types.MessageKey> messageKeyList = chain.MessageKeysList; foreach (StorageProtos.SessionStructure.Types.Chain.Types.MessageKey messageKey in messageKeyList) { if (messageKey.Index == counter) { return(true); } } return(false); }