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); }
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); } }
protected override int GetBodyLengthFromHeader(byte[] header, int offset, int length) { var result = MapleCipher.GetPacketLength(header.CloneRange(offset, length)); return(result); }
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 } } }