1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188
|
package org.bouncycastle.util;
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;
}
}
|