Example #1
0
        public static bool IsDisplayedDecryptedMessage(TLDecryptedMessageBase message, bool displayEmpty = false)
        {
            if (message == null)
            {
                return(false);
            }

#if DEBUG
            return(true);
#endif
            return(IsDisplayedDecryptedMessageInternal(message, displayEmpty));
        }
 public virtual void Update(TLDecryptedMessageBase message)
 {
     ChatId     = message.ChatId ?? ChatId;
     InputFile  = message.InputFile ?? InputFile;
     FromId     = message.FromId ?? FromId;
     Out        = message.Out ?? Out;
     Unread     = message.Unread ?? Unread;
     Date       = message.Date ?? Date;
     Qts        = message.Qts ?? Qts;
     DeleteDate = message.DeleteDate ?? DeleteDate;
     Status     = message.Status;
     TTL        = message.TTL ?? TTL;
 }
Example #3
0
        public static TLPeerBase GetPeerFromMessage(TLDecryptedMessageBase message)
        {
            TLPeerBase peer          = null;
            var        commonMessage = message;

            if (commonMessage != null)
            {
                if (commonMessage.ChatId != null)
                {
                    peer = new TLPeerEncryptedChat {
                        Id = commonMessage.ChatId
                    };
                }
            }
            else
            {
                WriteLine("Cannot get peer from non TLDecryptedMessage", LogSeverity.Error);
            }

            return(peer);
        }
Example #4
0
        public static TLDecryptedMessageBase DecryptMessage(TLString data, TLEncryptedChat chat, out bool commitChat)
        {
            commitChat = false;

            var bytes = data.Data;

            var keyFingerprint           = BitConverter.ToInt64(bytes, 0);
            var msgKey                   = bytes.SubArray(8, 16);
            var key                      = chat.Key.Data;
            var keyHash                  = Utils.ComputeSHA1(key);
            var calculatedKeyFingerprint = BitConverter.ToInt64(keyHash, keyHash.Length - 8);

            if (keyFingerprint != calculatedKeyFingerprint)
            {
                var chat20 = chat as TLEncryptedChat20;
                if (chat20 != null && chat20.PFS_Key != null)
                {
                    var pfsKeyHash        = Utils.ComputeSHA1(chat20.PFS_Key.Data);
                    var pfsKeyFingerprint = BitConverter.ToInt64(pfsKeyHash, pfsKeyHash.Length - 8);
                    if (pfsKeyFingerprint == keyFingerprint)
                    {
                        chat20.Key                = chat20.PFS_Key;
                        chat20.PFS_Key            = null;
                        chat20.PFS_KeyFingerprint = null;
                        chat20.PFS_A              = null;
                        chat20.PFS_ExchangeId     = null;
                        commitChat                = true;
                    }
                    else
                    {
                        return(null);
                    }
                }
                else
                {
                    return(null);
                }
            }

            var x      = 0;
            var sha1_a = Utils.ComputeSHA1(Combine(msgKey, key.SubArray(x, 32)));
            var sha1_b = Utils.ComputeSHA1(Combine(key.SubArray(32 + x, 16), msgKey, key.SubArray(48 + x, 16)));
            var sha1_c = Utils.ComputeSHA1(Combine(key.SubArray(64 + x, 32), msgKey));
            var sha1_d = Utils.ComputeSHA1(Combine(msgKey, key.SubArray(96 + x, 32)));

            var aesKey = Combine(sha1_a.SubArray(0, 8), sha1_b.SubArray(8, 12), sha1_c.SubArray(4, 12));
            var aesIV  = Combine(sha1_a.SubArray(8, 12), sha1_b.SubArray(0, 8), sha1_c.SubArray(16, 4), sha1_d.SubArray(0, 8));

            var encryptedBytes = bytes.SubArray(24, bytes.Length - 24);
            var decryptedBytes = Utils.AesIge(encryptedBytes, aesKey, aesIV, false);

            var length = BitConverter.ToInt32(decryptedBytes, 0);

            if (length <= 0 || (4 + length) > decryptedBytes.Length)
            {
                return(null);
            }

            var calculatedMsgKey = Utils.ComputeSHA1(decryptedBytes.SubArray(0, 4 + length));

            for (var i = 0; i < 16; i++)
            {
                if (msgKey[i] != calculatedMsgKey[i + 4])
                {
                    return(null);
                }
            }

            var position                            = 4;
            var decryptedObject                     = TLObject.GetObject <TLObject>(decryptedBytes, ref position);
            var decryptedMessageLayer               = decryptedObject as TLDecryptedMessageLayer;
            var decryptedMessageLayer17             = decryptedObject as TLDecryptedMessageLayer17;
            TLDecryptedMessageBase decryptedMessage = null;

            if (decryptedMessageLayer17 != null)
            {
                decryptedMessage = decryptedMessageLayer17.Message;
                var decryptedMessage17 = decryptedMessage as ISeqNo;
                if (decryptedMessage17 != null)
                {
                    decryptedMessage17.InSeqNo  = decryptedMessageLayer17.InSeqNo;
                    decryptedMessage17.OutSeqNo = decryptedMessageLayer17.OutSeqNo;
                }
            }
            else if (decryptedMessageLayer != null)
            {
                decryptedMessage = decryptedMessageLayer.Message;
            }
            else if (decryptedObject is TLDecryptedMessageBase)
            {
                decryptedMessage = (TLDecryptedMessageBase)decryptedObject;
            }

            return(decryptedMessage);
        }
Example #5
0
        public static bool IsDisplayedDecryptedMessageInternal(TLDecryptedMessageBase message, bool displayEmpty = false)
        {
            var serviceMessage = message as TLDecryptedMessageService;

            if (serviceMessage != null)
            {
                var emptyAction = serviceMessage.Action as TLDecryptedMessageActionEmpty;
                if (emptyAction != null)
                {
                    if (displayEmpty)
                    {
                        return(true);
                    }

                    return(false);
                }

                var notifyLayerAction = serviceMessage.Action as TLDecryptedMessageActionNotifyLayer;
                if (notifyLayerAction != null)
                {
                    return(false);
                }

                var deleteMessagesAction = serviceMessage.Action as TLDecryptedMessageActionDeleteMessages;
                if (deleteMessagesAction != null)
                {
                    return(false);
                }

                var readMessagesAction = serviceMessage.Action as TLDecryptedMessageActionReadMessages;
                if (readMessagesAction != null)
                {
                    return(false);
                }

                var flushHistoryAction = serviceMessage.Action as TLDecryptedMessageActionFlushHistory;
                if (flushHistoryAction != null)
                {
                    return(false);
                }

                var resendAction = serviceMessage.Action as TLDecryptedMessageActionResend;
                if (resendAction != null)
                {
                    return(false);
                }

                var requestKey = serviceMessage.Action as TLDecryptedMessageActionRequestKey;
                if (requestKey != null)
                {
                    return(false);
                }

                var commitKey = serviceMessage.Action as TLDecryptedMessageActionCommitKey;
                if (commitKey != null)
                {
                    return(false);
                }

                var acceptKey = serviceMessage.Action as TLDecryptedMessageActionAcceptKey;
                if (acceptKey != null)
                {
                    return(false);
                }

                var noop = serviceMessage.Action as TLDecryptedMessageActionNoop;
                if (noop != null)
                {
                    return(false);
                }

                var abortKey = serviceMessage.Action as TLDecryptedMessageActionAbortKey;
                if (abortKey != null)
                {
                    return(false);
                }
            }

            return(true);
        }
Example #6
0
        public static int InsertMessageInOrder(IList <TLDecryptedMessageBase> messages, TLDecryptedMessageBase message)
        {
            var position = -1;

            if (messages.Count == 0)
            {
                position = 0;
            }

            for (var i = 0; i < messages.Count; i++)
            {
                if (messages[i].DateIndex < message.DateIndex)
                {
                    position = i;
                    break;
                }
            }

            if (position != -1)
            {
                messages.Insert(position, message);
            }

            return(position);
        }