// 
// Decompiled by Procyon v0.6.0
// 

package org.bouncycastle.util;

public class IPAddress
{
    public static boolean isValid(final String s) {
        return isValidIPv4(s) || isValidIPv6(s);
    }
    
    public static boolean isValidWithNetMask(final String s) {
        return isValidIPv4WithNetmask(s) || isValidIPv6WithNetmask(s);
    }
    
    public static boolean isValidIPv4(final String s) {
        final int length = s.length();
        if (length < 7 || length > 15) {
            return false;
        }
        int fromIndex = 0;
        for (int i = 0; i < 3; ++i) {
            final int index = s.indexOf(46, fromIndex);
            if (!isParseableIPv4Octet(s, fromIndex, index)) {
                return false;
            }
            fromIndex = index + 1;
        }
        return isParseableIPv4Octet(s, fromIndex, length);
    }
    
    public static boolean isValidIPv4WithNetmask(final String s) {
        final int index = s.indexOf("/");
        if (index < 1) {
            return false;
        }
        final String substring = s.substring(0, index);
        final String substring2 = s.substring(index + 1);
        return isValidIPv4(substring) && (isValidIPv4(substring2) || isParseableIPv4Mask(substring2));
    }
    
    public static boolean isValidIPv6(final String str) {
        if (str.length() == 0) {
            return false;
        }
        final char char1 = str.charAt(0);
        if (char1 != ':' && Character.digit(char1, 16) < 0) {
            return false;
        }
        int n = 0;
        final String string = str + ":";
        int n2 = 0;
        int index;
        for (int n3 = 0; n3 < string.length() && (index = string.indexOf(58, n3)) >= n3; n3 = index + 1, ++n) {
            if (n == 8) {
                return false;
            }
            if (n3 != index) {
                final String substring = string.substring(n3, index);
                if (index == string.length() - 1 && substring.indexOf(46) > 0) {
                    if (++n == 8) {
                        return false;
                    }
                    if (!isValidIPv4(substring)) {
                        return false;
                    }
                }
                else if (!isParseableIPv6Segment(string, n3, index)) {
                    return false;
                }
            }
            else {
                if (index != 1 && index != string.length() - 1 && n2 != 0) {
                    return false;
                }
                n2 = 1;
            }
        }
        return n == 8 || n2 != 0;
    }
    
    public static boolean isValidIPv6WithNetmask(final String s) {
        final int index = s.indexOf("/");
        if (index < 1) {
            return false;
        }
        final String substring = s.substring(0, index);
        final String substring2 = s.substring(index + 1);
        return isValidIPv6(substring) && (isValidIPv6(substring2) || isParseableIPv6Mask(substring2));
    }
    
    private static boolean isParseableIPv4Mask(final String s) {
        return isParseable(s, 0, s.length(), 10, 2, false, 0, 32);
    }
    
    private static boolean isParseableIPv4Octet(final String s, final int n, final int n2) {
        return isParseable(s, n, n2, 10, 3, true, 0, 255);
    }
    
    private static boolean isParseableIPv6Mask(final String s) {
        return isParseable(s, 0, s.length(), 10, 3, false, 1, 128);
    }
    
    private static boolean isParseableIPv6Segment(final String s, final int n, final int n2) {
        return isParseable(s, n, n2, 16, 4, true, 0, 65535);
    }
    
    private static boolean isParseable(final String s, int i, final int n, final int n2, final int n3, final boolean b, final int n4, final int n5) {
        final int n6 = n - i;
        if (n6 < 1 | n6 > n3) {
            return false;
        }
        if ((n6 > 1 & !b) && Character.digit(s.charAt(i), n2) <= 0) {
            return false;
        }
        int n7 = 0;
        while (i < n) {
            final int digit = Character.digit(s.charAt(i++), n2);
            if (digit < 0) {
                return false;
            }
            n7 = n7 * n2 + digit;
        }
        return n7 >= n4 & n7 <= n5;
    }
}
