aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJ08nY2018-02-11 03:04:40 +0100
committerJ08nY2018-02-11 03:04:40 +0100
commit5097e783310242cfb782c62d84d65a4b3a387a72 (patch)
treeae513c0401b16ac4e109492e35c15232cdddcb55
parent91e83f3caea0d08c59bfbe3603cfa413ef1f0624 (diff)
downloadECTester-5097e783310242cfb782c62d84d65a4b3a387a72.tar.gz
ECTester-5097e783310242cfb782c62d84d65a4b3a387a72.tar.zst
ECTester-5097e783310242cfb782c62d84d65a4b3a387a72.zip
-rw-r--r--src/cz/crcs/ectester/common/output/TeeTestWriter.java43
-rw-r--r--src/cz/crcs/ectester/common/util/FileUtil.java33
-rw-r--r--src/cz/crcs/ectester/reader/ECTesterReader.java60
-rw-r--r--src/cz/crcs/ectester/reader/output/FileTestWriter.java54
4 files changed, 150 insertions, 40 deletions
diff --git a/src/cz/crcs/ectester/common/output/TeeTestWriter.java b/src/cz/crcs/ectester/common/output/TeeTestWriter.java
new file mode 100644
index 0000000..35912fa
--- /dev/null
+++ b/src/cz/crcs/ectester/common/output/TeeTestWriter.java
@@ -0,0 +1,43 @@
+package cz.crcs.ectester.common.output;
+
+import cz.crcs.ectester.common.test.Test;
+import cz.crcs.ectester.common.test.TestSuite;
+
+/**
+ * @author Jan Jancar johny@neuromancer.sk
+ */
+public class TeeTestWriter implements TestWriter {
+ protected TestWriter[] writers;
+
+ public TeeTestWriter(TestWriter... writers) {
+ this.writers = writers;
+ }
+
+ @Override
+ public void begin(TestSuite suite) {
+ for (TestWriter writer : writers) {
+ writer.begin(suite);
+ }
+ }
+
+ @Override
+ public void outputTest(Test t) {
+ for (TestWriter writer : writers) {
+ writer.outputTest(t);
+ }
+ }
+
+ @Override
+ public void outputError(Test t, Throwable cause) {
+ for (TestWriter writer : writers) {
+ writer.outputError(t, cause);
+ }
+ }
+
+ @Override
+ public void end() {
+ for (TestWriter writer : writers) {
+ writer.end();
+ }
+ }
+}
diff --git a/src/cz/crcs/ectester/common/util/FileUtil.java b/src/cz/crcs/ectester/common/util/FileUtil.java
new file mode 100644
index 0000000..790596b
--- /dev/null
+++ b/src/cz/crcs/ectester/common/util/FileUtil.java
@@ -0,0 +1,33 @@
+package cz.crcs.ectester.common.util;
+
+import cz.crcs.ectester.common.output.TeeOutputStream;
+
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * @author Jan Jancar johny@neuromancer.sk
+ */
+public class FileUtil {
+ public static OutputStream openStream(String[] files) throws FileNotFoundException {
+ if (files == null) {
+ return null;
+ }
+ List<OutputStream> outs = new LinkedList<>();
+ for (String fileOut : files) {
+ outs.add(new FileOutputStream(fileOut));
+ }
+ return new TeeOutputStream(outs.toArray(new OutputStream[0]));
+ }
+
+ public static OutputStreamWriter openFiles(String[] files) throws FileNotFoundException {
+ if (files == null) {
+ return null;
+ }
+ return new OutputStreamWriter(openStream(files));
+ }
+}
diff --git a/src/cz/crcs/ectester/reader/ECTesterReader.java b/src/cz/crcs/ectester/reader/ECTesterReader.java
index 22621ef..ef2d235 100644
--- a/src/cz/crcs/ectester/reader/ECTesterReader.java
+++ b/src/cz/crcs/ectester/reader/ECTesterReader.java
@@ -28,15 +28,12 @@ import cz.crcs.ectester.common.cli.CLITools;
import cz.crcs.ectester.common.ec.EC_Params;
import cz.crcs.ectester.common.output.OutputLogger;
import cz.crcs.ectester.common.output.TestWriter;
-import cz.crcs.ectester.common.test.TestException;
import cz.crcs.ectester.common.util.ByteUtil;
import cz.crcs.ectester.common.util.CardUtil;
+import cz.crcs.ectester.common.util.FileUtil;
import cz.crcs.ectester.data.EC_Store;
import cz.crcs.ectester.reader.command.Command;
-import cz.crcs.ectester.reader.output.ResponseWriter;
-import cz.crcs.ectester.reader.output.TextTestWriter;
-import cz.crcs.ectester.reader.output.XMLTestWriter;
-import cz.crcs.ectester.reader.output.YAMLTestWriter;
+import cz.crcs.ectester.reader.output.*;
import cz.crcs.ectester.reader.response.Response;
import cz.crcs.ectester.reader.test.*;
import javacard.security.KeyPair;
@@ -285,7 +282,7 @@ public class ECTesterReader {
opts.addOptionGroup(key);
opts.addOption(Option.builder("i").longOpt("input").desc("Input from fileĀ <input_file>, for ECDSA signing.").hasArg().argName("input_file").build());
- opts.addOption(Option.builder("o").longOpt("output").desc("Output into file <output_file>.").hasArg().argName("output_file").build());
+ opts.addOption(Option.builder("o").longOpt("output").desc("Output into file <output_file>. The file can be prefixed by the format (one of text,yml,xml), such as: xml:<output_file>.").hasArgs().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. One of: text,yml,xml.").hasArg().argName("format").build());
@@ -332,7 +329,7 @@ public class ECTesterReader {
EC_Params exported = new EC_Params(domain, export.getParams());
- FileOutputStream out = new FileOutputStream(cfg.output);
+ OutputStream out = FileUtil.openStream(cfg.outputs);
exported.writeCSV(out);
out.close();
}
@@ -346,11 +343,11 @@ public class ECTesterReader {
private void generate() throws CardException, IOException {
byte keyClass = cfg.primeField ? KeyPair.ALG_EC_FP : KeyPair.ALG_EC_F2M;
- Response allocate = new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_LOCAL, (short) cfg.bits, keyClass).send();
+ Response allocate = new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_LOCAL, cfg.bits, keyClass).send();
respWriter.outputResponse(allocate);
Command curve = Command.prepareCurve(cardManager, EC_Store.getInstance(), cfg, ECTesterApplet.KEYPAIR_LOCAL, (short) cfg.bits, keyClass);
- FileWriter keysFile = new FileWriter(cfg.output);
+ OutputStreamWriter keysFile = FileUtil.openFiles(cfg.outputs);
keysFile.write("index;time;pubW;privS\n");
int generated = 0;
@@ -394,26 +391,10 @@ public class ECTesterReader {
/**
* Tests Elliptic curve support for a given curve/curves.
*
- * @throws IOException if an IO error occurs when writing to key file.
+ * @throws IOException if an IO error occurs
*/
- private void test() throws IOException, ParserConfigurationException {
- TestWriter writer = null;
- if (cfg.format == null) {
- writer = new TextTestWriter(logger.getPrintStream());
- } else {
- switch (cfg.format) {
- case "text":
- writer = new TextTestWriter(logger.getPrintStream());
- break;
- case "xml":
- writer = new XMLTestWriter(logger.getOutputStream());
- break;
- case "yaml":
- case "yml":
- writer = new YAMLTestWriter(logger.getPrintStream());
- break;
- }
- }
+ private void test() throws ParserConfigurationException, IOException {
+ TestWriter writer = new FileTestWriter(cfg.format, true, cfg.outputs);
CardTestSuite suite;
@@ -488,9 +469,9 @@ public class ECTesterReader {
generate.add(Command.prepareKey(cardManager, EC_Store.getInstance(), cfg, ECTesterApplet.KEYPAIR_REMOTE));
}
- FileWriter out = null;
- if (cfg.output != null) {
- out = new FileWriter(cfg.output);
+ OutputStreamWriter out = null;
+ if (cfg.outputs != null) {
+ out = FileUtil.openFiles(cfg.outputs);
out.write("index;time;pubW;privS;secret\n");
}
@@ -570,9 +551,8 @@ public class ECTesterReader {
respWriter.outputResponse(r);
}
- FileWriter out = null;
- if (cfg.output != null) {
- out = new FileWriter(cfg.output);
+ OutputStreamWriter out = FileUtil.openFiles(cfg.outputs);
+ if (out != null) {
out.write("index;time;signature\n");
}
@@ -647,7 +627,7 @@ public class ECTesterReader {
public boolean verbose = false;
public String input;
- public String output;
+ public String[] outputs;
public boolean fresh = false;
public boolean simulate = false;
public boolean yes = false;
@@ -698,7 +678,7 @@ public class ECTesterReader {
verbose = cli.hasOption("verbose");
input = cli.getOptionValue("input");
- output = cli.getOptionValue("output");
+ outputs = cli.getOptionValues("output");
fresh = cli.hasOption("fresh");
simulate = cli.hasOption("simulate");
yes = cli.hasOption("yes");
@@ -708,9 +688,9 @@ public class ECTesterReader {
return true;
}
- format = cli.getOptionValue("format", "text");
+ format = cli.getOptionValue("format");
String formats[] = new String[]{"text", "xml", "yaml", "yml"};
- if (!Arrays.asList(formats).contains(format)) {
+ if (format != null && !Arrays.asList(formats).contains(format)) {
System.err.println("Wrong output format " + format + ". Should be one of " + Arrays.toString(formats));
return false;
}
@@ -742,7 +722,7 @@ public class ECTesterReader {
System.err.println("Specifying a curve for curve export makes no sense.");
return false;
}
- if (output == null) {
+ if (outputs == null) {
System.err.println("You have to specify an output file for curve parameter export.");
return false;
}
@@ -759,7 +739,7 @@ public class ECTesterReader {
System.err.println("Keys should not be specified when generating keys.");
return false;
}
- if (output == null) {
+ if (outputs == null) {
System.err.println("You have to specify an output file for the key generation process.");
return false;
}
diff --git a/src/cz/crcs/ectester/reader/output/FileTestWriter.java b/src/cz/crcs/ectester/reader/output/FileTestWriter.java
new file mode 100644
index 0000000..6cfece1
--- /dev/null
+++ b/src/cz/crcs/ectester/reader/output/FileTestWriter.java
@@ -0,0 +1,54 @@
+package cz.crcs.ectester.reader.output;
+
+import cz.crcs.ectester.common.output.TeeTestWriter;
+import cz.crcs.ectester.common.output.TestWriter;
+
+import javax.xml.parsers.ParserConfigurationException;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.PrintStream;
+import java.util.regex.Pattern;
+
+/**
+ * @author Jan Jancar johny@neuromancer.sk
+ */
+public class FileTestWriter extends TeeTestWriter {
+
+ private static final Pattern PREFIX = Pattern.compile("(text|xml|yaml|yml):.+");
+
+ public FileTestWriter(String defaultFormat, boolean systemOut, String[] files) throws ParserConfigurationException, FileNotFoundException {
+ int fLength = files == null ? 0 : files.length;
+ writers = new TestWriter[systemOut ? fLength + 1 : fLength];
+ System.err.println(writers.length);
+ if (systemOut) {
+ writers[0] = createWriter(defaultFormat, System.out);
+ }
+ for (int i = 0; i < fLength; ++i) {
+ String fName = files[i];
+ String format = null;
+ if (PREFIX.matcher(fName).matches()) {
+ String[] split = fName.split(":",2);
+ format = split[0];
+ fName = split[1];
+ }
+ writers[i + 1] = createWriter(format, new PrintStream(new FileOutputStream(fName)));
+ }
+ }
+
+ private TestWriter createWriter(String format, PrintStream out) throws ParserConfigurationException {
+ if (format == null) {
+ return new TextTestWriter(out);
+ }
+ switch (format) {
+ case "text":
+ return new TextTestWriter(out);
+ case "xml":
+ return new XMLTestWriter(out);
+ case "yaml":
+ case "yml":
+ return new YAMLTestWriter(out);
+ default:
+ return null;
+ }
+ }
+}