private void ProcessHandshake() { short packetSize = BitConverter.ToInt16(packetBuffer, 0); if (cursor < packetSize + HANDSHAKE_HEADER_SIZE || OnHandshake == null) { return; } byte[] buffer = new byte[packetSize]; Buffer.BlockCopy(packetBuffer, HANDSHAKE_HEADER_SIZE, buffer, 0, packetSize); var packet = new PacketReader(buffer); var info = new ServerInfo { Version = packet.ReadShort(), Subversion = packet.ReadMapleString(), SIV = packet.ReadBytes(4), RIV = packet.ReadBytes(4), Locale = packet.ReadByte() }; clientCipher = new MapleCipher(info.Version, info.SIV, aesCipher); serverCipher = new MapleCipher(info.Version, info.RIV, aesCipher); Encrypted = true; //start waiting for encrypted packets OnHandshake(this, info); cursor = 0; //reset stream }
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 } } }