Files
Dec2017-Script-Dump/System/Net/IPv6Address.cs
T
2026-06-04 11:42:34 +02:00

522 lines
12 KiB
C#

using System;
using System.Globalization;
using System.Net.Sockets;
using System.Text;
namespace System.Net
{
// Token: 0x02000243 RID: 579
[Serializable]
internal class IPv6Address
{
// Token: 0x060014A4 RID: 5284 RVA: 0x00041CC8 File Offset: 0x0003FEC8
public IPv6Address(ushort[] addr)
{
if (addr == null)
{
throw new ArgumentNullException("addr");
}
if (addr.Length != 8)
{
throw new ArgumentException("addr");
}
this.address = addr;
}
// Token: 0x060014A5 RID: 5285 RVA: 0x00041D08 File Offset: 0x0003FF08
public IPv6Address(ushort[] addr, int prefixLength)
: this(addr)
{
if (prefixLength < 0 || prefixLength > 128)
{
throw new ArgumentException("prefixLength");
}
this.prefixLength = prefixLength;
}
// Token: 0x060014A6 RID: 5286 RVA: 0x00041D38 File Offset: 0x0003FF38
public IPv6Address(ushort[] addr, int prefixLength, int scopeId)
: this(addr, prefixLength)
{
this.scopeId = (long)scopeId;
}
// Token: 0x060014A8 RID: 5288 RVA: 0x00041D6C File Offset: 0x0003FF6C
public static IPv6Address Parse(string ipString)
{
if (ipString == null)
{
throw new ArgumentNullException("ipString");
}
IPv6Address pv6Address;
if (IPv6Address.TryParse(ipString, out pv6Address))
{
return pv6Address;
}
throw new FormatException("Not a valid IPv6 address");
}
// Token: 0x060014A9 RID: 5289 RVA: 0x00041DA4 File Offset: 0x0003FFA4
private static int Fill(ushort[] addr, string ipString)
{
int num = 0;
int num2 = 0;
if (ipString.Length == 0)
{
return 0;
}
if (ipString.IndexOf("::") != -1)
{
return -1;
}
for (int i = 0; i < ipString.Length; i++)
{
char c = ipString[i];
if (c == ':')
{
if (i == ipString.Length - 1)
{
return -1;
}
if (num2 == 8)
{
return -1;
}
addr[num2++] = (ushort)num;
num = 0;
}
else
{
int num3;
if ('0' <= c && c <= '9')
{
num3 = (int)(c - '0');
}
else if ('a' <= c && c <= 'f')
{
num3 = (int)(c - 'a' + '\n');
}
else
{
if ('A' > c || c > 'F')
{
return -1;
}
num3 = (int)(c - 'A' + '\n');
}
num = (num << 4) + num3;
if (num > 65535)
{
return -1;
}
}
}
if (num2 == 8)
{
return -1;
}
addr[num2++] = (ushort)num;
return num2;
}
// Token: 0x060014AA RID: 5290 RVA: 0x00041EA8 File Offset: 0x000400A8
private static bool TryParse(string prefix, out int res)
{
return int.TryParse(prefix, NumberStyles.Integer, CultureInfo.InvariantCulture, out res);
}
// Token: 0x060014AB RID: 5291 RVA: 0x00041EB8 File Offset: 0x000400B8
public static bool TryParse(string ipString, out IPv6Address result)
{
result = null;
if (ipString == null)
{
return false;
}
if (ipString.Length > 2 && ipString[0] == '[' && ipString[ipString.Length - 1] == ']')
{
ipString = ipString.Substring(1, ipString.Length - 2);
}
if (ipString.Length < 2)
{
return false;
}
int num = 0;
int num2 = 0;
int num3 = ipString.LastIndexOf('/');
if (num3 != -1)
{
string text = ipString.Substring(num3 + 1);
if (!IPv6Address.TryParse(text, out num))
{
num = -1;
}
if (num < 0 || num > 128)
{
return false;
}
ipString = ipString.Substring(0, num3);
}
else
{
num3 = ipString.LastIndexOf('%');
if (num3 != -1)
{
string text2 = ipString.Substring(num3 + 1);
if (!IPv6Address.TryParse(text2, out num2))
{
num2 = 0;
}
ipString = ipString.Substring(0, num3);
}
}
ushort[] array = new ushort[8];
bool flag = false;
int num4 = ipString.LastIndexOf(':');
if (num4 == -1)
{
return false;
}
int num5 = 0;
if (num4 < ipString.Length - 1)
{
string text3 = ipString.Substring(num4 + 1);
if (text3.IndexOf('.') != -1)
{
IPAddress ipaddress;
if (!IPAddress.TryParse(text3, out ipaddress))
{
return false;
}
long internalIPv4Address = ipaddress.InternalIPv4Address;
array[6] = (ushort)(((int)(internalIPv4Address & 255L) << 8) + (int)((internalIPv4Address >> 8) & 255L));
array[7] = (ushort)(((int)((internalIPv4Address >> 16) & 255L) << 8) + (int)((internalIPv4Address >> 24) & 255L));
if (num4 > 0 && ipString[num4 - 1] == ':')
{
ipString = ipString.Substring(0, num4 + 1);
}
else
{
ipString = ipString.Substring(0, num4);
}
flag = true;
num5 = 2;
}
}
int num6 = ipString.IndexOf("::");
if (num6 != -1)
{
int num7 = IPv6Address.Fill(array, ipString.Substring(num6 + 2));
if (num7 == -1)
{
return false;
}
if (num7 + num5 > 8)
{
return false;
}
int num8 = 8 - num5 - num7;
for (int i = num7; i > 0; i--)
{
array[i + num8 - 1] = array[i - 1];
array[i - 1] = 0;
}
int num9 = IPv6Address.Fill(array, ipString.Substring(0, num6));
if (num9 == -1)
{
return false;
}
if (num9 + num7 + num5 > 7)
{
return false;
}
}
else if (IPv6Address.Fill(array, ipString) != 8 - num5)
{
return false;
}
bool flag2 = false;
for (int j = 0; j < num5; j++)
{
if (array[j] != 0 || (j == 5 && array[j] != 65535))
{
flag2 = true;
}
}
if (flag && !flag2)
{
for (int k = 0; k < 5; k++)
{
if (array[k] != 0)
{
return false;
}
}
if (array[5] != 0 && array[5] != 65535)
{
return false;
}
}
result = new IPv6Address(array, num, num2);
return true;
}
// Token: 0x170006C3 RID: 1731
// (get) Token: 0x060014AC RID: 5292 RVA: 0x000421D4 File Offset: 0x000403D4
public ushort[] Address
{
get
{
return this.address;
}
}
// Token: 0x170006C4 RID: 1732
// (get) Token: 0x060014AD RID: 5293 RVA: 0x000421DC File Offset: 0x000403DC
public int PrefixLength
{
get
{
return this.prefixLength;
}
}
// Token: 0x170006C5 RID: 1733
// (get) Token: 0x060014AE RID: 5294 RVA: 0x000421E4 File Offset: 0x000403E4
// (set) Token: 0x060014AF RID: 5295 RVA: 0x000421EC File Offset: 0x000403EC
public long ScopeId
{
get
{
return this.scopeId;
}
set
{
this.scopeId = value;
}
}
// Token: 0x170006C6 RID: 1734
public ushort this[int index]
{
get
{
return this.address[index];
}
}
// Token: 0x170006C7 RID: 1735
// (get) Token: 0x060014B1 RID: 5297 RVA: 0x00042204 File Offset: 0x00040404
public global::System.Net.Sockets.AddressFamily AddressFamily
{
get
{
return global::System.Net.Sockets.AddressFamily.InterNetworkV6;
}
}
// Token: 0x060014B2 RID: 5298 RVA: 0x00042208 File Offset: 0x00040408
public static bool IsLoopback(IPv6Address addr)
{
if (addr.address[7] != 1)
{
return false;
}
int num = addr.address[6] >> 8;
if (num != 127 && num != 0)
{
return false;
}
for (int i = 0; i < 4; i++)
{
if (addr.address[i] != 0)
{
return false;
}
}
return addr.address[5] == 0 || addr.address[5] == ushort.MaxValue;
}
// Token: 0x060014B3 RID: 5299 RVA: 0x00042284 File Offset: 0x00040484
private static ushort SwapUShort(ushort number)
{
return (ushort)(((number >> 8) & 255) + (((int)number << 8) & 65280));
}
// Token: 0x060014B4 RID: 5300 RVA: 0x0004229C File Offset: 0x0004049C
private int AsIPv4Int()
{
return ((int)IPv6Address.SwapUShort(this.address[7]) << 16) + (int)IPv6Address.SwapUShort(this.address[6]);
}
// Token: 0x060014B5 RID: 5301 RVA: 0x000422BC File Offset: 0x000404BC
public bool IsIPv4Compatible()
{
for (int i = 0; i < 6; i++)
{
if (this.address[i] != 0)
{
return false;
}
}
return this.AsIPv4Int() > 1;
}
// Token: 0x060014B6 RID: 5302 RVA: 0x000422F4 File Offset: 0x000404F4
public bool IsIPv4Mapped()
{
for (int i = 0; i < 5; i++)
{
if (this.address[i] != 0)
{
return false;
}
}
return this.address[5] == ushort.MaxValue;
}
// Token: 0x060014B7 RID: 5303 RVA: 0x00042334 File Offset: 0x00040534
public override string ToString()
{
StringBuilder stringBuilder = new StringBuilder();
if (this.IsIPv4Compatible() || this.IsIPv4Mapped())
{
stringBuilder.Append("::");
if (this.IsIPv4Mapped())
{
stringBuilder.Append("ffff:");
}
stringBuilder.Append(new IPAddress((long)this.AsIPv4Int()).ToString());
return stringBuilder.ToString();
}
int num = -1;
int num2 = 0;
int num3 = 0;
for (int i = 0; i < 8; i++)
{
if (this.address[i] != 0)
{
if (num3 > num2 && num3 > 1)
{
num2 = num3;
num = i - num3;
}
num3 = 0;
}
else
{
num3++;
}
}
if (num3 > num2 && num3 > 1)
{
num2 = num3;
num = 8 - num3;
}
if (num == 0)
{
stringBuilder.Append(":");
}
for (int j = 0; j < 8; j++)
{
if (j == num)
{
stringBuilder.Append(":");
j += num2 - 1;
}
else
{
stringBuilder.AppendFormat("{0:x}", this.address[j]);
if (j < 7)
{
stringBuilder.Append(':');
}
}
}
if (this.scopeId != 0L)
{
stringBuilder.Append('%').Append(this.scopeId);
}
return stringBuilder.ToString();
}
// Token: 0x060014B8 RID: 5304 RVA: 0x00042498 File Offset: 0x00040698
public string ToString(bool fullLength)
{
if (!fullLength)
{
return this.ToString();
}
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < this.address.Length - 1; i++)
{
stringBuilder.AppendFormat("{0:X4}:", this.address[i]);
}
stringBuilder.AppendFormat("{0:X4}", this.address[this.address.Length - 1]);
return stringBuilder.ToString();
}
// Token: 0x060014B9 RID: 5305 RVA: 0x00042514 File Offset: 0x00040714
public override bool Equals(object other)
{
IPv6Address pv6Address = other as IPv6Address;
if (pv6Address != null)
{
for (int i = 0; i < 8; i++)
{
if (this.address[i] != pv6Address.address[i])
{
return false;
}
}
return true;
}
IPAddress ipaddress = other as IPAddress;
if (ipaddress == null)
{
return false;
}
for (int j = 0; j < 5; j++)
{
if (this.address[j] != 0)
{
return false;
}
}
if (this.address[5] != 0 && this.address[5] != 65535)
{
return false;
}
long internalIPv4Address = ipaddress.InternalIPv4Address;
return this.address[6] == (ushort)(((int)(internalIPv4Address & 255L) << 8) + (int)((internalIPv4Address >> 8) & 255L)) && this.address[7] == (ushort)(((int)((internalIPv4Address >> 16) & 255L) << 8) + (int)((internalIPv4Address >> 24) & 255L));
}
// Token: 0x060014BA RID: 5306 RVA: 0x00042608 File Offset: 0x00040808
public override int GetHashCode()
{
return IPv6Address.Hash(((int)this.address[0] << 16) + (int)this.address[1], ((int)this.address[2] << 16) + (int)this.address[3], ((int)this.address[4] << 16) + (int)this.address[5], ((int)this.address[6] << 16) + (int)this.address[7]);
}
// Token: 0x060014BB RID: 5307 RVA: 0x0004266C File Offset: 0x0004086C
private static int Hash(int i, int j, int k, int l)
{
return i ^ ((j << 13) | (j >> 19)) ^ ((k << 26) | (k >> 6)) ^ ((l << 7) | (l >> 25));
}
// Token: 0x0400117C RID: 4476
private ushort[] address;
// Token: 0x0400117D RID: 4477
private int prefixLength;
// Token: 0x0400117E RID: 4478
private long scopeId;
// Token: 0x0400117F RID: 4479
public static readonly IPv6Address Loopback = IPv6Address.Parse("::1");
// Token: 0x04001180 RID: 4480
public static readonly IPv6Address Unspecified = IPv6Address.Parse("::");
}
}