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; }
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); }
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); }
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); }
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); }