示例#1
0
        public void GetPacketLength_ToServer_Succeeds()
        {
            var version        = (ushort)55;
            var aesKey         = (ulong)0x52330F1BB4060813;
            var iv             = (uint)0;
            var cryptoInstance = new MapleCipher(version, aesKey);

            cryptoInstance.SetIv(iv);

            var packet = new PacketWriter();

            packet.WriteByte(1);
            packet.WriteShort(2);
            packet.WriteInt(4);
            packet.WriteLong(8);
            var originalPacket  = packet.ToArray();
            var encryptedPacket = cryptoInstance.Encrypt(packet.ToArray().AsSpan(), false);
            var decryptedLength = MapleCipher.GetPacketLength(encryptedPacket);

            Assert.AreEqual(originalPacket.Length, decryptedLength);
        }
示例#2
0
        private void ProcessPacket()
        {
            while (cursor > PACKET_HEADER_SIZE && Connected)
            {
                int packetSize = MapleCipher.GetPacketLength(packetBuffer);
                if (cursor < packetSize + PACKET_HEADER_SIZE || OnPacket == null)
                {
                    return;
                }

                byte[] buffer = new byte[packetSize];
                Buffer.BlockCopy(packetBuffer, PACKET_HEADER_SIZE, buffer, 0, packetSize);
                serverCipher.Transform(buffer);

                cursor -= packetSize + PACKET_HEADER_SIZE;
                if (cursor > 0)
                {
                    Buffer.BlockCopy(packetBuffer, packetSize + PACKET_HEADER_SIZE, packetBuffer, 0, cursor);
                }
                OnPacket(this, buffer);
            }
        }
示例#3
0
        protected override int GetBodyLengthFromHeader(byte[] header, int offset, int length)
        {
            var result = MapleCipher.GetPacketLength(header.CloneRange(offset, length));

            return(result);
        }
示例#4
0
        private void ManipulateBuffer()
        {
            if (m_encrypted)
            {
                const int HeaderSize = 4;

                while (m_cursor > HeaderSize && m_connected) //header room + still connected
                {
                    int packetSize = MapleCipher.GetPacketLength(m_packetBuffer);

                    if (m_cursor < packetSize + HeaderSize) //header + packet room
                    {
                        break;
                    }

                    byte[] buffer = new byte[packetSize];
                    Buffer.BlockCopy(m_packetBuffer, HeaderSize, buffer, 0, packetSize); //copy packet
                    m_serverCipher.Transform(buffer);                                    //decrypt

                    m_cursor -= packetSize + HeaderSize;                                 //fix len

                    if (m_cursor > 0)                                                    //move reamining bytes
                    {
                        Buffer.BlockCopy(m_packetBuffer, packetSize + HeaderSize, m_packetBuffer, 0, m_cursor);
                    }

                    if (OnPacket != null)
                    {
                        OnPacket(this, buffer);
                    }

                    buffer = null; //get rid of buffer
                }
            }
            else if (m_cursor >= 2)
            {
                const int HeaderSize = 2;

                short packetSize = BitConverter.ToInt16(m_packetBuffer, 0);

                if (m_cursor >= packetSize + HeaderSize)
                {
                    byte[] buffer = new byte[packetSize];
                    Buffer.BlockCopy(m_packetBuffer, HeaderSize, buffer, 0, packetSize);

                    PacketReader packet = new PacketReader(buffer);

                    short  major = packet.ReadShort();
                    string minor = packet.ReadMapleString();

                    m_clientCipher = new MapleCipher(major, packet.ReadBytes(4), m_aesCipher, CipherType.Encrypt);
                    m_serverCipher = new MapleCipher(major, packet.ReadBytes(4), m_aesCipher, CipherType.Decrypt);

                    byte locale = packet.ReadByte();

                    m_encrypted = true; //start waiting for encrypted packets

                    if (OnHandshake != null)
                    {
                        var info = new ServerInfo()
                        {
                            Version    = major,
                            Subversion = minor,
                            Locale     = locale
                        };

                        OnHandshake(this, info);
                    }

                    buffer   = null; //get rid of buffer
                    m_cursor = 0;    //reset stream
                }
            }
        }