diff options
| author | J08nY | 2018-02-11 03:04:40 +0100 |
|---|---|---|
| committer | J08nY | 2018-02-11 03:04:40 +0100 |
| commit | 5097e783310242cfb782c62d84d65a4b3a387a72 (patch) | |
| tree | ae513c0401b16ac4e109492e35c15232cdddcb55 | |
| parent | 91e83f3caea0d08c59bfbe3603cfa413ef1f0624 (diff) | |
| download | ECTester-5097e783310242cfb782c62d84d65a4b3a387a72.tar.gz ECTester-5097e783310242cfb782c62d84d65a4b3a387a72.tar.zst ECTester-5097e783310242cfb782c62d84d65a4b3a387a72.zip | |
| -rw-r--r-- | src/cz/crcs/ectester/common/output/TeeTestWriter.java | 43 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/common/util/FileUtil.java | 33 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/reader/ECTesterReader.java | 60 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/reader/output/FileTestWriter.java | 54 |
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; + } + } +} |
