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 } } }