From 2c6c2a2d35292368b7263fedb6db508da7ded4c4 Mon Sep 17 00:00:00 2001 From: J08nY Date: Wed, 25 Oct 2017 20:17:07 +0200 Subject: Split ResponseWriter into separate class, introduce TestRunner. --- src/cz/crcs/ectester/reader/ECTester.java | 43 ++++---- .../crcs/ectester/reader/output/OutputWriter.java | 18 ---- .../ectester/reader/output/ResponseWriter.java | 39 +++++++ .../ectester/reader/output/TeeOutputStream.java | 4 +- src/cz/crcs/ectester/reader/output/TestWriter.java | 15 +++ .../ectester/reader/output/TextOutputWriter.java | 86 --------------- .../ectester/reader/output/TextTestWriter.java | 66 ++++++++++++ .../ectester/reader/output/XMLOutputWriter.java | 118 --------------------- .../crcs/ectester/reader/output/XMLTestWriter.java | 117 ++++++++++++++++++++ .../ectester/reader/output/YAMLOutputWriter.java | 93 ---------------- .../ectester/reader/output/YAMLTestWriter.java | 92 ++++++++++++++++ .../ectester/reader/test/CompositeCurvesSuite.java | 9 +- src/cz/crcs/ectester/reader/test/DefaultSuite.java | 11 +- .../ectester/reader/test/InvalidCurvesSuite.java | 11 +- src/cz/crcs/ectester/reader/test/TestRunner.java | 29 +++++ src/cz/crcs/ectester/reader/test/TestSuite.java | 22 +--- .../crcs/ectester/reader/test/TestVectorSuite.java | 10 +- .../ectester/reader/test/WrongCurvesSuite.java | 9 +- 18 files changed, 405 insertions(+), 387 deletions(-) delete mode 100644 src/cz/crcs/ectester/reader/output/OutputWriter.java create mode 100644 src/cz/crcs/ectester/reader/output/ResponseWriter.java create mode 100644 src/cz/crcs/ectester/reader/output/TestWriter.java delete mode 100644 src/cz/crcs/ectester/reader/output/TextOutputWriter.java create mode 100644 src/cz/crcs/ectester/reader/output/TextTestWriter.java delete mode 100644 src/cz/crcs/ectester/reader/output/XMLOutputWriter.java create mode 100644 src/cz/crcs/ectester/reader/output/XMLTestWriter.java delete mode 100644 src/cz/crcs/ectester/reader/output/YAMLOutputWriter.java create mode 100644 src/cz/crcs/ectester/reader/output/YAMLTestWriter.java create mode 100644 src/cz/crcs/ectester/reader/test/TestRunner.java (limited to 'src') diff --git a/src/cz/crcs/ectester/reader/ECTester.java b/src/cz/crcs/ectester/reader/ECTester.java index 5a2274d..271a8e4 100644 --- a/src/cz/crcs/ectester/reader/ECTester.java +++ b/src/cz/crcs/ectester/reader/ECTester.java @@ -52,7 +52,8 @@ public class ECTester { private CardMngr cardManager; private OutputLogger logger; - private OutputWriter writer; + private TestWriter testWriter; + private ResponseWriter respWriter; private EC_Store dataStore; private Config cfg; @@ -105,22 +106,25 @@ public class ECTester { cardManager.send(SELECT_ECTESTERAPPLET); } + // Setup logger, testWriter and respWriter logger = new OutputLogger(true, cfg.log); if (cfg.format == null) { - writer = new TextOutputWriter(logger.getPrintStream()); + testWriter = new TextTestWriter(logger.getPrintStream()); } else { switch (cfg.format) { case "text": - writer = new TextOutputWriter(logger.getPrintStream()); + testWriter = new TextTestWriter(logger.getPrintStream()); break; case "xml": - writer = new XMLOutputWriter(logger.getOutputStream()); + testWriter = new XMLTestWriter(logger.getOutputStream()); break; case "yaml": - writer = new YAMLOutputWriter(logger.getPrintStream()); + case "yml": + testWriter = new YAMLTestWriter(logger.getPrintStream()); break; } } + respWriter = new ResponseWriter(logger.getPrintStream()); //do action if (cli.hasOption("export")) { @@ -351,7 +355,7 @@ public class ECTester { sent.add(export); for (Response r : sent) { - writer.outputResponse(r); + respWriter.outputResponse(r); } EC_Params exported = new EC_Params(domain, export.getParams()); @@ -425,10 +429,10 @@ public class ECTester { switch (cfg.testSuite) { case "default": - suite = new DefaultSuite(dataStore, cfg, writer); + suite = new DefaultSuite(dataStore, cfg); break; case "test-vectors": - suite = new TestVectorSuite(dataStore, cfg, writer); + suite = new TestVectorSuite(dataStore, cfg); break; default: // These tests are dangerous, prompt before them. @@ -438,7 +442,7 @@ public class ECTester { System.out.print("Do you want to proceed? (y/n): "); Scanner in = new Scanner(System.in); String confirmation = in.nextLine().toLowerCase(); - if (!Arrays.asList("yes","y").contains(confirmation)) { + if (!Arrays.asList("yes", "y").contains(confirmation)) { return; } in.close(); @@ -447,13 +451,13 @@ public class ECTester { switch (cfg.testSuite) { case "wrong": - suite = new WrongCurvesSuite(dataStore, cfg, writer); + suite = new WrongCurvesSuite(dataStore, cfg); break; case "composite": - suite = new CompositeCurvesSuite(dataStore, cfg, writer); + suite = new CompositeCurvesSuite(dataStore, cfg); break; case "invalid": - suite = new InvalidCurvesSuite(dataStore, cfg, writer); + suite = new InvalidCurvesSuite(dataStore, cfg); break; default: System.err.println("Unknown test suite."); @@ -461,7 +465,10 @@ public class ECTester { } break; } - suite.run(cardManager); + + TestRunner runner = new TestRunner(suite, testWriter); + suite.setup(cardManager); + runner.run(); } /** @@ -480,7 +487,7 @@ public class ECTester { prepare.add(curve.send()); for (Response r : prepare) { - writer.outputResponse(r); + respWriter.outputResponse(r); } byte pubkey = (cfg.anyPublicKey || cfg.anyKey) ? ECTesterApplet.KEYPAIR_REMOTE : ECTesterApplet.KEYPAIR_LOCAL; @@ -506,7 +513,7 @@ 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); for (Response r : ecdh) { - writer.outputResponse(r); + respWriter.outputResponse(r); } if (!perform.successful() || !perform.hasSecret()) { @@ -565,7 +572,7 @@ public class ECTester { prepare.add(curve.send()); for (Response r : prepare) { - writer.outputResponse(r); + respWriter.outputResponse(r); } FileWriter out = null; @@ -583,7 +590,7 @@ public class ECTester { Response.ECDSA perform = new Command.ECDSA(cardManager, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_TRUE, data).send(); ecdsa.add(perform); for (Response r : ecdsa) { - writer.outputResponse(r); + respWriter.outputResponse(r); } if (!perform.successful() || !perform.hasSignature()) { @@ -706,7 +713,7 @@ public class ECTester { } format = cli.getOptionValue("format", "text"); - if (!Arrays.asList("text", "xml", "yaml").contains(format)) { + if (!Arrays.asList("text", "xml", "yaml", "yml").contains(format)) { System.err.println("Wrong output format " + format + "."); return false; } diff --git a/src/cz/crcs/ectester/reader/output/OutputWriter.java b/src/cz/crcs/ectester/reader/output/OutputWriter.java deleted file mode 100644 index 09185b1..0000000 --- a/src/cz/crcs/ectester/reader/output/OutputWriter.java +++ /dev/null @@ -1,18 +0,0 @@ -package cz.crcs.ectester.reader.output; - -import cz.crcs.ectester.reader.response.Response; -import cz.crcs.ectester.reader.test.Test; - -import javax.xml.stream.XMLStreamException; -import javax.xml.transform.TransformerConfigurationException; -import javax.xml.transform.TransformerException; - -/** - * @author Jan Jancar johny@neuromancer.sk - */ -public interface OutputWriter { - void begin(); - void outputResponse(Response r); - void outputTest(Test t); - void end(); -} diff --git a/src/cz/crcs/ectester/reader/output/ResponseWriter.java b/src/cz/crcs/ectester/reader/output/ResponseWriter.java new file mode 100644 index 0000000..120fdba --- /dev/null +++ b/src/cz/crcs/ectester/reader/output/ResponseWriter.java @@ -0,0 +1,39 @@ +package cz.crcs.ectester.reader.output; + +import cz.crcs.ectester.reader.Util; +import cz.crcs.ectester.reader.response.Response; + +import java.io.PrintStream; + +/** + * @author Jan Jancar johny@neuromancer.sk + */ +public class ResponseWriter { + private PrintStream output; + + public ResponseWriter(PrintStream output) { + this.output = output; + } + + public 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); + } + + public void outputResponse(Response r) { + String out = ""; + out += String.format("%-70s:", r.getDescription()) + " : "; + out += responseSuffix(r); + output.println(out); + output.flush(); + } +} diff --git a/src/cz/crcs/ectester/reader/output/TeeOutputStream.java b/src/cz/crcs/ectester/reader/output/TeeOutputStream.java index e18d32b..2a1af99 100644 --- a/src/cz/crcs/ectester/reader/output/TeeOutputStream.java +++ b/src/cz/crcs/ectester/reader/output/TeeOutputStream.java @@ -22,14 +22,14 @@ public class TeeOutputStream extends OutputStream { @Override public void flush() throws IOException { - for (OutputStream out :outputs) { + for (OutputStream out : outputs) { out.flush(); } } @Override public void close() throws IOException { - for (OutputStream out :outputs) { + for (OutputStream out : outputs) { out.close(); } } diff --git a/src/cz/crcs/ectester/reader/output/TestWriter.java b/src/cz/crcs/ectester/reader/output/TestWriter.java new file mode 100644 index 0000000..74c76fb --- /dev/null +++ b/src/cz/crcs/ectester/reader/output/TestWriter.java @@ -0,0 +1,15 @@ +package cz.crcs.ectester.reader.output; + +import cz.crcs.ectester.reader.test.Test; +import cz.crcs.ectester.reader.test.TestSuite; + +/** + * @author Jan Jancar johny@neuromancer.sk + */ +public interface TestWriter { + void begin(TestSuite suite); + + void outputTest(Test t); + + void end(); +} diff --git a/src/cz/crcs/ectester/reader/output/TextOutputWriter.java b/src/cz/crcs/ectester/reader/output/TextOutputWriter.java deleted file mode 100644 index 7f9cdae..0000000 --- a/src/cz/crcs/ectester/reader/output/TextOutputWriter.java +++ /dev/null @@ -1,86 +0,0 @@ -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 String.format("%-4s", t.getResult() == Test.Result.SUCCESS ? "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 outputResponse(Response r) { - String out = ""; - out += String.format("%-70s:", r.getDescription()) + " : "; - out += responseSuffix(r); - output.println(out); - output.flush(); - } - - private String testString(Test t) { - if (!t.hasRun()) - return null; - - StringBuilder out = new StringBuilder(); - if (t instanceof Test.Simple) { - Test.Simple test = (Test.Simple) t; - out.append(String.format("%-70s:", testPrefix(t) + " : " + test.getDescription())).append(" : "); - out.append(responseSuffix(test.getResponse())); - } else if (t instanceof Test.Compound) { - Test.Compound test = (Test.Compound) t; - Test[] tests = test.getTests(); - for (int i = 0; i < tests.length; ++i) { - if (i == 0) { - out.append(" /- "); - } else if (i == tests.length - 1) { - out.append(" \\- "); - } else { - out.append(" | "); - } - out.append(testString(tests[i])).append(System.lineSeparator()); - } - out.append(String.format("%-70s:", testPrefix(t) + " : " + test.getDescription())); - } - return out.toString(); - } - - @Override - public void outputTest(Test t) { - output.println(testString(t)); - output.flush(); - } - - @Override - public void end() { - } -} diff --git a/src/cz/crcs/ectester/reader/output/TextTestWriter.java b/src/cz/crcs/ectester/reader/output/TextTestWriter.java new file mode 100644 index 0000000..80c7204 --- /dev/null +++ b/src/cz/crcs/ectester/reader/output/TextTestWriter.java @@ -0,0 +1,66 @@ +package cz.crcs.ectester.reader.output; + +import cz.crcs.ectester.reader.test.Test; +import cz.crcs.ectester.reader.test.TestSuite; + +import java.io.PrintStream; + +/** + * @author Jan Jancar johny@neuromancer.sk + */ +public class TextTestWriter implements TestWriter { + private PrintStream output; + private ResponseWriter respWriter; + + public TextTestWriter(PrintStream output) { + this.output = output; + this.respWriter = new ResponseWriter(output); + } + + @Override + public void begin(TestSuite suite) { + } + + private String testPrefix(Test t) { + return String.format("%-4s", t.getResult() == Test.Result.SUCCESS ? "OK" : "NOK"); + } + + private String testString(Test t) { + if (!t.hasRun()) + return null; + + StringBuilder out = new StringBuilder(); + if (t instanceof Test.Simple) { + Test.Simple test = (Test.Simple) t; + out.append(String.format("%-70s:", testPrefix(t) + " : " + test.getDescription())).append(" : "); + out.append(respWriter.responseSuffix(test.getResponse())); + } else if (t instanceof Test.Compound) { + Test.Compound test = (Test.Compound) t; + Test[] tests = test.getTests(); + for (int i = 0; i < tests.length; ++i) { + if (i == 0) { + out.append(" /- "); + } else if (i == tests.length - 1) { + out.append(" \\- "); + } else { + out.append(" | "); + } + out.append(testString(tests[i])).append(System.lineSeparator()); + } + out.append(String.format("%-70s:", testPrefix(t) + " : " + test.getDescription())); + } + return out.toString(); + } + + @Override + public void outputTest(Test t) { + if (!t.hasRun()) + return; + output.println(testString(t)); + 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 deleted file mode 100644 index b9f8c8f..0000000 --- a/src/cz/crcs/ectester/reader/output/XMLOutputWriter.java +++ /dev/null @@ -1,118 +0,0 @@ -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 org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.Node; - -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.transform.*; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.stream.StreamResult; -import java.io.OutputStream; - -/** - * @author Jan Jancar johny@neuromancer.sk - */ -public class XMLOutputWriter implements OutputWriter { - private OutputStream output; - private Document doc; - private Node root; - - public XMLOutputWriter(OutputStream output) throws ParserConfigurationException { - this.output = output; - this.doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); - } - - @Override - public void begin() { - root = doc.createElement("testRun"); - doc.appendChild(root); - } - - private Element responseElement(Response r) { - Element responseElem = doc.createElement("response"); - responseElem.setAttribute("successful", r.successful() ? "true" : "false"); - - Element apdu = doc.createElement("apdu"); - apdu.setTextContent(Util.bytesToHex(r.getAPDU().getBytes())); - responseElem.appendChild(apdu); - - Element naturalSW = doc.createElement("natural-sw"); - naturalSW.setTextContent(String.valueOf(r.getNaturalSW())); - responseElem.appendChild(naturalSW); - - Element sws = doc.createElement("sws"); - for (int i = 0; i < r.getNumSW(); ++i) { - Element sw = doc.createElement("sw"); - sw.setTextContent(String.valueOf(r.getSW(i))); - sws.appendChild(sw); - } - responseElem.appendChild(sws); - - Element duration = doc.createElement("duration"); - duration.setTextContent(String.valueOf(r.getDuration())); - responseElem.appendChild(duration); - - Element description = doc.createElement("desc"); - description.setTextContent(r.getDescription()); - responseElem.appendChild(description); - - return responseElem; - } - - @Override - public void outputResponse(Response r) { - root.appendChild(responseElement(r)); - } - - private Element testElement(Test t) { - Element testElem = doc.createElement("test"); - - if (t instanceof Test.Simple) { - Test.Simple test = (Test.Simple) t; - testElem.setAttribute("type", "simple"); - testElem.appendChild(responseElement(test.getResponse())); - } else if (t instanceof Test.Compound) { - Test.Compound test = (Test.Compound) t; - testElem.setAttribute("type", "compound"); - for (Test innerTest : test.getTests()) { - testElem.appendChild(testElement(innerTest)); - } - } - - Element description = doc.createElement("desc"); - description.setTextContent(t.getDescription()); - testElem.appendChild(description); - - Element result = doc.createElement("result"); - result.setTextContent(t.getResult().toString()); - testElem.appendChild(result); - - return testElem; - } - - @Override - public void outputTest(Test t) { - if (!t.hasRun()) - return; - root.appendChild(testElement(t)); - } - - @Override - public void end() { - try { - DOMSource domSource = new DOMSource(doc); - StreamResult result = new StreamResult(output); - TransformerFactory tf = TransformerFactory.newInstance(); - Transformer transformer = tf.newTransformer(); - transformer.setOutputProperty(OutputKeys.INDENT, "yes"); - transformer.transform(domSource, result); - } catch (TransformerException e) { - e.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/src/cz/crcs/ectester/reader/output/XMLTestWriter.java b/src/cz/crcs/ectester/reader/output/XMLTestWriter.java new file mode 100644 index 0000000..29a97db --- /dev/null +++ b/src/cz/crcs/ectester/reader/output/XMLTestWriter.java @@ -0,0 +1,117 @@ +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 cz.crcs.ectester.reader.test.TestSuite; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; + +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; +import java.io.OutputStream; + +/** + * @author Jan Jancar johny@neuromancer.sk + */ +public class XMLTestWriter implements TestWriter { + private OutputStream output; + private Document doc; + private Node root; + + public XMLTestWriter(OutputStream output) throws ParserConfigurationException { + this.output = output; + this.doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); + } + + @Override + public void begin(TestSuite suite) { + root = doc.createElement("testRun"); + doc.appendChild(root); + } + + private Element responseElement(Response r) { + Element responseElem = doc.createElement("response"); + responseElem.setAttribute("successful", r.successful() ? "true" : "false"); + + Element apdu = doc.createElement("apdu"); + apdu.setTextContent(Util.bytesToHex(r.getAPDU().getBytes())); + responseElem.appendChild(apdu); + + Element naturalSW = doc.createElement("natural-sw"); + naturalSW.setTextContent(String.valueOf(r.getNaturalSW())); + responseElem.appendChild(naturalSW); + + Element sws = doc.createElement("sws"); + for (int i = 0; i < r.getNumSW(); ++i) { + Element sw = doc.createElement("sw"); + sw.setTextContent(String.valueOf(r.getSW(i))); + sws.appendChild(sw); + } + responseElem.appendChild(sws); + + Element duration = doc.createElement("duration"); + duration.setTextContent(String.valueOf(r.getDuration())); + responseElem.appendChild(duration); + + Element description = doc.createElement("desc"); + description.setTextContent(r.getDescription()); + responseElem.appendChild(description); + + return responseElem; + } + + private Element testElement(Test t) { + Element testElem = doc.createElement("test"); + + if (t instanceof Test.Simple) { + Test.Simple test = (Test.Simple) t; + testElem.setAttribute("type", "simple"); + testElem.appendChild(responseElement(test.getResponse())); + } else if (t instanceof Test.Compound) { + Test.Compound test = (Test.Compound) t; + testElem.setAttribute("type", "compound"); + for (Test innerTest : test.getTests()) { + testElem.appendChild(testElement(innerTest)); + } + } + + Element description = doc.createElement("desc"); + description.setTextContent(t.getDescription()); + testElem.appendChild(description); + + Element result = doc.createElement("result"); + result.setTextContent(t.getResult().toString()); + testElem.appendChild(result); + + return testElem; + } + + @Override + public void outputTest(Test t) { + if (!t.hasRun()) + return; + root.appendChild(testElement(t)); + } + + @Override + public void end() { + try { + DOMSource domSource = new DOMSource(doc); + StreamResult result = new StreamResult(output); + TransformerFactory tf = TransformerFactory.newInstance(); + Transformer transformer = tf.newTransformer(); + transformer.setOutputProperty(OutputKeys.INDENT, "yes"); + transformer.transform(domSource, result); + } catch (TransformerException e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/src/cz/crcs/ectester/reader/output/YAMLOutputWriter.java b/src/cz/crcs/ectester/reader/output/YAMLOutputWriter.java deleted file mode 100644 index 211bd47..0000000 --- a/src/cz/crcs/ectester/reader/output/YAMLOutputWriter.java +++ /dev/null @@ -1,93 +0,0 @@ -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 org.yaml.snakeyaml.DumperOptions; -import org.yaml.snakeyaml.Yaml; - -import java.io.PrintStream; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; - -/** - * @author Jan Jancar johny@neuromancer.sk - */ -public class YAMLOutputWriter implements OutputWriter { - private PrintStream output; - private List testRun; - - public YAMLOutputWriter(PrintStream output) { - this.output = output; - } - - @Override - public void begin() { - output.println("---"); - testRun = new LinkedList<>(); - } - - private Map responseObject(Response r) { - Map responseObj = new HashMap<>(); - responseObj.put("successful", r.successful()); - responseObj.put("apdu", Util.bytesToHex(r.getAPDU().getBytes())); - responseObj.put("natural_sw", r.getNaturalSW()); - List sws = new LinkedList<>(); - for (int i = 0; i < r.getNumSW(); ++i) { - sws.add(r.getSW(i)); - } - responseObj.put("sws", sws); - responseObj.put("duration", r.getDuration()); - responseObj.put("desc", r.getDescription()); - return responseObj; - } - - @Override - public void outputResponse(Response r) { - testRun.add(responseObject(r)); - } - - private Map testObject(Test t) { - Map testObj = new HashMap<>(); - - if (t instanceof Test.Simple) { - Test.Simple test = (Test.Simple) t; - testObj.put("type", "simple"); - testObj.put("response", responseObject(test.getResponse())); - } else if (t instanceof Test.Compound) { - Test.Compound test = (Test.Compound) t; - testObj.put("type", "compound"); - List> tests = new LinkedList<>(); - for (Test innerTest : test.getTests()) { - tests.add(testObject(innerTest)); - } - testObj.put("tests", tests); - } - - testObj.put("desc", t.getDescription()); - testObj.put("result", t.getResult().name()); - - return testObj; - } - - @Override - public void outputTest(Test t) { - testRun.add(testObject(t)); - } - - @Override - public void end() { - DumperOptions options = new DumperOptions(); - options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); - Yaml yaml = new Yaml(options); - - Map> result = new HashMap<>(); - result.put("testRun", testRun); - String out = yaml.dump(result); - - output.println(out); - output.println("---"); - } -} diff --git a/src/cz/crcs/ectester/reader/output/YAMLTestWriter.java b/src/cz/crcs/ectester/reader/output/YAMLTestWriter.java new file mode 100644 index 0000000..10d9bb9 --- /dev/null +++ b/src/cz/crcs/ectester/reader/output/YAMLTestWriter.java @@ -0,0 +1,92 @@ +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 cz.crcs.ectester.reader.test.TestSuite; +import org.yaml.snakeyaml.DumperOptions; +import org.yaml.snakeyaml.Yaml; + +import java.io.PrintStream; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +/** + * @author Jan Jancar johny@neuromancer.sk + */ +public class YAMLTestWriter implements TestWriter { + private PrintStream output; + private List testRun; + + public YAMLTestWriter(PrintStream output) { + this.output = output; + } + + @Override + public void begin(TestSuite suite) { + output.println("---"); + testRun = new LinkedList<>(); + } + + private Map responseObject(Response r) { + Map responseObj = new HashMap<>(); + responseObj.put("successful", r.successful()); + responseObj.put("apdu", Util.bytesToHex(r.getAPDU().getBytes())); + responseObj.put("natural_sw", r.getNaturalSW()); + List sws = new LinkedList<>(); + for (int i = 0; i < r.getNumSW(); ++i) { + sws.add(r.getSW(i)); + } + responseObj.put("sws", sws); + responseObj.put("duration", r.getDuration()); + responseObj.put("desc", r.getDescription()); + return responseObj; + } + + private Map testObject(Test t) { + Map testObj = new HashMap<>(); + + if (t instanceof Test.Simple) { + Test.Simple test = (Test.Simple) t; + testObj.put("type", "simple"); + testObj.put("response", responseObject(test.getResponse())); + } else if (t instanceof Test.Compound) { + Test.Compound test = (Test.Compound) t; + testObj.put("type", "compound"); + List> tests = new LinkedList<>(); + for (Test innerTest : test.getTests()) { + tests.add(testObject(innerTest)); + } + testObj.put("tests", tests); + } + + testObj.put("desc", t.getDescription()); + testObj.put("result", t.getResult().name()); + + return testObj; + } + + @Override + public void outputTest(Test t) { + if (!t.hasRun()) + return; + testRun.add(testObject(t)); + } + + @Override + public void end() { + DumperOptions options = new DumperOptions(); + options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); + options.setPrettyFlow(true); + Yaml yaml = new Yaml(options); + + Map> result = new HashMap<>(); + result.put("testRun", testRun); + String out = yaml.dump(result); + + output.println(out); + output.println("---"); + } +} diff --git a/src/cz/crcs/ectester/reader/test/CompositeCurvesSuite.java b/src/cz/crcs/ectester/reader/test/CompositeCurvesSuite.java index 75c6371..76b79de 100644 --- a/src/cz/crcs/ectester/reader/test/CompositeCurvesSuite.java +++ b/src/cz/crcs/ectester/reader/test/CompositeCurvesSuite.java @@ -8,7 +8,7 @@ import cz.crcs.ectester.reader.ECTester; import cz.crcs.ectester.reader.command.Command; import cz.crcs.ectester.reader.ec.EC_Curve; import cz.crcs.ectester.reader.ec.EC_Key; -import cz.crcs.ectester.reader.output.OutputWriter; +import cz.crcs.ectester.reader.output.TestWriter; import javacard.security.KeyPair; import javax.smartcardio.CardException; @@ -22,12 +22,12 @@ import java.util.Map; */ public class CompositeCurvesSuite extends TestSuite { - public CompositeCurvesSuite(EC_Store dataStore, ECTester.Config cfg, OutputWriter writer) { - super(dataStore, cfg, writer, "composite"); + public CompositeCurvesSuite(EC_Store dataStore, ECTester.Config cfg) { + super(dataStore, cfg, "composite"); } @Override - public List run(CardMngr cardManager) throws IOException, CardException { + public void setup(CardMngr cardManager) { /* Do the default tests with the public keys set to provided smallorder keys * over composite order curves. Essentially small subgroup attacks. * These should fail, the curves aren't safe so that if the computation with @@ -55,6 +55,5 @@ public class CompositeCurvesSuite extends TestSuite { tests.add(new Test.Simple(new Command.Cleanup(cardManager), Test.Result.ANY)); } } - return super.run(cardManager); } } diff --git a/src/cz/crcs/ectester/reader/test/DefaultSuite.java b/src/cz/crcs/ectester/reader/test/DefaultSuite.java index 2024578..de069f9 100644 --- a/src/cz/crcs/ectester/reader/test/DefaultSuite.java +++ b/src/cz/crcs/ectester/reader/test/DefaultSuite.java @@ -6,25 +6,21 @@ import cz.crcs.ectester.data.EC_Store; import cz.crcs.ectester.reader.CardMngr; import cz.crcs.ectester.reader.ECTester; import cz.crcs.ectester.reader.command.Command; -import cz.crcs.ectester.reader.output.OutputWriter; import javacard.security.KeyPair; -import javax.smartcardio.CardException; import java.io.IOException; -import java.util.List; /** - * * @author Jan Jancar johny@neuromancer.sk */ public class DefaultSuite extends TestSuite { - public DefaultSuite(EC_Store dataStore, ECTester.Config cfg, OutputWriter writer) { - super(dataStore, cfg, writer, "default"); + public DefaultSuite(EC_Store dataStore, ECTester.Config cfg) { + super(dataStore, cfg, "default"); } @Override - public List run(CardMngr cardManager) throws IOException, CardException { + public void setup(CardMngr cardManager) throws IOException { tests.add(new Test.Simple(new Command.Support(cardManager), Test.Result.ANY)); if (cfg.namedCurve != null) { if (cfg.primeField) { @@ -57,7 +53,6 @@ public class DefaultSuite extends TestSuite { } } } - return super.run(cardManager); } private void defaultTests(CardMngr cardManager, short keyLength, byte keyType) throws IOException { diff --git a/src/cz/crcs/ectester/reader/test/InvalidCurvesSuite.java b/src/cz/crcs/ectester/reader/test/InvalidCurvesSuite.java index 20882b6..3b6cb2f 100644 --- a/src/cz/crcs/ectester/reader/test/InvalidCurvesSuite.java +++ b/src/cz/crcs/ectester/reader/test/InvalidCurvesSuite.java @@ -8,10 +8,8 @@ import cz.crcs.ectester.reader.ECTester; import cz.crcs.ectester.reader.command.Command; import cz.crcs.ectester.reader.ec.EC_Curve; import cz.crcs.ectester.reader.ec.EC_Key; -import cz.crcs.ectester.reader.output.OutputWriter; import javacard.security.KeyPair; -import javax.smartcardio.CardException; import java.io.IOException; import java.util.HashMap; import java.util.LinkedList; @@ -19,17 +17,16 @@ import java.util.List; import java.util.Map; /** - * * @author Jan Jancar johny@neuromancer.sk */ public class InvalidCurvesSuite extends TestSuite { - public InvalidCurvesSuite(EC_Store dataStore, ECTester.Config cfg, OutputWriter writer) { - super(dataStore, cfg, writer, "invalid"); + public InvalidCurvesSuite(EC_Store dataStore, ECTester.Config cfg) { + super(dataStore, cfg, "invalid"); } @Override - public List run(CardMngr cardManager) throws CardException, IOException { + public void setup(CardMngr cardManager) throws IOException { /* Set original curves (secg/nist/brainpool). Generate local. * Try ECDH with invalid public keys of increasing (or decreasing) order. */ @@ -64,7 +61,5 @@ public class InvalidCurvesSuite extends TestSuite { } tests.add(new Test.Simple(new Command.Cleanup(cardManager), Test.Result.ANY)); } - - return super.run(cardManager); } } diff --git a/src/cz/crcs/ectester/reader/test/TestRunner.java b/src/cz/crcs/ectester/reader/test/TestRunner.java new file mode 100644 index 0000000..baab6a8 --- /dev/null +++ b/src/cz/crcs/ectester/reader/test/TestRunner.java @@ -0,0 +1,29 @@ +package cz.crcs.ectester.reader.test; + +import cz.crcs.ectester.reader.output.TestWriter; + +import javax.smartcardio.CardException; + +/** + * @author Jan Jancar johny@neuromancer.sk + */ +public class TestRunner { + private TestSuite suite; + private TestWriter writer; + + public TestRunner(TestSuite suite, TestWriter writer) { + this.suite = suite; + this.writer = writer; + } + + public void run() throws CardException { + writer.begin(suite); + for (Test t : suite.getTests()) { + if (!t.hasRun()) { + t.run(); + writer.outputTest(t); + } + } + writer.end(); + } +} diff --git a/src/cz/crcs/ectester/reader/test/TestSuite.java b/src/cz/crcs/ectester/reader/test/TestSuite.java index fde2266..6123a39 100644 --- a/src/cz/crcs/ectester/reader/test/TestSuite.java +++ b/src/cz/crcs/ectester/reader/test/TestSuite.java @@ -1,17 +1,13 @@ package cz.crcs.ectester.reader.test; -import static cz.crcs.ectester.reader.test.Test.Result; 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.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; +import cz.crcs.ectester.reader.output.TestWriter; import javax.smartcardio.CardException; import java.io.IOException; @@ -24,28 +20,16 @@ public abstract class TestSuite { EC_Store dataStore; ECTester.Config cfg; - OutputWriter writer; String name; List tests = new LinkedList<>(); - TestSuite(EC_Store dataStore, ECTester.Config cfg, OutputWriter writer, String name) { + TestSuite(EC_Store dataStore, ECTester.Config cfg, String name) { this.dataStore = dataStore; this.cfg = cfg; - this.writer = writer; this.name = name; } - public List run(CardMngr cardManager) throws CardException, IOException { - writer.begin(); - for (Test t : tests) { - if (!t.hasRun()) { - t.run(); - writer.outputTest(t); - } - } - writer.end(); - return tests; - } + public abstract void setup(CardMngr cardManager) throws IOException; public List getTests() { return Collections.unmodifiableList(tests); diff --git a/src/cz/crcs/ectester/reader/test/TestVectorSuite.java b/src/cz/crcs/ectester/reader/test/TestVectorSuite.java index 2098ae3..2a74d41 100644 --- a/src/cz/crcs/ectester/reader/test/TestVectorSuite.java +++ b/src/cz/crcs/ectester/reader/test/TestVectorSuite.java @@ -8,28 +8,25 @@ 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; -import javax.smartcardio.CardException; import java.io.IOException; import java.util.LinkedList; import java.util.List; import java.util.Map; /** - * * @author Jan Jancar johny@neuromancer.sk */ public class TestVectorSuite extends TestSuite { - public TestVectorSuite(EC_Store dataStore, ECTester.Config cfg, OutputWriter writer) { - super(dataStore, cfg, writer, "test"); + public TestVectorSuite(EC_Store dataStore, ECTester.Config cfg) { + super(dataStore, cfg, "test"); } @Override - public List run(CardMngr cardManager) throws IOException, CardException { + public void setup(CardMngr cardManager) throws IOException { /* Set original curves (secg/nist/brainpool). Set keypairs from test vectors. * Do ECDH both ways, export and verify that the result is correct. */ @@ -76,6 +73,5 @@ public class TestVectorSuite extends TestSuite { tests.add(new Test.Simple(new Command.Cleanup(cardManager), Test.Result.ANY)); } - return super.run(cardManager); } } diff --git a/src/cz/crcs/ectester/reader/test/WrongCurvesSuite.java b/src/cz/crcs/ectester/reader/test/WrongCurvesSuite.java index 3346b9f..95bbe1e 100644 --- a/src/cz/crcs/ectester/reader/test/WrongCurvesSuite.java +++ b/src/cz/crcs/ectester/reader/test/WrongCurvesSuite.java @@ -3,7 +3,7 @@ package cz.crcs.ectester.reader.test; import cz.crcs.ectester.data.EC_Store; import cz.crcs.ectester.reader.CardMngr; import cz.crcs.ectester.reader.ECTester; -import cz.crcs.ectester.reader.output.OutputWriter; +import cz.crcs.ectester.reader.output.TestWriter; import javacard.security.KeyPair; import javax.smartcardio.CardException; @@ -16,12 +16,12 @@ import java.util.List; */ public class WrongCurvesSuite extends TestSuite { - public WrongCurvesSuite(EC_Store dataStore, ECTester.Config cfg, OutputWriter writer) { - super(dataStore, cfg, writer, "wrong"); + public WrongCurvesSuite(EC_Store dataStore, ECTester.Config cfg) { + super(dataStore, cfg, "wrong"); } @Override - public List run(CardMngr cardManager) throws CardException, IOException { + public void setup(CardMngr cardManager) throws IOException { /* Just do the default tests on the wrong curves. * These should generally fail, the curves aren't curves. */ @@ -31,6 +31,5 @@ public class WrongCurvesSuite extends TestSuite { if (cfg.binaryField) { tests.addAll(defaultCategoryTests(cardManager, cfg.testSuite, KeyPair.ALG_EC_F2M, Test.Result.FAILURE, Test.Result.FAILURE, Test.Result.FAILURE, Test.Result.FAILURE)); } - return super.run(cardManager); } } -- cgit v1.2.3-70-g09d2