diff --git a/core/src/main/java/com.riverssen.p2p4j/CryptographicScheme.java b/core/src/main/java/com.riverssen.p2p4j/CryptographicScheme.java new file mode 100644 index 0000000..8e639ec --- /dev/null +++ b/core/src/main/java/com.riverssen.p2p4j/CryptographicScheme.java @@ -0,0 +1,6 @@ +package com.riverssen.p2p4j; + +public abstract class CryptographicScheme { + public abstract byte[] encrypt(Packet packet); + public abstract byte[] decrypt(byte[] bytes); +} diff --git a/core/src/main/java/com.riverssen.p2p4j/DefaultScheme.java b/core/src/main/java/com.riverssen.p2p4j/DefaultScheme.java new file mode 100644 index 0000000..cfc6022 --- /dev/null +++ b/core/src/main/java/com.riverssen.p2p4j/DefaultScheme.java @@ -0,0 +1,13 @@ +package com.riverssen.p2p4j; + +public class DefaultScheme extends CryptographicScheme { + @Override + public byte[] encrypt(Packet packet) { + return packet.getBytes(); + } + + @Override + public byte[] decrypt(byte[] bytes) { + return bytes; + } +} diff --git a/core/src/main/java/com.riverssen.p2p4j/Node.java b/core/src/main/java/com.riverssen.p2p4j/Node.java index 40da419..78685d4 100644 --- a/core/src/main/java/com.riverssen.p2p4j/Node.java +++ b/core/src/main/java/com.riverssen.p2p4j/Node.java @@ -79,14 +79,10 @@ protected boolean sendMessage(Packet packet) if (packet.getSize() > server.getParameters().getMaxBytesSend()) return false; - /** - * Check that the packet has not been sent - * before. - * - * This is implementation specific. - */ - if (nodeID.screen(packet.getHashCode())) - return false; + byte encodedBytes[] = nodeID.getScheme().encrypt(packet); + dataOutputStream.writeInt(encodedBytes.length); + dataOutputStream.write(encodedBytes); + dataOutputStream.flush(); /** * Cache the hash of this packet to insure @@ -95,10 +91,6 @@ protected boolean sendMessage(Packet packet) */ nodeID.cache(packet.getHashCode()); - dataOutputStream.writeInt(packet.getSize()); - packet.write(dataOutputStream); - dataOutputStream.flush(); - return true; } catch (IOException e) { } @@ -107,7 +99,17 @@ protected boolean sendMessage(Packet packet) } public boolean send(Packet packet) { - if (connected.get()) return messages.add(packet); + if (connected.get()) { + /** + * Check that the packet has not been sent + * before. + * + * This is implementation specific. + */ + if (nodeID.screen(packet.getHashCode())) + return false; + return messages.add(packet); + } return false; } diff --git a/core/src/main/java/com.riverssen.p2p4j/NodeID.java b/core/src/main/java/com.riverssen.p2p4j/NodeID.java index 2eb9995..2e40125 100644 --- a/core/src/main/java/com.riverssen.p2p4j/NodeID.java +++ b/core/src/main/java/com.riverssen.p2p4j/NodeID.java @@ -17,6 +17,8 @@ public abstract class NodeID { public abstract boolean screen(byte[] object); public abstract void cache(byte[] object); + public abstract CryptographicScheme getScheme(); + @Override public String toString() { return getAddress() + ":" + getPort(); diff --git a/core/src/main/java/com.riverssen.p2p4j/Packet.java b/core/src/main/java/com.riverssen.p2p4j/Packet.java index 5cd2302..cd64fcf 100644 --- a/core/src/main/java/com.riverssen.p2p4j/Packet.java +++ b/core/src/main/java/com.riverssen.p2p4j/Packet.java @@ -19,4 +19,5 @@ public abstract class Packet { public abstract void write(DataOutputStream dataOutputStream) throws IOException; public abstract byte[] getHashCode(); + public abstract byte[] getBytes(); } diff --git a/core/src/test/java/tests/GenericPacket.java b/core/src/test/java/tests/GenericPacket.java index f710932..23d99f4 100644 --- a/core/src/test/java/tests/GenericPacket.java +++ b/core/src/test/java/tests/GenericPacket.java @@ -47,4 +47,9 @@ public void write(DataOutputStream dataOutputStream) throws IOException { public byte[] getHashCode() { return new byte[1]; } + + @Override + public byte[] getBytes() { + return getBuffer().array(); + } } diff --git a/core/src/test/java/tests/Main.java b/core/src/test/java/tests/Main.java index 1f7af15..71d2182 100644 --- a/core/src/test/java/tests/Main.java +++ b/core/src/test/java/tests/Main.java @@ -11,6 +11,8 @@ import com.riverssen.p2p4j.ServerParameters; import com.riverssen.p2p4j.Descriptor; import com.riverssen.p2p4j.Packet; +import com.riverssen.p2p4j.CryptographicScheme; +import com.riverssen.p2p4j.DefaultScheme; import java.io.DataOutputStream; import java.io.IOException; @@ -92,9 +94,9 @@ public static void createServerB(String name, int port) throws IOException { message.send(theNode); System.out.println(name + " sent " + message.getPacket().getSize()); - ResponsePacket response1 = request1.sendGetReply(theNode, 1500); + ResponsePacket response1 = request1.sendGetReply(theNode, 10000); System.out.println(name + " sent " + request1.getPacket().getSize() + " " + request1.getPacket().getSerialNumber()); - ResponsePacket response2 = request2.sendGetReply(theNode, 1500); + ResponsePacket response2 = request2.sendGetReply(theNode, 10000); System.out.println(name + " sent " + request2.getPacket().getSize() + " " + request2.getPacket().getSerialNumber()); System.out.println(name + ".. response1: " + response1); @@ -203,12 +205,14 @@ public static class NodeIDImpl extends NodeID { private int spam = 0; private InetAddress address; private int port; + private CryptographicScheme scheme; public NodeIDImpl(InetAddress address, int port) { this.address = address; this.port = port; this.setShouldBan(false); + this.scheme = new DefaultScheme(); } @Override @@ -256,6 +260,11 @@ public boolean screen(byte[] object) { @Override public void cache(byte[] object) { } + + @Override + public CryptographicScheme getScheme() { + return scheme; + } } public static enum PacketType { @@ -320,6 +329,11 @@ public void write(DataOutputStream dataOutputStream) throws IOException { public byte[] getHashCode() { return new byte[1]; } + + @Override + public byte[] getBytes() { + return getBuffer().array(); + } } public static class GenericResponsePacket extends Packet { @@ -383,6 +397,11 @@ public void write(DataOutputStream dataOutputStream) throws IOException { public byte[] getHashCode() { return new byte[1]; } + + @Override + public byte[] getBytes() { + return getBuffer().array(); + } } public static class StringMessage extends Message {