From 009d6448b8536efbb5d28884ebbf5a6e41d4f8a1 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Tue, 20 Jul 2021 17:09:14 +0800 Subject: [PATCH] =?UTF-8?q?change=20VPN=20connection:=20=E6=B3=A8=E5=86=8C?= =?UTF-8?q?=E6=A0=87=E8=AF=86=E7=B4=A7=E8=B7=9F=E5=9C=A8=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96Face=E4=B9=8B=E5=90=8E=EF=BC=9B=E5=B0=86=E6=89=80?= =?UTF-8?q?=E6=9C=89=E5=85=B4=E8=B6=A3=E5=8C=85=E5=92=8C=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=8C=85=E6=9B=BF=E6=8D=A2=E4=B8=BACPacket?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../services/MINVpnConnection.java | 129 +++++++++++------- 1 file changed, 77 insertions(+), 52 deletions(-) diff --git a/app/src/main/java/com/pkusz/min_vpn_client/services/MINVpnConnection.java b/app/src/main/java/com/pkusz/min_vpn_client/services/MINVpnConnection.java index 21d3999..ff6cc9e 100644 --- a/app/src/main/java/com/pkusz/min_vpn_client/services/MINVpnConnection.java +++ b/app/src/main/java/com/pkusz/min_vpn_client/services/MINVpnConnection.java @@ -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; } }