| /* GENERATED SOURCE. DO NOT MODIFY. */ |
| package com.android.org.bouncycastle.util; |
| |
| /** |
| * Utility methods for processing String objects containing IP addresses. |
| * @hide This class is not part of the Android public SDK API |
| */ |
| 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; |
| } |
| } |
| |
| |