Пример #1
0
        //#region Generic
        //public static object FromBytes<T>(this object value, byte[] bytes, ref int position)
        //{
        //    if (typeof(T) == typeof(long?))
        //    {
        //        return ((long?)value).FromBytes(bytes, ref position);
        //    }
        //    if (typeof(T) == typeof(int?))
        //    {
        //        return ((int?)value).FromBytes(bytes, ref position);
        //    }

        //    return ((TLObject)value).FromBytes(bytes, ref position);
        //}

        //public static byte[] ToBytes(this object value)
        //{
        //    if (value is long?)
        //    {
        //        return BitConverter.GetBytes((long?)value ?? 0);
        //    }
        //    if (value is int?)
        //    {
        //        return BitConverter.GetBytes((int?)value ?? 0);
        //    }

        //    return ((TLObject)value).ToBytes();
        //}

        //public static object FromStream<T>(this object value, Stream input)
        //{
        //    if (typeof(T) == typeof(long?))
        //    {
        //        var buffer = new byte[8];
        //        input.Read(buffer, 0, 8);
        //        value = BitConverter.ToInt64(buffer, 0);

        //        return value;
        //    }
        //    if (typeof(T) == typeof(int?))
        //    {
        //        var buffer = new byte[4];
        //        input.Read(buffer, 0, 4);
        //        value = BitConverter.ToInt32(buffer, 0);

        //        return value;
        //    }

        //    return ((TLObject)value).FromStream(input);
        //}

        //public static void ToStream(this object value, Stream output)
        //{
        //    if (value is long?)
        //    {
        //        output.Write(BitConverter.GetBytes((long?)value ?? 0), 0, 8);
        //        return;
        //    }
        //    else if (value is int?)
        //    {
        //        output.Write(BitConverter.GetBytes((int?)value ?? 0), 0, 4);
        //        return;
        //    }

        //    ((TLObject)value).ToStream(output);
        //}
        //#endregion

        public static TLConfig Merge(TLConfig oldConfig, TLCdnConfig cdnConfig)
        {
            foreach (var dcOption in oldConfig.DCOptions)
            {
                if (dcOption.IsCdn)
                {
                    var keys = new List <string>();
                    foreach (var newDCOption in cdnConfig.PublicKeys.Where(x => x.DCId.Equals(dcOption.Id)))
                    {
                        keys.Add(newDCOption.PublicKey);
                    }

                    dcOption.PublicKeys = keys.Count > 0 ? keys.ToArray() : null;
                }
            }

            return(oldConfig);
        }
Пример #2
0
        public static TLConfig Merge(TLConfig oldConfig, TLConfig newConfig)
        {
            if (oldConfig == null)
            {
                return(newConfig);
            }

            if (newConfig == null)
            {
                return(oldConfig);
            }

            foreach (var dcOption in oldConfig.DCOptions)
            {
                if (dcOption.AuthKey != null)
                {
                    var option = dcOption;
                    foreach (var newDCOption in newConfig.DCOptions.Where(x => x.AreEquals(option)))
                    {
                        newDCOption.AuthKey          = dcOption.AuthKey;
                        newDCOption.Salt             = dcOption.Salt;
                        newDCOption.SessionId        = dcOption.SessionId;
                        newDCOption.ClientTicksDelta = dcOption.ClientTicksDelta;
                        newDCOption.PublicKeys       = dcOption.PublicKeys;
                    }
                }
            }
            if (!string.IsNullOrEmpty(oldConfig.Country))
            {
                newConfig.Country = oldConfig.Country;
            }
            if (oldConfig.ActiveDCOptionIndex != default(int))
            {
                var oldActiveDCOption = oldConfig.DCOptions[oldConfig.ActiveDCOptionIndex];
                var dcId  = oldConfig.DCOptions[oldConfig.ActiveDCOptionIndex].Id;
                var ipv6  = oldActiveDCOption.IsIpv6;
                var media = oldActiveDCOption.IsMediaOnly;
                var cdn   = oldActiveDCOption.IsCdn;

                TLDCOption newActiveDCOption      = null;
                int        newActiveDCOptionIndex = 0;
                for (var i = 0; i < newConfig.DCOptions.Count; i++)
                {
                    if (newConfig.DCOptions[i].Id == dcId &&
                        newConfig.DCOptions[i].IsIpv6 == ipv6 &&
                        newConfig.DCOptions[i].IsMediaOnly == media &&
                        newConfig.DCOptions[i].IsCdn == cdn)
                    {
                        newActiveDCOption      = newConfig.DCOptions[i];
                        newActiveDCOptionIndex = i;
                        break;
                    }
                }

                if (newActiveDCOption == null)
                {
                    for (var i = 0; i < newConfig.DCOptions.Count; i++)
                    {
                        if (newConfig.DCOptions[i].Id == dcId)
                        {
                            newActiveDCOption      = newConfig.DCOptions[i];
                            newActiveDCOptionIndex = i;
                            break;
                        }
                    }
                }

                newConfig.ActiveDCOptionIndex = newActiveDCOptionIndex;
            }
            if (oldConfig.LastUpdate != default(DateTime))
            {
                newConfig.LastUpdate = oldConfig.LastUpdate;
            }

            return(newConfig);
        }
Пример #3
0
 public override void DeserializeResponse(BinaryReader br)
 {
     Response = (TLConfig)ObjectUtils.DeserializeObject(br);
 }
        private void CheckGetConfig(object state)
        {
            //TLUtils.WriteLine(DateTime.Now.ToLongTimeString() + ": Check Config on Thread " + Thread.CurrentThread.ManagedThreadId, LogSeverity.Error);

            if (_deviceInfo != null && _deviceInfo.IsBackground)
            {
                return;
            }

            if (_isGettingConfig)
            {
                return;
            }

            if (_activeTransport == null)
            {
                return;
            }

            if (_activeTransport.AuthKey == null)
            {
                return;
            }

            var isAuthorized = SettingsHelper.IsAuthorized;

            if (!isAuthorized)
            {
                return;
            }

            var currentTime = TLUtils.DateToUniversalTimeTLInt(ClientTicksDelta, DateTime.Now);


            var config23 = _config as TLConfig;

            if (config23 != null && config23.Expires != null && (config23.Expires > currentTime))
            {
                return;
            }

            //if (_config != null && _config.Date != null && Math.Abs(_config.Date.Value - currentTime.Value) < Constants.GetConfigInterval)
            //{
            //    return;
            //}

            //Execute.ShowDebugMessage("MTProtoService.CheckGetConfig GetConfig");

            _isGettingConfig = true;
            GetConfigAsync(
                result =>
            {
                //TLUtils.WriteLine(DateTime.Now.ToLongTimeString() + ": help.getConfig", LogSeverity.Error);
                _config = TLExtensions.Merge(_config, result);
                SaveConfig();
                _isGettingConfig = false;
            },
                error =>
            {
                _isGettingConfig = false;
                //Execute.ShowDebugMessage("help.getConfig error: " + error);
            });
        }
Пример #5
0
 public void updateSettings(TLConfig tlc)
 {
     throw new NotImplementedException();
 }
Пример #6
0
        private static void ProcessRequest(TcpListener tcpListener)
        {
            Console.WriteLine("Processing...");
            var        tcpClient = tcpListener.AcceptTcpClient();
            var        netStream = tcpClient.GetStream();
            BigInteger ga        = null;

            byte[]     newNonce       = new byte[32];
            BigInteger a              = new BigInteger(2048, new Random());
            var        dhPrime        = new BigInteger("00C150023E2F70DB7985DED064759CFECF0AF328E69A41DAF4D6F01B538135A6F91F8F8B2A0EC9BA9720CE352EFCF6C5680FFC424BD634864902DE0B4BD6D49F4E580230E3AE97D95C8B19442B3C0A10D8F5633FECEDD6926A7F6DAB0DDB7D457F9EA81B8465FCD6FFFEED114011DF91C059CAEDAF97625F6C96ECC74725556934EF781D866B34F011FCE4D835A090196E9A5F0E4449AF7EB697DDB9076494CA5F81104A305B6DD27665722C46B60E5DF680FB16B210607EF217652E60236C255F6A28315F4083A96791D7214BF64C1DF4FD0DB1944FB26A2A57031B32EEE64AD15A8BA68885CDE74A5BFC920F6ABF59BA5C75506373E7130F9042DA922179251F", 16);
            BigInteger gb             = null;
            var        sequenceNumber = 1;
            ulong?     messageId      = null;
            var        privateKey     = new BigInteger("582A4D5EE3A45C1AEEBDECD549D1FD4E12337B05C4C0A03FA8FF4A0A7B2861BAB86E8B58A70AAB9CF173FA313348239E28B17D34C7CEC8B68544BAD8623A306D747B7DC1D3D064FA73CE96893E8AFC36F7CDF58A383F48BDEC284D30BFFBC3F1A413DC869B3692EDD26004EE661C021BDA32F124D6631C67891E3E35EEDEAA08BFED8DBB7A6CC1D550CF16C67703BBDFFF0500FD81A55F98D92ECD67CE3CC31B766EA0DFBA284E18677E46036D9ED04105AAD11E97FD675F49A3B54D5AD395AA3C5B8343CDFF70C2E2A9243A47FBC5F541BBAE910B5DD1BF574B1E732A105C2B8F5239A4DFA0BCE0559F18BA0C44D31A279FA7CDCA612BD8F9796EBD114F7FA9", 16);
            AuthKey    authKey        = null;

            //var getingCounter = 0;
            //while (true)
            //{
            //    if (!netStream.DataAvailable)
            //        continue;
            //    Console.WriteLine("Get data " + ++getingCounter);
            //}

            while (tcpClient.Connected)
            {
                System.Threading.Thread.Sleep(100);
                if (!netStream.DataAvailable)
                {
                    continue;
                }

                byte[] nonceFromClient = new byte[16];
                byte[] servernonce     = new byte[16];

                uint responseCode  = 0;
                int  innerCode     = 0;
                long authkeysample = 123456789;

                const long step1Constructor = 0x60469778;
                const long step2Constructor = 0xd712e4be;
                const long step3Constructor = 0xf5045f1f;

                if (netStream.CanRead)
                {
                    var bytes = new byte[tcpClient.ReceiveBufferSize];
                    netStream.Read(bytes, 0, (int)tcpClient.ReceiveBufferSize);
                    var tcpMessage   = TcpMessage.Decode(bytes);
                    var binaryReader = new BinaryReader(new MemoryStream(tcpMessage.Body, false));


                    var authKeyId = binaryReader.ReadInt64();
                    if (authKeyId == 0)
                    {
                        var msgId      = binaryReader.ReadInt64();
                        var datalength = binaryReader.ReadInt32();
                        var data       = binaryReader.ReadBytes(datalength);

                        var binaryReader2 = new BinaryReader(new MemoryStream(data, false));

                        responseCode = binaryReader2.ReadUInt32();
                        Console.WriteLine("Request code: " + responseCode);
                        if (responseCode == step1Constructor) //---Step1_PQRequest
                        {
                            nonceFromClient = binaryReader2.ReadBytes(16);
                        }
                        else if (responseCode == step2Constructor) //---Step1_PQRequest
                        {
                            nonceFromClient = binaryReader2.ReadBytes(16);
                            servernonce     = binaryReader2.ReadBytes(16);
                            var p = binaryReader2.ReadBytes(4);
                            var q = binaryReader2.ReadBytes(8);
                            var targetFingerprint = BitConverter.ToString(binaryReader2.ReadBytes(8)).Replace("-", string.Empty);

                            //TODO: need to decryption
                            var ciphertext = Bytes.read(binaryReader2);
                            ciphertext = RSA.Decrypt(targetFingerprint, ciphertext, privateKey, 0, ciphertext.Length);
                            var cipherReader    = new BinaryReader(new MemoryStream(ciphertext, false));
                            var hashsum         = cipherReader.ReadBytes(20);
                            var innercode       = cipherReader.ReadUInt32();//0x83c95aec
                            var pq              = cipherReader.ReadBytes(20);
                            var noncetemp       = cipherReader.ReadBytes(16);
                            var servernoncetemp = cipherReader.ReadBytes(16);
                            newNonce = cipherReader.ReadBytes(32);
                            //Array.Copy(ciphertext, ciphertext.Length - 32, newNonce, 0, 32);
                            //ciphertext.CopyTo(newnoncetemp, ciphertext.Length - 32);
                        }
                        else if (responseCode == step3Constructor) //---Step1_PQRequest
                        {
                            nonceFromClient = binaryReader2.ReadBytes(16);
                            servernonce     = binaryReader2.ReadBytes(16);

                            //TODO: need to decryption
                            var        ciphertext                = Bytes.read(binaryReader2);
                            AESKeyData key                       = AES.GenerateKeyDataFromNonces(servernonce, newNonce);
                            var        cleartext                 = AES.DecryptAES(key, ciphertext);
                            var        binaryReadernner          = new BinaryReader(new MemoryStream(cleartext, false));
                            var        hasheddata                = binaryReadernner.ReadBytes(20);
                            var        client_dh_inner_data_code = binaryReadernner.ReadUInt32();
                            if (client_dh_inner_data_code != 0x6643b654)
                            {
                                throw new Exception("We have a complex story");
                            }
                            var nonceFromClient_temp = binaryReadernner.ReadBytes(16);
                            var servernonce_temp     = binaryReadernner.ReadBytes(16);
                            var zero = binaryReadernner.ReadUInt64();
                            gb = new BigInteger(Bytes.read(binaryReadernner));
                        }
                    }
                    else
                    {
                        var _gba = gb.ModPow(a, dhPrime);
                        authKey = new AuthKey(_gba);
                        var decodeMessage = DecodeMessage(tcpMessage.Body, authKey);
                        var objrawReader  = new BinaryReader(new MemoryStream(decodeMessage.Item1, false));
                        messageId = decodeMessage.Item2;
                        innerCode = objrawReader.ReadInt32();


                        if (innerCode == 0x62d6b459)//acknowledged
                        {
                            var vector   = objrawReader.ReadInt32();
                            var msgCount = objrawReader.ReadInt32();
                            continue;
                        }
                        else //if (responseCode == -627372787)
                        {
                            objrawReader.BaseStream.Position += -4;
                            var obj = ObjectUtils.DeserializeObject(objrawReader);
                            if (obj is TLRequestInvokeWithLayer)
                            {
                                var invokewithlayer = (TLRequestInvokeWithLayer)obj;
                                if (invokewithlayer.Query is TLRequestInitConnection)
                                {
                                    var requestInitConnection = (TLRequestInitConnection)invokewithlayer.Query;
                                }
                                else if (invokewithlayer.Query is TLRequestSendCode)
                                {
                                    var requestSendCode = (TLRequestSendCode)invokewithlayer.Query;
                                }
                            }
                            else if (obj is TLRequestSendCode)
                            {
                                var requestSendCode = (TLRequestSendCode)obj;
                            }
                            else if (obj is TLRequestSignIn)
                            {
                                var requestSignIn = (TLRequestSignIn)obj;
                            }
                            else if (obj is TLRequestGetContacts)
                            {
                                var requestGetContacts = (TLRequestGetContacts)obj;
                            }
                        }

                        //var keyData = Helpers.CalcKey(buffer, messageKey, false);
                        //var data = AES.DecryptAES(keyData, buffer);
                    }
                }

                if (netStream.CanWrite)
                {
                    var fingerprint = StringToByteArray("216be86c022bb4c3");

                    byte[] outputdata = null;
                    if (responseCode == step1Constructor)
                    {
                        var nonce = new byte[16];
                        new Random().NextBytes(nonce);
                        outputdata = new Step1_Response()
                        {
                            Pq           = new BigInteger(1, BitConverter.GetBytes(880)),
                            ServerNonce  = nonceFromClient,
                            Nonce        = nonce,
                            Fingerprints = new List <byte[]>()
                            {
                                fingerprint
                            }
                        }.ToBytes();
                    }
                    else if (responseCode == step2Constructor)
                    {
                        //var nonce = new byte[16];
                        //new Random().NextBytes(nonce);

                        byte[]     answer;
                        var        hashsum       = Encoding.UTF8.GetBytes("asdfghjklmnbvcxzasdf");
                        const uint innerCodetemp = 0xb5890dba;
                        AESKeyData key           = AES.GenerateKeyDataFromNonces(servernonce, newNonce);

                        var g = 47;
                        ga = BigInteger.ValueOf(g).ModPow(a, dhPrime);

                        using (var memoryStream = new MemoryStream())
                        {
                            using (var binaryWriter = new BinaryWriter(memoryStream))
                            {
                                binaryWriter.Write(hashsum);
                                binaryWriter.Write(innerCodetemp);
                                binaryWriter.Write(nonceFromClient);
                                binaryWriter.Write(servernonce);
                                binaryWriter.Write(g);
                                Bytes.write(binaryWriter, dhPrime.ToByteArrayUnsigned());
                                Bytes.write(binaryWriter, ga.ToByteArrayUnsigned());
                                Bytes.write(binaryWriter, BitConverter.GetBytes((int)(Convert.ToInt64((DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalMilliseconds) / 1000)));//server datetime
                                answer = memoryStream.ToArray();
                            }
                        }

                        outputdata = new Step2_Response()
                        {
                            ServerNonce     = nonceFromClient,
                            Nonce           = servernonce,
                            NewNonce        = newNonce,
                            EncryptedAnswer = AES.EncryptAES(key, answer)
                        }.ToBytes();
                    }
                    else if (responseCode == step3Constructor)
                    {
                        var _gba = gb.ModPow(a, dhPrime);
                        authKey = new AuthKey(_gba);
                        var        newNonceHash  = authKey.CalcNewNonceHash(newNonce, 1);
                        const uint innerCodeTemp = 0x3bcbf734;
                        using (var memoryStream = new MemoryStream())
                        {
                            using (var binaryWriter = new BinaryWriter(memoryStream))
                            {
                                binaryWriter.Write(innerCodeTemp);
                                binaryWriter.Write(servernonce);
                                binaryWriter.Write(nonceFromClient);
                                binaryWriter.Write(newNonceHash);//hashnewnonce
                                outputdata = memoryStream.ToArray();
                            }
                        }
                    }
                    else if (innerCode == -2035355412)//TLRequestSendCode
                    {
                        #region Generate TLSentCode

                        var sentCode = new TLSentCode();
                        sentCode.PhoneRegistered = false;
                        sentCode.Timeout         = 7777;
                        sentCode.PhoneCodeHash   = "asdfghjklmnbvcxzasdf";
                        sentCode.Flags           = 3;
                        sentCode.NextType        = new TLCodeTypeSms();
                        sentCode.Type            = new TLSentCodeTypeApp()
                        {
                            Length = 20
                        };

                        #endregion

                        using (var memoryStream = new MemoryStream())
                        {
                            using (var binaryWriter = new BinaryWriter(memoryStream))
                            {
                                binaryWriter.Write(0xf35c6d01);      //main code
                                binaryWriter.Write(messageId.Value); //requestId -- ulong -- from mesage id
                                sentCode.SerializeBody(binaryWriter);
                                outputdata = memoryStream.ToArray();
                            }
                        }
                    }
                    else if (innerCode == -627372787)
                    {
                        #region Generate TLConfig
                        //---Genrate mock tlconfig
                        var config = new TLConfig();
                        config.CallConnectTimeoutMs = 7777;
                        config.CallPacketTimeoutMs  = 7777;
                        config.CallReceiveTimeoutMs = 7777;
                        config.CallRingTimeoutMs    = 7777;
                        config.ChatBigSize          = 7777;
                        config.ChatSizeMax          = 777;
                        config.Date      = Convert.ToInt32((DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds);
                        config.DcOptions = new TLVector <TLDcOption>()
                        {
                            new TLDcOption()
                            {
                                Flags = 0, Id = 1, IpAddress = "127.0.0.1", Port = 5000
                            }
                        };
                        config.DisabledFeatures      = new TLVector <TLDisabledFeature>();
                        config.ForwardedCountMax     = 777;
                        config.MegagroupSizeMax      = 777;
                        config.NotifyCloudDelayMs    = 7777;
                        config.NotifyDefaultDelayMs  = 7777;
                        config.OfflineBlurTimeoutMs  = 7777;
                        config.OfflineIdleTimeoutMs  = 7777;
                        config.OnlineCloudTimeoutMs  = 7777;
                        config.OnlineUpdatePeriodMs  = 7777;
                        config.PhonecallsEnabled     = false;
                        config.PinnedDialogsCountMax = 7;
                        config.PushChatLimit         = 7;
                        config.PushChatPeriodMs      = 777;
                        config.RatingEDecay          = 777;
                        config.SavedGifsLimit        = 777;
                        config.StickersRecentLimit   = 777;
                        config.ThisDc      = 1;//TODO: ---what's this?!---
                        config.MeUrlPrefix = "https://t.me/";
                        config.TestMode    = false;
                        #endregion

                        using (var memoryStream = new MemoryStream())
                        {
                            using (var binaryWriter = new BinaryWriter(memoryStream))
                            {
                                binaryWriter.Write(0xf35c6d01);      //main code
                                                                     //binaryWriter.Write(0xf35c6d02);//code
                                binaryWriter.Write(messageId.Value); //requestId -- ulong -- from mesage id
                                                                     //binaryWriter.Write(0x2144ca17);//innercode -- int
                                                                     //binaryWriter.Write(1123456789);//sample code
                                                                     //Serializers.Bytes.write(binaryWriter, config.Serialize());
                                config.SerializeBody(binaryWriter);
                                outputdata = memoryStream.ToArray();
                            }
                        }
                    }
                    else if (innerCode == -1126886015)
                    {
                        #region Generate TLAuthorization

                        var auth = new TeleSharp.TL.Auth.TLAuthorization();
                        auth.Flags = 3;
                        auth.User  = new TLUser()
                        {
                            FirstName = "Meysami"
                        };

                        #endregion

                        using (var memoryStream = new MemoryStream())
                        {
                            using (var binaryWriter = new BinaryWriter(memoryStream))
                            {
                                binaryWriter.Write(0xf35c6d01);      //main code
                                binaryWriter.Write(messageId.Value); //requestId -- ulong -- from mesage id
                                auth.SerializeBody(binaryWriter);
                                outputdata = memoryStream.ToArray();
                            }
                        }
                    }
                    else if (innerCode == 583445000)//GetContacts
                    {
                        #region Generate TLAbsContacts

                        var contacts = new TLContacts();
                        contacts.Contacts = new TLVector <TLContact>()
                        {
                            new TLContact()
                            {
                                UserId = 11
                            },
                            new TLContact()
                            {
                                UserId = 12
                            }
                        };
                        contacts.Users = new TLVector <TLAbsUser>()
                        {
                            new TLUser()
                            {
                                Bot = false, FirstName = "Mary", Id = 11
                            },
                            new TLUser()
                            {
                                Bot = false, FirstName = "Mary 2", Id = 12
                            }
                        };

                        #endregion

                        using (var memoryStream = new MemoryStream())
                        {
                            using (var binaryWriter = new BinaryWriter(memoryStream))
                            {
                                binaryWriter.Write(0xf35c6d01);      //main code
                                binaryWriter.Write(messageId.Value); //requestId -- ulong -- from mesage id
                                contacts.SerializeBody(binaryWriter);
                                outputdata = memoryStream.ToArray();
                            }
                        }
                    }
                    else
                    {
                        continue;
                    }

                    if (innerCode != 0)
                    {
                        outputdata = PrepareToSend2(outputdata, authKey.Id, 0, 0, 0, servernonce, sequenceNumber, authKey);
                    }
                    else
                    {
                        outputdata = PrepareToSend(outputdata);
                    }

                    outputdata = Encode(outputdata, sequenceNumber++);
                    netStream.Write(outputdata, 0, outputdata.Length);
                }
                else
                {
                    Console.WriteLine("You cannot write data to this stream.");
                    tcpClient.Close();
                    netStream.Close();
                }
            }
        }