init commit
This commit is contained in:
@@ -0,0 +1,189 @@
|
||||
using System;
|
||||
using System.Globalization;
|
||||
|
||||
namespace Org.BouncyCastle.Utilities.Net;
|
||||
|
||||
public class IPAddress
|
||||
{
|
||||
public static bool IsValid(string address)
|
||||
{
|
||||
if (!IsValidIPv4(address))
|
||||
{
|
||||
return IsValidIPv6(address);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public static bool IsValidWithNetMask(string address)
|
||||
{
|
||||
if (!IsValidIPv4WithNetmask(address))
|
||||
{
|
||||
return IsValidIPv6WithNetmask(address);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public static bool IsValidIPv4(string address)
|
||||
{
|
||||
try
|
||||
{
|
||||
return unsafeIsValidIPv4(address);
|
||||
}
|
||||
catch (FormatException)
|
||||
{
|
||||
}
|
||||
catch (OverflowException)
|
||||
{
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private static bool unsafeIsValidIPv4(string address)
|
||||
{
|
||||
if (address.Length == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
int num = 0;
|
||||
string text = address + ".";
|
||||
int num2 = 0;
|
||||
int num3;
|
||||
while (num2 < text.Length && (num3 = text.IndexOf('.', num2)) > num2)
|
||||
{
|
||||
if (num == 4)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
string s = text.Substring(num2, num3 - num2);
|
||||
int num4 = int.Parse(s);
|
||||
if (num4 < 0 || num4 > 255)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
num2 = num3 + 1;
|
||||
num++;
|
||||
}
|
||||
return num == 4;
|
||||
}
|
||||
|
||||
public static bool IsValidIPv4WithNetmask(string address)
|
||||
{
|
||||
int num = address.IndexOf('/');
|
||||
string text = address.Substring(num + 1);
|
||||
if (num > 0 && IsValidIPv4(address.Substring(0, num)))
|
||||
{
|
||||
if (!IsValidIPv4(text))
|
||||
{
|
||||
return IsMaskValue(text, 32);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static bool IsValidIPv6WithNetmask(string address)
|
||||
{
|
||||
int num = address.IndexOf('/');
|
||||
string text = address.Substring(num + 1);
|
||||
if (num > 0)
|
||||
{
|
||||
if (IsValidIPv6(address.Substring(0, num)))
|
||||
{
|
||||
if (!IsValidIPv6(text))
|
||||
{
|
||||
return IsMaskValue(text, 128);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private static bool IsMaskValue(string component, int size)
|
||||
{
|
||||
int num = int.Parse(component);
|
||||
try
|
||||
{
|
||||
return num >= 0 && num <= size;
|
||||
}
|
||||
catch (FormatException)
|
||||
{
|
||||
}
|
||||
catch (OverflowException)
|
||||
{
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static bool IsValidIPv6(string address)
|
||||
{
|
||||
try
|
||||
{
|
||||
return unsafeIsValidIPv6(address);
|
||||
}
|
||||
catch (FormatException)
|
||||
{
|
||||
}
|
||||
catch (OverflowException)
|
||||
{
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private static bool unsafeIsValidIPv6(string address)
|
||||
{
|
||||
if (address.Length == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
int num = 0;
|
||||
string text = address + ":";
|
||||
bool flag = false;
|
||||
int num2 = 0;
|
||||
int num3;
|
||||
while (num2 < text.Length && (num3 = text.IndexOf(':', num2)) >= num2)
|
||||
{
|
||||
if (num == 8)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (num2 != num3)
|
||||
{
|
||||
string text2 = text.Substring(num2, num3 - num2);
|
||||
if (num3 == text.Length - 1 && text2.IndexOf('.') > 0)
|
||||
{
|
||||
if (!IsValidIPv4(text2))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
num++;
|
||||
}
|
||||
else
|
||||
{
|
||||
string s = text.Substring(num2, num3 - num2);
|
||||
int num4 = int.Parse(s, NumberStyles.AllowHexSpecifier);
|
||||
if (num4 < 0 || num4 > 65535)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (num3 != 1 && num3 != text.Length - 1 && flag)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
flag = true;
|
||||
}
|
||||
num2 = num3 + 1;
|
||||
num++;
|
||||
}
|
||||
if (num != 8)
|
||||
{
|
||||
return flag;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user