Exemple #1
0
        /// <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());
            }
        }
Exemple #3
0
        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);
        }
Exemple #4
0
 public void Encrypt(ref byte[] data, bool toClient = false)
 {
     SendCipher.Encrypt(ref data, toClient);
 }
Exemple #5
0
        /// <summary>
        /// Encrypts packet data
        /// </summary>
#if KMS || EMS
        public UInt16?Encrypt(ref byte[] data, bool toClient = false)
        {
            return(SendCipher.Encrypt(ref data, toClient));
        }
Exemple #6
0
 /// <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);
 }