public static IEnumerable <Message> ParseIncoming(byte[] data, Blowfish blowfishContext = null) { for (int pos = 0; pos < data.Length;) { if (pos + 6 > data.Length) { throw new Exception("Incomplete Header received!"); } int packetSize = data[pos + 2] + 256 * data[pos + 1] + 256 * 256 * data[pos + 0]; MessageType type = (MessageType)(data[pos + 3] >> 6); MessageCode code = (MessageCode)(data[pos + 4]); byte numA = (byte)(data[pos + 5] >> 4); byte numB = (byte)(data[pos + 5] & 0x0F); if (pos + packetSize > data.Length) { throw new Exception("Incomplete message body received!"); } var argLen = packetSize - 6; byte[] msgData = new byte[argLen]; if (argLen != 0) { Array.Copy(data, pos + 6, msgData, 0, argLen); switch (type) { case MessageType.GSMessage: XorCrypt.Decrypt(msgData); break; case MessageType.GSEncryptMessage: if (blowfishContext == null) { throw new Exception("Received BF encrypted message, but no key available!"); } blowfishContext.DecipherPadded(ref msgData); break; case MessageType.GameMessage: throw new NotImplementedException("GameMessage received, WAT DO?"); } } yield return(new Message(type, code, DNodeList.Parse(msgData), numA, numB)); pos += packetSize; } yield break; }
public byte[] Serialize(Blowfish blowfishContext = null) { var msgData = Data.Serialize(); if (msgData.Length > 0) { switch (Type) { case MessageType.GSMessage: XorCrypt.Encrypt(msgData); break; case MessageType.GSEncryptMessage: if (blowfishContext == null) { throw new Exception("Missing blowfish key!"); } blowfishContext.EncipherPadded(ref msgData); break; case MessageType.GameMessage: throw new NotImplementedException("Sending clGameMessage, WAT DO?"); } } var msgLen = msgData.Length + 6; var message = new byte[msgLen]; message[0] = (byte)(msgLen >> 16); message[1] = (byte)(msgLen >> 8); message[2] = (byte)msgLen; message[3] = (byte)((int)Type << 6); message[4] = (byte)Code; message[5] = (byte)(NumA << 4 | (NumB & 0x0F)); Array.Copy(msgData, 0, message, 6, msgData.Length); return(message); }