From 22e4cfaf40a259be007bddc7b5cd765390de1c11 Mon Sep 17 00:00:00 2001 From: J08nY Date: Sat, 10 Feb 2018 19:59:41 +0100 Subject: Handle exceptions in Tests and TestSuites grafeully. --- .../ectester/common/output/BaseXMLTestWriter.java | 57 +++++++++++++++++----- 1 file changed, 45 insertions(+), 12 deletions(-) (limited to 'src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java') diff --git a/src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java b/src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java index f3e9411..5d6d53d 100644 --- a/src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java +++ b/src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java @@ -24,6 +24,7 @@ public abstract class BaseXMLTestWriter implements TestWriter { private DocumentBuilder db; protected Document doc; private Node root; + private Node tests; public BaseXMLTestWriter(OutputStream output) throws ParserConfigurationException { this.output = output; @@ -40,19 +41,55 @@ public abstract class BaseXMLTestWriter implements TestWriter { root = rootElem; doc.appendChild(root); root.appendChild(deviceElement(suite)); + tests = doc.createElement("tests"); + root.appendChild(tests); } protected abstract Element testableElement(Testable t); protected abstract Element deviceElement(TestSuite suite); + private String causeString(Object cause) { + if (cause == null) { + return "null"; + } else if (cause instanceof String) { + return (String) cause; + } else if (cause instanceof Throwable) { + StringBuilder sb = new StringBuilder(); + for (Throwable t = (Throwable) cause; t != null; t = t.getCause()) { + sb.append(t.toString()); + sb.append(System.lineSeparator()); + } + return sb.toString(); + } else { + return cause.toString(); + } + } + + private Element resultElement(Result result) { + Element resultElem = doc.createElement("result"); + + Element ok = doc.createElement("ok"); + ok.setTextContent(String.valueOf(result.ok())); + Element value = doc.createElement("value"); + value.setTextContent(result.getValue().name()); + Element cause = doc.createElement("cause"); + cause.setTextContent(causeString(cause)); + + resultElem.appendChild(ok); + resultElem.appendChild(value); + resultElem.appendChild(cause); + + return resultElem; + } + private Element testElement(Test t) { Element testElem; if (t instanceof CompoundTest) { CompoundTest test = (CompoundTest) t; testElem = doc.createElement("test"); testElem.setAttribute("type", "compound"); - for (Test innerTest : test.getTests()) { + for (Test innerTest : test.getStartedTests()) { testElem.appendChild(testElement(innerTest)); } } else { @@ -64,16 +101,7 @@ public abstract class BaseXMLTestWriter implements TestWriter { description.setTextContent(t.getDescription()); testElem.appendChild(description); - Element result = doc.createElement("result"); - Element ok = doc.createElement("ok"); - ok.setTextContent(String.valueOf(t.ok())); - Element value = doc.createElement("value"); - value.setTextContent(t.getResultValue().name()); - Element cause = doc.createElement("cause"); - cause.setTextContent(t.getResultCause()); - result.appendChild(ok); - result.appendChild(value); - result.appendChild(cause); + Element result = resultElement(t.getResult()); testElem.appendChild(result); return testElem; @@ -83,7 +111,12 @@ public abstract class BaseXMLTestWriter implements TestWriter { public void outputTest(Test t) { if (!t.hasRun()) return; - root.appendChild(testElement(t)); + tests.appendChild(testElement(t)); + } + + @Override + public void outputError(Test t, Throwable cause) { + tests.appendChild(testElement(t)); } @Override -- cgit v1.2.3-70-g09d2 From 1f19d7eaff114967e470739ad32c82286fe62cce Mon Sep 17 00:00:00 2001 From: J08nY Date: Sat, 10 Feb 2018 20:16:02 +0100 Subject: Fix XML output of Result cause. --- src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java') diff --git a/src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java b/src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java index 5d6d53d..fca3e68 100644 --- a/src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java +++ b/src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java @@ -74,7 +74,7 @@ public abstract class BaseXMLTestWriter implements TestWriter { Element value = doc.createElement("value"); value.setTextContent(result.getValue().name()); Element cause = doc.createElement("cause"); - cause.setTextContent(causeString(cause)); + cause.setTextContent(causeString(result.getCause())); resultElem.appendChild(ok); resultElem.appendChild(value); -- cgit v1.2.3-70-g09d2 From 31a8bfc6f8d2990f8bc9e4a126731052e07b7e10 Mon Sep 17 00:00:00 2001 From: J08nY Date: Sun, 11 Feb 2018 01:05:47 +0100 Subject: Output Result causes better in YAML. --- .../crcs/ectester/common/output/BaseXMLTestWriter.java | 2 -- .../crcs/ectester/common/output/BaseYAMLTestWriter.java | 17 ++++++++++++++++- src/cz/crcs/ectester/reader/test/CommandTestable.java | 1 + 3 files changed, 17 insertions(+), 3 deletions(-) (limited to 'src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java') diff --git a/src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java b/src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java index fca3e68..800f893 100644 --- a/src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java +++ b/src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java @@ -52,8 +52,6 @@ public abstract class BaseXMLTestWriter implements TestWriter { private String causeString(Object cause) { if (cause == null) { return "null"; - } else if (cause instanceof String) { - return (String) cause; } else if (cause instanceof Throwable) { StringBuilder sb = new StringBuilder(); for (Throwable t = (Throwable) cause; t != null; t = t.getCause()) { diff --git a/src/cz/crcs/ectester/common/output/BaseYAMLTestWriter.java b/src/cz/crcs/ectester/common/output/BaseYAMLTestWriter.java index 1e13082..1452b08 100644 --- a/src/cz/crcs/ectester/common/output/BaseYAMLTestWriter.java +++ b/src/cz/crcs/ectester/common/output/BaseYAMLTestWriter.java @@ -41,11 +41,26 @@ public abstract class BaseYAMLTestWriter implements TestWriter { abstract protected Map deviceObject(TestSuite suite); + private Object causeObject(Object cause) { + if (cause == null) { + return null; + } else if (cause instanceof Throwable) { + StringBuilder sb = new StringBuilder(); + for (Throwable t = (Throwable) cause; t != null; t = t.getCause()) { + sb.append(t.toString()); + sb.append(System.lineSeparator()); + } + return sb.toString(); + } else { + return cause.toString(); + } + } + private Map resultObject(Result result) { Map resultObject = new HashMap<>(); resultObject.put("ok", result.ok()); resultObject.put("value", result.getValue().name()); - resultObject.put("cause", result.getCause()); + resultObject.put("cause", causeObject(result.getCause())); return resultObject; } diff --git a/src/cz/crcs/ectester/reader/test/CommandTestable.java b/src/cz/crcs/ectester/reader/test/CommandTestable.java index f670534..e3dbd05 100644 --- a/src/cz/crcs/ectester/reader/test/CommandTestable.java +++ b/src/cz/crcs/ectester/reader/test/CommandTestable.java @@ -28,6 +28,7 @@ public class CommandTestable extends BaseTestable { @Override public void run() { + try { response = command.send(); } catch (CardException e) { -- cgit v1.2.3-70-g09d2 From 6ef4f8130b03564bcf482c102c699325d4c3b533 Mon Sep 17 00:00:00 2001 From: J08nY Date: Wed, 14 Mar 2018 21:55:22 +0100 Subject: Add lint options to javac. Fix most of uncovered warnings. --- nbproject/reader/project.properties | 2 +- nbproject/standalone/project.properties | 2 +- src/cz/crcs/ectester/common/cli/TreeParser.java | 2 +- .../crcs/ectester/common/output/BaseTextTestWriter.java | 2 +- src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java | 2 +- .../crcs/ectester/common/output/BaseYAMLTestWriter.java | 2 +- src/cz/crcs/ectester/reader/CardMngr.java | 10 ++++------ src/cz/crcs/ectester/reader/ECTesterReader.java | 15 ++++++++------- 8 files changed, 18 insertions(+), 19 deletions(-) (limited to 'src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java') diff --git a/nbproject/reader/project.properties b/nbproject/reader/project.properties index acd82ee..b738c2d 100644 --- a/nbproject/reader/project.properties +++ b/nbproject/reader/project.properties @@ -38,7 +38,7 @@ javac.classpath=\ lib/commons-cli-1.4.jar:\ lib/snakeyaml-1.19.jar # Space-separated list of extra javac options -javac.compilerargs= +javac.compilerargs=-Xlint:all javac.deprecation=false javac.processorpath=\ ${javac.classpath} diff --git a/nbproject/standalone/project.properties b/nbproject/standalone/project.properties index 94fdb41..355ea58 100644 --- a/nbproject/standalone/project.properties +++ b/nbproject/standalone/project.properties @@ -38,7 +38,7 @@ javac.classpath=\ lib/commons-cli-1.4.jar:\ lib/snakeyaml-1.19.jar # Space-separated list of extra javac options -javac.compilerargs= +javac.compilerargs=-Xlint:all javac.deprecation=false javac.processorpath=\ ${javac.classpath} diff --git a/src/cz/crcs/ectester/common/cli/TreeParser.java b/src/cz/crcs/ectester/common/cli/TreeParser.java index f1a1980..23f59b1 100644 --- a/src/cz/crcs/ectester/common/cli/TreeParser.java +++ b/src/cz/crcs/ectester/common/cli/TreeParser.java @@ -82,7 +82,7 @@ public class TreeParser implements CommandLineParser { } } else { if (required) { - throw new MissingOptionException(new ArrayList(parsers.keySet())); + throw new MissingOptionException(new ArrayList<>(parsers.keySet())); } } diff --git a/src/cz/crcs/ectester/common/output/BaseTextTestWriter.java b/src/cz/crcs/ectester/common/output/BaseTextTestWriter.java index 4315201..333722d 100644 --- a/src/cz/crcs/ectester/common/output/BaseTextTestWriter.java +++ b/src/cz/crcs/ectester/common/output/BaseTextTestWriter.java @@ -76,7 +76,7 @@ public abstract class BaseTextTestWriter implements TestWriter { } } } else { - SimpleTest test = (SimpleTest) t; + SimpleTest test = (SimpleTest) t; out.append(testableString(test.getTestable())); } return out.toString(); diff --git a/src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java b/src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java index 800f893..9747cf2 100644 --- a/src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java +++ b/src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java @@ -91,7 +91,7 @@ public abstract class BaseXMLTestWriter implements TestWriter { testElem.appendChild(testElement(innerTest)); } } else { - SimpleTest test = (SimpleTest) t; + SimpleTest test = (SimpleTest) t; testElem = testableElement(test.getTestable()); } diff --git a/src/cz/crcs/ectester/common/output/BaseYAMLTestWriter.java b/src/cz/crcs/ectester/common/output/BaseYAMLTestWriter.java index 1452b08..354d518 100644 --- a/src/cz/crcs/ectester/common/output/BaseYAMLTestWriter.java +++ b/src/cz/crcs/ectester/common/output/BaseYAMLTestWriter.java @@ -76,7 +76,7 @@ public abstract class BaseYAMLTestWriter implements TestWriter { } testObj.put("tests", innerTests); } else { - SimpleTest test = (SimpleTest) t; + SimpleTest test = (SimpleTest) t; testObj = testableObject(test.getTestable()); } diff --git a/src/cz/crcs/ectester/reader/CardMngr.java b/src/cz/crcs/ectester/reader/CardMngr.java index 1e42c52..637be56 100644 --- a/src/cz/crcs/ectester/reader/CardMngr.java +++ b/src/cz/crcs/ectester/reader/CardMngr.java @@ -4,6 +4,7 @@ import com.licel.jcardsim.io.CAD; import com.licel.jcardsim.io.JavaxSmartCardInterface; import cz.crcs.ectester.common.util.ByteUtil; import javacard.framework.AID; +import javacard.framework.Applet; import javacard.framework.ISO7816; import javax.smartcardio.*; @@ -19,7 +20,6 @@ public class CardMngr { private Card card = null; // Simulator related attributes - private CAD cad = null; private JavaxSmartCardInterface simulator = null; private boolean simulate = false; @@ -351,13 +351,11 @@ public class CardMngr { return sendAPDU(commandAPDU); } - public boolean prepareLocalSimulatorApplet(byte[] appletAIDArray, byte[] installData, Class appletClass) { - System.setProperty("com.licel.jcardsim.terminal.type", "2"); - cad = new CAD(System.getProperties()); - simulator = (JavaxSmartCardInterface) cad.getCardInterface(); + public boolean prepareLocalSimulatorApplet(byte[] appletAIDArray, byte[] installData, Class appletClass) { + simulator = new JavaxSmartCardInterface(); AID appletAID = new AID(appletAIDArray, (short) 0, (byte) appletAIDArray.length); - AID appletAIDRes = simulator.installApplet(appletAID, appletClass, installData, (short) 0, (byte) installData.length); + simulator.installApplet(appletAID, appletClass, installData, (short) 0, (byte) installData.length); return simulator.selectApplet(appletAID); } diff --git a/src/cz/crcs/ectester/reader/ECTesterReader.java b/src/cz/crcs/ectester/reader/ECTesterReader.java index 302df84..dfd71db 100644 --- a/src/cz/crcs/ectester/reader/ECTesterReader.java +++ b/src/cz/crcs/ectester/reader/ECTesterReader.java @@ -33,7 +33,8 @@ 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.*; +import cz.crcs.ectester.reader.output.FileTestWriter; +import cz.crcs.ectester.reader.output.ResponseWriter; import cz.crcs.ectester.reader.response.Response; import cz.crcs.ectester.reader.test.*; import javacard.security.KeyPair; @@ -308,7 +309,7 @@ public class ECTesterReader { byte keyClass = cfg.primeField ? KeyPair.ALG_EC_FP : KeyPair.ALG_EC_F2M; List sent = new LinkedList<>(); - sent.add(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_LOCAL, (short) cfg.bits, keyClass).send()); + sent.add(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_LOCAL, cfg.bits, keyClass).send()); sent.add(new Command.Clear(cardManager, ECTesterApplet.KEYPAIR_LOCAL).send()); sent.add(new Command.Generate(cardManager, ECTesterApplet.KEYPAIR_LOCAL).send()); @@ -345,7 +346,7 @@ public class ECTesterReader { 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); + Command curve = Command.prepareCurve(cardManager, EC_Store.getInstance(), cfg, ECTesterApplet.KEYPAIR_LOCAL, cfg.bits, keyClass); OutputStreamWriter keysFile = FileUtil.openFiles(cfg.outputs); keysFile.write("index;time;pubW;privS\n"); @@ -454,8 +455,8 @@ public class ECTesterReader { byte keyClass = cfg.primeField ? KeyPair.ALG_EC_FP : KeyPair.ALG_EC_F2M; List prepare = new LinkedList<>(); prepare.add(new Command.AllocateKeyAgreement(cardManager, cfg.ECKAType).send()); // Prepare KeyAgreement or required type - prepare.add(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, (short) cfg.bits, keyClass).send()); - Command curve = Command.prepareCurve(cardManager, EC_Store.getInstance(), cfg, ECTesterApplet.KEYPAIR_BOTH, (short) cfg.bits, keyClass); + prepare.add(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, cfg.bits, keyClass).send()); + Command curve = Command.prepareCurve(cardManager, EC_Store.getInstance(), cfg, ECTesterApplet.KEYPAIR_BOTH, cfg.bits, keyClass); if (curve != null) prepare.add(curve.send()); @@ -545,8 +546,8 @@ public class ECTesterReader { byte keyClass = cfg.primeField ? KeyPair.ALG_EC_FP : KeyPair.ALG_EC_F2M; List prepare = new LinkedList<>(); prepare.add(new Command.AllocateSignature(cardManager, cfg.ECDSAType).send()); - prepare.add(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_LOCAL, (short) cfg.bits, keyClass).send()); - Command curve = Command.prepareCurve(cardManager, EC_Store.getInstance(), cfg, ECTesterApplet.KEYPAIR_LOCAL, (short) cfg.bits, keyClass); + prepare.add(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_LOCAL, cfg.bits, keyClass).send()); + Command curve = Command.prepareCurve(cardManager, EC_Store.getInstance(), cfg, ECTesterApplet.KEYPAIR_LOCAL, cfg.bits, keyClass); if (curve != null) prepare.add(curve.send()); -- cgit v1.2.3-70-g09d2 From 28651c07e7fc0a6eecc040b1396cec45c2585ac6 Mon Sep 17 00:00:00 2001 From: J08nY Date: Wed, 25 Apr 2018 13:23:57 +0200 Subject: Output date in test suite outputs. --- src/cz/crcs/ectester/common/output/BaseTextTestWriter.java | 6 ++++++ src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java | 6 ++++++ src/cz/crcs/ectester/common/output/BaseYAMLTestWriter.java | 10 ++++++---- 3 files changed, 18 insertions(+), 4 deletions(-) (limited to 'src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java') diff --git a/src/cz/crcs/ectester/common/output/BaseTextTestWriter.java b/src/cz/crcs/ectester/common/output/BaseTextTestWriter.java index 333722d..7805d16 100644 --- a/src/cz/crcs/ectester/common/output/BaseTextTestWriter.java +++ b/src/cz/crcs/ectester/common/output/BaseTextTestWriter.java @@ -3,6 +3,9 @@ package cz.crcs.ectester.common.output; import cz.crcs.ectester.common.test.*; import java.io.PrintStream; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; /** * An absctract basis of a TextTestWriter, which outputs in a human readable format, into console. @@ -25,6 +28,9 @@ public abstract class BaseTextTestWriter implements TestWriter { public void begin(TestSuite suite) { output.println("═══ Running test suite: " + suite.getName() + " ═══"); output.println("═══ " + suite.getDescription()); + DateFormat dateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss"); + Date date = new Date(); + output.println("═══ Date: " + dateFormat.format(date)); output.print(deviceString(suite)); } diff --git a/src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java b/src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java index 9747cf2..44037bf 100644 --- a/src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java +++ b/src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java @@ -15,6 +15,9 @@ import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import java.io.OutputStream; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; /** * @author Jan Jancar johny@neuromancer.sk @@ -37,6 +40,9 @@ public abstract class BaseXMLTestWriter implements TestWriter { Element rootElem = doc.createElement("testSuite"); rootElem.setAttribute("name", suite.getName()); rootElem.setAttribute("desc", suite.getDescription()); + DateFormat dateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss"); + Date date = new Date(); + rootElem.setAttribute("date", dateFormat.format(date)); root = rootElem; doc.appendChild(root); diff --git a/src/cz/crcs/ectester/common/output/BaseYAMLTestWriter.java b/src/cz/crcs/ectester/common/output/BaseYAMLTestWriter.java index 354d518..c274cf2 100644 --- a/src/cz/crcs/ectester/common/output/BaseYAMLTestWriter.java +++ b/src/cz/crcs/ectester/common/output/BaseYAMLTestWriter.java @@ -5,10 +5,9 @@ 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; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.*; /** * @author Jan Jancar johny@neuromancer.sk @@ -32,6 +31,9 @@ public abstract class BaseYAMLTestWriter implements TestWriter { testSuite.put("name", suite.getName()); testSuite.put("desc", suite.getDescription()); + DateFormat dateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss"); + Date date = new Date(); + testRun.put("date", dateFormat.format(date)); testRun.put("suite", testSuite); testRun.put("device", deviceObject(suite)); testRun.put("tests", tests); -- cgit v1.2.3-70-g09d2 From 4dfa76f84bfdfbafe400ea0d4670dddc46cc3ade Mon Sep 17 00:00:00 2001 From: J08nY Date: Tue, 29 May 2018 19:29:18 +0200 Subject: Add list-suites option to both reader and standalone. - Also add support for specifying the key algo for KDF in standalone ECDH. - Add descriptions to standalone options. --- src/cz/crcs/ectester/common/cli/CLITools.java | 3 +- src/cz/crcs/ectester/common/cli/ParserOptions.java | 13 +++--- .../ectester/common/output/BaseTextTestWriter.java | 2 +- .../ectester/common/output/BaseXMLTestWriter.java | 2 +- .../ectester/common/output/BaseYAMLTestWriter.java | 2 +- src/cz/crcs/ectester/common/test/TestSuite.java | 10 ++++- src/cz/crcs/ectester/reader/ECTesterReader.java | 26 ++++++++++++ .../ectester/standalone/ECTesterStandalone.java | 49 +++++++++++++++++----- 8 files changed, 84 insertions(+), 23 deletions(-) (limited to 'src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java') diff --git a/src/cz/crcs/ectester/common/cli/CLITools.java b/src/cz/crcs/ectester/common/cli/CLITools.java index 91f121f..4aa58b0 100644 --- a/src/cz/crcs/ectester/common/cli/CLITools.java +++ b/src/cz/crcs/ectester/common/cli/CLITools.java @@ -37,7 +37,8 @@ public class CLITools { } tp.getParsers().forEach((key, value) -> { pw.println(); - help.printWrapped(pw, HelpFormatter.DEFAULT_WIDTH, String.format("%" + depth + "s" + key + ":", " ")); + String description = value.getDescription() == null ? "" : " | " + value.getDescription() + " |"; + help.printWrapped(pw, HelpFormatter.DEFAULT_WIDTH, String.format("%" + depth + "s" + key + ":" + description, " ")); CLITools.help(help, pw, value.getParser(), value.getOptions(), depth + 1); }); } diff --git a/src/cz/crcs/ectester/common/cli/ParserOptions.java b/src/cz/crcs/ectester/common/cli/ParserOptions.java index ee2097e..7300cbb 100644 --- a/src/cz/crcs/ectester/common/cli/ParserOptions.java +++ b/src/cz/crcs/ectester/common/cli/ParserOptions.java @@ -3,25 +3,22 @@ package cz.crcs.ectester.common.cli; import org.apache.commons.cli.CommandLineParser; import org.apache.commons.cli.Options; -import java.util.Collections; -import java.util.List; - /** * @author Jan Jancar johny@neuromancer.sk */ public class ParserOptions { private CommandLineParser parser; private Options options; - private List arguments; + private String description; public ParserOptions(CommandLineParser parser, Options options) { this.parser = parser; this.options = options; } - public ParserOptions(CommandLineParser parser, Options options, List arguments) { + public ParserOptions(CommandLineParser parser, Options options, String description) { this(parser, options); - this.arguments = arguments; + this.description = description; } public CommandLineParser getParser() { @@ -32,7 +29,7 @@ public class ParserOptions { return options; } - public List getArguments() { - return Collections.unmodifiableList(arguments); + public String getDescription() { + return description; } } diff --git a/src/cz/crcs/ectester/common/output/BaseTextTestWriter.java b/src/cz/crcs/ectester/common/output/BaseTextTestWriter.java index 1b85f36..148466a 100644 --- a/src/cz/crcs/ectester/common/output/BaseTextTestWriter.java +++ b/src/cz/crcs/ectester/common/output/BaseTextTestWriter.java @@ -27,7 +27,7 @@ public abstract class BaseTextTestWriter implements TestWriter { @Override public void begin(TestSuite suite) { output.println("═══ Running test suite: " + suite.getName() + " ═══"); - for (String d : suite.getDescription().split("\n")) { + for (String d : suite.getDescription()) { output.println("═══ " + d); } DateFormat dateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss"); diff --git a/src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java b/src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java index 44037bf..4e0c236 100644 --- a/src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java +++ b/src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java @@ -39,7 +39,7 @@ public abstract class BaseXMLTestWriter implements TestWriter { doc = db.newDocument(); Element rootElem = doc.createElement("testSuite"); rootElem.setAttribute("name", suite.getName()); - rootElem.setAttribute("desc", suite.getDescription()); + rootElem.setAttribute("desc", suite.getTextDescription()); DateFormat dateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss"); Date date = new Date(); rootElem.setAttribute("date", dateFormat.format(date)); diff --git a/src/cz/crcs/ectester/common/output/BaseYAMLTestWriter.java b/src/cz/crcs/ectester/common/output/BaseYAMLTestWriter.java index 609e46d..cab2632 100644 --- a/src/cz/crcs/ectester/common/output/BaseYAMLTestWriter.java +++ b/src/cz/crcs/ectester/common/output/BaseYAMLTestWriter.java @@ -29,7 +29,7 @@ public abstract class BaseYAMLTestWriter implements TestWriter { testSuite = new LinkedHashMap<>(); tests = new LinkedList<>(); testSuite.put("name", suite.getName()); - testSuite.put("desc", suite.getDescription()); + testSuite.put("desc", suite.getTextDescription()); DateFormat dateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss"); Date date = new Date(); diff --git a/src/cz/crcs/ectester/common/test/TestSuite.java b/src/cz/crcs/ectester/common/test/TestSuite.java index c8bb3f8..5f26f52 100644 --- a/src/cz/crcs/ectester/common/test/TestSuite.java +++ b/src/cz/crcs/ectester/common/test/TestSuite.java @@ -69,8 +69,16 @@ public abstract class TestSuite { return name; } - public String getDescription() { + public String[] getDescription() { + return description; + } + + public String getTextDescription() { return String.join(System.lineSeparator(), description); } + public String toString() { + return null; + } + } diff --git a/src/cz/crcs/ectester/reader/ECTesterReader.java b/src/cz/crcs/ectester/reader/ECTesterReader.java index 9d7df4e..92b5781 100644 --- a/src/cz/crcs/ectester/reader/ECTesterReader.java +++ b/src/cz/crcs/ectester/reader/ECTesterReader.java @@ -102,6 +102,11 @@ public class ECTesterReader { return; } + if (cli.hasOption("list-suites")) { + listSuites(); + return; + } + //init CardManager cardManager = new CardMngr(cfg.verbose, cfg.simulate); @@ -250,6 +255,7 @@ public class ECTesterReader { actions.addOption(Option.builder("t").longOpt("test").desc("Test ECC support. [test_suite]:\n- default:\n- compression:\n- invalid:\n- twist:\n- degenerate:\n- cofactor:\n- wrong:\n- composite:\n- test-vectors:\n- edge-cases:").hasArg().argName("test_suite").optionalArg(true).build()); actions.addOption(Option.builder("dh").longOpt("ecdh").desc("Do EC KeyAgreement (ECDH...), [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()); + actions.addOption(Option.builder("ls").longOpt("list-suites").desc("List supported test suites.").build()); opts.addOptionGroup(actions); @@ -299,6 +305,26 @@ public class ECTesterReader { return parser.parse(opts, args); } + private void listSuites() { + CardTestSuite[] suites = new CardTestSuite[]{ + new CardDefaultSuite(null, null, null), + new CardTestVectorSuite(null, null, null), + new CardCompressionSuite(null, null, null), + new CardWrongCurvesSuite(null, null, null), + new CardDegenerateCurvesSuite(null, null, null), + new CardCofactorSuite(null, null, null), + new CardCompositeCurvesSuite(null, null, null), + new CardInvalidCurvesSuite(null, null, null), + new CardEdgeCasesSuite(null, null, null), + new CardTwistTestSuite(null, null, null)}; + for (CardTestSuite suite : suites) { + System.out.println(" - " + suite.getName()); + for (String line : suite.getDescription()) { + System.out.println("\t" + line); + } + } + } + /** * Exports default card/simulation EC domain parameters to output file. * diff --git a/src/cz/crcs/ectester/standalone/ECTesterStandalone.java b/src/cz/crcs/ectester/standalone/ECTesterStandalone.java index 18bfce6..60a33f3 100644 --- a/src/cz/crcs/ectester/standalone/ECTesterStandalone.java +++ b/src/cz/crcs/ectester/standalone/ECTesterStandalone.java @@ -44,6 +44,7 @@ import org.apache.commons.cli.Options; import org.apache.commons.cli.ParseException; import javax.crypto.KeyAgreement; +import javax.crypto.SecretKey; import javax.xml.parsers.ParserConfigurationException; import java.io.File; import java.io.FileNotFoundException; @@ -102,6 +103,8 @@ public class ECTesterStandalone { listLibraries(); } else if (cli.isNext("list-data")) { CLITools.listNamed(EC_Store.getInstance(), cli.getNext().getArg(0)); + } else if (cli.isNext("list-suites")) { + listSuites(); } else if (cli.isNext("ecdh")) { ecdh(); } else if (cli.isNext("ecdsa")) { @@ -141,10 +144,10 @@ public class ECTesterStandalone { testOpts.addOption(Option.builder("kt").longOpt("ka-type").desc("Set the KeyAgreement object [type].").hasArg().argName("type").optionalArg(false).build()); testOpts.addOption(Option.builder("st").longOpt("sig-type").desc("Set the Signature object [type].").hasArg().argName("type").optionalArg(false).build()); testOpts.addOption(Option.builder("f").longOpt("format").desc("Set the output format, one of text,yaml,xml.").hasArg().argName("format").optionalArg(false).build()); - testOpts.addOption(Option.builder().longOpt("key-type").desc("Set the key [algorithm] for which the key should be derived in KeyAgreements with KDF.").hasArg().argName("algorithm").optionalArg(false).build()); + testOpts.addOption(Option.builder().longOpt("key-type").desc("Set the key [algorithm] for which the key should be derived in KeyAgreements with KDF. Default is \"AES\".").hasArg().argName("algorithm").optionalArg(false).build()); List testArgs = new LinkedList<>(); - testArgs.add(new Argument("test_suite", "The test suite to run.", true)); - ParserOptions test = new ParserOptions(new DefaultParser(), testOpts, testArgs); + testArgs.add(new Argument("test-suite", "The test suite to run.", true)); + ParserOptions test = new ParserOptions(new TreeParser(Collections.emptyMap(), true, testArgs), testOpts, "Test a library."); actions.put("test", test); Options ecdhOpts = new Options(); @@ -152,8 +155,9 @@ public class ECTesterStandalone { ecdhOpts.addOption(namedCurve); ecdhOpts.addOption(curveName); ecdhOpts.addOption(Option.builder("t").longOpt("type").desc("Set KeyAgreement object [type].").hasArg().argName("type").optionalArg(false).build()); + ecdhOpts.addOption(Option.builder().longOpt("key-type").desc("Set the key [algorithm] for which the key should be derived in KeyAgreements with KDF. Default is \"AES\".").hasArg().argName("algorithm").optionalArg(false).build()); ecdhOpts.addOption(Option.builder("n").longOpt("amount").hasArg().argName("amount").optionalArg(false).desc("Do ECDH [amount] times.").build()); - ParserOptions ecdh = new ParserOptions(new DefaultParser(), ecdhOpts); + ParserOptions ecdh = new ParserOptions(new DefaultParser(), ecdhOpts, "Perform EC based KeyAgreement."); actions.put("ecdh", ecdh); Options ecdsaOpts = new Options(); @@ -163,7 +167,7 @@ public class ECTesterStandalone { ecdsaOpts.addOption(Option.builder("t").longOpt("type").desc("Set Signature object [type].").hasArg().argName("type").optionalArg(false).build()); ecdsaOpts.addOption(Option.builder("n").longOpt("amount").hasArg().argName("amount").optionalArg(false).desc("Do ECDSA [amount] times.").build()); ecdsaOpts.addOption(Option.builder("f").longOpt("file").hasArg().argName("file").optionalArg(false).desc("Input [file] to sign.").build()); - ParserOptions ecdsa = new ParserOptions(new DefaultParser(), ecdsaOpts); + ParserOptions ecdsa = new ParserOptions(new DefaultParser(), ecdsaOpts, "Perform EC based Signature."); actions.put("ecdsa", ecdsa); Options generateOpts = new Options(); @@ -172,25 +176,29 @@ public class ECTesterStandalone { generateOpts.addOption(curveName); generateOpts.addOption(Option.builder("n").longOpt("amount").hasArg().argName("amount").optionalArg(false).desc("Generate [amount] of EC keys.").build()); generateOpts.addOption(Option.builder("t").longOpt("type").hasArg().argName("type").optionalArg(false).desc("Set KeyPairGenerator object [type].").build()); - ParserOptions generate = new ParserOptions(new DefaultParser(), generateOpts); + ParserOptions generate = new ParserOptions(new DefaultParser(), generateOpts, "Generate EC keypairs."); actions.put("generate", generate); Options exportOpts = new Options(); exportOpts.addOption(Option.builder("t").longOpt("type").hasArg().argName("type").optionalArg(false).desc("Set KeyPair object [type].").build()); exportOpts.addOption(bits); - ParserOptions export = new ParserOptions(new DefaultParser(), exportOpts); + ParserOptions export = new ParserOptions(new DefaultParser(), exportOpts, "Export default curve parameters."); actions.put("export", export); Options listDataOpts = new Options(); List listDataArgs = new LinkedList<>(); listDataArgs.add(new Argument("what", "what to list.", false)); - ParserOptions listData = new ParserOptions(new TreeParser(Collections.emptyMap(), false, listDataArgs), listDataOpts); + ParserOptions listData = new ParserOptions(new TreeParser(Collections.emptyMap(), false, listDataArgs), listDataOpts, "List/show contained EC domain parameters/keys."); actions.put("list-data", listData); Options listLibsOpts = new Options(); - ParserOptions listLibs = new ParserOptions(new DefaultParser(), listLibsOpts); + ParserOptions listLibs = new ParserOptions(new DefaultParser(), listLibsOpts, "List supported libraries."); actions.put("list-libs", listLibs); + Options listSuitesOpts = new Options(); + ParserOptions listSuites = new ParserOptions(new DefaultParser(), listSuitesOpts, "List supported test suites."); + actions.put("list-suites", listSuites); + List baseArgs = new LinkedList<>(); baseArgs.add(new Argument("lib", "What library to use.", false)); optParser = new TreeParser(actions, false, baseArgs); @@ -229,6 +237,19 @@ public class ECTesterStandalone { } } + /** + * + */ + private void listSuites() { + StandaloneTestSuite[] suites = new StandaloneTestSuite[]{new StandaloneDefaultSuite(null, null, null)}; + for (StandaloneTestSuite suite : suites) { + System.out.println(" - " + suite.getName()); + for (String line : suite.getDescription()) { + System.out.println("\t" + line); + } + } + } + /** * */ @@ -236,6 +257,7 @@ public class ECTesterStandalone { ProviderECLibrary lib = cfg.selected; String algo = cli.getOptionValue("ecdh.type", "ECDH"); + String keyAlgo = cli.getOptionValue("ecdh.key-type", "AES"); KeyAgreementIdent kaIdent = lib.getKAs().stream() .filter((ident) -> ident.contains(algo)) .findFirst() @@ -295,7 +317,14 @@ public class ECTesterStandalone { } ka.doPhase(pubkey, true); elapsed += System.nanoTime(); - byte[] result = ka.generateSecret(); + SecretKey derived; + byte[] result; + if (kaIdent.requiresKeyAlgo()) { + derived = ka.generateSecret(keyAlgo); + result = derived.getEncoded(); + } else { + result = ka.generateSecret(); + } ka = kaIdent.getInstance(lib.getProvider()); String pub = ByteUtil.bytesToHex(ECUtil.toX962Uncompressed(pubkey.getW(), pubkey.getParams()), false); -- cgit v1.2.3-70-g09d2 From 1bfa90811a0b4ea02d98ea7dedcfc07bec89d19c Mon Sep 17 00:00:00 2001 From: J08nY Date: Thu, 5 Jul 2018 19:30:16 +0200 Subject: Add ability to skip tests/run only a part of a test suite. --- .../ectester/common/output/BaseTextTestWriter.java | 19 ++++++----- .../ectester/common/output/BaseXMLTestWriter.java | 4 +-- .../ectester/common/output/BaseYAMLTestWriter.java | 4 +-- .../crcs/ectester/common/output/TeeTestWriter.java | 8 ++--- src/cz/crcs/ectester/common/output/TestWriter.java | 9 +++--- src/cz/crcs/ectester/common/test/TestSuite.java | 22 +++++++++++-- src/cz/crcs/ectester/reader/CardMngr.java | 1 - src/cz/crcs/ectester/reader/ECTesterReader.java | 37 +++++++++++++++++++--- .../ectester/reader/test/CardCofactorSuite.java | 4 +-- .../ectester/reader/test/CardCompositeSuite.java | 5 +-- .../ectester/reader/test/CardCompressionSuite.java | 2 +- .../ectester/reader/test/CardDefaultSuite.java | 4 +-- .../ectester/reader/test/CardDegenerateSuite.java | 4 +-- .../ectester/reader/test/CardInvalidSuite.java | 4 +-- .../crcs/ectester/reader/test/CardMiscSuite.java | 4 +-- .../ectester/reader/test/CardTestVectorSuite.java | 2 +- .../crcs/ectester/reader/test/CardTwistSuite.java | 4 +-- .../crcs/ectester/reader/test/CardWrongSuite.java | 1 - 18 files changed, 91 insertions(+), 47 deletions(-) (limited to 'src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java') diff --git a/src/cz/crcs/ectester/common/output/BaseTextTestWriter.java b/src/cz/crcs/ectester/common/output/BaseTextTestWriter.java index c3ce640..eef767b 100644 --- a/src/cz/crcs/ectester/common/output/BaseTextTestWriter.java +++ b/src/cz/crcs/ectester/common/output/BaseTextTestWriter.java @@ -38,20 +38,18 @@ public abstract class BaseTextTestWriter implements TestWriter { } /** - * * @param t * @return */ protected abstract String testableString(Testable t); /** - * * @param suite * @return */ protected abstract String deviceString(TestSuite suite); - private String testString(Test t, String prefix) { + private String testString(Test t, String prefix, int index) { boolean compound = t instanceof CompoundTest; Result result = t.getResult(); @@ -61,7 +59,8 @@ public abstract class BaseTextTestWriter implements TestWriter { out.append(compound ? "┳ " : "━ "); int width = BASE_WIDTH - (prefix.length() + out.length()); String widthSpec = "%-" + String.valueOf(width) + "s"; - out.append(String.format(widthSpec, t.getDescription())); + String desc = ((prefix.equals("")) ? "(" + index + ") " : "") + t.getDescription(); + out.append(String.format(widthSpec, desc)); out.append(" ┃ "); Colors.Foreground valueColor; if (result.getValue().ok()) { @@ -82,10 +81,10 @@ public abstract class BaseTextTestWriter implements TestWriter { for (int i = 0; i < tests.length; ++i) { if (i == tests.length - 1) { out.append(prefix).append(" ┗ "); - out.append(testString(tests[i], prefix + " ")); + out.append(testString(tests[i], prefix + " ", index)); } else { out.append(prefix).append(" ┣ "); - out.append(testString(tests[i], prefix + " ┃ ")); + out.append(testString(tests[i], prefix + " ┃ ", index)); } if (i != tests.length - 1) { @@ -100,10 +99,10 @@ public abstract class BaseTextTestWriter implements TestWriter { } @Override - public void outputTest(Test t) { + public void outputTest(Test t, int index) { if (!t.hasRun()) return; - output.println(testString(t, "")); + output.println(testString(t, "", index)); output.flush(); } @@ -122,8 +121,8 @@ public abstract class BaseTextTestWriter implements TestWriter { } @Override - public void outputError(Test t, Throwable cause) { - output.println(testString(t, "")); + public void outputError(Test t, Throwable cause, int index) { + output.println(testString(t, "", index)); output.print(errorString(cause)); output.flush(); } diff --git a/src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java b/src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java index 4e0c236..b666e08 100644 --- a/src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java +++ b/src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java @@ -112,14 +112,14 @@ public abstract class BaseXMLTestWriter implements TestWriter { } @Override - public void outputTest(Test t) { + public void outputTest(Test t, int index) { if (!t.hasRun()) return; tests.appendChild(testElement(t)); } @Override - public void outputError(Test t, Throwable cause) { + public void outputError(Test t, Throwable cause, int index) { tests.appendChild(testElement(t)); } diff --git a/src/cz/crcs/ectester/common/output/BaseYAMLTestWriter.java b/src/cz/crcs/ectester/common/output/BaseYAMLTestWriter.java index cab2632..e3c7952 100644 --- a/src/cz/crcs/ectester/common/output/BaseYAMLTestWriter.java +++ b/src/cz/crcs/ectester/common/output/BaseYAMLTestWriter.java @@ -89,14 +89,14 @@ public abstract class BaseYAMLTestWriter implements TestWriter { } @Override - public void outputTest(Test t) { + public void outputTest(Test t, int index) { if (!t.hasRun()) return; tests.add(testObject(t)); } @Override - public void outputError(Test t, Throwable cause) { + public void outputError(Test t, Throwable cause, int index) { tests.add(testObject(t)); } diff --git a/src/cz/crcs/ectester/common/output/TeeTestWriter.java b/src/cz/crcs/ectester/common/output/TeeTestWriter.java index 35912fa..58a0a15 100644 --- a/src/cz/crcs/ectester/common/output/TeeTestWriter.java +++ b/src/cz/crcs/ectester/common/output/TeeTestWriter.java @@ -21,16 +21,16 @@ public class TeeTestWriter implements TestWriter { } @Override - public void outputTest(Test t) { + public void outputTest(Test t, int index) { for (TestWriter writer : writers) { - writer.outputTest(t); + writer.outputTest(t, index); } } @Override - public void outputError(Test t, Throwable cause) { + public void outputError(Test t, Throwable cause, int index) { for (TestWriter writer : writers) { - writer.outputError(t, cause); + writer.outputError(t, cause, index); } } diff --git a/src/cz/crcs/ectester/common/output/TestWriter.java b/src/cz/crcs/ectester/common/output/TestWriter.java index 7de23a5..eb95804 100644 --- a/src/cz/crcs/ectester/common/output/TestWriter.java +++ b/src/cz/crcs/ectester/common/output/TestWriter.java @@ -21,15 +21,16 @@ public interface TestWriter { /** * * @param t + * @param index */ - void outputTest(Test t); + void outputTest(Test t, int index); /** - * - * @param t + * @param t * @param cause + * @param index */ - void outputError(Test t, Throwable cause); + void outputError(Test t, Throwable cause, int index); /** * diff --git a/src/cz/crcs/ectester/common/test/TestSuite.java b/src/cz/crcs/ectester/common/test/TestSuite.java index 5f26f52..b12680a 100644 --- a/src/cz/crcs/ectester/common/test/TestSuite.java +++ b/src/cz/crcs/ectester/common/test/TestSuite.java @@ -10,6 +10,9 @@ public abstract class TestSuite { protected String[] description; private TestWriter writer; private Test running; + private int ran = 0; + private int runFrom = 0; + private int runTo = -1; public TestSuite(TestWriter writer, String name, String... description) { this.writer = writer; @@ -21,11 +24,21 @@ public abstract class TestSuite { * Run the TestSuite. */ public void run() { + run(0); + } + + public void run(int from) { + run(from, -1); + } + + public void run(int from, int to) { + this.runFrom = from; + this.runTo = to; writer.begin(this); try { runTests(); } catch (TestException e) { - writer.outputError(running, e); + writer.outputError(running, e, ran); } catch (Exception e) { writer.end(); throw new TestSuiteException(e); @@ -55,8 +68,11 @@ public abstract class TestSuite { * @throws TestException */ protected T doTest(T t) { - runTest(t); - writer.outputTest(t); + if (ran >= runFrom && (runTo < 0 || ran <= runTo)) { + runTest(t); + writer.outputTest(t, ran); + } + ran++; return t; } diff --git a/src/cz/crcs/ectester/reader/CardMngr.java b/src/cz/crcs/ectester/reader/CardMngr.java index 637be56..921a9c8 100644 --- a/src/cz/crcs/ectester/reader/CardMngr.java +++ b/src/cz/crcs/ectester/reader/CardMngr.java @@ -1,6 +1,5 @@ package cz.crcs.ectester.reader; -import com.licel.jcardsim.io.CAD; import com.licel.jcardsim.io.JavaxSmartCardInterface; import cz.crcs.ectester.common.util.ByteUtil; import javacard.framework.AID; diff --git a/src/cz/crcs/ectester/reader/ECTesterReader.java b/src/cz/crcs/ectester/reader/ECTesterReader.java index 89cfca1..2b78cb0 100644 --- a/src/cz/crcs/ectester/reader/ECTesterReader.java +++ b/src/cz/crcs/ectester/reader/ECTesterReader.java @@ -272,8 +272,8 @@ public class ECTesterReader { actions.addOption(Option.builder("h").longOpt("help").desc("Print help.").build()); actions.addOption(Option.builder("ln").longOpt("list-named").desc("Print the list of supported named curves and keys.").hasArg().argName("what").optionalArg(true).build()); actions.addOption(Option.builder("e").longOpt("export").desc("Export the defaut curve parameters of the card(if any).").build()); - actions.addOption(Option.builder("g").longOpt("generate").desc("Generate [amount] of EC keys.").hasArg().argName("amount").optionalArg(true).build()); - actions.addOption(Option.builder("t").longOpt("test").desc("Test ECC support. [test_suite]:\n- default:\n- compression:\n- invalid:\n- twist:\n- degenerate:\n- cofactor:\n- wrong:\n- composite:\n- test-vectors:\n- edge-cases:\n- miscellaneous:").hasArg().argName("test_suite").optionalArg(true).build()); + actions.addOption(Option.builder("g").longOpt("generate").desc("Generate of EC keys.").hasArg().argName("amount").optionalArg(true).build()); + actions.addOption(Option.builder("t").longOpt("test").desc("Test ECC support. Optionally specify a test number to run only a part of a test suite. :\n- default:\n- compression:\n- invalid:\n- twist:\n- degenerate:\n- cofactor:\n- wrong:\n- composite:\n- test-vectors:\n- edge-cases:\n- miscellaneous:").hasArg().argName("test_suite[:from[:to]]").optionalArg(true).build()); actions.addOption(Option.builder("dh").longOpt("ecdh").desc("Do EC KeyAgreement (ECDH...), [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()); actions.addOption(Option.builder("ls").longOpt("list-suites").desc("List supported test suites.").build()); @@ -503,7 +503,7 @@ public class ECTesterReader { break; } - suite.run(); + suite.run(cfg.testFrom, cfg.testTo); } /** @@ -702,6 +702,8 @@ public class ECTesterReader { //Action-related options public String listNamed; public String testSuite; + public int testFrom; + public int testTo; public int generateAmount; public int ECKACount; public byte ECKAType = KeyAgreement_ALG_EC_SVDP_DH; @@ -827,7 +829,34 @@ public class ECTesterReader { primeField = true; } - testSuite = cli.getOptionValue("test", "default").toLowerCase(); + String suiteOpt = cli.getOptionValue("test", "default").toLowerCase(); + if (suiteOpt.contains(":")) { + String[] parts = suiteOpt.split(":"); + testSuite = parts[0]; + try { + testFrom = Integer.parseInt(parts[1]); + } catch (NumberFormatException nfe) { + System.err.println("Invalid test from number: " + parts[1] + "."); + return false; + } + if (parts.length == 3) { + try { + testTo = Integer.parseInt(parts[2]); + } catch (NumberFormatException nfe) { + System.err.println("Invalid test to number: " + parts[2] + "."); + return false; + } + } else if (parts.length != 2) { + System.err.println("Invalid test suite selection."); + return false; + } else { + testTo = -1; + } + } else { + testSuite = suiteOpt; + testFrom = 0; + testTo = -1; + } String[] tests = new String[]{"default", "composite", "compression", "invalid", "degenerate", "test-vectors", "wrong", "twist", "cofactor", "edge-cases", "miscellaneous"}; if (!Arrays.asList(tests).contains(testSuite)) { System.err.println(Colors.error("Unknown test suite " + testSuite + ". Should be one of: " + Arrays.toString(tests))); diff --git a/src/cz/crcs/ectester/reader/test/CardCofactorSuite.java b/src/cz/crcs/ectester/reader/test/CardCofactorSuite.java index 2ecf4a2..762dc88 100644 --- a/src/cz/crcs/ectester/reader/test/CardCofactorSuite.java +++ b/src/cz/crcs/ectester/reader/test/CardCofactorSuite.java @@ -65,9 +65,9 @@ public class CardCofactorSuite extends CardTestSuite { Test ecdsa = CompoundTest.all(ExpectedValue.SUCCESS, "Verify random ECDSA signature by public points on non-generator subgroup.", ecdsaTests.toArray(new Test[0])); Test tests = CompoundTest.all(ExpectedValue.SUCCESS, "Perform ECDH and ECDSA tests.", ecdh, ecdsa); + Test cleanup = CommandTest.expect(new Command.Cleanup(this.card), ExpectedValue.SUCCESS); - doTest(CompoundTest.greedyAllTry(ExpectedValue.SUCCESS, "Cofactor test of " + curve.getId() + ".", prepare, tests)); - new Command.Cleanup(this.card).send(); + doTest(CompoundTest.greedyAllTry(ExpectedValue.SUCCESS, "Cofactor test of " + curve.getId() + ".", prepare, tests, cleanup)); } } } diff --git a/src/cz/crcs/ectester/reader/test/CardCompositeSuite.java b/src/cz/crcs/ectester/reader/test/CardCompositeSuite.java index a693ac7..b80a0e3 100644 --- a/src/cz/crcs/ectester/reader/test/CardCompositeSuite.java +++ b/src/cz/crcs/ectester/reader/test/CardCompositeSuite.java @@ -96,8 +96,9 @@ public class CardCompositeSuite extends CardTestSuite { } else { description = testName + " test of " + curve.getId() + "."; } - doTest(CompoundTest.greedyAllTry(ExpectedValue.SUCCESS, description, allocate, set, generate, ecdh)); - new Command.Cleanup(this.card).send(); + Test cleanup = CommandTest.expect(new Command.Cleanup(this.card), ExpectedValue.SUCCESS); + + doTest(CompoundTest.greedyAllTry(ExpectedValue.SUCCESS, description, allocate, set, generate, ecdh, cleanup)); } } diff --git a/src/cz/crcs/ectester/reader/test/CardCompressionSuite.java b/src/cz/crcs/ectester/reader/test/CardCompressionSuite.java index 35cfd1d..19c452c 100644 --- a/src/cz/crcs/ectester/reader/test/CardCompressionSuite.java +++ b/src/cz/crcs/ectester/reader/test/CardCompressionSuite.java @@ -112,9 +112,9 @@ public class CardCompressionSuite extends CardTestSuite { } } compressionTests.addAll(kaTests); + compressionTests.add(CommandTest.expect(new Command.Cleanup(this.card), Result.ExpectedValue.SUCCESS)); doTest(CompoundTest.all(Result.ExpectedValue.SUCCESS, "Compression test of " + spec + ".", compressionTests.toArray(new Test[0]))); - new Command.Cleanup(this.card).send(); } } } diff --git a/src/cz/crcs/ectester/reader/test/CardDefaultSuite.java b/src/cz/crcs/ectester/reader/test/CardDefaultSuite.java index 4480962..554003b 100644 --- a/src/cz/crcs/ectester/reader/test/CardDefaultSuite.java +++ b/src/cz/crcs/ectester/reader/test/CardDefaultSuite.java @@ -126,10 +126,10 @@ public class CardDefaultSuite extends CardTestSuite { } Test signTest = runTest(CompoundTest.any(ExpectedValue.SUCCESS, "Signature tests.", signTests.toArray(new Test[0]))); supportTests.add(signTest); + supportTests.add(CommandTest.expect(new Command.Cleanup(this.card), Result.ExpectedValue.SUCCESS)); - ExpectedValue[] testExpects = {ExpectedValue.SUCCESS, ExpectedValue.ANY, ExpectedValue.SUCCESS, ExpectedValue.SUCCESS, ExpectedValue.SUCCESS, ExpectedValue.SUCCESS, ExpectedValue.SUCCESS}; + ExpectedValue[] testExpects = {ExpectedValue.SUCCESS, ExpectedValue.ANY, ExpectedValue.SUCCESS, ExpectedValue.SUCCESS, ExpectedValue.SUCCESS, ExpectedValue.SUCCESS, ExpectedValue.SUCCESS, ExpectedValue.ANY}; doTest(CompoundTest.mask(testExpects, "Tests of " + keyLength + "b " + CardUtil.getKeyTypeString(field) + " support.", supportTests.toArray(new Test[0]))); - new Command.Cleanup(this.card).send(); } } } diff --git a/src/cz/crcs/ectester/reader/test/CardDegenerateSuite.java b/src/cz/crcs/ectester/reader/test/CardDegenerateSuite.java index 7483b2b..c3cf51c 100644 --- a/src/cz/crcs/ectester/reader/test/CardDegenerateSuite.java +++ b/src/cz/crcs/ectester/reader/test/CardDegenerateSuite.java @@ -47,9 +47,9 @@ public class CardDegenerateSuite extends CardTestSuite { ecdhTests.add(CommandTest.expect(ecdhCommand, Result.ExpectedValue.FAILURE, "Card correctly rejected point on degenerate curve.", "Card incorrectly accepted point on degenerate curve.")); } Test ecdh = CompoundTest.all(Result.ExpectedValue.SUCCESS, "Perform ECDH with degenerate public points", ecdhTests.toArray(new Test[0])); + Test cleanup = CommandTest.expect(new Command.Cleanup(this.card), Result.ExpectedValue.SUCCESS); - doTest(CompoundTest.greedyAllTry(Result.ExpectedValue.SUCCESS, "Degenerate curve test of " + curve.getId(), prepare, ecdh)); - new Command.Cleanup(this.card).send(); + doTest(CompoundTest.greedyAllTry(Result.ExpectedValue.SUCCESS, "Degenerate curve test of " + curve.getId(), prepare, ecdh, cleanup)); } } } diff --git a/src/cz/crcs/ectester/reader/test/CardInvalidSuite.java b/src/cz/crcs/ectester/reader/test/CardInvalidSuite.java index 2543027..60afe75 100644 --- a/src/cz/crcs/ectester/reader/test/CardInvalidSuite.java +++ b/src/cz/crcs/ectester/reader/test/CardInvalidSuite.java @@ -67,9 +67,9 @@ public class CardInvalidSuite extends CardTestSuite { Test ecdsa = CompoundTest.all(Result.ExpectedValue.SUCCESS, "Verify random ECDSA signature by invalid public points", ecdsaTests.toArray(new Test[0])); Test tests = CompoundTest.all(Result.ExpectedValue.SUCCESS, "Test ECDH and ECDSA with points on invalid curves.", ecdh, ecdsa); + Test cleanup = CommandTest.expect(new Command.Cleanup(this.card), ExpectedValue.SUCCESS); - doTest(CompoundTest.greedyAllTry(ExpectedValue.SUCCESS, "Invalid curve test of " + curve.getId(), prepare, tests)); - new Command.Cleanup(this.card).send(); + doTest(CompoundTest.greedyAllTry(ExpectedValue.SUCCESS, "Invalid curve test of " + curve.getId(), prepare, tests, cleanup)); } } } diff --git a/src/cz/crcs/ectester/reader/test/CardMiscSuite.java b/src/cz/crcs/ectester/reader/test/CardMiscSuite.java index d969cf9..5dcf727 100644 --- a/src/cz/crcs/ectester/reader/test/CardMiscSuite.java +++ b/src/cz/crcs/ectester/reader/test/CardMiscSuite.java @@ -46,9 +46,9 @@ public class CardMiscSuite extends CardTestSuite { Test generate = CommandTest.expect(new Command.Generate(this.card, ECTesterApplet.KEYPAIR_BOTH), Result.ExpectedValue.SUCCESS); Test ka = CommandTest.expect(new Command.ECDH(this.card, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.EXPORT_FALSE, EC_Consts.TRANSFORMATION_NONE, EC_Consts.KeyAgreement_ALG_EC_SVDP_DH), Result.ExpectedValue.SUCCESS); Test sig = CommandTest.expect(new Command.ECDSA(this.card, ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.Signature_ALG_ECDSA_SHA, ECTesterApplet.EXPORT_FALSE, null), Result.ExpectedValue.SUCCESS); + Test cleanup = CommandTest.expect(new Command.Cleanup(this.card), Result.ExpectedValue.SUCCESS); - doTest(CompoundTest.greedyAll(Result.ExpectedValue.SUCCESS, "Tests over " + curve.getBits() + " " + catName + " curve: " + curve.getId() + ".", allocateFirst, set, generate, ka, sig)); - new Command.Cleanup(this.card).send(); + doTest(CompoundTest.greedyAll(Result.ExpectedValue.SUCCESS, "Tests over " + curve.getBits() + " " + catName + " curve: " + curve.getId() + ".", allocateFirst, set, generate, ka, sig, cleanup)); } } } diff --git a/src/cz/crcs/ectester/reader/test/CardTestVectorSuite.java b/src/cz/crcs/ectester/reader/test/CardTestVectorSuite.java index 9d39525..9a39a72 100644 --- a/src/cz/crcs/ectester/reader/test/CardTestVectorSuite.java +++ b/src/cz/crcs/ectester/reader/test/CardTestVectorSuite.java @@ -69,8 +69,8 @@ public class CardTestVectorSuite extends CardTestSuite { return new Result(Value.SUCCESS); } })); + testVector.add(CommandTest.expect(new Command.Cleanup(this.card), ExpectedValue.SUCCESS)); doTest(CompoundTest.greedyAll(ExpectedValue.SUCCESS, "Test vector " + result.getId(), testVector.toArray(new Test[0]))); - new Command.Cleanup(this.card).send(); } } } diff --git a/src/cz/crcs/ectester/reader/test/CardTwistSuite.java b/src/cz/crcs/ectester/reader/test/CardTwistSuite.java index 46da415..e7ea436 100644 --- a/src/cz/crcs/ectester/reader/test/CardTwistSuite.java +++ b/src/cz/crcs/ectester/reader/test/CardTwistSuite.java @@ -61,9 +61,9 @@ public class CardTwistSuite extends CardTestSuite { Test ecdsa = CompoundTest.all(Result.ExpectedValue.SUCCESS, "Verify random ECDSA signature by public points on twist", ecdsaTests.toArray(new Test[0])); Test tests = CompoundTest.all(Result.ExpectedValue.SUCCESS, ecdh, ecdsa); + Test cleanup = CommandTest.expect(new Command.Cleanup(this.card), Result.ExpectedValue.SUCCESS); - doTest(CompoundTest.greedyAllTry(Result.ExpectedValue.SUCCESS, "Twist test of " + curve.getId(), prepare, tests)); - new Command.Cleanup(this.card).send(); + doTest(CompoundTest.greedyAllTry(Result.ExpectedValue.SUCCESS, "Twist test of " + curve.getId(), prepare, tests, cleanup)); } } } diff --git a/src/cz/crcs/ectester/reader/test/CardWrongSuite.java b/src/cz/crcs/ectester/reader/test/CardWrongSuite.java index 6c0d5f5..2057093 100644 --- a/src/cz/crcs/ectester/reader/test/CardWrongSuite.java +++ b/src/cz/crcs/ectester/reader/test/CardWrongSuite.java @@ -129,7 +129,6 @@ public class CardWrongSuite extends CardTestSuite { Test wrongR = CompoundTest.all(ExpectedValue.SUCCESS, "Tests with corrupted R parameter.", primeWrongR, nonprimeWrongR); - doTest(CompoundTest.all(ExpectedValue.SUCCESS, "Tests of " + keyLength + "b " + CardUtil.getKeyTypeString(KeyPair.ALG_EC_FP), setup, wrongPrime, resetSetup, wrongG, resetSetup.clone(), wrongR, resetSetup.clone())); } -- cgit v1.2.3-70-g09d2 From e5984d7304101070a5bb9daf1b996dc85e59a800 Mon Sep 17 00:00:00 2001 From: J08nY Date: Thu, 5 Jul 2018 20:20:55 +0200 Subject: Also export test index in YAML and XML. --- src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java | 12 ++++++++---- src/cz/crcs/ectester/common/output/BaseYAMLTestWriter.java | 11 +++++++---- 2 files changed, 15 insertions(+), 8 deletions(-) (limited to 'src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java') diff --git a/src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java b/src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java index b666e08..53970dd 100644 --- a/src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java +++ b/src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java @@ -87,14 +87,14 @@ public abstract class BaseXMLTestWriter implements TestWriter { return resultElem; } - private Element testElement(Test t) { + private Element testElement(Test t, int index) { Element testElem; if (t instanceof CompoundTest) { CompoundTest test = (CompoundTest) t; testElem = doc.createElement("test"); testElem.setAttribute("type", "compound"); for (Test innerTest : test.getStartedTests()) { - testElem.appendChild(testElement(innerTest)); + testElem.appendChild(testElement(innerTest, -1)); } } else { SimpleTest test = (SimpleTest) t; @@ -108,6 +108,10 @@ public abstract class BaseXMLTestWriter implements TestWriter { Element result = resultElement(t.getResult()); testElem.appendChild(result); + if (index != -1) { + testElem.setAttribute("index", String.valueOf(index)); + } + return testElem; } @@ -115,12 +119,12 @@ public abstract class BaseXMLTestWriter implements TestWriter { public void outputTest(Test t, int index) { if (!t.hasRun()) return; - tests.appendChild(testElement(t)); + tests.appendChild(testElement(t, index)); } @Override public void outputError(Test t, Throwable cause, int index) { - tests.appendChild(testElement(t)); + tests.appendChild(testElement(t, index)); } @Override diff --git a/src/cz/crcs/ectester/common/output/BaseYAMLTestWriter.java b/src/cz/crcs/ectester/common/output/BaseYAMLTestWriter.java index e3c7952..e054563 100644 --- a/src/cz/crcs/ectester/common/output/BaseYAMLTestWriter.java +++ b/src/cz/crcs/ectester/common/output/BaseYAMLTestWriter.java @@ -66,7 +66,7 @@ public abstract class BaseYAMLTestWriter implements TestWriter { return resultObject; } - private Map testObject(Test t) { + private Map testObject(Test t, int index) { Map testObj; if (t instanceof CompoundTest) { CompoundTest test = (CompoundTest) t; @@ -74,7 +74,7 @@ public abstract class BaseYAMLTestWriter implements TestWriter { testObj.put("type", "compound"); List> innerTests = new LinkedList<>(); for (Test innerTest : test.getStartedTests()) { - innerTests.add(testObject(innerTest)); + innerTests.add(testObject(innerTest, -1)); } testObj.put("tests", innerTests); } else { @@ -84,6 +84,9 @@ public abstract class BaseYAMLTestWriter implements TestWriter { testObj.put("desc", t.getDescription()); testObj.put("result", resultObject(t.getResult())); + if (index != -1) { + testObj.put("index", index); + } return testObj; } @@ -92,12 +95,12 @@ public abstract class BaseYAMLTestWriter implements TestWriter { public void outputTest(Test t, int index) { if (!t.hasRun()) return; - tests.add(testObject(t)); + tests.add(testObject(t, index)); } @Override public void outputError(Test t, Throwable cause, int index) { - tests.add(testObject(t)); + tests.add(testObject(t, index)); } @Override -- cgit v1.2.3-70-g09d2