org.bouncycastle.util.IPAddress Maven / Gradle / Ivy
package org.bouncycastle.util;
/**
* Utility methods for processing String objects containing IP addresses.
*/
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 boolean isValid(
String address)
{
return isValidIPv4(address) || isValidIPv6(address);
}
/**
* Validate the given IPv4 or IPv6 address and netmask.
*
* @param address the IP address as a String.
*
* @return true if a valid address with netmask, false otherwise
*/
public static boolean isValidWithNetMask(
String address)
{
return isValidIPv4WithNetmask(address) || isValidIPv6WithNetmask(address);
}
/**
* Validate the given IPv4 address.
*
* @param address the IP address as a String.
*
* @return true if a valid IPv4 address, false otherwise
*/
public static boolean isValidIPv4(
String address)
{
if (address.length() == 0)
{
return false;
}
int 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 = Integer.parseInt(temp.substring(start, pos));
}
catch (NumberFormatException ex)
{
return false;
}
if (octet < 0 || octet > 255)
{
return false;
}
start = pos + 1;
octets++;
}
return octets == 4;
}
public static boolean isValidIPv4WithNetmask(
String address)
{
int index = address.indexOf("/");
String mask = address.substring(index + 1);
return (index > 0) && isValidIPv4(address.substring(0, index))
&& (isValidIPv4(mask) || isMaskValue(mask, 32));
}
public static boolean isValidIPv6WithNetmask(
String address)
{
int index = address.indexOf("/");
String mask = address.substring(index + 1);
return (index > 0) && (isValidIPv6(address.substring(0, index))
&& (isValidIPv6(mask) || isMaskValue(mask, 128)));
}
private static boolean isMaskValue(String component, int size)
{
try
{
int value = Integer.parseInt(component);
return value >= 0 && value <= size;
}
catch (NumberFormatException e)
{
return false;
}
}
/**
* Validate the given IPv6 address.
*
* @param address the IP address as a String.
*
* @return true if a valid IPv4 address, false otherwise
*/
public static boolean isValidIPv6(
String address)
{
if (address.length() == 0)
{
return false;
}
int octet;
int octets = 0;
String temp = address + ":";
boolean doubleColonFound = false;
int pos;
int start = 0;
while (start < temp.length()
&& (pos = temp.indexOf(':', start)) >= start)
{
if (octets == 8)
{
return false;
}
if (start != pos)
{
String value = temp.substring(start, pos);
if (pos == (temp.length() - 1) && value.indexOf('.') > 0)
{
if (!isValidIPv4(value))
{
return false;
}
octets++; // add an extra one as address covers 2 words.
}
else
{
try
{
octet = Integer.parseInt(temp.substring(start, pos), 16);
}
catch (NumberFormatException ex)
{
return false;
}
if (octet < 0 || octet > 0xffff)
{
return false;
}
}
}
else
{
if (pos != 1 && pos != temp.length() - 1 && doubleColonFound)
{
return false;
}
doubleColonFound = true;
}
start = pos + 1;
octets++;
}
return octets == 8 || doubleColonFound;
}
}