private async Task <byte[]> GetPacketBytesAsync(Socket socket, MTProtoPacket mtprotoPacket) { var packetLengthBytes = new byte[1]; var resultPacketLength = await ReceiveAsync(packetLengthBytes, socket).ConfigureAwait(false); if (resultPacketLength) { return(null); } packetLengthBytes = mtprotoPacket.DecryptObfuscated2(packetLengthBytes); var packetLength = BitConverter.ToInt32(packetLengthBytes.Concat(new byte[] { 0x00, 0x00, 0x00 }).ToArray(), 0); int lengthBytes; if (packetLength < 0x7F) { lengthBytes = packetLength << 2; } else { var lenBytes = new byte[3]; var resultLengthBytes = ReceiveAsync(lenBytes, socket).Result; if (resultLengthBytes) { return(null); } lenBytes = mtprotoPacket.DecryptObfuscated2(lenBytes); lengthBytes = BitConverter.ToInt32(lenBytes.Concat(new byte[] { 0x00 }).ToArray(), 0) << 2; } var packetBytes = new byte[lengthBytes]; var resultpacket = ReceiveAsync(packetBytes, socket).Result; if (resultpacket) { return(null); } packetBytes = mtprotoPacket.DecryptObfuscated2(packetBytes); return(packetBytes); }
private async void SenderSocketAsync(Socket socketClient, Socket socketServer, MTProtoPacket mtprotoPacketClient, MTProtoPacket mtprotoPacketServer) { try { while (true) { var packetBytesClient = await GetPacketBytesAsync(socketClient, mtprotoPacketClient).ConfigureAwait(false); if (packetBytesClient == null) { return; } var packetEnc = mtprotoPacketServer.CreatePacketObfuscated2(packetBytesClient); await socketServer.SendAsync(packetEnc, 0, packetEnc.Length).ConfigureAwait(false); } } catch (Exception e) { if (e.InnerException != null) { Console.WriteLine(e.InnerException.Message); return; } Console.WriteLine(e.Message); } }
private async void StartSocketAsync(Socket socket) { try { _listSocket.Add(socket); var randomBuffer = new byte[64]; await socket.ReceiveAsync(randomBuffer, 0, randomBuffer.Length).ConfigureAwait(false); var reversed = randomBuffer.SubArray(8, 48).Reverse().ToArray(); var key = randomBuffer.SubArray(8, 32); var keyReversed = reversed.SubArray(0, 32); var binSecret = ArrayUtils.HexToByteArray(_secret); key = SHA256Helper.ComputeHashsum(key.Concat(binSecret).ToArray()); keyReversed = SHA256Helper.ComputeHashsum(keyReversed.Concat(binSecret).ToArray()); var mtprotoPacketServer = new MTProtoPacket(); mtprotoPacketServer.SetInitBufferObfuscated2(randomBuffer, reversed, key, keyReversed); byte[] decryptBuf = mtprotoPacketServer.DecryptObfuscated2(randomBuffer).SubArray(56, 8); for (int i = 56; i < 64; i++) { randomBuffer[i] = decryptBuf[i - 56]; } byte[] res = randomBuffer.SubArray(56, 4); for (int i = 0; i < 4; i++) { if (res[i] != 0xef) { Console.WriteLine("Error in buffer"); return; } } var dcId = Math.Abs(BitConverter.ToInt16(randomBuffer.SubArray(60, 2), 0)); Console.WriteLine("Create new connection with dataCenterId:{0}", dcId); var ip = _ipServersConfig[dcId - 1]; Socket socketClient = null; MTProtoPacket mtprotoPacketClient = null; object lockSend = new object(); while (socket.IsConnected()) { ThrowIfDisposed(); var packetBytes = await GetPacketBytesAsync(socket, mtprotoPacketServer).ConfigureAwait(false); if (packetBytes == null) { continue; } if (socketClient == null || !socketClient.Connected) { socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socketClient.Connect(ip, 443); _listSocket.Add(socketClient); mtprotoPacketClient = new MTProtoPacket(); await mtprotoPacketClient.SendInitBufferObfuscated2Async(socketClient).ConfigureAwait(false); SenderSocketAsync(socketClient, socket, mtprotoPacketClient, mtprotoPacketServer); } var packet = mtprotoPacketClient.CreatePacketObfuscated2(packetBytes); lock (lockSend) { socketClient.SendAsync(packet, 0, packet.Length).GetAwaiter().GetResult(); } } if (socketClient != null) { socketClient.Close(); _listSocket.Remove(socketClient); } Console.WriteLine("A connection was closed"); } catch (Exception e) { if (e.InnerException != null) { Console.WriteLine(e.InnerException.Message); return; } Console.WriteLine(e.Message); } try { socket.Close(); _listSocket.Remove(socket); } catch (Exception e) { if (e.InnerException != null) { Console.WriteLine(e.InnerException.Message); return; } Console.WriteLine(e.Message); } }