Exemple #1
0
 public bool TryParse(byte[] buffer)
 {
     try
     {
         int offset = 0;
         MessageType = (MessageType)NetBinaryUtil.ReadShort(buffer, ref offset);
         int messageLength = (ushort)NetBinaryUtil.ReadShort(buffer, ref offset);
         if (MagicCookie != NetBinaryUtil.ReadUInt(buffer, ref offset))
         {
             return(false);
         }
         TransactionId = NetBinaryUtil.ReadBytes(buffer, TransactionIdSize, ref offset);
         Attributes.Clear();
         while (offset < messageLength + 20)
         {
             var attr = GetAttribute(buffer, ref offset);
             if (attr != null)
             {
                 Attributes.Add(attr);
             }
         }
         return(true);
     }
     catch
     {
         return(false);
     }
 }
Exemple #2
0
 protected override void ReadBody(byte[] buf, int offset, int size)
 {
     offset      += 2;
     ErrorClass   = buf[offset++];
     ErrorNumber  = buf[offset++];
     ReasonPhrase = NetBinaryUtil.ReadString(buf, size - 2, ref offset);
 }
Exemple #3
0
        public void Read(byte[] buf, ref int offset)
        {
            Type = (AttributeType)NetBinaryUtil.ReadUShort(buf, ref offset);
            var size = NetBinaryUtil.ReadUShort(buf, ref offset);

            ReadBody(buf, offset, size);
            offset += size + GetPadOffset(size);
        }
Exemple #4
0
 protected override void WriteBody(byte[] buf, ref int offset)
 {
     buf[offset++] = 0;
     buf[offset++] = 0;
     buf[offset++] = ErrorClass;
     buf[offset++] = ErrorNumber;
     NetBinaryUtil.Write(ReasonPhrase, buf, ref offset);
 }
Exemple #5
0
        protected override void WriteBody(byte[] buf, ref int offset)
        {
            buf[offset++] = 0;
            buf[offset++] = (byte)(m_EndPoint.AddressFamily == AddressFamily.InterNetwork ? 1 : 2);
            var port = (ushort)((ushort)m_EndPoint.Port ^ (ushort)(StunMessage.MagicCookie >> 16));

            NetBinaryUtil.Write(port, buf, ref offset);
            for (int i = 0; i < m_AddressBytes.Length; i++)
            {
                s_Buffer[i] = (byte)(m_AddressBytes[i] ^ buf[i + 4]);
            }
            NetBinaryUtil.Write(s_Buffer, m_AddressBytes.Length, buf, ref offset);
        }
Exemple #6
0
        protected override void ReadBody(byte[] buf, int offset, int size)
        {
            offset++;
            var family = buf[offset++];
            var port   = (int)(NetBinaryUtil.ReadUShort(buf, ref offset) ^ (ushort)(StunMessage.MagicCookie >> 16));

            byte[] address = NetBinaryUtil.ReadBytes(buf, family == 1 ? 4 : 16, ref offset);
            for (int i = 0; i < address.Length; i++)
            {
                address[i] = (byte)(address[i] ^ buf[i + 4]);
            }
            EndPoint = new IPEndPoint(new IPAddress(address), port);
        }
Exemple #7
0
        public void Write(ref byte[] buf, ref int offset)
        {
            var totalSize = 4 + GetPaddedLength() + offset;

            if (buf.Length < totalSize)
            {
                System.Array.Resize(ref buf, System.Math.Max(buf.Length * 2, totalSize));
            }

            NetBinaryUtil.Write((ushort)Type, buf, ref offset);
            NetBinaryUtil.Write((ushort)GetLength(), buf, ref offset);
            WriteBody(buf, ref offset);
            offset += GetPadOffset(GetLength());
        }
Exemple #8
0
        protected override void WriteBody(byte[] buf, ref int offset)
        {
            int flag = 0;

            if (ChangeIP)
            {
                flag |= 4;
            }
            if (ChangePort)
            {
                flag |= 2;
            }
            s_Buffer[3] = (byte)flag;
            NetBinaryUtil.Write(s_Buffer, buf, ref offset);
        }
Exemple #9
0
        StunAttribute GetAttribute(byte[] buf, ref int offset)
        {
            int tmp  = offset;
            var type = (AttributeType)NetBinaryUtil.ReadUShort(buf, ref tmp);

            switch (type)
            {
            case AttributeType.MappedAddress:
            case AttributeType.SourceAddress:
            case AttributeType.ChangedAddress:
            case AttributeType.ReflectedFrom:
            case AttributeType.ResponseAddress:
            {
                var attr = new AddressAttribute(type);
                attr.Read(buf, ref offset);
                return(attr);
            }

            case AttributeType.XorMappedAddress:
            {
                var attr = new XorAddressAttribute(type);
                attr.Read(buf, ref offset);
                return(attr);
            }

            case AttributeType.ErrorCode:
            {
                var attr = new ErrorCodeAttribute(type);
                attr.Read(buf, ref offset);
                return(attr);
            }

            case AttributeType.ServerName:
            case AttributeType.Username:
            case AttributeType.Password:
            {
                var attr = new ErrorCodeAttribute(type);
                attr.Read(buf, ref offset);
                return(attr);
            }
            }
            var len = NetBinaryUtil.ReadUShort(buf, ref tmp);

            offset += len + StunAttribute.GetPadOffset(len);
            return(null);
        }
Exemple #10
0
        public int Write(ref byte[] buf)
        {
            int offset = 0;

            NetBinaryUtil.Write((ushort)MessageType, buf, ref offset);
            int attributesLength = 0;

            foreach (var attribute in Attributes)
            {
                attributesLength += StunAttribute.HeaderSize + attribute.GetPaddedLength();
            }
            NetBinaryUtil.Write((ushort)attributesLength, buf, ref offset);
            NetBinaryUtil.Write(MagicCookie, buf, ref offset);
            NetBinaryUtil.Write(TransactionId, TransactionIdSize, buf, ref offset);
            foreach (var attribute in Attributes)
            {
                attribute.Write(ref buf, ref offset);
            }
            return(offset);
        }
Exemple #11
0
 protected override void WriteBody(byte[] buf, ref int offset)
 {
     NetBinaryUtil.Write(Text, buf, ref offset);
 }
Exemple #12
0
 protected override void ReadBody(byte[] buf, int offset, int size)
 {
     NetBinaryUtil.ReadString(buf, size, ref offset);
 }