2023-06-21 12:46:23 -04:00

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;
}
}
}