package org.bouncycastle.util;
import java.math.BigInteger;
public class IPAddress
{
private static final BigInteger ZERO = BigInteger.valueOf(0);
/**
* 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 boolean 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 boolean 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)));
}
catch (NumberFormatException ex)
{
return false;
}
if (octet.compareTo(ZERO) == -1
|| octet.compareTo(BigInteger.valueOf(255)) == 1)
{
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 boolean 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), 16));
}
catch (NumberFormatException ex)
{
return false;
}
if (octet.compareTo(ZERO) == -1
|| octet.compareTo(BigInteger.valueOf(0xFFFF)) == 1)
{
return false;
}
start = pos + 1;
octets++;
}
return octets == 8;
}
}