Exemple #1
0
        private async Task <BinaryReader> SendAndRecieve(TlMethod methodToExecute)
        {
            var sendTask    = Sender.Send(methodToExecute);
            var recieveTask = ResponseResultGetter.Recieve(sendTask.Item2);

            await sendTask.Item1;
            await recieveTask;

            return(recieveTask.Result);
        }
Exemple #2
0
        public Tuple <Task, ulong> Send(TlMethod request)
        {
            var preparedData = PrepareToSend(request, out var mesId);

            TcpTransport.Send(preparedData).Wait();

            SessionStore.Save();

            var waitTask = ConfirmationRecieveService.WaitForConfirm(mesId);

            return(Tuple.Create(waitTask, mesId));
        }
Exemple #3
0
        public async Task <T> SendRequestAsync <T>(TlMethod methodToExecute)
        {
            Log.Debug($"Send message of the constructor {methodToExecute}");

            BinaryReader resultReader;

            try
            {
                resultReader = await SendAndRecieve(methodToExecute);
            }
            catch (BadServerSaltException)
            {
                resultReader = await SendAndRecieve(methodToExecute);
            }
            methodToExecute.DeserializeResponse(resultReader);

            return((T)methodToExecute.GetType().GetProperty("Response").GetValue(methodToExecute));
        }
Exemple #4
0
        private byte[] PrepareToSend(TlMethod request, out ulong mesId)
        {
            var packet = BinaryHelper.WriteBytes(request.SerializeBody);

            var genResult = ClientSettings.Session.GenerateMsgIdAndSeqNo(request.Confirmed);

            mesId = genResult.Item1;

            Log.Debug($"Send message with Id = {mesId} and seqNo = {genResult.Item2}");

            byte[] msgKey;
            byte[] ciphertext;
            using (var plaintextPacket = MakeMemory(8 + 8 + 8 + 4 + 4 + packet.Length))
            {
                using (var plaintextWriter = new BinaryWriter(plaintextPacket))
                {
                    plaintextWriter.Write(ClientSettings.Session.Salt);
                    plaintextWriter.Write(ClientSettings.Session.Id);
                    plaintextWriter.Write(mesId);
                    plaintextWriter.Write(genResult.Item2);
                    plaintextWriter.Write(packet.Length);
                    plaintextWriter.Write(packet);

                    plaintextPacket.TryGetBuffer(out var buffer);
                    msgKey     = TlHelpers.CalcMsgKey(buffer.Array);
                    ciphertext = AES.EncryptAes(TlHelpers.CalcKey(ClientSettings.Session.AuthKey.Data, msgKey, true), buffer.Array);
                }
            }

            using (var ciphertextPacket = MakeMemory(8 + 16 + ciphertext.Length))
            {
                using (var writer = new BinaryWriter(ciphertextPacket))
                {
                    writer.Write(ClientSettings.Session.AuthKey.Id);
                    writer.Write(msgKey);
                    writer.Write(ciphertext);

                    return(ciphertextPacket.ToArray());
                }
            }
        }
Exemple #5
0
        private void AddSendHandler(Mock <ITcpTransport> mock, TlMethod request)
        {
            mock
            .BuildSend(
                bytes =>
            {
                var session = Container.Resolve <IClientSettings>().Session;

                byte[] plainText = null;

                BinaryHelper.ReadBytes(
                    bytes,
                    reader =>
                {
                    Assert.Equal(session.AuthKey.Id, reader.ReadUInt64());
                    var msgKey = reader.ReadBytes(16);

                    var cipherText = reader.ReadBytes(bytes.Length - 8 - 16);

                    plainText = AES.DecryptAes(TlHelpers.CalcKey(session.AuthKey.Data, msgKey, true), cipherText);
                });

                Assert.NotNull(plainText);

                BinaryHelper.ReadBytes(
                    plainText,
                    reader =>
                {
                    Assert.Equal(session.Salt, reader.ReadUInt64());
                    Assert.Equal(session.Id, reader.ReadUInt64());
                    Assert.Equal(0, reader.ReadInt32());

                    var packetLength = reader.ReadInt32();
                    Assert.True(packetLength > 0);

                    var requestBytes = BinaryHelper.WriteBytes(request.SerializeBody);
                    Assert.Equal(requestBytes, reader.ReadBytes(packetLength));
                });
            });
        }