public void SetMessageKeys(ECPublicKey senderEphemeral, MessageKeys messageKeys) { var chainAndIndex = GetReceiverChain(senderEphemeral); var chain = chainAndIndex.Item1; var messageKeyStructure = new Chain.MessageKey { cipherKey = messageKeys.CipherKey, macKey = messageKeys.MacKey, index = messageKeys.Counter, iv = messageKeys.Iv }; chain.messageKeys.Add(messageKeyStructure); }
private byte[] GetPlaintext(UInt32 version, MessageKeys messageKeys, byte[] cipherText) { try { ICryptoTransform cipher; if(version >= 3) { cipher = GetCipher(messageKeys.CipherKey, messageKeys.Iv); } else { cipher = GetCipher(messageKeys.CipherKey, messageKeys.Counter); } return cipher.TransformFinalBlock(cipherText, 0, cipherText.Length); } catch(Exception e) { throw new InvalidMessageException(e); } }
public MessageKeys RemoveMessageKeys(ECPublicKey senderEphemeral, UInt32 counter) { Tuple<Chain, UInt32> chainAndIndex = GetReceiverChain(senderEphemeral); Chain chain = chainAndIndex.Item1; if(chain == null) { return null; } MessageKeys result = null; // TODO: Check~ foreach(var mK in chain.messageKeys) { if(mK.index == counter) { result = new MessageKeys(mK.cipherKey, mK.macKey, mK.iv, mK.index); chain.messageKeys.Remove(mK); break; } } return result; }
private byte[] GetCiphertext(UInt32 version, MessageKeys messageKeys, byte[] plaintext) { try { ICryptoTransform cipher; if(version >= 3) { cipher = GetCipher(messageKeys.CipherKey, messageKeys.Iv); } else { cipher = GetCipher(messageKeys.CipherKey, messageKeys.Counter); } return cipher.TransformFinalBlock(plaintext, 0, plaintext.Length); } catch(Exception e) { throw new InvalidOperationException("Assertion error", e); } }