public ClientSocket(Socket socket, AClient client, ushort version, ulong?aesKey, bool toClient) { _socket = socket; _client = client; _toClient = toClient; _pipe = new Pipe(); Endpoint = socket?.RemoteEndPoint as IPEndPoint; Host = Endpoint?.Address.ToString(); HostBytes = Endpoint?.Address.GetAddressBytes(); Port = (ushort)(((IPEndPoint)socket?.LocalEndPoint)?.Port ?? 0); Cipher = new MapleCipherProvider(version, aesKey, toClient); Cipher.PacketFinished += data => _client.Receive(new PacketReader(data)); if (socket != null && socket.Connected) { Task.Factory.StartNew(ListenForData); } }
public void EncryptDecryptProvider_ToClient_Succeeds() { var version = (ushort)55; var aesKey = (ulong)0x52330F1BB4060813; var iv = (uint)0; var encryptor = new MapleCipher(version, aesKey); encryptor.SetIv(iv); var packet = new PacketWriter(); packet.WriteByte(1); packet.WriteShort(2); packet.WriteInt(4); packet.WriteLong(8); var originalPacket = packet.ToArray(); var encryptedPacket = encryptor.Encrypt(packet.ToArray().AsSpan(), true); var waiter = new ManualResetEventSlim(); var provider = new MapleCipherProvider(version, aesKey, toClient: false); provider.SetVectors(0, 0); var buffer = encryptedPacket.ToArray().AsMemory(); provider.PacketFinished += received => { Assert.AreEqual(originalPacket.Length, received.Length, "Packet length should match"); Assert.AreEqual(originalPacket.ByteArrayToString(), received.ByteArrayToString()); waiter.Set(); }; provider.Decrypt(buffer.Span); waiter.Wait(); }