mirror of
https://gitee.com/willfree/min-vpn-client_v2.git
synced 2026-06-03 15:36:14 +08:00
change VPN connection: 注册标识紧跟在初始化Face之后;将所有兴趣包和数据包替换为CPacket
This commit is contained in:
@@ -39,8 +39,10 @@ import component.IdentifierComponent;
|
||||
import logicface.LogicFace;
|
||||
import logicface.LogicFaceException;
|
||||
import mgmt.RegisterPrefixHelper;
|
||||
import packet.CPacket;
|
||||
import packet.Data;
|
||||
import packet.Interest;
|
||||
import packet.PacketException;
|
||||
|
||||
import static java.nio.charset.StandardCharsets.US_ASCII;
|
||||
|
||||
@@ -228,13 +230,13 @@ public class MINVpnConnection implements Runnable{
|
||||
// -------------- 线程2:从服务器接收网络包,并往网卡写 -----------------
|
||||
Thread recvFromServerAndReadThread = new Thread(() -> {
|
||||
try {
|
||||
// 1. 注册标识到服务器
|
||||
RegisterPrefixHelper helper=new RegisterPrefixHelper();
|
||||
face.registerIdentifier(new Identifier(this.localPrefix),5000,helper);
|
||||
// 1. 注册标识到服务器 => 新版是在初始化face时进行注册!!
|
||||
// RegisterPrefixHelper helper=new RegisterPrefixHelper();
|
||||
// face.registerIdentifier(new Identifier(this.localPrefix),5000,helper);
|
||||
|
||||
// 2. 接收服务器返回的数据包,放入buf2
|
||||
Interest interest= face.receiveInterest(5000);
|
||||
System.out.println("recv interest packet, name : " + interest.getName().toString());
|
||||
CPacket interest= face.receiveCPacket(5000);
|
||||
System.out.println("recv interest packet, name : " + interest.getSrcIdentifier().toString());
|
||||
System.out.println("兴趣包中装的数据长度 : " + interest.payload.getValue().length);
|
||||
int dataLen = interest.payload.getValue().length;
|
||||
ByteBuffer buf2 = ByteBuffer.allocate(dataLen);
|
||||
@@ -259,7 +261,7 @@ public class MINVpnConnection implements Runnable{
|
||||
System.out.println("transfer data error: outputStream.write error");
|
||||
}
|
||||
}
|
||||
} catch (SecurityException | ComponentException | LogicFaceException e) {
|
||||
} catch (SecurityException | LogicFaceException e) {
|
||||
e.printStackTrace();
|
||||
System.out.println("transfer data error: recvFromServerAndReadThread.start error");
|
||||
}
|
||||
@@ -275,44 +277,49 @@ public class MINVpnConnection implements Runnable{
|
||||
* @param buf
|
||||
*/
|
||||
private void sendInterestPkt(LogicFace face, ByteBuffer buf) {
|
||||
// 1. 构造兴趣包
|
||||
// 构造兴趣包名称:/{service prefix}/{username}/{interest seq}/{defraudString}/{safetyInfo}
|
||||
Identifier interestName;
|
||||
// 1. 构造CPacket
|
||||
// 构造目的标识:/{service prefix}/{cPacket seq}/{defraudString}
|
||||
Identifier serverIdentifier;
|
||||
try {
|
||||
interestName = new Identifier(MINVpnSettingAPI.INSTANCE.getServicePrefix());
|
||||
serverIdentifier = new Identifier(MINVpnSettingAPI.INSTANCE.getServicePrefix());
|
||||
} catch (ComponentException e) {
|
||||
e.printStackTrace();
|
||||
System.out.println("vpn connection sendInterestPkt error: "+e.getMessage());
|
||||
LoggerHelper.warning("sendInterestPkt error 1: serverIdentifier init error: "+e.getMessage());
|
||||
return;
|
||||
}
|
||||
interestName.append(new IdentifierComponent(MINVpnSettingAPI.INSTANCE.getUsername()));
|
||||
interestName.appendFragmentNumber(interestSeq++);
|
||||
interestName.append(new IdentifierComponent(MINVpnSettingAPI.defraudString));
|
||||
String safetyInfo = SafetyInfoUtil.getSafetyInfoStringWithBaidu(mService.getApplicationContext());
|
||||
interestName.append(new IdentifierComponent(safetyInfo));
|
||||
// 构造兴趣包:名称 生存时间 是否要求最新 TTL 负载(中转数据)
|
||||
Interest interest = new Interest();
|
||||
interest.setName(interestName);
|
||||
interest.interestLifeTime.setInterestLifeTime(6000);
|
||||
interest.mustBeRefresh.setMustBeRefresh(true);
|
||||
interest.ttl.setTtl(10);
|
||||
interest.payload.setValue(buf.array());
|
||||
serverIdentifier.appendFragmentNumber(interestSeq++);
|
||||
serverIdentifier.append(new IdentifierComponent(MINVpnSettingAPI.defraudString));
|
||||
// 构造本地标识:/{local_prefix}
|
||||
Identifier clientIdentifier;
|
||||
try {
|
||||
clientIdentifier = new Identifier(MINVpnSettingAPI.INSTANCE.getLocalPrefix());
|
||||
} catch (ComponentException e) {
|
||||
e.printStackTrace();
|
||||
LoggerHelper.warning("sendInterestPkt error 1: clientIdentifier init error: "+e.getMessage());
|
||||
return;
|
||||
}
|
||||
// 构造CPacket
|
||||
CPacket cPacket = new CPacket();
|
||||
cPacket.setSrcIdentifier(clientIdentifier);
|
||||
cPacket.setDstIdentifier(serverIdentifier);
|
||||
cPacket.ttl.setTtl(64);
|
||||
cPacket.payload.setValue(buf.array());
|
||||
|
||||
System.out.println("raw interest param size ============= " + interest.payload.getValue().length);
|
||||
System.out.println("raw interest param size ============= " + cPacket.payload.getValue().length);
|
||||
|
||||
// 2. 对兴趣包进行签名
|
||||
try {
|
||||
KeyManager.INSTANCE.getKeyChain().signInterest(interest);
|
||||
KeyManager.INSTANCE.getKeyChain().signCPacket(cPacket);
|
||||
} catch (Exception error) {
|
||||
error.printStackTrace();
|
||||
return;
|
||||
}
|
||||
|
||||
System.out.println("signed interest param size ============= " + interest.payload.getValue().length);
|
||||
System.out.println("signed interest param size ============= " + cPacket.payload.getValue().length);
|
||||
|
||||
// 3. 将兴趣包发送到服务器
|
||||
try {
|
||||
face.sendInterest(interest);
|
||||
face.sendCPacket(cPacket);
|
||||
} catch (LogicFaceException e) {
|
||||
e.printStackTrace();
|
||||
System.out.println("vpn connection sendInterestPkt error: send interest error: "+e.getMessage());
|
||||
@@ -320,7 +327,8 @@ public class MINVpnConnection implements Runnable{
|
||||
}
|
||||
|
||||
try {
|
||||
System.out.println("express interest : " + interest.getName().toUri());
|
||||
System.out.println("express interest : " +cPacket.getSrcIdentifier()
|
||||
+" -> "+cPacket.getDstIdentifier().toUri());
|
||||
} catch (ComponentException e) {
|
||||
e.printStackTrace();
|
||||
System.out.println("express interest parse uri error" );
|
||||
@@ -334,40 +342,47 @@ public class MINVpnConnection implements Runnable{
|
||||
@RequiresApi(api = Build.VERSION_CODES.Q)
|
||||
private boolean handShake(LogicFace face){
|
||||
// 1. 构造兴趣包
|
||||
// 构造兴趣包负载字段:本地前缀 & 加密密钥
|
||||
// 构造兴趣包负载字段:加密密钥 & 本地前缀
|
||||
ByteBuffer requestBuf = ByteBuffer.allocate(1024);
|
||||
requestBuf.put((byte) 1).put(mEncryptedAESSeed).put(this.localPrefix.getBytes()).flip();
|
||||
// 构造兴趣包名称:/{service prefix}/{interest seq}/{defraudString}
|
||||
Identifier interestName;
|
||||
// 构造目的标识:/{service prefix}/{cPacket seq}/{defraudString}
|
||||
Identifier serverIdentifier;
|
||||
try {
|
||||
System.out.println();
|
||||
interestName = new Identifier(MINVpnSettingAPI.INSTANCE.getServicePrefix());
|
||||
serverIdentifier = new Identifier(MINVpnSettingAPI.INSTANCE.getServicePrefix());
|
||||
} catch (ComponentException e) {
|
||||
e.printStackTrace();
|
||||
LoggerHelper.warning("handshake error 1: name init error: "+e.getMessage());
|
||||
LoggerHelper.warning("handshake error 1: serverIdentifier init error: "+e.getMessage());
|
||||
return false;
|
||||
}
|
||||
interestName.appendFragmentNumber(interestSeq++);
|
||||
interestName.append(new IdentifierComponent(MINVpnSettingAPI.defraudString));
|
||||
// 构造兴趣包:名称 生存时间 是否要求最新 TTL 请求内容
|
||||
Interest interest = new Interest();
|
||||
interest.setName(interestName);
|
||||
interest.interestLifeTime.setInterestLifeTime(5000);
|
||||
interest.mustBeRefresh.setMustBeRefresh(true);
|
||||
interest.ttl.setTtl(10);
|
||||
interest.payload.setValue(requestBuf.array());
|
||||
serverIdentifier.appendFragmentNumber(interestSeq++);
|
||||
serverIdentifier.append(new IdentifierComponent(MINVpnSettingAPI.defraudString));
|
||||
// 构造本地标识:/{local_prefix}
|
||||
Identifier clientIdentifier;
|
||||
try {
|
||||
clientIdentifier = new Identifier(MINVpnSettingAPI.INSTANCE.getLocalPrefix());
|
||||
} catch (ComponentException e) {
|
||||
e.printStackTrace();
|
||||
LoggerHelper.warning("handshake error 1: clientIdentifier init error: "+e.getMessage());
|
||||
return false;
|
||||
}
|
||||
// 构造CPacket:名称 生存时间 是否要求最新 TTL 请求内容
|
||||
CPacket cPacket = new CPacket();
|
||||
cPacket.setSrcIdentifier(clientIdentifier);
|
||||
cPacket.setDstIdentifier(serverIdentifier);
|
||||
cPacket.ttl.setTtl(64);
|
||||
cPacket.payload.setValue(requestBuf.array());
|
||||
|
||||
// 输出未签名兴趣包
|
||||
try {
|
||||
System.out.println("express origin Interest: " + interest.toUri());
|
||||
} catch (ComponentException e) {
|
||||
System.out.println("express origin Interest: " + cPacket.toUri());
|
||||
} catch (PacketException e) {
|
||||
e.printStackTrace();
|
||||
System.out.println("express origin Interest: error");
|
||||
}
|
||||
|
||||
// 2. 对兴趣包进行签名
|
||||
try {
|
||||
KeyManager.INSTANCE.getKeyChain().signInterest(interest);
|
||||
KeyManager.INSTANCE.getKeyChain().signCPacket(cPacket);
|
||||
} catch (Exception error) {
|
||||
error.printStackTrace();
|
||||
LoggerHelper.warning("handshake error 2: keychain sign error: "+error.getMessage());
|
||||
@@ -376,23 +391,23 @@ public class MINVpnConnection implements Runnable{
|
||||
|
||||
// 输出签名兴趣包
|
||||
try {
|
||||
System.out.println("express signed Interest: " + interest.toUri());
|
||||
} catch (ComponentException e) {
|
||||
System.out.println("express signed Interest: " + cPacket.toUri());
|
||||
} catch (PacketException e) {
|
||||
e.printStackTrace();
|
||||
System.out.println("express signed Interest: error");
|
||||
}
|
||||
|
||||
// 3. 发送兴趣包到服务器,接收服务器发回来的数据包
|
||||
try {
|
||||
face.sendInterest(interest);
|
||||
Data data=face.receiveData(5000);
|
||||
face.sendCPacket(cPacket);
|
||||
CPacket data=face.receiveCPacket(5000);
|
||||
ByteBuffer respondBuf = ByteBuffer.allocate(1024);
|
||||
respondBuf.put(data.payload.getValue());
|
||||
System.out.println("handshake recv data , data content : " + new String(data.payload.getValue()));
|
||||
this.handshakeResponse = new String(respondBuf.array(), 1, data.payload.getValue().length - 1, US_ASCII).trim();
|
||||
} catch (LogicFaceException e) {
|
||||
e.printStackTrace();
|
||||
LoggerHelper.warning("handshake error 3: send sign interest error: "+e.getMessage());
|
||||
LoggerHelper.warning("handshake error 3: send sign cPacket error: "+e.getMessage());
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -511,13 +526,14 @@ public class MINVpnConnection implements Runnable{
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成一个连接指定服务器地址的TCP LogicFace
|
||||
* 生成一个连接指定服务器地址的TCP LogicFace,并进行标识注册
|
||||
* @param hostIP
|
||||
* @param hostPort
|
||||
* @return
|
||||
*/
|
||||
private LogicFace initTCPLogicFace(String hostIP,Integer hostPort){
|
||||
System.out.println("host ip = " + hostIP + ", host port = " + hostPort);
|
||||
// 1. 初始化TCP Face到MIN边界路由器
|
||||
LogicFace face;
|
||||
try {
|
||||
face = new LogicFace();
|
||||
@@ -526,6 +542,15 @@ public class MINVpnConnection implements Runnable{
|
||||
LoggerHelper.warning("tcp logic face init error: "+e.getMessage());
|
||||
return null;
|
||||
}
|
||||
// 2. 注册标识
|
||||
RegisterPrefixHelper helper=new RegisterPrefixHelper();
|
||||
try {
|
||||
face.registerIdentifier(new Identifier(this.localPrefix),5000,helper);
|
||||
} catch (LogicFaceException | ComponentException e) {
|
||||
e.printStackTrace();
|
||||
LoggerHelper.warning("tcp logic face register identifier error: "+e.getMessage());
|
||||
return null;
|
||||
}
|
||||
return face;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user