Пример #1
0
        /// <summary>
        /// Assembles the current outgoing packet from the given payload data, crypto session, auth session and partial header.
        /// </summary>
        /// <param name="payloadData">The raw payload data.</param>
        /// <param name="crypto">The crypto session being used.</param>
        /// <param name="auth">The auth session being used.</param>
        /// <param name="partialHeader">The outer packet header, except for the 2 first bytes (packet size).</param>
        /// <returns>The assembled packet, ready to be sent.</returns>
        private static byte[] AssemblePacket(byte[] payloadData, CryptoSession crypto, AuthSession auth, byte[] partialHeader)
        {
            PayloadReader reader = new PayloadReader(payloadData, 6);

            if (reader.ReadBool())
            {
                payloadData = PayloadCompression.Compress(payloadData);
            }

            FixSize(payloadData);

            byte[] iv            = Generate.IV();
            byte[] encryptedData = crypto.EncryptPacket(payloadData, iv);

            HeaderWriter headerWriter = new HeaderWriter();

            headerWriter.WriteData((short)(16 + encryptedData.Length + 10));
            headerWriter.WriteData(partialHeader);
            headerWriter.WriteData(iv);

            byte[] partialBuffer = Sequence.Concat(headerWriter.GetHeader(), encryptedData);
            byte[] hmac          = auth.GetHmac(partialBuffer);

            return(Sequence.Concat(partialBuffer, hmac));
        }
Пример #2
0
        /// <summary>
        /// Initializes a new instance of OutPacket from the given payload data, crypto session, prefix and count.
        /// </summary>
        /// <param name="payloadData">The raw payload data.</param>
        /// <param name="crypto">The crypto session to be used.</param>
        /// <param name="auth">The auth session to be used.</param>
        /// <param name="prefix">The packet prefix.</param>
        /// <param name="count">The current count of sent packets.</param>
        public OutPacket(byte[] payloadData, CryptoSession crypto, AuthSession auth, short prefix, int count)
        {
            HeaderWriter headerWriter = new HeaderWriter();

            headerWriter.WriteData(prefix);
            headerWriter.WriteData(count);

            Data = AssemblePacket(payloadData, crypto, auth, headerWriter.GetHeader());
        }
Пример #3
0
        /// <summary>
        /// Initializes a new instance of OutPacket for the keys definition packet (ID 0x0001) from the given
        /// payload data, crypto session, auth session and count.
        /// </summary>
        /// <param name="payloadData">The raw payload data.</param>
        /// <param name="crypto">The crypto session to be used.</param>
        /// <param name="auth">The auth session to be used.</param>
        /// <param name="firstCount">The first packet count.</param>
        public OutPacket(byte[] payloadData, CryptoSession crypto, AuthSession auth, int firstCount)
        {
            HeaderWriter headerWriter = new HeaderWriter();

            headerWriter.WriteData((short)(0));
            headerWriter.WriteData(firstCount);

            Data = AssemblePacket(payloadData, crypto, auth, headerWriter.GetHeader());
        }