public STUNAddress ReadMappedAddress(NetworkPacket packet) { STUNAddress sa = new STUNAddress(); ushort attrLength = packet.ReadUShort(); byte empty = packet.ReadByte(); sa.family = packet.ReadByte(); sa.port = packet.ReadUShort(); switch (sa.family) { case 1: sa.address = new byte[4]; break; case 2: sa.address = new byte[16]; break; } for (int i = 0; i < sa.address.Length; i++) { sa.address[i] = packet.ReadByte(); } return(sa); }
public STUNAddress ReadXorMappedAddress(NetworkPacket packet) { STUNAddress sa = new STUNAddress(); ushort attrLength = packet.ReadUShort(); ushort xorFlag16 = (ushort)(magicCookie >> 16); byte empty = packet.ReadByte(); sa.family = packet.ReadByte(); sa.port = (ushort)(packet.ReadUShort() ^ xorFlag16); switch (sa.family) { case 1: byte[] xorFlagBytes = new byte[4]; Array.Copy(packet.ByteBuffer, 4, xorFlagBytes, 0, 4); Array.Reverse(xorFlagBytes); uint xorFlag32 = BitConverter.ToUInt32(xorFlagBytes, 0); sa.address = new byte[4]; uint address = packet.ReadUInt() ^ xorFlag32; sa.address[0] = (byte)((address & 0xff000000) >> 24); sa.address[1] = (byte)((address & 0x00ff0000) >> 16); sa.address[2] = (byte)((address & 0x0000ff00) >> 8); sa.address[3] = (byte)(address & 0x000000ff); break; case 2: sa.address = new byte[16]; byte[] xorFlags = new byte[16]; Array.Copy(transactionID, 0, xorFlags, xorFlags.Length, transactionID.Length); for (int i = 0; i < sa.address.Length; i++) { sa.address[i] = (byte)(packet.ReadByte() ^ xorFlags[i]); } break; } return(sa); }