Esempio n. 1
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();

                    byte[] riv = packet.ReadBytes(4);
                    byte[] siv = packet.ReadBytes(4);

                    m_clientCipher = new MapleCipher(major, riv, m_aesCipher, CipherType.Encrypt);
                    m_serverCipher = new MapleCipher(major, siv, 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,
                            Riv        = riv,
                            Siv        = siv,
                            Locale     = locale
                        };

                        OnHandshake(this, info);
                    }

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