/// <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)); }
/// <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()); }
/// <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()); }