package org.zarroboogs.smartzpn.utils;
import org.zarroboogs.smartzpn.tcpip.IPHeader;
import org.zarroboogs.smartzpn.tcpip.TCPHeader;
import org.zarroboogs.smartzpn.tcpip.UDPHeader;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class ProxyUtils {
public static InetAddress ipIntToInet4Address(int ip) {
byte[] ipAddress = new byte[4];
writeInt(ipAddress, 0, ip);
try {
return Inet4Address.getByAddress(ipAddress);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
public static String ipIntToString(int ip) {
return String.format("%s.%s.%s.%s", (ip >> 24) & 0x00FF,
(ip >> 16) & 0x00FF, (ip >> 8) & 0x00FF, ip & 0x00FF);
}
public static String ipBytesToString(byte[] ip) {
return String.format("%s.%s.%s.%s", ip[0] & 0x00FF, ip[1] & 0x00FF, ip[2] & 0x00FF, ip[3] & 0x00FF);
}
public static int ipStringToInt(String ip) {
String[] arrStrings = ip.split("\\.");
int r = (Integer.parseInt(arrStrings[0]) << 24)
| (Integer.parseInt(arrStrings[1]) << 16)
| (Integer.parseInt(arrStrings[2]) << 8)
| Integer.parseInt(arrStrings[3]);
return r;
}
public static int readInt(byte[] data, int offset) {
int r = ((data[offset] & 0xFF) << 24)
| ((data[offset + 1] & 0xFF) << 16)
| ((data[offset + 2] & 0xFF) << 8) | (data[offset + 3] & 0xFF);
return r;
}
public static short readShort(byte[] data, int offset) {
int r = ((data[offset] & 0xFF) << 8) | (data[offset + 1] & 0xFF);
return (short) r;
}
public static void writeInt(byte[] data, int offset, int value) {
data[offset] = (byte) (value >> 24);
data[offset + 1] = (byte) (value >> 16);
data[offset + 2] = (byte) (value >> 8);
data[offset + 3] = (byte) (value);
}
public static void writeShort(byte[] data, int offset, short value) {
data[offset] = (byte) (value >> 8);
data[offset + 1] = (byte) (value);
}
// 网络字节顺序与主机字节顺序的转换
public static short htons(short u) {
int r = ((u & 0xFFFF) << 8) | ((u & 0xFFFF) >> 8);
return (short) r;
}
public static short ntohs(short u) {
int r = ((u & 0xFFFF) << 8) | ((u & 0xFFFF) >> 8);
return (short) r;
}
public static int hton(int u) {
int r = (u >> 24) & 0x000000FF;
r |= (u >> 8) & 0x0000FF00;
r |= (u << 8) & 0x00FF0000;
r |= (u << 24) & 0xFF000000;
return r;
}
public static int ntoh(int u) {
int r = (u >> 24) & 0x000000FF;
r |= (u >> 8) & 0x0000FF00;
r |= (u << 8) & 0x00FF0000;
r |= (u << 24) & 0xFF000000;
return r;
}
// 计算校验和
public static short checksum(long sum, byte[] buf, int offset, int len) {
sum += getsum(buf, offset, len);
while ((sum >> 16) > 0)
sum = (sum & 0xFFFF) + (sum >> 16);
return (short) ~sum;
}
public static long getsum(byte[] buf, int offset, int len) {
long sum = 0; /* assume 32 bit long, 16 bit short */
while (len > 1) {
sum += readShort(buf, offset) & 0xFFFF;
offset += 2;
len -= 2;
}
if (len > 0) /* take care of left over byte */ {
sum += (buf[offset] & 0xFF) << 8;
}
return sum;
}
// 计算IP包的校验和
public static boolean ComputeIPChecksum(IPHeader ipHeader) {
short oldCrc = ipHeader.getCrc();
ipHeader.setCrc((short) 0);// 计算前置零
short newCrc = ProxyUtils.checksum(0, ipHeader.mData,
ipHeader.mOffset, ipHeader.getHeaderLength());
ipHeader.setCrc(newCrc);
return oldCrc == newCrc;
}
// 计算TCP或UDP的校验和
public static boolean ComputeTCPChecksum(IPHeader ipHeader, TCPHeader tcpHeader) {
ComputeIPChecksum(ipHeader);//计算IP校验和
int ipData_len = ipHeader.getTotalLength() - ipHeader.getHeaderLength();// IP数据长度
if (ipData_len < 0)
return false;
// 计算为伪首部和
long sum = getsum(ipHeader.mData, ipHeader.mOffset
+ IPHeader.offset_src_ip, 8);
sum += ipHeader.getProtocol() & 0xFF;
sum += ipData_len;
short oldCrc = tcpHeader.getCrc();
tcpHeader.setCrc((short) 0);// 计算前置0
short newCrc = checksum(sum, tcpHeader.m_Data, tcpHeader.m_Offset, ipData_len);// 计算校验和
tcpHeader.setCrc(newCrc);
return oldCrc == newCrc;
}
// 计算TCP或UDP的校验和
public static boolean ComputeUDPChecksum(IPHeader ipHeader, UDPHeader udpHeader) {
ComputeIPChecksum(ipHeader);//计算IP校验和
int ipData_len = ipHeader.getTotalLength() - ipHeader.getHeaderLength();// IP数据长度
if (ipData_len < 0)
return false;
// 计算为伪首部和
long sum = getsum(ipHeader.mData, ipHeader.mOffset
+ IPHeader.offset_src_ip, 8);
sum += ipHeader.getProtocol() & 0xFF;
sum += ipData_len;
short oldCrc = udpHeader.getCrc();
udpHeader.setCrc((short) 0);// 计算前置0
short newCrc = checksum(sum, udpHeader.m_Data, udpHeader.m_Offset, ipData_len);// 计算校验和
udpHeader.setCrc(newCrc);
return oldCrc == newCrc;
}
private final static int FAKE_NETWORK_MASK = ProxyUtils.ipStringToInt("255.255.0.0");
private final static int FAKE_NETWORK_IP = ProxyUtils.ipStringToInt("10.231.0.0");
public static boolean isFakeIP(int ip) {
return (ip & FAKE_NETWORK_MASK) == FAKE_NETWORK_IP;
}
public static int fakeIP(int hashIP){
return FAKE_NETWORK_IP | (hashIP & 0x0000FFFF);
}
public static String fakeNetWorkIP(){
return ipIntToString(FAKE_NETWORK_IP);
}
}