diff --git a/test/java/foundation/pEp/jniadapter/test/templateAliceBob/Makefile b/test/java/foundation/pEp/jniadapter/test/templateAliceBob/Makefile index dc44461..ceb822f 100644 --- a/test/java/foundation/pEp/jniadapter/test/templateAliceBob/Makefile +++ b/test/java/foundation/pEp/jniadapter/test/templateAliceBob/Makefile @@ -7,7 +7,8 @@ JAVA_CLASSES = \ TestAlice.class \ TestBob.class \ MultiPeerCTX.class \ - pEpMessage.class \ + Utils.class \ + TransportMessage.class \ ../utils/AdapterBaseTestContext.class \ ../utils/AdapterTestUtils.class \ ../utils/TestCallbacks.class diff --git a/test/java/foundation/pEp/jniadapter/test/templateAliceBob/MultiPeerCTX.java b/test/java/foundation/pEp/jniadapter/test/templateAliceBob/MultiPeerCTX.java index 6e96771..0be476e 100644 --- a/test/java/foundation/pEp/jniadapter/test/templateAliceBob/MultiPeerCTX.java +++ b/test/java/foundation/pEp/jniadapter/test/templateAliceBob/MultiPeerCTX.java @@ -87,5 +87,7 @@ class MultiPeerCTX extends FsMQManagerTestContext { path = Paths.get(filenameAliceSec); keyAliceSec = Files.readAllBytes(path); + + qm.clearOwnQueue(); } } diff --git a/test/java/foundation/pEp/jniadapter/test/templateAliceBob/TestAlice.java b/test/java/foundation/pEp/jniadapter/test/templateAliceBob/TestAlice.java index eb7bb86..ac8805f 100644 --- a/test/java/foundation/pEp/jniadapter/test/templateAliceBob/TestAlice.java +++ b/test/java/foundation/pEp/jniadapter/test/templateAliceBob/TestAlice.java @@ -2,26 +2,15 @@ package foundation.pEp.jniadapter.test.templateAliceBob; import static foundation.pEp.pitytest.TestLogger.*; -import foundation.pEp.jniadapter.Blob; -import foundation.pEp.jniadapter.test.templateAliceBob.MultiPeerCTX; - import foundation.pEp.jniadapter.Engine; -import foundation.pEp.jniadapter.Identity; import foundation.pEp.jniadapter.Message; import foundation.pEp.jniadapter.test.utils.transport.fsmqmanager.FsMQMessage; -import foundation.pEp.jniadapter.test.utils.transport.fsmqmanager.test.ctx.FsMQManagerTestContext; import foundation.pEp.pitytest.*; import foundation.pEp.pitytest.utils.TestUtils; import foundation.pEp.jniadapter.test.utils.*; import java.io.*; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.Base64; import java.util.List; -import java.util.Vector; class TestAlice { public static void main(String[] args) throws Exception { @@ -31,84 +20,56 @@ class TestAlice { MultiPeerCTX mpctx = new MultiPeerCTX("Alice"); new TestUnit("Alice tx msg", mpctx, ctx -> { - try { - System.in.read(); - } catch (IOException e) { - e.printStackTrace(); - } - log(AdapterTestUtils.identityToString(ctx.alice, true)); - log("update_ident"); - ctx.alice = ctx.engine.updateIdentity(ctx.alice); - log(AdapterTestUtils.identityToString(ctx.alice, true)); - log("myself()"); ctx.alice = ctx.engine.myself(ctx.alice); - log(AdapterTestUtils.identityToString(ctx.alice, true)); + log(AdapterTestUtils.identityToString(ctx.alice, false)); - - log(AdapterTestUtils.identityToString(ctx.bob, true)); + log(AdapterTestUtils.identityToString(ctx.bob, false)); log("update()"); - ctx.engine.updateIdentity(ctx.bob); - log(AdapterTestUtils.identityToString(ctx.bob, true)); - - Message pEpMsg = AdapterTestUtils.makeNewTestMessage(ctx.alice, ctx.bob, Message.Direction.Outgoing); -// pEpMsg.setEncFormat(Message.EncFormat.None); - - log("Orig IN: " + AdapterTestUtils.msgToString(pEpMsg, false)); - - Message pEpMsgEnc = ctx.engine.encrypt_message(pEpMsg, null, Message.EncFormat.PEP); - - Message txMsgpEp = null; - if (pEpMsgEnc == null) { - log("UNENCRYPTED"); - txMsgpEp = pEpMsg; - } else { - log("ENCRYPTED"); - txMsgpEp = pEpMsgEnc; - } - log("Orig OUT: " + AdapterTestUtils.msgToString(txMsgpEp, false)); - - pEpMessage pEpMessageOut = new pEpMessage(txMsgpEp); - - log("Serializing"); - String txMsg = null; - try { - txMsg = pEpMessageOut.serialize(); - } catch (IOException e) { - log("Exception while serializing: " + e.toString()); - } - log("Serialized Msg: " + txMsg); - - log("deserializing"); - pEpMessage deserialized = null; - try { - deserialized = pEpMessage.deserialize(txMsg); - } catch (Exception e) { - log("Exception while deserializing: " + e.toString()); - } - - Message reconstr = deserialized.toMessage(); - log("Reconstr: " + AdapterTestUtils.msgToString(reconstr, false)); - - try { - ctx.qm.sendMessage("Bob", txMsg); - } catch (IOException e) { - assert false : e.toString(); + ctx.bob = ctx.engine.updateIdentity(ctx.bob); + log(AdapterTestUtils.identityToString(ctx.bob, false)); + + String payloadPlain = "PING"; + List msgTx = Utils.encryptInlineEA(ctx, ctx.alice, ctx.bob, payloadPlain); + + for (TransportMessage out : msgTx) { + log("MSG TX: \n" + out.toString()); + try { + String msgTxSerialized = out.serialize(); + ctx.qm.sendMessage("Bob", msgTxSerialized); + } catch (IOException e) { + assert false : e.toString(); + } } + log("Sending messages finished..."); }); new TestUnit("Alice rx msg", mpctx, ctx -> { - FsMQMessage rxMsg = null; try { - rxMsg = ctx.qm.receiveMessage(200000); + FsMQMessage msgRxSerialized = null; + while ((msgRxSerialized = ctx.qm.receiveMessage(6)) != null) { +// log("MSG RX from [" + msgRxSerialized.getFrom().getAddress() + "]: " + msgRxSerialized.getMsg()); + + Message msgRx = Utils.deserializepEpMessageEA(ctx, msgRxSerialized); + log("ENCRYPTED IN: \n" + AdapterTestUtils.msgToString(msgRx, false)); + + Engine.decrypt_message_Return result = ctx.engine.decrypt_message(msgRx, null, 0); + log("DECRYPTED msg: \n" + AdapterTestUtils.msgToString(result.dst, false)); + log("DECRYPTED rating:" + result.rating.toString()); + log("DECRYPTED flags:" + result.flags); + } } catch (Exception e) { assert false : e.toString(); } - - log("Msg rx from [" + rxMsg.getFrom() + "]:" + rxMsg.getMsg()); + log(AdapterTestUtils.identityToString(ctx.bob, false)); + ctx.bob = ctx.engine.updateIdentity(ctx.bob); + log(AdapterTestUtils.identityToString(ctx.bob, false)); + log("Stop Receiving, no more messages..."); }); TestSuite.getDefault().run(); } + + } diff --git a/test/java/foundation/pEp/jniadapter/test/templateAliceBob/TestBob.java b/test/java/foundation/pEp/jniadapter/test/templateAliceBob/TestBob.java index c63a63c..f641399 100644 --- a/test/java/foundation/pEp/jniadapter/test/templateAliceBob/TestBob.java +++ b/test/java/foundation/pEp/jniadapter/test/templateAliceBob/TestBob.java @@ -10,7 +10,7 @@ import foundation.pEp.pitytest.utils.TestUtils; import foundation.pEp.jniadapter.test.utils.*; import java.io.IOException; -import java.util.Vector; +import java.util.List; class TestBob { public static void main(String[] args) throws Exception { @@ -20,61 +20,58 @@ class TestBob { MultiPeerCTX mpctx = new MultiPeerCTX("Bob"); new TestUnit("Bob rx msg", mpctx, ctx -> { - log(AdapterTestUtils.identityToString(ctx.bob, true)); log("myself()"); ctx.bob = ctx.engine.myself(ctx.bob); - log(AdapterTestUtils.identityToString(ctx.bob, true)); + log(AdapterTestUtils.identityToString(ctx.bob, false)); - log(AdapterTestUtils.identityToString(ctx.alice, true)); + log(AdapterTestUtils.identityToString(ctx.alice, false)); log("update()"); - ctx.engine.updateIdentity(ctx.alice); - log(AdapterTestUtils.identityToString(ctx.alice, true)); + ctx.alice = ctx.engine.updateIdentity(ctx.alice); + log(AdapterTestUtils.identityToString(ctx.alice, false)); - FsMQMessage msgRx = null; + try { + FsMQMessage msgRxSerialized = null; + while ((msgRxSerialized = ctx.qm.receiveMessage(3)) != null) { +// log("MSG RX from [" + msgRxSerialized.getFrom().getAddress() + "]: " + msgRxSerialized.getMsg()); - while (true) { - try { - msgRx = ctx.qm.receiveMessage(1000000); - } catch (Exception e) { - e.printStackTrace(); - assert false : e.toString(); - } - log("Msg Rx from[" + msgRx.getFrom().getAddress() + "]: " + msgRx.getMsg()); - - Message rxMsg = null; - if(false) { - rxMsg = ctx.engine.incomingMessageFromPGPText(msgRx.getMsg(), Message.EncFormat.PEP); - } else { - pEpMessage rxMsgpEp = null; - try { - rxMsgpEp = pEpMessage.deserialize(msgRx.getMsg()); - } catch (Exception e) { - log("Exception while deserializing: " + e.toString()); - } - rxMsg = rxMsgpEp.toMessage(); - } - log("Orig IN: " + AdapterTestUtils.msgToString(rxMsg, false)); - - // decrypt - Engine.decrypt_message_Return result = ctx.engine.decrypt_message(rxMsg, null, 0); - log("Msg Rx from[" + msgRx.getFrom().getAddress() + "]: " + AdapterTestUtils.msgToString(result.dst,false)); + Message msgRx = Utils.deserializepEpMessageEA(ctx, msgRxSerialized); + log("ENCRYPTED IN: \n" + AdapterTestUtils.msgToString(msgRx, false)); + Engine.decrypt_message_Return result = ctx.engine.decrypt_message(msgRx, null, 0); + log("DECRYPTED msg: \n" + AdapterTestUtils.msgToString(result.dst, false)); + log("DECRYPTED rating:" + result.rating.toString()); + log("DECRYPTED flags:" + result.flags); + } + } catch (Exception e) { + assert false : e.toString(); } + log(AdapterTestUtils.identityToString(ctx.alice, false)); + ctx.alice = ctx.engine.updateIdentity(ctx.alice); + log(AdapterTestUtils.identityToString(ctx.alice, false)); + log("Stop Receiving, no more messages..."); }); new TestUnit("Bob tx msg", mpctx, ctx -> { - ctx.bob = ctx.engine.myself(ctx.bob); + String payloadPlain = "PONG"; + List msgTx = Utils.encryptInlineEA(ctx, ctx.bob, ctx.alice, payloadPlain); - if (ctx.bob.fpr == null) { - throw new RuntimeException(); + for (TransportMessage out : msgTx) { + log("MSG TX: \n" + out.toString()); + try { + String msgTxSerialized = out.serialize(); + ctx.qm.sendMessage("Alice", msgTxSerialized); + } catch (IOException e) { + assert false : e.toString(); + } } - - //send message + log("Sending messages finished..."); }); TestSuite.getDefault().run(); } + + } diff --git a/test/java/foundation/pEp/jniadapter/test/templateAliceBob/Utils.java b/test/java/foundation/pEp/jniadapter/test/templateAliceBob/Utils.java new file mode 100644 index 0000000..8647934 --- /dev/null +++ b/test/java/foundation/pEp/jniadapter/test/templateAliceBob/Utils.java @@ -0,0 +1,93 @@ +package foundation.pEp.jniadapter.test.templateAliceBob; + +import foundation.pEp.jniadapter.Blob; +import foundation.pEp.jniadapter.Identity; +import foundation.pEp.jniadapter.Message; +import foundation.pEp.jniadapter.test.utils.AdapterTestUtils; +import foundation.pEp.jniadapter.test.utils.transport.fsmqmanager.FsMQMessage; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Vector; + +import static foundation.pEp.pitytest.TestLogger.log; + +public class Utils { + public static List encryptInlineEA(MultiPeerCTX ctx, Identity from, Identity to, String payloadPlain) throws RuntimeException { + List ret = new ArrayList<>(); + + // 1. put payload into .longmsg + Message msgPlain = AdapterTestUtils.makeNewTestMessage(from, to, Message.Direction.Outgoing); + msgPlain.setLongmsg(payloadPlain); + msgPlain.setEncFormat(Message.EncFormat.PEPEncInlineEA); + log("MSG PLAIN: " + AdapterTestUtils.msgToString(msgPlain, false)); + + // 2. call encrypt_message() with enc_format = PEP_enc_inline_EA + Message msgEnc = ctx.engine.encrypt_message(msgPlain, null, Message.EncFormat.PEPEncInlineEA); + Message msgTx = null; + if (msgEnc == null) { + log("UNENCRYPTED"); + msgTx = msgPlain; + } else { + log("ENCRYPTED"); + msgTx = msgEnc; + } + log("MSG AFTER ENCRYPT: \n" + AdapterTestUtils.msgToString(msgTx, false)); + + // 3. you’re getting back crypto text in .longmsg and possibly ASCII encoded crypto text in .value of attachments in .attachments; .enc_format is PEP_enc_inline_EA + // 4. send one message with the crypto text of .longmsg + TransportMessage tmp = new TransportMessage(msgTx); + tmp.setAttachments(new Vector<>()); + ret.add(new TransportMessage(tmp)); + + // 5. send messages for each attachment in .attachments with the crypto text of .value, respectively + for (Blob b : msgTx.getAttachments()) { + if(b != null) { + tmp.setLongMessage(new String(b.data)); + ret.add(new TransportMessage(tmp)); + } else { + throw new RuntimeException("NULL ATTACHMENT"); + } + } + return ret; + } + + public static String serializepEpMessage(Message msgTx) { + TransportMessage msgTransport = new TransportMessage(msgTx); + String msgTxSerialized = null; + try { + msgTxSerialized = msgTransport.serialize(); + } catch (IOException e) { + log("Exception while serializing: " + e.toString()); + } + return msgTxSerialized; + } + + public static Message deserializepEpMessageEA(MultiPeerCTX ctx, FsMQMessage msgRxSerialized) { + Message ret = null; + try { + TransportMessage msgTransportRx = TransportMessage.deserialize(msgRxSerialized.getMsg()); + ret = ctx.engine.incomingMessageFromPGPText(msgTransportRx.getLongMessage(), Message.EncFormat.PEPEncInlineEA); + // From + Identity from = new Identity(); + from.address = msgTransportRx.getFromAddress(); + from = ctx.engine.updateIdentity(from); + ret.setFrom(from); + + // To + Vector toList = new Vector<>(); + for (String addr: msgTransportRx.getToAddresses()) { + Identity to = new Identity(); + to.address = addr; + to = ctx.engine.myself(to); + toList.add(to); + } + ret.setTo(toList); + + } catch (Exception e) { + log("Exception while deserializing: " + e.toString()); + } + return ret; + } +} \ No newline at end of file diff --git a/test/java/foundation/pEp/jniadapter/test/templateAliceBob/pEpMessage.java b/test/java/foundation/pEp/jniadapter/test/templateAliceBob/pEpMessage.java deleted file mode 100644 index b415f8f..0000000 --- a/test/java/foundation/pEp/jniadapter/test/templateAliceBob/pEpMessage.java +++ /dev/null @@ -1,81 +0,0 @@ -package foundation.pEp.jniadapter.test.templateAliceBob; - -import foundation.pEp.jniadapter.Blob; -import foundation.pEp.jniadapter.Identity; -import foundation.pEp.jniadapter.Message; - -import java.io.*; -import java.util.ArrayList; -import java.util.Base64; -import java.util.List; -import java.util.Vector; - -public class pEpMessage implements Serializable { - private static final long serialVersionUID = 1L; - - String fromAddress = null; - List toAddresses = new ArrayList(); - List attachments = new ArrayList(); - String shortMessage = null; - String longMessage = null; - - pEpMessage(Message msg) { - fromAddress = msg.getFrom().address; - for(Identity i : msg.getTo() ) { - toAddresses.add(i.address); - } - for(Blob b : msg.getAttachments()) { - attachments.add(b); - } - shortMessage = msg.getShortmsg(); - longMessage = msg.getLongmsg(); - } - - public Message toMessage() { - Message ret = new Message(); - Identity from = new Identity(); - from.address = fromAddress; - ret.setFrom(from); - Vector toIdents = new Vector<>(); - for( String addr : toAddresses) { - Identity i = new Identity(); - i.address = addr; - toIdents.add(i); - } - ret.setTo(toIdents); - Vector atts = new Vector<>(); - for(Blob b : attachments) { - atts.add(b); - } - ret.setAttachments(atts); - ret.setShortmsg(shortMessage); - ret.setLongmsg(longMessage); - return ret; - } - - public static pEpMessage deserialize(String serializedMsg) throws IOException, ClassNotFoundException { - pEpMessage ret = null; - byte[] data = Base64.getDecoder().decode(serializedMsg); -// byte[] data = serializedMsg.getBytes(); - ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(data)); - Object obj = ois.readObject(); - ois.close(); - if (!(obj instanceof pEpMessage)) { - throw new ClassNotFoundException("Invalid serialized string"); - } else { - ret = (pEpMessage) obj; - } - return ret; - } - - public String serialize() throws IOException { - String ret = null; - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - ObjectOutputStream oos = new ObjectOutputStream(baos); - oos.writeObject(this); - oos.close(); - ret = Base64.getEncoder().encodeToString(baos.toByteArray()); -// ret = baos.toString(); - return ret; - } -} diff --git a/test/java/foundation/pEp/jniadapter/test/templateAliceBob/transportMessage.java b/test/java/foundation/pEp/jniadapter/test/templateAliceBob/transportMessage.java new file mode 100644 index 0000000..bb19e22 --- /dev/null +++ b/test/java/foundation/pEp/jniadapter/test/templateAliceBob/transportMessage.java @@ -0,0 +1,183 @@ +package foundation.pEp.jniadapter.test.templateAliceBob; + +import foundation.pEp.jniadapter.Blob; +import foundation.pEp.jniadapter.Identity; +import foundation.pEp.jniadapter.Message; +import foundation.pEp.jniadapter.Pair; +import foundation.pEp.jniadapter.test.utils.AdapterTestUtils; + +import java.io.*; +import java.util.ArrayList; +import java.util.Base64; +import java.util.List; +import java.util.Vector; + +public class TransportMessage implements Serializable { + private static final long serialVersionUID = 1L; + private String fromAddress = null; + private List toAddresses = new ArrayList(); + private Vector attachments = new Vector<>(); + private String shortMessage = null; + private String longMessage = null; + + TransportMessage() { + } + + TransportMessage(Message msg) { + fromAddress = msg.getFrom().address; + for (Identity i : msg.getTo()) { + toAddresses.add(i.address); + } + for (Blob b : msg.getAttachments()) { + attachments.add(b); + } + shortMessage = msg.getShortmsg(); + longMessage = msg.getLongmsg(); + } + + // Deep Copy + TransportMessage(TransportMessage msg) { + fromAddress = msg.fromAddress; + toAddresses = new ArrayList<>(msg.toAddresses); + attachments = new Vector<>(msg.attachments); + shortMessage = msg.shortMessage; + longMessage = msg.longMessage; + } + + + public String getFromAddress() { + return fromAddress; + } + + public void setFromAddress(String fromAddress) { + this.fromAddress = fromAddress; + } + + public List getToAddresses() { + return toAddresses; + } + + public void setToAddresses(List toAddresses) { + this.toAddresses = toAddresses; + } + + public Vector getAttachments() { + return attachments; + } + + public void setAttachments(Vector attachments) { + this.attachments = attachments; + } + + public String getShortMessage() { + return shortMessage; + } + + public void setShortMessage(String shortMessage) { + this.shortMessage = shortMessage; + } + + public String getLongMessage() { + return longMessage; + } + + public void setLongMessage(String longMessage) { + this.longMessage = longMessage; + } + + public Message toMessage() { + Message ret = new Message(); + + // from + Identity from = new Identity(); + from.address = fromAddress; + ret.setFrom(from); + + // to + Vector toIdents = new Vector<>(); + for (String addr : toAddresses) { + Identity i = new Identity(); + i.address = addr; + toIdents.add(i); + } + ret.setTo(toIdents); + + // attachments + ret.setAttachments(new Vector<>(attachments)); + + // shortMessage + if (shortMessage != null) { + ret.setShortmsg(shortMessage); + } + + // longMessage + if (longMessage != null) { + ret.setLongmsg(longMessage); + } + return ret; + } + + public String toString() { + String ret = ""; + ArrayList> kvs = new ArrayList<>(); + String key = ""; + String value = ""; + boolean full = false; + + key = "from"; + value = fromAddress; + kvs.add(new Pair<>(key, value)); + + key = "to"; + value = toAddresses.toString(); + kvs.add(new Pair<>(key, value)); + + key = "shortMessage"; + value = shortMessage; + kvs.add(new Pair<>(key, value)); + + key = "longMessage"; + value = longMessage; + kvs.add(new Pair<>(key, value)); + + key = "getAttachments"; + value = AdapterTestUtils.blobListToString(attachments, full) + "\n"; + kvs.add(new Pair<>(key, value)); + + if (!full) { + kvs = AdapterTestUtils.clipStrings(kvs, 200, "clipped..."); + } + + ret = AdapterTestUtils.stringPairListToString(kvs); + ret = ret.trim(); + + return ret; + } + + + public static TransportMessage deserialize(String serializedMsg) throws IOException, ClassNotFoundException { + TransportMessage ret = null; + byte[] data = Base64.getDecoder().decode(serializedMsg); +// byte[] data = serializedMsg.getBytes(); + ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(data)); + Object obj = ois.readObject(); + ois.close(); + if (!(obj instanceof TransportMessage)) { + throw new ClassNotFoundException("Invalid serialized string"); + } else { + ret = (TransportMessage) obj; + } + return ret; + } + + public String serialize() throws IOException { + String ret = null; + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(baos); + oos.writeObject(this); + oos.close(); + ret = Base64.getEncoder().encodeToString(baos.toByteArray()); +// ret = baos.toString(); + return ret; + } +} diff --git a/test/java/foundation/pEp/jniadapter/test/utils/AdapterTestUtils.java b/test/java/foundation/pEp/jniadapter/test/utils/AdapterTestUtils.java index d66d79a..ccc4821 100644 --- a/test/java/foundation/pEp/jniadapter/test/utils/AdapterTestUtils.java +++ b/test/java/foundation/pEp/jniadapter/test/utils/AdapterTestUtils.java @@ -20,7 +20,7 @@ public class AdapterTestUtils { ret += "me: " + i.me + "\n"; ret += "comm_type: " + i.comm_type + "\n"; } else { - ret += i.address + "/" + i.user_id + "/" + i.fpr; + ret += i.address + "/" + i.user_id + "/" + i.username + "/" + i.fpr; } ret = ret.trim(); return ret; @@ -282,7 +282,8 @@ public class AdapterTestUtils { msg.setFrom(from); msg.setTo(vID); msg.setDir(dir); - msg.setLongmsg("Hi i am the message longmessage"); + msg.setShortmsg("Hi i am the shortMessage"); + msg.setLongmsg("Hi i am the longMessage"); return msg; } } \ No newline at end of file