summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJ08nY2017-10-14 01:14:07 +0200
committerJ08nY2017-10-15 00:19:18 +0200
commit114c3378e323b954bfd8c0470e489c9615978d58 (patch)
tree46281a9f45c91bdad518e7e21e5edff099b96c01
parent88f829e238097343a044f437c2d4cfeb8b6cfdff (diff)
downloadECTester-114c3378e323b954bfd8c0470e489c9615978d58.tar.gz
ECTester-114c3378e323b954bfd8c0470e489c9615978d58.tar.zst
ECTester-114c3378e323b954bfd8c0470e489c9615978d58.zip
-rw-r--r--src/cz/crcs/ectester/reader/DirtyLogger.java56
-rw-r--r--src/cz/crcs/ectester/reader/ECTester.java83
-rw-r--r--src/cz/crcs/ectester/reader/output/HTMLOutputWriter.java29
-rw-r--r--src/cz/crcs/ectester/reader/output/OutputLogger.java60
-rw-r--r--src/cz/crcs/ectester/reader/output/OutputWriter.java14
-rw-r--r--src/cz/crcs/ectester/reader/output/TeeOutputStream.java36
-rw-r--r--src/cz/crcs/ectester/reader/output/TextOutputWriter.java72
-rw-r--r--src/cz/crcs/ectester/reader/output/XMLOutputWriter.java29
-rw-r--r--src/cz/crcs/ectester/reader/response/Response.java85
-rw-r--r--src/cz/crcs/ectester/reader/test/Test.java21
-rw-r--r--src/cz/crcs/ectester/reader/test/TestSuite.java33
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