diff --git a/app/src/main/java/eu/faircode/netguard/IPUtil.java b/app/src/main/java/eu/faircode/netguard/IPUtil.java new file mode 100644 index 00000000..29bff112 --- /dev/null +++ b/app/src/main/java/eu/faircode/netguard/IPUtil.java @@ -0,0 +1,101 @@ +package eu.faircode.netguard; + +/* + This file is part of NetGuard. + + NetGuard is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + NetGuard is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with NetGuard. If not, see . + + Copyright 2015-2016 by Marcel Bokhorst (M66B) +*/ + +import android.util.Log; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.ArrayList; +import java.util.List; + +public class IPUtil { + private static final String TAG = "NetGuard.IPUtil"; + + public static List toCIDR(String start, String end) throws UnknownHostException { + return toCIDR(InetAddress.getByName(start), InetAddress.getByName(end)); + } + + public static List toCIDR(InetAddress start, InetAddress end) throws UnknownHostException { + List listResult = new ArrayList<>(); + + Log.i(TAG, "toCIDR(" + start.getHostAddress() + "," + end.getHostAddress() + ")"); + + long from = inet2long(start); + long to = inet2long(end); + while (to >= from) { + byte prefix = 32; + while (prefix > 0) { + long mask = (0xFFFFFFFF00000000L >> (prefix - 1)) % 0x0100000000L; + if ((from & mask) != from) + break; + prefix--; + } + + byte max = (byte) (32 - Math.floor(Math.log(to - from + 1) / Math.log(2))); + if (prefix < max) + prefix = max; + + listResult.add(new CIDR(long2inet(from), prefix)); + + from += Math.pow(2, (32 - prefix)); + } + + for (CIDR cidr : listResult) + Log.i(TAG, cidr.toString()); + + return listResult; + } + + private static long inet2long(InetAddress addr) { + long result = 0; + for (byte b : addr.getAddress()) + result = result << 8 | (b & 0xFF); + return result; + } + + private static InetAddress long2inet(long addr) throws UnknownHostException { + byte[] b = new byte[4]; + for (int i = b.length - 1; i >= 0; i--) { + b[i] = (byte) (addr & 0xFF); + addr = addr >> 8; + } + return InetAddress.getByAddress(b); + } + + public static String minus1(String addr) throws UnknownHostException { + return long2inet(inet2long(InetAddress.getByName(addr)) - 1).getHostAddress(); + } + + public static class CIDR { + public InetAddress address; + public int prefix; + + public CIDR(InetAddress address, int prefix) { + this.address = address; + this.prefix = prefix; + } + + @Override + public String toString() { + return address.getHostAddress() + "/" + prefix; + } + } +}