Esempio n. 1
0
        public static ZonePacket Parse(ref byte[] rawData, Int32 secureKey)
        {
            xorBytes(ref rawData, secureKey);

            var parsedPacket = new ZonePacket();

            if (rawData.Length < 16)
            {
                throw new NotEnoughBytesException();
                // not enough bytes, even for the header
            }

            parsedPacket.Signature  = BitConverter.ToInt32(rawData, 0);
            parsedPacket.Size       = BitConverter.ToInt32(rawData, 4);
            parsedPacket.SequenceID = BitConverter.ToInt32(rawData, 8);
            parsedPacket.CRC        = BitConverter.ToInt32(rawData, 12);

            parsedPacket.Data = new byte[parsedPacket.Size];
            if (parsedPacket.Data.Length > rawData.Length - 16)
            {
                throw new NotEnoughBytesException();
                // not enough bytes to parse message. This can happen. What do to?
            }
            else
            {
                Array.Copy(rawData, 16, parsedPacket.Data, 0, parsedPacket.Data.Length);

                if (rawData.Length - (parsedPacket.Size + 16) > 0)
                {
                    // This means the packets were nagled, and the key was applied to ending bytes unnecessarily
                    xorBytesFixTail(ref parsedPacket.Data, secureKey);
                }
            }
            // remove from rawData the parsed ZonePacket
            Array.Reverse(rawData);
            Array.Resize(ref rawData, rawData.Length - (parsedPacket.Size + 16));
            Array.Reverse(rawData);
            xorBytes(ref rawData, secureKey);

            // Check CRC
            byte[] computingCRC = new byte[] { 0x12, 0x34, 0x43, 0x21 };
            for (int i = 0; i < parsedPacket.Data.Length / 4; i++)
            {
                computingCRC[0] ^= parsedPacket.Data[i * 4];
                computingCRC[1] ^= parsedPacket.Data[i * 4 + 1];
                computingCRC[2] ^= parsedPacket.Data[i * 4 + 2];
                computingCRC[3] ^= parsedPacket.Data[i * 4 + 3];
            }
            Array.Reverse(computingCRC, 0, 4);
            Int32 computedCRC = BitConverter.ToInt32(computingCRC, 0);

            if (computedCRC != parsedPacket.CRC)
            {
                throw new CRCMismatchException(parsedPacket, computedCRC);
            }

            return(parsedPacket);
        }
Esempio n. 2
0
 public static ZonePacket?TryParse(byte[] rawData, Int32 secureKey)
 {
     try
     {
         return(ZonePacket.Parse(ref rawData, secureKey));
     }
     catch
     {
         return(null);
     }
 }
Esempio n. 3
0
 public static Message Parse(ZonePacket Packet)
 {
     return(Message.Parse(Packet.Data));
 }
Esempio n. 4
0
 public CRCMismatchException(ZonePacket ParsedPacket, Int32 ComputedCRC)
 {
     this.ParsedPacket = ParsedPacket;
     this.ComputedCRC  = ComputedCRC;
 }