Example #1
0
 public DialogModelEncrypted(TelegramSession session, EncryptedChat chat, byte[] key, long fingerprint, byte[] a) : base(session)
 {
     this.chat        = chat;
     this.key         = key;
     this.fingerprint = EncryptedChats.CalculateKeyFingerprint(key);//;fingerprint;
     this.a           = a;
 }
Example #2
0
        public void UpdateChat(EncryptedChat chat, byte[] a = null)
        {
            if (chat.Constructor == Constructor.encryptedChatEmpty)
            {
                return;
            }

            switch (chat.Constructor)
            {
            case Constructor.encryptedChatRequested:
                UpdateChat((EncryptedChatRequestedConstructor)chat, a);
                break;

            case Constructor.encryptedChatDiscarded:
                UpdateChat((EncryptedChatDiscardedConstructor)chat, a);
                break;

            case Constructor.encryptedChatWaiting:
                UpdateChat((EncryptedChatWaitingConstructor)chat, a);
                break;

            case Constructor.encryptedChat:
                UpdateChat((EncryptedChatConstructor)chat, a);
                break;
            }
            //
        }
Example #3
0
        private async Task CreateChatResponse(EncryptedChatRequestedConstructor chat)
        {
            try {
                messages_DhConfig dhConfig = await session.Api.messages_getDhConfig(version, 256);

                byte[] randomSalt;
                if (dhConfig.Constructor == Constructor.messages_dhConfig)
                {
                    Messages_dhConfigConstructor conf = (Messages_dhConfigConstructor)dhConfig;
                    version    = conf.version;
                    g          = conf.g;
                    p          = new BigInteger(1, conf.p);
                    randomSalt = conf.random;
                }
                else if (dhConfig.Constructor == Constructor.messages_dhConfigNotModified)
                {
                    Messages_dhConfigNotModifiedConstructor conf = (Messages_dhConfigNotModifiedConstructor)dhConfig;
                    randomSalt = conf.random;
                }
                else
                {
                    throw new InvalidDataException("invalid constructor");
                }

                byte[]     b           = GetSaltedRandomBytes(256, randomSalt, 0);
                BigInteger bInt        = new BigInteger(1, b);
                byte[]     gb          = BigInteger.ValueOf(g).ModPow(bInt, p).ToByteArrayUnsigned();
                byte[]     key         = new BigInteger(1, chat.g_a).ModPow(bInt, p).ToByteArrayUnsigned();
                long       fingerprint = CalculateKeyFingerprint(key);

                EncryptedChat acceptedChat = await session.Api.messages_acceptEncryption(TL.inputEncryptedChat(chat.id, chat.access_hash), gb, fingerprint);


                Deployment.Current.Dispatcher.BeginInvoke(() => {
                    var echats = from dialog in session.Dialogs.Model.Dialogs where dialog is DialogModelEncrypted && ((DialogModelEncrypted)dialog).Id == chat.id select dialog;
                    if (echats.Any())
                    {
                        // ???
                    }
                    else
                    {
                        session.Dialogs.Model.Dialogs.Insert(0, new DialogModelEncrypted(session, acceptedChat, key, fingerprint, b));
                    }
                });
            } catch (Exception e) {
                logger.error("response create chat error: {0}", e);
            }
        }
Example #4
0
        public override void Read(BinaryReader reader)
        {
            chat = TL.Parse <EncryptedChat>(reader);
            ttl  = reader.ReadInt32();
            int keyExists = reader.ReadInt32();

            if (keyExists != 0)
            {
                key         = Serializers.Bytes.read(reader);
                fingerprint = reader.ReadInt64();
            }



            int aExists = reader.ReadInt32();

            if (aExists != 0)
            {
                a = Serializers.Bytes.read(reader);
            }

            int messagesCount = reader.ReadInt32();

            for (int i = 0; i < messagesCount; i++)
            {
                int type = reader.ReadInt32();
                switch (type)
                {
                case 1:
                    messages.Add(new MessageModelDelivered(reader));
                    break;

                case 2:
                    messages.Add(new MessageModelUndelivered(reader));
                    break;

                case 3:
                    messages.Add(new MessageModelEncryptedDelivered(reader));
                    break;
                }
            }
        }
Example #5
0
        public void SetEncryptedChat(EncryptedChatConstructor chat, byte[] a)
        {
            this.chat = chat;

            OnPropertyChanged("IsWaiting");

            if (a != null)
            {
                this.a = a;
            }

            if (this.a != null)
            {
                logger.info("computation key based on a: {0} and m: {1}", BitConverter.ToString(this.a).Replace("-", "").ToLower(), TelegramSession.Instance.EncryptedChats.Modulo);
                key         = new BigInteger(1, chat.g_a_or_b).ModPow(new BigInteger(1, this.a), TelegramSession.Instance.EncryptedChats.Modulo).ToByteArrayUnsigned();
                fingerprint = EncryptedChats.CalculateKeyFingerprint(key);
                this.a      = null;
                logger.info("new calculated key: {0}", BitConverter.ToString(key).Replace("-", "").ToLower());
            }
            // TODO: on property changed
        }
Example #6
0
        /// <summary>
        /// This method retrieves the public key of the server and initiate the handshake back
        /// </summary>
        /// <param name="name">name of the client</param>
        private void GetServerPublicKeyAndInitiateHandshake(string name)
        {
            try
            {
                Model.QueueDeclarePassive(ClientQueue);
            }
            catch { throw new RabbitMQException(RabbitMQException.ExceptionType.NoClientQueue); }

            var data = Model.BasicGet(ClientQueue, true);

            if (data == null)
            {
                throw new RabbitMQException(RabbitMQException.ExceptionType.NoServerHandshakeData);
            }

            var handshake = BinaryFormatter <TServerHandshake> .FromBinary(data.Body);

            Chat = new EncryptedChat(name);
            Chat.Bind(handshake);

            SendClientPublicKeyToServer(handshake);
        }
Example #7
0
        public async Task CreateChatRequest(InputUser user)
        {
            try {
                messages_DhConfig dhConfig = await session.Api.messages_getDhConfig(version, 256);

                byte[] randomSalt;
                if (dhConfig.Constructor == Constructor.messages_dhConfig)
                {
                    var conf = (Messages_dhConfigConstructor)dhConfig;
                    version    = conf.version;
                    g          = conf.g;
                    p          = new BigInteger(1, conf.p);
                    randomSalt = conf.random;
                }
                else if (dhConfig.Constructor == Constructor.messages_dhConfigNotModified)
                {
                    var conf = (Messages_dhConfigNotModifiedConstructor)dhConfig;
                    randomSalt = conf.random;
                }
                else
                {
                    throw new InvalidDataException("invalid constructor");
                }

                byte[]     a  = GetSaltedRandomBytes(256, randomSalt, 0);
                BigInteger ga = BigInteger.ValueOf(g).ModPow(new BigInteger(1, a), p);

                logger.info("generated a: {0}, ga: {1}", BitConverter.ToString(a).Replace("-", "").ToLower(), ga);

                int           randomId = random.Next(); // also chat id
                EncryptedChat chat     = await session.Api.messages_requestEncryption(user, randomId, ga.ToByteArrayUnsigned());

                UpdateChat(chat, a);
            } catch (Exception e) {
                logger.error("creating chat error: {0}", e);
            }
        }
Example #8
0
 public void UpdateChatHandler(EncryptedChat chat)
 {
     logger.info("update chat handler: {0}", chat);
     UpdateChat(chat);
 }
 public DialogModelEncrypted(TelegramSession session, EncryptedChat chat, byte[] key, long fingerprint, byte[] a) : base(session) {
     this.chat = chat;
     this.key = key;
     this.fingerprint = EncryptedChats.CalculateKeyFingerprint(key);//;fingerprint;
     this.a = a;
 }
Example #10
0
 public void UpdateChatHandler(EncryptedChat chat) {
     logger.info("update chat handler: {0}", chat);
     UpdateChat(chat);
 }
 public DialogModelEncrypted(TelegramSession session, EncryptedChat chat, byte[] a) : base(session) {
     logger.info("encrypted chat created with a: {0}", BitConverter.ToString(a).Replace("-", "").ToLower());
     this.chat = chat;
     this.a = a;
 }
        public void SetEncryptedChat(EncryptedChatConstructor chat, byte[] a) {
            this.chat = chat;

            OnPropertyChanged("IsWaiting");

            if(a != null) {
                this.a = a;
            }

            if(this.a != null) {
                logger.info("computation key based on a: {0} and m: {1}", BitConverter.ToString(this.a).Replace("-", "").ToLower(), TelegramSession.Instance.EncryptedChats.Modulo);
                key = new BigInteger(1, chat.g_a_or_b).ModPow(new BigInteger(1, this.a), TelegramSession.Instance.EncryptedChats.Modulo).ToByteArrayUnsigned();
                fingerprint = EncryptedChats.CalculateKeyFingerprint(key);
                this.a = null;
                logger.info("new calculated key: {0}", BitConverter.ToString(key).Replace("-", "").ToLower());
            }
            // TODO: on property changed


        }
Example #13
0
 public DialogModelEncrypted(TelegramSession session, EncryptedChat chat, byte[] a) : base(session)
 {
     logger.info("encrypted chat created with a: {0}", BitConverter.ToString(a).Replace("-", "").ToLower());
     this.chat = chat;
     this.a    = a;
 }
 public UpdateEncryptionConstructor(EncryptedChat chat, int date)
 {
     this.chat = chat;
     this.date = date;
 }
        public override void Read(BinaryReader reader) {
            chat = TL.Parse<EncryptedChat>(reader);
            ttl = reader.ReadInt32();
            int keyExists = reader.ReadInt32();
            if(keyExists != 0) {
                key = Serializers.Bytes.read(reader);
                fingerprint = reader.ReadInt64();
            }

            

            int aExists = reader.ReadInt32();
            if (aExists != 0) {
                a = Serializers.Bytes.read(reader);
            }

            int messagesCount = reader.ReadInt32();
            for(int i = 0; i < messagesCount; i++) {
                int type = reader.ReadInt32();
                switch(type) {
                    case 1:
                        messages.Add(new MessageModelDelivered(reader));
                        break;
                    case 2:
                        messages.Add(new MessageModelUndelivered(reader));
                        break;
                    case 3:
                        messages.Add(new MessageModelEncryptedDelivered(reader));
                        break;
                }
            }
        }
 public override void Read(BinaryReader reader)
 {
     this.chat = Tl.Parse <EncryptedChat>(reader);
     this.date = reader.ReadInt32();
 }
Example #17
0
        public void UpdateChat(EncryptedChat chat, byte[] a = null) {
            if(chat.Constructor == Constructor.encryptedChatEmpty) {
                return;
            }

            switch(chat.Constructor) {
                case Constructor.encryptedChatRequested:
                    UpdateChat((EncryptedChatRequestedConstructor)chat, a);
                    break;
                case Constructor.encryptedChatDiscarded:
                    UpdateChat((EncryptedChatDiscardedConstructor) chat, a);
                    break;
                case Constructor.encryptedChatWaiting:
                    UpdateChat((EncryptedChatWaitingConstructor)chat, a);
                    break;
                case Constructor.encryptedChat:
                    UpdateChat((EncryptedChatConstructor)chat, a);
                    break;
            }
            //

        }