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