diff options
| author | J08nY | 2017-10-14 01:14:07 +0200 |
|---|---|---|
| committer | J08nY | 2017-10-15 00:19:18 +0200 |
| commit | 114c3378e323b954bfd8c0470e489c9615978d58 (patch) | |
| tree | 46281a9f45c91bdad518e7e21e5edff099b96c01 | |
| parent | 88f829e238097343a044f437c2d4cfeb8b6cfdff (diff) | |
| download | ECTester-114c3378e323b954bfd8c0470e489c9615978d58.tar.gz ECTester-114c3378e323b954bfd8c0470e489c9615978d58.tar.zst ECTester-114c3378e323b954bfd8c0470e489c9615978d58.zip | |
| -rw-r--r-- | src/cz/crcs/ectester/reader/DirtyLogger.java | 56 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/reader/ECTester.java | 83 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/reader/output/HTMLOutputWriter.java | 29 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/reader/output/OutputLogger.java | 60 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/reader/output/OutputWriter.java | 14 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/reader/output/TeeOutputStream.java | 36 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/reader/output/TextOutputWriter.java | 72 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/reader/output/XMLOutputWriter.java | 29 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/reader/response/Response.java | 85 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/reader/test/Test.java | 21 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/reader/test/TestSuite.java | 33 |
11 files changed, 352 insertions, 166 deletions
diff --git a/src/cz/crcs/ectester/reader/DirtyLogger.java b/src/cz/crcs/ectester/reader/DirtyLogger.java deleted file mode 100644 index 7a2c70d..0000000 --- a/src/cz/crcs/ectester/reader/DirtyLogger.java +++ /dev/null @@ -1,56 +0,0 @@ -package cz.crcs.ectester.reader; - -import java.io.FileWriter; -import java.io.IOException; -import java.io.OutputStream; - -/** - * @author Petr Svenda petr@svenda.com - * @author Jan Jancar johny@neuromancer.sk - */ -public class DirtyLogger { - FileWriter log; - boolean systemOut; - - public DirtyLogger(String filePath) throws IOException { - this(filePath, true); - } - - public DirtyLogger(String filePath, boolean systemOut) throws IOException { - if (filePath != null) - this.log = new FileWriter(filePath); - this.systemOut = systemOut; - } - - public void println() { - print("\n"); - } - - public void println(String logLine) { - logLine += "\n"; - print(logLine); - } - - public void print(String logLine) { - if (systemOut) { - System.out.print(logLine); - } - if (log != null) { - try { - log.write(logLine); - } catch (IOException ignored) { - } - } - } - - void flush() { - try { - if (log != null) log.flush(); - } catch (IOException ignored) { - } - } - - void close() throws IOException { - if (log != null) log.close(); - } -} diff --git a/src/cz/crcs/ectester/reader/ECTester.java b/src/cz/crcs/ectester/reader/ECTester.java index a43c945..c0c282c 100644 --- a/src/cz/crcs/ectester/reader/ECTester.java +++ b/src/cz/crcs/ectester/reader/ECTester.java @@ -22,13 +22,13 @@ package cz.crcs.ectester.reader; import cz.crcs.ectester.applet.ECTesterApplet; -import static cz.crcs.ectester.applet.ECTesterApplet.KeyAgreement_ALG_EC_SVDP_DH; import cz.crcs.ectester.applet.EC_Consts; import cz.crcs.ectester.data.EC_Store; import cz.crcs.ectester.reader.command.Command; import cz.crcs.ectester.reader.ec.EC_Category; import cz.crcs.ectester.reader.ec.EC_Data; import cz.crcs.ectester.reader.ec.EC_Params; +import cz.crcs.ectester.reader.output.*; import cz.crcs.ectester.reader.response.Response; import cz.crcs.ectester.reader.test.TestSuite; import javacard.security.KeyPair; @@ -39,6 +39,8 @@ import java.io.*; import java.nio.file.Files; import java.util.*; +import static cz.crcs.ectester.applet.ECTesterApplet.KeyAgreement_ALG_EC_SVDP_DH; + /** * Reader part of ECTester, a tool for testing Elliptic curve support on javacards. * @@ -48,7 +50,8 @@ import java.util.*; public class ECTester { private CardMngr cardManager; - private DirtyLogger systemOutLogger; + private OutputLogger logger; + private OutputWriter writer; private EC_Store dataStore; private Config cfg; @@ -101,7 +104,22 @@ public class ECTester { cardManager.send(SELECT_ECTESTERAPPLET); } - systemOutLogger = new DirtyLogger(cfg.log, true); + logger = new OutputLogger(true, cfg.log); + if (cfg.format == null) { + writer = new TextOutputWriter(logger.getPrintStream()); + } else { + switch (cfg.format) { + case "text": + writer = new TextOutputWriter(logger.getPrintStream()); + break; + case "xml": + writer = new XMLOutputWriter(); + break; + case "html": + writer = new HTMLOutputWriter(); + break; + } + } //do action if (cli.hasOption("export")) { @@ -118,7 +136,7 @@ public class ECTester { //disconnect cardManager.disconnectFromCard(); - systemOutLogger.close(); + logger.close(); } catch (MissingOptionException moex) { System.err.println("Missing required options, one of:"); @@ -157,11 +175,11 @@ public class ECTester { } catch (ParseException | IOException ex) { System.err.println(ex.getMessage()); } catch (CardException ex) { - if (systemOutLogger != null) - systemOutLogger.println(ex.getMessage()); + if (logger != null) + logger.println(ex.getMessage()); } finally { - if (systemOutLogger != null) - systemOutLogger.flush(); + if (logger != null) + logger.flush(); } } @@ -223,7 +241,7 @@ public class ECTester { actions.addOption(Option.builder("dh").longOpt("ecdh").desc("Do ECDH, [count] times.").hasArg().argName("count").optionalArg(true).build()); actions.addOption(Option.builder("dhc").longOpt("ecdhc").desc("Do ECDHC, [count] times.").hasArg().argName("count").optionalArg(true).build()); actions.addOption(Option.builder("dsa").longOpt("ecdsa").desc("Sign data with ECDSA, [count] times.").hasArg().argName("count").optionalArg(true).build()); - + opts.addOptionGroup(actions); OptionGroup size = new OptionGroup(); @@ -259,6 +277,7 @@ public class ECTester { opts.addOption(Option.builder("o").longOpt("output").desc("Output into file <output_file>.").hasArg().argName("output_file").build()); opts.addOption(Option.builder("l").longOpt("log").desc("Log output into file [log_file].").hasArg().argName("log_file").optionalArg(true).build()); opts.addOption(Option.builder("v").longOpt("verbose").desc("Turn on verbose logging.").build()); + opts.addOption(Option.builder().longOpt("format").desc("Output format to use.").hasArg().argName("format").build()); opts.addOption(Option.builder("f").longOpt("fresh").desc("Generate fresh keys (set domain parameters before every generation).").build()); opts.addOption(Option.builder("s").longOpt("simulate").desc("Simulate a card with jcardsim instead of using a terminal.").build()); @@ -328,7 +347,9 @@ public class ECTester { } sent.add(export); - systemOutLogger.println(Response.toString(sent)); + for (Response r : sent) { + writer.printResponse(r); + } EC_Params exported = new EC_Params(domain, export.getParams()); @@ -357,7 +378,7 @@ public class ECTester { while (generated < cfg.generateAmount || cfg.generateAmount == 0) { if ((cfg.fresh || generated == 0) && curve != null) { Response fresh = curve.send(); - systemOutLogger.println(fresh.toString()); + logger.println(fresh.toString()); } Command.Generate generate = new Command.Generate(cardManager, ECTesterApplet.KEYPAIR_LOCAL); @@ -375,7 +396,7 @@ public class ECTester { break; } } - systemOutLogger.println(response.toString()); + logger.println(response.toString()); String pub = Util.bytesToHex(export.getParameter(ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.PARAMETER_W), false); String priv = Util.bytesToHex(export.getParameter(ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.PARAMETER_S), false); @@ -385,7 +406,7 @@ public class ECTester { generated++; } Response cleanup = new Command.Cleanup(cardManager).send(); - systemOutLogger.println(cleanup.toString()); + logger.println(cleanup.toString()); keysFile.close(); } @@ -401,10 +422,10 @@ public class ECTester { switch (cfg.testSuite) { case "default": - suite = new TestSuite.Default(dataStore, cfg, systemOutLogger); + suite = new TestSuite.Default(dataStore, cfg, writer); break; case "test-vectors": - suite = new TestSuite.TestVectors(dataStore, cfg, systemOutLogger); + suite = new TestSuite.TestVectors(dataStore, cfg, writer); break; default: // These tests are dangerous, prompt before them. @@ -413,8 +434,8 @@ public class ECTester { if (!cfg.yes) { System.out.print("Do you want to proceed? (y/n): "); Scanner in = new Scanner(System.in); - String confirmation = in.nextLine(); - if (!Arrays.asList("yes", "YES", "y", "Y").contains(confirmation)) { + String confirmation = in.nextLine().toLowerCase(); + if (!Arrays.asList("yes","y").contains(confirmation)) { return; } in.close(); @@ -423,13 +444,13 @@ public class ECTester { switch (cfg.testSuite) { case "wrong": - suite = new TestSuite.Wrong(dataStore, cfg, systemOutLogger); + suite = new TestSuite.Wrong(dataStore, cfg, writer); break; case "composite": - suite = new TestSuite.Composite(dataStore, cfg, systemOutLogger); + suite = new TestSuite.Composite(dataStore, cfg, writer); break; case "invalid": - suite = new TestSuite.Invalid(dataStore, cfg, systemOutLogger); + suite = new TestSuite.Invalid(dataStore, cfg, writer); break; default: System.err.println("Unknown test suite."); @@ -455,7 +476,9 @@ public class ECTester { if (curve != null) prepare.add(curve.send()); - systemOutLogger.println(Response.toString(prepare)); + for (Response r : prepare) { + writer.printResponse(r); + } byte pubkey = (cfg.anyPublicKey || cfg.anyKey) ? ECTesterApplet.KEYPAIR_REMOTE : ECTesterApplet.KEYPAIR_LOCAL; byte privkey = (cfg.anyPrivateKey || cfg.anyKey) ? ECTesterApplet.KEYPAIR_REMOTE : ECTesterApplet.KEYPAIR_LOCAL; @@ -479,7 +502,9 @@ public class ECTester { Response.ECDH perform = new Command.ECDH(cardManager, pubkey, privkey, ECTesterApplet.EXPORT_TRUE, EC_Consts.CORRUPTION_NONE, cfg.ECDHKA).send(); ecdh.add(perform); - systemOutLogger.println(Response.toString(ecdh)); + for (Response r : ecdh) { + writer.printResponse(r); + } if (!perform.successful() || !perform.hasSecret()) { if (retry < 10) { @@ -498,7 +523,7 @@ public class ECTester { ++done; } Response cleanup = new Command.Cleanup(cardManager).send(); - systemOutLogger.println(cleanup.toString()); + logger.println(cleanup.toString()); if (out != null) out.close(); @@ -536,7 +561,9 @@ public class ECTester { if (curve != null) prepare.add(curve.send()); - systemOutLogger.println(Response.toString(prepare)); + for (Response r : prepare) { + writer.printResponse(r); + } FileWriter out = null; if (cfg.output != null) { @@ -552,7 +579,9 @@ public class ECTester { Response.ECDSA perform = new Command.ECDSA(cardManager, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_TRUE, data).send(); ecdsa.add(perform); - systemOutLogger.println(Response.toString(ecdsa)); + for (Response r : ecdsa) { + writer.printResponse(r); + } if (!perform.successful() || !perform.hasSignature()) { if (retry < 10) { @@ -571,7 +600,7 @@ public class ECTester { ++done; } Response cleanup = new Command.Cleanup(cardManager).send(); - systemOutLogger.println(cleanup.toString()); + logger.println(cleanup.toString()); if (out != null) out.close(); @@ -617,6 +646,7 @@ public class ECTester { public boolean fresh = false; public boolean simulate = false; public boolean yes = false; + public String format; //Action-related options public String listNamed; @@ -666,6 +696,7 @@ public class ECTester { fresh = cli.hasOption("fresh"); simulate = cli.hasOption("simulate"); yes = cli.hasOption("yes"); + format = cli.getOptionValue("format"); if (cli.hasOption("list-named")) { listNamed = cli.getOptionValue("list-named"); diff --git a/src/cz/crcs/ectester/reader/output/HTMLOutputWriter.java b/src/cz/crcs/ectester/reader/output/HTMLOutputWriter.java new file mode 100644 index 0000000..c20771d --- /dev/null +++ b/src/cz/crcs/ectester/reader/output/HTMLOutputWriter.java @@ -0,0 +1,29 @@ +package cz.crcs.ectester.reader.output; + +import cz.crcs.ectester.reader.response.Response; +import cz.crcs.ectester.reader.test.Test; + +/** + * @author Jan Jancar johny@neuromancer.sk + */ +public class HTMLOutputWriter implements OutputWriter { + @Override + public void begin() { + + } + + @Override + public void printResponse(Response r) { + + } + + @Override + public void printTest(Test t) { + + } + + @Override + public void end() { + + } +}
\ No newline at end of file diff --git a/src/cz/crcs/ectester/reader/output/OutputLogger.java b/src/cz/crcs/ectester/reader/output/OutputLogger.java new file mode 100644 index 0000000..bf47a1f --- /dev/null +++ b/src/cz/crcs/ectester/reader/output/OutputLogger.java @@ -0,0 +1,60 @@ +package cz.crcs.ectester.reader.output; + +import java.io.*; +import java.util.LinkedList; +import java.util.List; + +/** + * @author Petr Svenda petr@svenda.com + * @author Jan Jancar johny@neuromancer.sk + */ +public class OutputLogger { + private OutputStream out; + private PrintStream print; + + public OutputLogger(boolean systemOut, String... filePaths) throws IOException { + List<OutputStream> streams = new LinkedList<>(); + for (String filePath : filePaths) { + if (filePath != null) { + streams.add(new FileOutputStream(filePath)); + } + } + if (systemOut) { + streams.add(System.out); + } + this.out = new TeeOutputStream(streams.toArray(new OutputStream[0])); + this.print = new PrintStream(this.out); + } + + public OutputLogger(String filePath) throws IOException { + this(true, filePath); + } + + public OutputStream getOutputStream() { + return this.out; + } + + public PrintStream getPrintStream() { + return this.print; + } + + public void println() { + print.println(); + } + + public void println(String logLine) { + print.println(logLine); + } + + public void print(String logLine) { + print.print(logLine); + } + + public void flush() { + print.flush(); + } + + public void close() { + print.close(); + } +} diff --git a/src/cz/crcs/ectester/reader/output/OutputWriter.java b/src/cz/crcs/ectester/reader/output/OutputWriter.java new file mode 100644 index 0000000..ddcef8c --- /dev/null +++ b/src/cz/crcs/ectester/reader/output/OutputWriter.java @@ -0,0 +1,14 @@ +package cz.crcs.ectester.reader.output; + +import cz.crcs.ectester.reader.response.Response; +import cz.crcs.ectester.reader.test.Test; + +/** + * @author Jan Jancar johny@neuromancer.sk + */ +public interface OutputWriter { + void begin(); + void printResponse(Response r); + void printTest(Test t); + void end(); +} diff --git a/src/cz/crcs/ectester/reader/output/TeeOutputStream.java b/src/cz/crcs/ectester/reader/output/TeeOutputStream.java new file mode 100644 index 0000000..e18d32b --- /dev/null +++ b/src/cz/crcs/ectester/reader/output/TeeOutputStream.java @@ -0,0 +1,36 @@ +package cz.crcs.ectester.reader.output; + +import java.io.IOException; +import java.io.OutputStream; + +/** + * @author Jan Jancar johny@neuromancer.sk + */ +public class TeeOutputStream extends OutputStream { + private OutputStream[] outputs; + + public TeeOutputStream(OutputStream... outputs) { + this.outputs = outputs; + } + + @Override + public void write(int b) throws IOException { + for (OutputStream out : outputs) { + out.write(b); + } + } + + @Override + public void flush() throws IOException { + for (OutputStream out :outputs) { + out.flush(); + } + } + + @Override + public void close() throws IOException { + for (OutputStream out :outputs) { + out.close(); + } + } +} diff --git a/src/cz/crcs/ectester/reader/output/TextOutputWriter.java b/src/cz/crcs/ectester/reader/output/TextOutputWriter.java new file mode 100644 index 0000000..7e62e89 --- /dev/null +++ b/src/cz/crcs/ectester/reader/output/TextOutputWriter.java @@ -0,0 +1,72 @@ +package cz.crcs.ectester.reader.output; + +import cz.crcs.ectester.reader.Util; +import cz.crcs.ectester.reader.response.Response; +import cz.crcs.ectester.reader.test.Test; + +import java.io.PrintStream; + +/** + * @author Jan Jancar johny@neuromancer.sk + */ +public class TextOutputWriter implements OutputWriter { + private PrintStream output; + + public TextOutputWriter(PrintStream output) { + this.output = output; + } + + @Override + public void begin() { + } + + private String testPrefix(Test t) { + return (t.ok() ? "OK" : "NOK"); + } + + private String responseSuffix(Response r) { + StringBuilder suffix = new StringBuilder(); + for (int j = 0; j < r.getNumSW(); ++j) { + short sw = r.getSW(j); + if (sw != 0) { + suffix.append(" ").append(Util.getSWString(sw)); + } + } + if (suffix.length() == 0) { + suffix.append(" [").append(Util.getSW(r.getNaturalSW())).append("]"); + } + return String.format("%4d ms : %s", r.getDuration() / 1000000, suffix); + } + + @Override + public void printResponse(Response r) { + String out = ""; + out += String.format("%-62s:", r.getDescription()) + " : "; + out += responseSuffix(r); + output.println(out); + output.flush(); + } + + @Override + public void printTest(Test t) { + if (!t.hasRun()) + return; + + String out = ""; + if (t instanceof Test.Simple) { + Test.Simple test = (Test.Simple) t; + out += String.format("%-62s:", testPrefix(t) + " " + test.getDescription()) + " : "; + out += responseSuffix(test.getResponse()); + } else if (t instanceof Test.Compound) { + Test.Compound test = (Test.Compound) t; + out += String.format("%-62s:", testPrefix(t) + " " + test.getDescription()); + } + + output.println(out); + output.flush(); + } + + @Override + public void end() { + } +} diff --git a/src/cz/crcs/ectester/reader/output/XMLOutputWriter.java b/src/cz/crcs/ectester/reader/output/XMLOutputWriter.java new file mode 100644 index 0000000..2755501 --- /dev/null +++ b/src/cz/crcs/ectester/reader/output/XMLOutputWriter.java @@ -0,0 +1,29 @@ +package cz.crcs.ectester.reader.output; + +import cz.crcs.ectester.reader.response.Response; +import cz.crcs.ectester.reader.test.Test; + +/** + * @author Jan Jancar johny@neuromancer.sk + */ +public class XMLOutputWriter implements OutputWriter { + @Override + public void begin() { + + } + + @Override + public void printResponse(Response r) { + + } + + @Override + public void printTest(Test t) { + + } + + @Override + public void end() { + + } +}
\ No newline at end of file diff --git a/src/cz/crcs/ectester/reader/response/Response.java b/src/cz/crcs/ectester/reader/response/Response.java index 59b24fc..962261e 100644 --- a/src/cz/crcs/ectester/reader/response/Response.java +++ b/src/cz/crcs/ectester/reader/response/Response.java @@ -114,46 +114,7 @@ public abstract class Response { return this.success; } - @Override - public abstract String toString(); - - public String toString(String inner) { - StringBuilder suffix = new StringBuilder(); - for (int j = 0; j < getNumSW(); ++j) { - short sw = getSW(j); - if (sw != 0) { - suffix.append(" ").append(Util.getSWString(sw)); - } - } - if (suffix.length() == 0) { - suffix.append(" [").append(Util.getSW(getNaturalSW())).append("]"); - } - return String.format("%-62s:%4d ms : %s", inner, time / 1000000, suffix); - } - - public static String toString(List<Response> responses) { - return toString(responses, null); - } - - public static String toString(List<Response> responses, String prefix) { - if (prefix != null) - prefix += " | "; - StringBuilder out = new StringBuilder(); - for (int i = 0; i < responses.size(); ++i) { - Response r = responses.get(i); - - if (prefix != null) - out.append(prefix); - - String message = r.toString(); - out.append(message); - if (i < responses.size() - 1) { - out.append("\n"); - } - } - return out.toString(); - } - + public abstract String getDescription(); /** * @@ -168,8 +129,8 @@ public abstract class Response { } @Override - public String toString() { - return super.toString(String.format("Allocate KeyAgreement(%s) object", Util.getKATypeString(this.kaType))); + public String getDescription() { + return String.format("Allocated KeyAgreement(%s) object", Util.getKATypeString(this.kaType)); } } @@ -193,7 +154,7 @@ public abstract class Response { } @Override - public String toString() { + public String getDescription() { String field = keyClass == KeyPair.ALG_EC_FP ? "ALG_EC_FP" : "ALG_EC_F2M"; String key; if (keyPair == ECTesterApplet.KEYPAIR_BOTH) { @@ -201,7 +162,7 @@ public abstract class Response { } else { key = ((keyPair == ECTesterApplet.KEYPAIR_LOCAL) ? "local" : "remote") + " keypair"; } - return super.toString(String.format("Allocated %s %db %s", key, keyLength, field)); + return String.format("Allocated %s %db %s", key, keyLength, field); } } @@ -223,14 +184,14 @@ public abstract class Response { } @Override - public String toString() { + public String getDescription() { String key; if (keyPair == ECTesterApplet.KEYPAIR_BOTH) { key = "both keypairs"; } else { key = ((keyPair == ECTesterApplet.KEYPAIR_LOCAL) ? "local" : "remote") + " keypair"; } - return super.toString(String.format("Cleared %s", key)); + return String.format("Cleared %s", key); } } @@ -257,7 +218,7 @@ public abstract class Response { } @Override - public String toString() { + public String getDescription() { String name; switch (curve) { case EC_Consts.CURVE_default: @@ -287,7 +248,7 @@ public abstract class Response { } else { pair = ((keyPair == ECTesterApplet.KEYPAIR_LOCAL) ? "local" : "remote") + " keypair"; } - return super.toString(String.format("Set %s %s parameters on %s", name, what, pair)); + return String.format("Set %s %s parameters on %s", name, what, pair); } } @@ -317,7 +278,7 @@ public abstract class Response { } @Override - public String toString() { + public String getDescription() { String corrupt = Util.getCorruption(corruption); String pair; @@ -326,7 +287,7 @@ public abstract class Response { } else { pair = ((keyPair == ECTesterApplet.KEYPAIR_LOCAL) ? "local" : "remote") + " keypair"; } - return super.toString(String.format("Corrupted params of %s, %s", pair, corrupt)); + return String.format("Corrupted params of %s, %s", pair, corrupt); } } @@ -348,14 +309,14 @@ public abstract class Response { } @Override - public String toString() { + public String getDescription() { String key; if (keyPair == ECTesterApplet.KEYPAIR_BOTH) { key = "both keypairs"; } else { key = ((keyPair == ECTesterApplet.KEYPAIR_LOCAL) ? "local" : "remote") + " keypair"; } - return super.toString(String.format("Generated %s", key)); + return String.format("Generated %s", key); } } @@ -452,7 +413,7 @@ public abstract class Response { } @Override - public String toString() { + public String getDescription() { String source; if (key == EC_Consts.KEY_BOTH) { source = "both keys"; @@ -465,7 +426,7 @@ public abstract class Response { } else { pair = ((keyPair == ECTesterApplet.KEYPAIR_LOCAL) ? "local" : "remote") + " keypair"; } - return super.toString(String.format("Exported params from %s of %s", source, pair)); + return String.format("Exported params from %s of %s", source, pair); } } @@ -504,7 +465,7 @@ public abstract class Response { } @Override - public String toString() { + public String getDescription() { String algo = Util.getKA(type); String pub = pubkey == ECTesterApplet.KEYPAIR_LOCAL ? "local" : "remote"; @@ -516,7 +477,7 @@ public abstract class Response { } else { validity = Util.getCorruption(corruption); } - return super.toString(String.format("%s of %s pubkey and %s privkey(%s point)", algo, pub, priv, validity)); + return String.format("%s of %s pubkey and %s privkey(%s point)", algo, pub, priv, validity); } } @@ -547,10 +508,10 @@ public abstract class Response { } @Override - public String toString() { + public String getDescription() { String key = keyPair == ECTesterApplet.KEYPAIR_LOCAL ? "local" : "remote"; String data = raw == null ? "random" : "provided"; - return super.toString(String.format("ECDSA with %s keypair(%s data)", key, data)); + return String.format("ECDSA with %s keypair(%s data)", key, data); } } @@ -566,8 +527,8 @@ public abstract class Response { } @Override - public String toString() { - return super.toString("Requested JCSystem object deletion"); + public String getDescription() { + return "Requested JCSystem object deletion"; } } @@ -584,8 +545,8 @@ public abstract class Response { } @Override - public String toString() { - return super.toString("Support of ECDH, ECDHC, ECDSA"); + public String getDescription() { + return "Support of ECDH, ECDHC, ECDSA"; } } } diff --git a/src/cz/crcs/ectester/reader/test/Test.java b/src/cz/crcs/ectester/reader/test/Test.java index cd0cf49..cb885e5 100644 --- a/src/cz/crcs/ectester/reader/test/Test.java +++ b/src/cz/crcs/ectester/reader/test/Test.java @@ -31,6 +31,8 @@ public abstract class Test { public abstract void run() throws CardException; + public abstract String getDescription(); + /** * A result of a Test. */ @@ -93,12 +95,8 @@ public abstract class Test { } @Override - public String toString() { - if (hasRun) { - return (ok() ? "OK " : "NOK") + " " + response.toString(); - } else { - return ""; - } + public String getDescription() { + return response.getDescription(); } } @@ -140,6 +138,10 @@ public abstract class Test { }, any); } + public Test[] getTests() { + return tests; + } + @Override public boolean ok() { return result == Result.SUCCESS; @@ -147,10 +149,15 @@ public abstract class Test { @Override public void run() throws CardException { - for (Test test: tests) { + for (Test test : tests) { test.run(); } result = callback.apply(tests); } + + @Override + public String getDescription() { + return ""; + } } } diff --git a/src/cz/crcs/ectester/reader/test/TestSuite.java b/src/cz/crcs/ectester/reader/test/TestSuite.java index 7ce9e0f..33c462f 100644 --- a/src/cz/crcs/ectester/reader/test/TestSuite.java +++ b/src/cz/crcs/ectester/reader/test/TestSuite.java @@ -4,11 +4,12 @@ import cz.crcs.ectester.applet.ECTesterApplet; import cz.crcs.ectester.applet.EC_Consts; import cz.crcs.ectester.data.EC_Store; import cz.crcs.ectester.reader.CardMngr; -import cz.crcs.ectester.reader.DirtyLogger; +import cz.crcs.ectester.reader.output.OutputLogger; import cz.crcs.ectester.reader.ECTester; import cz.crcs.ectester.reader.Util; import cz.crcs.ectester.reader.command.Command; import cz.crcs.ectester.reader.ec.*; +import cz.crcs.ectester.reader.output.OutputWriter; import cz.crcs.ectester.reader.response.Response; import javacard.security.KeyPair; @@ -23,24 +24,26 @@ public abstract class TestSuite { EC_Store dataStore; ECTester.Config cfg; - DirtyLogger systemOut; + OutputWriter writer; String name; List<Test> tests = new LinkedList<>(); - TestSuite(EC_Store dataStore, ECTester.Config cfg, DirtyLogger systemOut, String name) { + TestSuite(EC_Store dataStore, ECTester.Config cfg, OutputWriter writer, String name) { this.dataStore = dataStore; this.cfg = cfg; - this.systemOut = systemOut; + this.writer = writer; this.name = name; } public List<Test> run(CardMngr cardManager) throws CardException, IOException { + writer.begin(); for (Test t : tests) { if (!t.hasRun()) { t.run(); - systemOut.println(t.toString()); + writer.printTest(t); } } + writer.end(); return tests; } @@ -104,8 +107,8 @@ public abstract class TestSuite { public static class Default extends TestSuite { - public Default(EC_Store dataStore, ECTester.Config cfg, DirtyLogger systemOut) { - super(dataStore, cfg, systemOut, "default"); + public Default(EC_Store dataStore, ECTester.Config cfg, OutputWriter writer) { + super(dataStore, cfg, writer, "default"); } @Override @@ -157,8 +160,8 @@ public abstract class TestSuite { public static class TestVectors extends TestSuite { - public TestVectors(EC_Store dataStore, ECTester.Config cfg, DirtyLogger systemOut) { - super(dataStore, cfg, systemOut, "test"); + public TestVectors(EC_Store dataStore, ECTester.Config cfg, OutputWriter writer) { + super(dataStore, cfg, writer, "test"); } @Override @@ -213,8 +216,8 @@ public abstract class TestSuite { public static class Composite extends TestSuite { - public Composite(EC_Store dataStore, ECTester.Config cfg, DirtyLogger systemOut) { - super(dataStore, cfg, systemOut, "composite"); + public Composite(EC_Store dataStore, ECTester.Config cfg, OutputWriter writer) { + super(dataStore, cfg, writer, "composite"); } @Override @@ -252,8 +255,8 @@ public abstract class TestSuite { public static class Invalid extends TestSuite { - public Invalid(EC_Store dataStore, ECTester.Config cfg, DirtyLogger systemOut) { - super(dataStore, cfg, systemOut, "invalid"); + public Invalid(EC_Store dataStore, ECTester.Config cfg, OutputWriter writer) { + super(dataStore, cfg, writer, "invalid"); } @Override @@ -299,8 +302,8 @@ public abstract class TestSuite { public static class Wrong extends TestSuite { - public Wrong(EC_Store dataStore, ECTester.Config cfg, DirtyLogger systemOut) { - super(dataStore, cfg, systemOut, "wrong"); + public Wrong(EC_Store dataStore, ECTester.Config cfg, OutputWriter writer) { + super(dataStore, cfg, writer, "wrong"); } @Override |
