/// <summary> /// Decrypts the packet data /// </summary> private void Decrypt(byte[] data) { if (!RecvCipher.Handshaken) { RecvCipher.Handshake(ref data); ArrayReader pr = new ArrayReader(data); Console.WriteLine("Server version {0}.{1}", pr.ReadShort(), pr.ReadMapleString()); uint siv = pr.ReadUInt(); uint riv = pr.ReadUInt(); SendCipher.SetIV(siv); RecvCipher.SetIV(riv); if (HandshakeFinished != null) { HandshakeFinished(siv, riv); } } else { RecvCipher.Decrypt(ref data); if (data.Length == 0) { return; } if (PacketFinished != null) { PacketFinished(data); } } Wait(); }
/// <summary> /// Decrypts the packet data /// </summary> public void Decrypt(Span <byte> data) { if (!RecvCipher.Handshaken) { var pr = new BinaryReader(new MemoryStream(MapleCipher.Handshake(data).ToArray(), false), Encoding.ASCII); var version = pr.ReadInt16(); var subVersionLength = pr.ReadInt16(); var subVersion = new string(pr.ReadChars(subVersionLength)); var siv = pr.ReadUInt32(); var riv = pr.ReadUInt32(); var serverType = pr.ReadByte(); SendCipher.SetIv(siv); RecvCipher.SetIv(riv); HandshakeFinished?.Invoke(siv, riv, version, subVersion, serverType); } else { if (!RecvCipher.CheckHeader(data, !ToClient)) { throw new InvalidOperationException($"Packet header mismatch Size:{data.Length}"); } var decrypted = RecvCipher.Decrypt(data); if (decrypted.Length == 0) { return; } PacketFinished?.Invoke(decrypted.ToArray()); } }
private void Send(byte[] packetData) { var headerData = SendCipher.GetPacketHeader(packetData.Length); //Console.WriteLine($"发送封包:{BitTool.GetHexStr(packetData)}"); SendCipher.Transform(packetData); var finalData = new byte[packetData.Length + headerData.Length]; Buffer.BlockCopy(headerData, 0, finalData, 0, headerData.Length); Buffer.BlockCopy(packetData, 0, finalData, 4, packetData.Length); SendRaw(finalData); }
public void Encrypt(ref byte[] data, bool toClient = false) { SendCipher.Encrypt(ref data, toClient); }
/// <summary> /// Encrypts packet data /// </summary> #if KMS || EMS public UInt16?Encrypt(ref byte[] data, bool toClient = false) { return(SendCipher.Encrypt(ref data, toClient)); }
/// <summary> /// Sets the Recv and Send Vectors for the ciphers /// </summary> public void SetVectors(uint SIV, uint RIV) { SendCipher.SetIV(SIV); RecvCipher.SetIV(RIV); }
/// <summary> /// Encrypts packet data /// </summary> public Span <byte> Encrypt(ReadOnlySpan <byte> data, bool toClient = false) => SendCipher.Encrypt(data, toClient);
/// <summary> /// Sets the Recv and Send Vectors for the ciphers /// </summary> public void SetVectors(uint siv, uint riv) { SendCipher.SetIv(siv); RecvCipher.SetIv(riv); }