123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272 |
- package ui;
- import java.lang.reflect.Constructor;
- import java.lang.reflect.InvocationTargetException;
- import java.net.InetSocketAddress;
- import org.apache.commons.cli.CommandLine;
- import org.apache.commons.cli.CommandLineParser;
- import org.apache.commons.cli.GnuParser;
- import org.apache.commons.cli.Options;
- import org.apache.commons.cli.ParseException;
- import communication.Communication;
- import exceptions.NoSuchPartyException;
- import oram.Global;
- import oram.Metadata;
- import protocols.*;
- import struct.Party;
- import subprotocols.*;
- public class CLI {
- public static final int DEFAULT_PORT = 8000;
- public static final String DEFAULT_IP = "localhost";
- public static void main(String[] args) {
- // Setup command line argument parser
- Options options = new Options();
- options.addOption("config", true, "Config file");
- options.addOption("forest", true, "Forest file");
- options.addOption("eddie_ip", true, "IP to look for eddie");
- options.addOption("debbie_ip", true, "IP to look for debbie");
- options.addOption("protocol", true, "Algorithim to test");
- options.addOption("pipeline", false, "Whether to do pipelined eviction");
- // Parse the command line arguments
- CommandLineParser cmdParser = new GnuParser();
- CommandLine cmd = null;
- try {
- cmd = cmdParser.parse(options, args);
- } catch (ParseException e1) {
- e1.printStackTrace();
- }
- Global.pipeline = cmd.hasOption("pipeline");
- String configFile = cmd.getOptionValue("config", "config.yaml");
- String forestFile = cmd.getOptionValue("forest", null);
- String party = null;
- String[] positionalArgs = cmd.getArgs();
- if (positionalArgs.length > 0) {
- party = positionalArgs[0];
- } else {
- try {
- throw new ParseException("No party specified");
- } catch (ParseException e) {
- e.printStackTrace();
- System.exit(-1);
- }
- }
- int extra_port = 1;
- int eddiePort1 = DEFAULT_PORT;
- int eddiePort2 = eddiePort1 + extra_port;
- int debbiePort = eddiePort2 + extra_port;
- String eddieIp = cmd.getOptionValue("eddie_ip", DEFAULT_IP);
- String debbieIp = cmd.getOptionValue("debbie_ip", DEFAULT_IP);
- Class<? extends Protocol> operation = null;
- String protocol = cmd.getOptionValue("protocol", "retrieve").toLowerCase();
- if (protocol.equals("ur")) {
- operation = UpdateRoot.class;
- } else if (protocol.equals("evi")) {
- operation = Eviction.class;
- } else if (protocol.equals("pt")) {
- operation = PermuteTarget.class;
- } else if (protocol.equals("pi")) {
- operation = PermuteIndex.class;
- } else if (protocol.equals("xot")) {
- operation = SSXOT.class;
- } else if (protocol.equals("pircot")) {
- operation = PIRCOT.class;
- } else if (protocol.equals("piracc")) {
- operation = PIRAccess.class;
- } else if (protocol.equals("pirrtv")) {
- operation = PIRRetrieve.class;
- } else if (protocol.equals("sspir")) {
- operation = SSPIR.class;
- } else if (protocol.equals("shiftpir")) {
- operation = ShiftPIR.class;
- } else if (protocol.equals("tspir")) {
- operation = ThreeShiftPIR.class;
- } else if (protocol.equals("shiftxorpir")) {
- operation = ShiftXorPIR.class;
- } else if (protocol.equals("tsxpir")) {
- operation = ThreeShiftXorPIR.class;
- } else if (protocol.equals("shift")) {
- operation = Shift.class;
- } else if (protocol.equals("ff")) {
- operation = FlipFlag.class;
- } else if (protocol.equals("inslbl")) {
- operation = InsLbl.class;
- } else if (protocol.equals("ulit")) {
- operation = ULiT.class;
- } else {
- System.out.println("Protocol " + protocol + " not supported");
- System.exit(-1);
- }
- Constructor<? extends Protocol> operationCtor = null;
- try {
- operationCtor = operation.getDeclaredConstructor(Communication.class, Communication.class);
- } catch (NoSuchMethodException | SecurityException e1) {
- e1.printStackTrace();
- }
- // For now all logic happens here. Eventually this will get wrapped
- // up in party specific classes.
- System.out.println("Starting " + party + "...");
- Metadata md = new Metadata(configFile);
- int numComs = Global.pipeline ? md.getNumTrees() + 1 : 1;
- Communication[] con1 = new Communication[numComs];
- Communication[] con2 = new Communication[numComs];
- if (party.equals("eddie")) {
- System.out.print("Waiting to establish debbie connections...");
- for (int i = 0; i < numComs; i++) {
- con1[i] = new Communication();
- con1[i].start(eddiePort1);
- eddiePort1 += 3;
- while (con1[i].getState() != Communication.STATE_CONNECTED)
- ;
- }
- System.out.println(" done!");
- System.out.print("Waiting to establish charlie connections...");
- for (int i = 0; i < numComs; i++) {
- con2[i] = new Communication();
- con2[i].start(eddiePort2);
- eddiePort2 += 3;
- while (con2[i].getState() != Communication.STATE_CONNECTED)
- ;
- }
- System.out.println(" done!");
- for (int i = 0; i < numComs; i++) {
- con1[i].setTcpNoDelay(true);
- con2[i].setTcpNoDelay(true);
- }
- try {
- Protocol p = operationCtor.newInstance(con1[0], con2[0]);
- if (protocol.equals("pirrtv")) {
- ((PIRRetrieve) p).setCons(con1, con2);
- }
- if (!Global.usePIR) {
- p.run(Party.Eddie, md, forestFile);
- } else {
- p.run(Party.Eddie, md);
- }
- } catch (InstantiationException | IllegalAccessException | IllegalArgumentException
- | InvocationTargetException e) {
- e.printStackTrace();
- }
- } else if (party.equals("debbie")) {
- System.out.print("Waiting to establish eddie connections...");
- for (int i = 0; i < numComs; i++) {
- con1[i] = new Communication();
- InetSocketAddress addr = new InetSocketAddress(eddieIp, eddiePort1);
- con1[i].connect(addr);
- eddiePort1 += 3;
- while (con1[i].getState() != Communication.STATE_CONNECTED)
- ;
- }
- System.out.println(" done!");
- System.out.print("Waiting to establish charlie connections...");
- for (int i = 0; i < numComs; i++) {
- con2[i] = new Communication();
- con2[i].start(debbiePort);
- debbiePort += 3;
- while (con2[i].getState() != Communication.STATE_CONNECTED)
- ;
- }
- System.out.println(" done!");
- for (int i = 0; i < numComs; i++) {
- con1[i].setTcpNoDelay(true);
- con2[i].setTcpNoDelay(true);
- }
- try {
- Protocol p = operationCtor.newInstance(con1[0], con2[0]);
- if (protocol.equals("pirrtv")) {
- ((PIRRetrieve) p).setCons(con1, con2);
- }
- if (!Global.usePIR) {
- p.run(Party.Debbie, md, forestFile);
- } else {
- p.run(Party.Debbie, md);
- }
- } catch (InstantiationException | IllegalAccessException | IllegalArgumentException
- | InvocationTargetException e) {
- e.printStackTrace();
- }
- } else if (party.equals("charlie")) {
- System.out.print("Waiting to establish eddie connections...");
- for (int i = 0; i < numComs; i++) {
- con1[i] = new Communication();
- InetSocketAddress addr = new InetSocketAddress(eddieIp, eddiePort2);
- con1[i].connect(addr);
- eddiePort2 += 3;
- while (con1[i].getState() != Communication.STATE_CONNECTED)
- ;
- }
- System.out.println(" done!");
- System.out.print("Waiting to establish debbie connections...");
- for (int i = 0; i < numComs; i++) {
- con2[i] = new Communication();
- InetSocketAddress addr = new InetSocketAddress(debbieIp, debbiePort);
- con2[i].connect(addr);
- debbiePort += 3;
- while (con2[i].getState() != Communication.STATE_CONNECTED)
- ;
- }
- System.out.println(" done!");
- for (int i = 0; i < numComs; i++) {
- con1[i].setTcpNoDelay(true);
- con2[i].setTcpNoDelay(true);
- }
- try {
- Protocol p = operationCtor.newInstance(con1[0], con2[0]);
- if (protocol.equals("pirrtv")) {
- ((PIRRetrieve) p).setCons(con1, con2);
- }
- if (!Global.usePIR) {
- p.run(Party.Charlie, md, forestFile);
- } else {
- p.run(Party.Charlie, md);
- }
- } catch (InstantiationException | IllegalAccessException | IllegalArgumentException
- | InvocationTargetException e) {
- e.printStackTrace();
- }
- } else {
- throw new NoSuchPartyException(party);
- }
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- for (int i = 0; i < numComs; i++) {
- con1[i].stop();
- con2[i].stop();
- }
- System.out.println(party + " exiting...");
- }
- }
|