Переглянути джерело

Prepare to implement 2-3 PIR protocols

Boyang Wei 6 роки тому
батько
коміт
f65103f5b5
35 змінених файлів з 470 додано та 11 видалено
  1. 6 0
      src/pir/PIRAccess.java
  2. 6 0
      src/pir/PIRCOT.java
  3. 6 0
      src/pir/PIREviction.java
  4. 6 0
      src/pir/PIRIOT.java
  5. 6 0
      src/pir/PIRReshuffle.java
  6. 229 2
      src/pir/PIRRetrieve.java
  7. 6 0
      src/pir/precomputation/PrePIRAccess.java
  8. 6 0
      src/pir/precomputation/PrePIRCOT.java
  9. 6 0
      src/pir/precomputation/PrePIRIOT.java
  10. 6 0
      src/pir/precomputation/PrePIRReshuffle.java
  11. 6 0
      src/pir/precomputation/PrePIRRetrieve.java
  12. 6 0
      src/protocols/Access.java
  13. 6 0
      src/protocols/Eviction.java
  14. 6 0
      src/protocols/PermuteIndex.java
  15. 6 0
      src/protocols/PermuteTarget.java
  16. 6 0
      src/protocols/PostProcessT.java
  17. 30 0
      src/protocols/Protocol.java
  18. 6 0
      src/protocols/Reshuffle.java
  19. 6 0
      src/protocols/Retrieve.java
  20. 6 0
      src/protocols/SSCOT.java
  21. 6 0
      src/protocols/SSIOT.java
  22. 7 0
      src/protocols/SSXOT.java
  23. 6 0
      src/protocols/UpdateRoot.java
  24. 6 0
      src/protocols/precomputation/PreAccess.java
  25. 6 0
      src/protocols/precomputation/PreEviction.java
  26. 6 0
      src/protocols/precomputation/PrePermuteIndex.java
  27. 6 0
      src/protocols/precomputation/PrePermuteTarget.java
  28. 6 0
      src/protocols/precomputation/PrePostProcessT.java
  29. 6 0
      src/protocols/precomputation/PreReshuffle.java
  30. 6 0
      src/protocols/precomputation/PreRetrieve.java
  31. 6 0
      src/protocols/precomputation/PreSSCOT.java
  32. 6 0
      src/protocols/precomputation/PreSSIOT.java
  33. 6 0
      src/protocols/precomputation/PreSSXOT.java
  34. 6 0
      src/protocols/precomputation/PreUpdateRoot.java
  35. 18 9
      src/ui/CLI.java

+ 6 - 0
src/pir/PIRAccess.java

@@ -500,4 +500,10 @@ public class PIRAccess extends Protocol {
 
 		// timer.print();
 	}
+
+	@Override
+	public void run(Party party, Metadata md, Forest[] forest) {
+		// TODO Auto-generated method stub
+		
+	}
 }

+ 6 - 0
src/pir/PIRCOT.java

@@ -146,4 +146,10 @@ public class PIRCOT extends Protocol {
 
 		// timer.print();
 	}
+
+	@Override
+	public void run(Party party, Metadata md, Forest[] forest) {
+		// TODO Auto-generated method stub
+		
+	}
 }

+ 6 - 0
src/pir/PIREviction.java

@@ -269,4 +269,10 @@ public class PIREviction extends Protocol {
 	public void run(Party party, Metadata md, Forest forest) {
 		System.out.println("Use Retrieve to test Eviction");
 	}
+
+	@Override
+	public void run(Party party, Metadata md, Forest[] forest) {
+		// TODO Auto-generated method stub
+		
+	}
 }

+ 6 - 0
src/pir/PIRIOT.java

@@ -136,4 +136,10 @@ public class PIRIOT extends Protocol {
 
 		// timer.print();
 	}
+
+	@Override
+	public void run(Party party, Metadata md, Forest[] forest) {
+		// TODO Auto-generated method stub
+		
+	}
 }

+ 6 - 0
src/pir/PIRReshuffle.java

@@ -212,4 +212,10 @@ public class PIRReshuffle extends Protocol {
 
 		// timer.print();
 	}
+
+	@Override
+	public void run(Party party, Metadata md, Forest[] forest) {
+		// TODO Auto-generated method stub
+		
+	}
 }

+ 229 - 2
src/pir/PIRRetrieve.java

@@ -178,9 +178,9 @@ public class PIRRetrieve extends Protocol {
 		if (Global.cheat)
 			System.out.println("Cheat Mode is On");
 
-		int records = 30;
+		int records = 10;
 		int reset = 5;
-		int repeat = 10;
+		int repeat = 1;
 
 		int tau = md.getTau();
 		int numTrees = md.getNumTrees();
@@ -396,4 +396,231 @@ public class PIRRetrieve extends Protocol {
 
 		sanityCheck();
 	}
+
+	@Override
+	public void run(Party party, Metadata md, Forest[] forests) {
+		System.err.println("Check2");
+		if (Global.pipeline)
+			System.out.println("Pipeline Mode is On");
+		if (Global.cheat)
+			System.out.println("Cheat Mode is On");
+
+		int records = 10;
+		int reset = 5;
+		int repeat = 1;
+
+		int tau = md.getTau();
+		int numTrees = md.getNumTrees();
+		long numInsert = md.getNumInsertRecords();
+		int addrBits = md.getAddrBits();
+
+		int numTimer = Global.pipeline ? numTrees + 1 : 1;
+		Timer[] timer = new Timer[numTimer];
+		for (int i = 0; i < numTimer; i++)
+			timer[i] = new Timer();
+
+		StopWatch ete_off = new StopWatch("ETE_offline");
+		StopWatch ete_on = new StopWatch("ETE_online");
+
+		long[] gates = new long[2];
+
+		Pipeline[] threads = new Pipeline[numTrees];
+
+		sanityCheck();
+		System.out.println();
+
+		for (int i = 0; i < records; i++) {
+			long N = Global.cheat ? 0 : Util.nextLong(numInsert, Crypto.sr);
+
+			for (int j = 0; j < repeat; j++) {
+				int cycleIndex = i * repeat + j;
+				if (cycleIndex == reset * repeat) {
+					for (int k = 0; k < timer.length; k++)
+						timer[k].reset();
+					ete_on.reset();
+					ete_off.reset();
+				}
+				if (cycleIndex == 1) {
+					for (int k = 0; k < cons1.length; k++) {
+						cons1[k].bandSwitch = false;
+						cons2[k].bandSwitch = false;
+					}
+				}
+
+				System.out.println("Test: " + i + " " + j);
+				System.out.println("N=" + BigInteger.valueOf(N).toString(2));
+
+				System.out.print("Precomputation... ");
+
+				PreData[][] predata = new PreData[numTrees][2];
+				PrePIRRetrieve preretrieve = new PrePIRRetrieve(con1, con2);
+				for (int ti = 0; ti < numTrees; ti++) {
+					predata[ti][0] = new PreData();
+					predata[ti][1] = new PreData();
+
+					if (party == Party.Eddie) {
+						ete_off.start();
+						preretrieve.runE(predata[ti], md, ti, timer[0]);
+						ete_off.stop();
+
+					} else if (party == Party.Debbie) {
+						ete_off.start();
+						long[] cnt = preretrieve.runD(predata[ti], md, ti, ti == 0 ? null : predata[ti - 1][0],
+								timer[0]);
+						ete_off.stop();
+
+						if (cycleIndex == 0) {
+							gates[0] += cnt[0];
+							gates[1] += cnt[1];
+						}
+
+					} else if (party == Party.Charlie) {
+						ete_off.start();
+						preretrieve.runC(predata[ti], md, ti, ti == 0 ? null : predata[ti - 1][0], timer[0]);
+						ete_off.stop();
+
+					} else {
+						throw new NoSuchPartyException(party + "");
+					}
+				}
+
+				sanityCheck();
+				System.out.println("done!");
+
+				byte[] Li = new byte[0];
+				for (int ti = 0; ti < numTrees; ti++) {
+					long Ni_value = Util.getSubBits(N, addrBits, addrBits - md.getNBitsOfTree(ti));
+					long Nip1_pr_value = Util.getSubBits(N, addrBits - md.getNBitsOfTree(ti),
+							Math.max(addrBits - md.getNBitsOfTree(ti) - tau, 0));
+					byte[] Ni = Util.longToBytes(Ni_value, md.getNBytesOfTree(ti));
+					byte[] Nip1_pr = Util.longToBytes(Nip1_pr_value, (tau + 7) / 8);
+
+					if (party == Party.Eddie) {
+						Tree OTi = forests[0].getTree(ti);
+
+						byte[] sE_Ni = Util.nextBytes(Ni.length, Crypto.sr);
+						byte[] sD_Ni = Util.xor(Ni, sE_Ni);
+						con1.write(sD_Ni);
+
+						byte[] sE_Nip1_pr = Util.nextBytes(Nip1_pr.length, Crypto.sr);
+						byte[] sD_Nip1_pr = Util.xor(Nip1_pr, sE_Nip1_pr);
+						con1.write(sD_Nip1_pr);
+
+						byte[] E_A = null;
+						if (!Global.pipeline) {
+							ete_on.start();
+							E_A = runE(predata[ti], OTi, sE_Ni, sE_Nip1_pr, numTrees, timer[0]);
+							ete_on.stop();
+						} else {
+							if (ti == 0)
+								ete_on.start();
+							threads[ti] = pipelineE(predata[ti], OTi, sE_Ni, sE_Nip1_pr, numTrees, timer);
+						}
+
+						if (ti == numTrees - 1) {
+							con2.write(N);
+							con2.write(E_A);
+						}
+
+					} else if (party == Party.Debbie) {
+						Tree OTi = forests[1].getTree(ti);
+
+						byte[] sD_Ni = con1.read();
+						byte[] sD_Nip1_pr = con1.read();
+
+						if (!Global.pipeline) {
+							ete_on.start();
+							runD(predata[ti], OTi, sD_Ni, sD_Nip1_pr, timer[0]);
+							ete_on.stop();
+						} else {
+							if (ti == 0)
+								ete_on.start();
+							threads[ti] = pipelineD(predata[ti], OTi, sD_Ni, sD_Nip1_pr, timer);
+						}
+
+					} else if (party == Party.Charlie) {
+						Tree OTi = forests[1].getTree(ti);
+						int lBits = md.getLBitsOfTree(ti);
+						System.out.println("L" + ti + "="
+								+ Util.addZeros(Util.getSubBits(new BigInteger(1, Li), lBits, 0).toString(2), lBits));
+
+						OutAccess outaccess = null;
+						if (!Global.pipeline) {
+							ete_on.start();
+							outaccess = runC(predata[ti], md, OTi, ti, Li, timer[0]);
+							ete_on.stop();
+						} else {
+							if (ti == 0)
+								ete_on.start();
+							OutRetrieve outretrieve = pipelineC(predata[ti], md, OTi, ti, Li, timer);
+							outaccess = outretrieve.outaccess;
+							threads[ti] = outretrieve.pipeline;
+						}
+
+						Li = outaccess.C_Lip1;
+
+						if (ti == numTrees - 1) {
+							N = con1.readLong();
+							byte[] E_A = con1.read();
+							long data = new BigInteger(1, Util.xor(outaccess.C_Ti.getA(), E_A)).longValue();
+							if (N == data) {
+								System.out.println("PIR Retrieval passed");
+								System.out.println();
+							} else {
+								throw new AccessException("PIR Retrieval failed");
+							}
+						}
+
+					} else {
+						throw new NoSuchPartyException(party + "");
+					}
+				}
+
+				if (Global.pipeline) {
+					for (int ti = 0; ti < numTrees; ti++) {
+						try {
+							threads[ti].join();
+						} catch (InterruptedException e) {
+							e.printStackTrace();
+						}
+					}
+					ete_on.stop();
+				}
+			}
+		}
+		System.out.println();
+
+		Timer sum = new Timer();
+		for (int i = 0; i < timer.length; i++)
+			sum = sum.add(timer[i]);
+		sum.noPrePrint();
+		System.out.println();
+
+		StopWatch comEnc = new StopWatch("CE_online_comp");
+		for (int i = 0; i < cons1.length; i++)
+			comEnc = comEnc.add(cons1[i].comEnc.add(cons2[i].comEnc));
+		System.out.println(comEnc.noPreToMS());
+		System.out.println();
+
+		if (Global.pipeline)
+			ete_on.elapsedCPU = 0;
+		System.out.println(ete_on.noPreToMS());
+		System.out.println(ete_off.noPreToMS());
+		System.out.println();
+
+		Bandwidth[] bandwidth = new Bandwidth[P.size];
+		for (int i = 0; i < P.size; i++) {
+			bandwidth[i] = new Bandwidth(P.names[i]);
+			for (int j = 0; j < cons1.length; j++)
+				bandwidth[i] = bandwidth[i].add(cons1[j].bandwidth[i].add(cons2[j].bandwidth[i]));
+			System.out.println(bandwidth[i].noPreToString());
+		}
+		System.out.println();
+
+		System.out.println(gates[0]);
+		System.out.println(gates[1]);
+		System.out.println();
+
+		sanityCheck();
+	}
 }

+ 6 - 0
src/pir/precomputation/PrePIRAccess.java

@@ -85,4 +85,10 @@ public class PrePIRAccess extends Protocol {
 	@Override
 	public void run(Party party, Metadata md, Forest forest) {
 	}
+
+	@Override
+	public void run(Party party, Metadata md, Forest[] forest) {
+		// TODO Auto-generated method stub
+		
+	}
 }

+ 6 - 0
src/pir/precomputation/PrePIRCOT.java

@@ -61,4 +61,10 @@ public class PrePIRCOT extends Protocol {
 	@Override
 	public void run(Party party, Metadata md, Forest forest) {
 	}
+
+	@Override
+	public void run(Party party, Metadata md, Forest[] forest) {
+		// TODO Auto-generated method stub
+		
+	}
 }

+ 6 - 0
src/pir/precomputation/PrePIRIOT.java

@@ -58,4 +58,10 @@ public class PrePIRIOT extends Protocol {
 	@Override
 	public void run(Party party, Metadata md, Forest forest) {
 	}
+
+	@Override
+	public void run(Party party, Metadata md, Forest[] forest) {
+		// TODO Auto-generated method stub
+		
+	}
 }

+ 6 - 0
src/pir/precomputation/PrePIRReshuffle.java

@@ -66,4 +66,10 @@ public class PrePIRReshuffle extends Protocol {
 	@Override
 	public void run(Party party, Metadata md, Forest forest) {
 	}
+
+	@Override
+	public void run(Party party, Metadata md, Forest[] forest) {
+		// TODO Auto-generated method stub
+		
+	}
 }

+ 6 - 0
src/pir/precomputation/PrePIRRetrieve.java

@@ -90,4 +90,10 @@ public class PrePIRRetrieve extends Protocol {
 	@Override
 	public void run(Party party, Metadata md, Forest forest) {
 	}
+
+	@Override
+	public void run(Party party, Metadata md, Forest[] forest) {
+		// TODO Auto-generated method stub
+		
+	}
 }

+ 6 - 0
src/protocols/Access.java

@@ -387,4 +387,10 @@ public class Access extends Protocol {
 
 		// timer.print();
 	}
+
+	@Override
+	public void run(Party party, Metadata md, Forest[] forest) {
+		// TODO Auto-generated method stub
+		
+	}
 }

+ 6 - 0
src/protocols/Eviction.java

@@ -252,4 +252,10 @@ public class Eviction extends Protocol {
 	public void run(Party party, Metadata md, Forest forest) {
 		System.out.println("Use Retrieve to test Eviction");
 	}
+
+	@Override
+	public void run(Party party, Metadata md, Forest[] forest) {
+		// TODO Auto-generated method stub
+		
+	}
 }

+ 6 - 0
src/protocols/PermuteIndex.java

@@ -151,4 +151,10 @@ public class PermuteIndex extends Protocol {
 
 		// timer.print();
 	}
+
+	@Override
+	public void run(Party party, Metadata md, Forest[] forest) {
+		// TODO Auto-generated method stub
+		
+	}
 }

+ 6 - 0
src/protocols/PermuteTarget.java

@@ -177,4 +177,10 @@ public class PermuteTarget extends Protocol {
 
 		// timer.print();
 	}
+
+	@Override
+	public void run(Party party, Metadata md, Forest[] forest) {
+		// TODO Auto-generated method stub
+		
+	}
 }

+ 6 - 0
src/protocols/PostProcessT.java

@@ -237,4 +237,10 @@ public class PostProcessT extends Protocol {
 
 		// timer.print();
 	}
+
+	@Override
+	public void run(Party party, Metadata md, Forest[] forest) {
+		// TODO Auto-generated method stub
+		
+	}
 }

+ 30 - 0
src/protocols/Protocol.java

@@ -76,10 +76,40 @@ public abstract class Protocol {
 
 		run(party, md, forest);
 	}
+	
+	// a simulation using a path instead of building whole tree
+	public void run(Party party, Metadata md) {
+		System.err.println("Check");
+		assert Global.cheat;
+		Forest[] forests = new Forest[2];
+		// Eddie has x1, x2
+		// Debbie has x1, x3
+		// Charlie has x2, x3
+		// only x1 should have content
+		if (party == Party.Eddie) {
+			forests[0] = new Forest(md, Crypto.sr);
+			forests[1] = new Forest(md, null);
+
+		} else if (party == Party.Debbie) {
+			forests[0] = new Forest(md, Crypto.sr);
+			forests[1] = new Forest(md, null);
+			
+		} else if (party == Party.Charlie) {
+			forests[0] = new Forest(md, null);
+			forests[1] = new Forest(md, null);
+
+		} else {
+			throw new NoSuchPartyException(party.toString());
+		}
+
+		run(party, md, forests);
+	}
 
 	/*
 	 * This is mostly just testing code and may need to change for the purpose
 	 * of an actual execution
 	 */
 	public abstract void run(Party party, Metadata md, Forest forest);
+	
+	public abstract void run(Party party, Metadata md, Forest[] forests);
 }

+ 6 - 0
src/protocols/Reshuffle.java

@@ -205,4 +205,10 @@ public class Reshuffle extends Protocol {
 
 		// timer.print();
 	}
+
+	@Override
+	public void run(Party party, Metadata md, Forest[] forest) {
+		// TODO Auto-generated method stub
+		
+	}
 }

+ 6 - 0
src/protocols/Retrieve.java

@@ -373,4 +373,10 @@ public class Retrieve extends Protocol {
 
 		sanityCheck();
 	}
+
+	@Override
+	public void run(Party party, Metadata md, Forest[] forest) {
+		// TODO Auto-generated method stub
+		
+	}
 }

+ 6 - 0
src/protocols/SSCOT.java

@@ -164,4 +164,10 @@ public class SSCOT extends Protocol {
 
 		// timer.print();
 	}
+
+	@Override
+	public void run(Party party, Metadata md, Forest[] forest) {
+		// TODO Auto-generated method stub
+		
+	}
 }

+ 6 - 0
src/protocols/SSIOT.java

@@ -155,4 +155,10 @@ public class SSIOT extends Protocol {
 
 		// timer.print();
 	}
+
+	@Override
+	public void run(Party party, Metadata md, Forest[] forest) {
+		// TODO Auto-generated method stub
+		
+	}
 }

+ 7 - 0
src/protocols/SSXOT.java

@@ -5,6 +5,7 @@ import java.math.BigInteger;
 import communication.Communication;
 import crypto.Crypto;
 import exceptions.NoSuchPartyException;
+import oram.Forest;
 import oram.Metadata;
 import oram.Tuple;
 import protocols.precomputation.PreSSXOT;
@@ -177,4 +178,10 @@ public class SSXOT extends Protocol {
 
 		// timer.print();
 	}
+
+	@Override
+	public void run(Party party, Metadata md, Forest[] forest) {
+		// TODO Auto-generated method stub
+		
+	}
 }

+ 6 - 0
src/protocols/UpdateRoot.java

@@ -253,4 +253,10 @@ public class UpdateRoot extends Protocol {
 
 		// timer.print();
 	}
+
+	@Override
+	public void run(Party party, Metadata md, Forest[] forest) {
+		// TODO Auto-generated method stub
+		
+	}
 }

+ 6 - 0
src/protocols/precomputation/PreAccess.java

@@ -83,4 +83,10 @@ public class PreAccess extends Protocol {
 	@Override
 	public void run(Party party, Metadata md, Forest forest) {
 	}
+
+	@Override
+	public void run(Party party, Metadata md, Forest[] forest) {
+		// TODO Auto-generated method stub
+		
+	}
 }

+ 6 - 0
src/protocols/precomputation/PreEviction.java

@@ -222,4 +222,10 @@ public class PreEviction extends Protocol {
 	@Override
 	public void run(Party party, Metadata md, Forest forest) {
 	}
+
+	@Override
+	public void run(Party party, Metadata md, Forest[] forest) {
+		// TODO Auto-generated method stub
+		
+	}
 }

+ 6 - 0
src/protocols/precomputation/PrePermuteIndex.java

@@ -60,4 +60,10 @@ public class PrePermuteIndex extends Protocol {
 	@Override
 	public void run(Party party, Metadata md, Forest forest) {
 	}
+
+	@Override
+	public void run(Party party, Metadata md, Forest[] forest) {
+		// TODO Auto-generated method stub
+		
+	}
 }

+ 6 - 0
src/protocols/precomputation/PrePermuteTarget.java

@@ -105,4 +105,10 @@ public class PrePermuteTarget extends Protocol {
 	@Override
 	public void run(Party party, Metadata md, Forest forest) {
 	}
+
+	@Override
+	public void run(Party party, Metadata md, Forest[] forest) {
+		// TODO Auto-generated method stub
+		
+	}
 }

+ 6 - 0
src/protocols/precomputation/PrePostProcessT.java

@@ -80,4 +80,10 @@ public class PrePostProcessT extends Protocol {
 	@Override
 	public void run(Party party, Metadata md, Forest forest) {
 	}
+
+	@Override
+	public void run(Party party, Metadata md, Forest[] forest) {
+		// TODO Auto-generated method stub
+		
+	}
 }

+ 6 - 0
src/protocols/precomputation/PreReshuffle.java

@@ -67,4 +67,10 @@ public class PreReshuffle extends Protocol {
 	@Override
 	public void run(Party party, Metadata md, Forest forest) {
 	}
+
+	@Override
+	public void run(Party party, Metadata md, Forest[] forest) {
+		// TODO Auto-generated method stub
+		
+	}
 }

+ 6 - 0
src/protocols/precomputation/PreRetrieve.java

@@ -87,4 +87,10 @@ public class PreRetrieve extends Protocol {
 	@Override
 	public void run(Party party, Metadata md, Forest forest) {
 	}
+
+	@Override
+	public void run(Party party, Metadata md, Forest[] forest) {
+		// TODO Auto-generated method stub
+		
+	}
 }

+ 6 - 0
src/protocols/precomputation/PreSSCOT.java

@@ -68,4 +68,10 @@ public class PreSSCOT extends Protocol {
 	@Override
 	public void run(Party party, Metadata md, Forest forest) {
 	}
+
+	@Override
+	public void run(Party party, Metadata md, Forest[] forest) {
+		// TODO Auto-generated method stub
+		
+	}
 }

+ 6 - 0
src/protocols/precomputation/PreSSIOT.java

@@ -65,4 +65,10 @@ public class PreSSIOT extends Protocol {
 	@Override
 	public void run(Party party, Metadata md, Forest forest) {
 	}
+
+	@Override
+	public void run(Party party, Metadata md, Forest[] forest) {
+		// TODO Auto-generated method stub
+		
+	}
 }

+ 6 - 0
src/protocols/precomputation/PreSSXOT.java

@@ -71,4 +71,10 @@ public class PreSSXOT extends Protocol {
 	@Override
 	public void run(Party party, Metadata md, Forest forest) {
 	}
+
+	@Override
+	public void run(Party party, Metadata md, Forest[] forest) {
+		// TODO Auto-generated method stub
+		
+	}
 }

+ 6 - 0
src/protocols/precomputation/PreUpdateRoot.java

@@ -131,4 +131,10 @@ public class PreUpdateRoot extends Protocol {
 	@Override
 	public void run(Party party, Metadata md, Forest forest) {
 	}
+
+	@Override
+	public void run(Party party, Metadata md, Forest[] forest) {
+		// TODO Auto-generated method stub
+		
+	}
 }

+ 18 - 9
src/ui/CLI.java

@@ -153,11 +153,14 @@ public class CLI {
 
 			try {
 				Protocol p = operationCtor.newInstance(con1[0], con2[0]);
-				if (protocol.equals("rtv"))
+				if (protocol.equals("rtv")) {
 					((Retrieve) p).setCons(con1, con2);
-				if (protocol.equals("pirrtv"))
+					p.run(Party.Eddie, md, forestFile);
+				}
+				if (protocol.equals("pirrtv")) {
 					((PIRRetrieve) p).setCons(con1, con2);
-				p.run(Party.Eddie, md, forestFile);
+					p.run(Party.Eddie, md);
+				}
 			} catch (InstantiationException | IllegalAccessException | IllegalArgumentException
 					| InvocationTargetException e) {
 				e.printStackTrace();
@@ -192,11 +195,14 @@ public class CLI {
 
 			try {
 				Protocol p = operationCtor.newInstance(con1[0], con2[0]);
-				if (protocol.equals("rtv"))
+				if (protocol.equals("rtv")) {
 					((Retrieve) p).setCons(con1, con2);
-				if (protocol.equals("pirrtv"))
+					p.run(Party.Debbie, md, forestFile);
+				}
+				if (protocol.equals("pirrtv")) {
 					((PIRRetrieve) p).setCons(con1, con2);
-				p.run(Party.Debbie, md, forestFile);
+					p.run(Party.Debbie, md);
+				}
 			} catch (InstantiationException | IllegalAccessException | IllegalArgumentException
 					| InvocationTargetException e) {
 				e.printStackTrace();
@@ -232,11 +238,14 @@ public class CLI {
 
 			try {
 				Protocol p = operationCtor.newInstance(con1[0], con2[0]);
-				if (protocol.equals("rtv"))
+				if (protocol.equals("rtv")) {
 					((Retrieve) p).setCons(con1, con2);
-				if (protocol.equals("pirrtv"))
+					p.run(Party.Charlie, md, forestFile);
+				}
+				if (protocol.equals("pirrtv")) {
 					((PIRRetrieve) p).setCons(con1, con2);
-				p.run(Party.Charlie, md, forestFile);
+					p.run(Party.Charlie, md);
+				}
 			} catch (InstantiationException | IllegalAccessException | IllegalArgumentException
 					| InvocationTargetException e) {
 				e.printStackTrace();