113 lines
1.9 KiB
C#
113 lines
1.9 KiB
C#
using System;
|
|
|
|
using Org.BouncyCastle.Math;
|
|
|
|
namespace Org.BouncyCastle.Utilities.Net
|
|
{
|
|
public class IPAddress
|
|
{
|
|
/**
|
|
* Validate the given IPv4 or IPv6 address.
|
|
*
|
|
* @param address the IP address as a string.
|
|
*
|
|
* @return true if a valid address, false otherwise
|
|
*/
|
|
public static bool IsValid(
|
|
string address)
|
|
{
|
|
return IsValidIPv4(address) || IsValidIPv6(address);
|
|
}
|
|
|
|
/**
|
|
* Validate the given IPv4 address.
|
|
*
|
|
* @param address the IP address as a string.
|
|
*
|
|
* @return true if a valid IPv4 address, false otherwise
|
|
*/
|
|
private static bool IsValidIPv4(
|
|
string address)
|
|
{
|
|
if (address.Length == 0)
|
|
return false;
|
|
|
|
BigInteger octet;
|
|
int octets = 0;
|
|
|
|
string temp = address + ".";
|
|
|
|
int pos;
|
|
int start = 0;
|
|
while (start < temp.Length
|
|
&& (pos = temp.IndexOf('.', start)) > start)
|
|
{
|
|
if (octets == 4)
|
|
return false;
|
|
|
|
try
|
|
{
|
|
octet = new BigInteger(temp.Substring(start, pos - start));
|
|
}
|
|
catch (FormatException)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if (octet.SignValue < 0 || octet.BitLength > 8)
|
|
return false;
|
|
|
|
start = pos + 1;
|
|
++octets;
|
|
}
|
|
|
|
return octets == 4;
|
|
}
|
|
|
|
/**
|
|
* Validate the given IPv6 address.
|
|
*
|
|
* @param address the IP address as a string.
|
|
*
|
|
* @return true if a valid IPv4 address, false otherwise
|
|
*/
|
|
private static bool IsValidIPv6(
|
|
string address)
|
|
{
|
|
if (address.Length == 0)
|
|
return false;
|
|
|
|
BigInteger octet;
|
|
int octets = 0;
|
|
|
|
string temp = address + ":";
|
|
|
|
int pos;
|
|
int start = 0;
|
|
while (start < temp.Length
|
|
&& (pos = temp.IndexOf(':', start)) > start)
|
|
{
|
|
if (octets == 8)
|
|
return false;
|
|
|
|
try
|
|
{
|
|
octet = new BigInteger(temp.Substring(start, pos - start), 16);
|
|
}
|
|
catch (FormatException)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if (octet.SignValue < 0 || octet.BitLength > 16)
|
|
return false;
|
|
|
|
start = pos + 1;
|
|
octets++;
|
|
}
|
|
|
|
return octets == 8;
|
|
}
|
|
}
|
|
}
|