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