Exemple #1
0
        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;
        }
Exemple #2
0
        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);
        }