/// <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()); } }
/// <summary> /// Sets the Recv and Send Vectors for the ciphers /// </summary> public void SetVectors(uint siv, uint riv) { SendCipher.SetIv(siv); RecvCipher.SetIv(riv); }