Example #1
0
        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);
            }
        }
Example #2
0
        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();
        }