Example #1
0
 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);
 }
Example #2
0
        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);
            }
        }
Example #3
0
        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;
        }
Example #4
0
        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);
            }
        }