Exemplo n.º 1
0
        private static XPacket DecryptPacket(XPacket packet)
        {
            if (!packet.HasField(0))
            {
                return(null); // Зашифрованные данные должны быть в 0 поле
            }

            var rawData   = packet.GetValueRaw(0); // получаем зашифрованный пакет
            var decrypted = XProtocolEncryption.Decrypt(rawData);

            return(Parse(decrypted, true));
        }
Exemplo n.º 2
0
        public static XPacketType GetTypeFromPacket(XPacket packet)
        {
            var type    = packet.PacketType;
            var subtype = packet.PacketSubtype;

            foreach (var tuple in TypeDictionary)
            {
                var value = tuple.Value;

                if (value.Item1 == type && value.Item2 == subtype)
                {
                    return(tuple.Key);
                }
            }

            return(XPacketType.Unknown);
        }
Exemplo n.º 3
0
        public static XPacket EncryptPacket(XPacket packet)
        {
            if (packet == null)
            {
                return(null); // Нам попросту нечего шифровать
            }

            var rawBytes  = packet.ToPacket();                     // получаем пакет в байтах
            var encrypted = XProtocolEncryption.Encrypt(rawBytes); // шифруем его

            var p = Create(0, 0);                                  // создаем пакет

            p.SetValueRaw(0, encrypted);                           // записываем данные
            p.ChangeHeaders = true;                                // помечаем, что нам нужен другой заголовок

            return(p);
        }
Exemplo n.º 4
0
        public static XPacket Parse(byte[] packet, bool markAsEncrypted = false)
        {
            /*
             * Минимальный размер пакета - 7 байт
             * HEADER (3) + TYPE (1) + SUBTYPE (1) + PACKET ENDING (2)
             */
            if (packet.Length < 7)
            {
                return(null);
            }

            var encrypted = false;

            // Проверяем заголовок
            if (packet[0] != 0xAF ||
                packet[1] != 0xAA ||
                packet[2] != 0xAF)
            {
                if (packet[0] == 0x95 ||
                    packet[1] == 0xAA ||
                    packet[2] == 0xFF)
                {
                    encrypted = true;
                }
                else
                {
                    return(null);
                }
            }

            var mIndex = packet.Length - 1;

            // Проверяем, что бы пакет заканчивался нужными байтами
            if (packet[mIndex - 1] != 0xFF ||
                packet[mIndex] != 0x00)
            {
                return(null);
            }

            var type    = packet[3];
            var subtype = packet[4];

            var xpacket = new XPacket {
                PacketType = type, PacketSubtype = subtype, Protected = markAsEncrypted
            };

            var fields = packet.Skip(5).ToArray();

            while (true)
            {
                if (fields.Length == 2) // Остались последние два байта, завершающие пакет.
                {
                    return(encrypted ? DecryptPacket(xpacket) : xpacket);
                }

                var id   = fields[0];
                var size = fields[1];

                var contents = size != 0 ?
                               fields.Skip(2).Take(size).ToArray() : null;

                xpacket.Fields.Add(new XPacketField
                {
                    FieldID   = id,
                    FieldSize = size,
                    Contents  = contents
                });

                fields = fields.Skip(2 + size).ToArray();
            }
        }