diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/cz/crcs/ectester/reader/ECTester.java | 10 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/reader/Util.java | 10 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/reader/output/TextTestWriter.java | 4 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/reader/output/XMLTestWriter.java | 11 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/reader/output/YAMLTestWriter.java | 3 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/reader/test/CompositeCurvesSuite.java | 21 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/reader/test/DefaultSuite.java | 16 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/reader/test/InvalidCurvesSuite.java | 16 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/reader/test/Result.java | 47 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/reader/test/Test.java | 82 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/reader/test/TestSuite.java | 27 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/reader/test/TestVectorSuite.java | 27 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/reader/test/WrongCurvesSuite.java | 6 |
13 files changed, 177 insertions, 103 deletions
diff --git a/src/cz/crcs/ectester/reader/ECTester.java b/src/cz/crcs/ectester/reader/ECTester.java index 271a8e4..fa71ca6 100644 --- a/src/cz/crcs/ectester/reader/ECTester.java +++ b/src/cz/crcs/ectester/reader/ECTester.java @@ -713,8 +713,9 @@ public class ECTester { } format = cli.getOptionValue("format", "text"); - if (!Arrays.asList("text", "xml", "yaml", "yml").contains(format)) { - System.err.println("Wrong output format " + format + "."); + String formats[] = new String[]{"text", "xml", "yaml", "yml"}; + if (!Arrays.asList(formats).contains(format)) { + System.err.println("Wrong output format " + format + ". Should be one of " + Arrays.toString(formats)); return false; } @@ -789,9 +790,8 @@ public class ECTester { testSuite = cli.getOptionValue("test", "default").toLowerCase(); String[] tests = new String[]{"default", "composite", "invalid", "test-vectors", "wrong"}; - List<String> testsList = Arrays.asList(tests); - if (!testsList.contains(testSuite)) { - System.err.println("Unknown test case. Should be one of: " + Arrays.toString(tests)); + if (!Arrays.asList(tests).contains(testSuite)) { + System.err.println("Unknown test suite " + testSuite + ". Should be one of: " + Arrays.toString(tests)); return false; } diff --git a/src/cz/crcs/ectester/reader/Util.java b/src/cz/crcs/ectester/reader/Util.java index 754cda3..840f4c5 100644 --- a/src/cz/crcs/ectester/reader/Util.java +++ b/src/cz/crcs/ectester/reader/Util.java @@ -28,15 +28,19 @@ public class Util { array[offset] = (byte) ((value >> 8) & 0xFF); } - public static boolean compareBytes(byte[] one, int oneOffset, byte[] other, int otherOffset, int length) { + public static int diffBytes(byte[] one, int oneOffset, byte[] other, int otherOffset, int length) { for (int i = 0; i < length; ++i) { byte a = one[i + oneOffset]; byte b = other[i + otherOffset]; if (a != b) { - return false; + return i; } } - return true; + return length; + } + + public static boolean compareBytes(byte[] one, int oneOffset, byte[] other, int otherOffset, int length) { + return diffBytes(one, oneOffset, other, otherOffset, length) == length; } public static boolean allValue(byte[] array, byte value) { diff --git a/src/cz/crcs/ectester/reader/output/TextTestWriter.java b/src/cz/crcs/ectester/reader/output/TextTestWriter.java index 80c7204..ca42fba 100644 --- a/src/cz/crcs/ectester/reader/output/TextTestWriter.java +++ b/src/cz/crcs/ectester/reader/output/TextTestWriter.java @@ -1,6 +1,7 @@ package cz.crcs.ectester.reader.output; import cz.crcs.ectester.reader.test.Test; +import cz.crcs.ectester.reader.test.Result; import cz.crcs.ectester.reader.test.TestSuite; import java.io.PrintStream; @@ -19,10 +20,11 @@ public class TextTestWriter implements TestWriter { @Override public void begin(TestSuite suite) { + //TODO: output suite.name and suite.description } private String testPrefix(Test t) { - return String.format("%-4s", t.getResult() == Test.Result.SUCCESS ? "OK" : "NOK"); + return String.format("%-4s", t.getResultValue() == Result.Value.SUCCESS ? "OK" : "NOK"); } private String testString(Test t) { diff --git a/src/cz/crcs/ectester/reader/output/XMLTestWriter.java b/src/cz/crcs/ectester/reader/output/XMLTestWriter.java index 29a97db..c575bb7 100644 --- a/src/cz/crcs/ectester/reader/output/XMLTestWriter.java +++ b/src/cz/crcs/ectester/reader/output/XMLTestWriter.java @@ -8,6 +8,7 @@ import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; +import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.OutputKeys; @@ -23,17 +24,23 @@ import java.io.OutputStream; */ public class XMLTestWriter implements TestWriter { private OutputStream output; + private DocumentBuilder db; private Document doc; private Node root; public XMLTestWriter(OutputStream output) throws ParserConfigurationException { this.output = output; - this.doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); + this.db = DocumentBuilderFactory.newInstance().newDocumentBuilder(); } @Override public void begin(TestSuite suite) { - root = doc.createElement("testRun"); + doc = db.newDocument(); + Element rootElem = doc.createElement("testSuite"); + rootElem.setAttribute("name", suite.getName()); + rootElem.setAttribute("desc", suite.getDescription()); + + root = rootElem; doc.appendChild(root); } diff --git a/src/cz/crcs/ectester/reader/output/YAMLTestWriter.java b/src/cz/crcs/ectester/reader/output/YAMLTestWriter.java index 10d9bb9..6dc5c2d 100644 --- a/src/cz/crcs/ectester/reader/output/YAMLTestWriter.java +++ b/src/cz/crcs/ectester/reader/output/YAMLTestWriter.java @@ -28,6 +28,7 @@ public class YAMLTestWriter implements TestWriter { public void begin(TestSuite suite) { output.println("---"); testRun = new LinkedList<>(); + //TODO: output suite.name and suite.description } private Map<String, Object> responseObject(Response r) { @@ -63,7 +64,7 @@ public class YAMLTestWriter implements TestWriter { } testObj.put("desc", t.getDescription()); - testObj.put("result", t.getResult().name()); + testObj.put("result", t.getResultValue().name()); return testObj; } diff --git a/src/cz/crcs/ectester/reader/test/CompositeCurvesSuite.java b/src/cz/crcs/ectester/reader/test/CompositeCurvesSuite.java index 76b79de..291d404 100644 --- a/src/cz/crcs/ectester/reader/test/CompositeCurvesSuite.java +++ b/src/cz/crcs/ectester/reader/test/CompositeCurvesSuite.java @@ -8,22 +8,17 @@ 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.TestWriter; import javacard.security.KeyPair; -import javax.smartcardio.CardException; -import java.io.IOException; -import java.util.List; import java.util.Map; /** - * * @author Jan Jancar johny@neuromancer.sk */ public class CompositeCurvesSuite extends TestSuite { public CompositeCurvesSuite(EC_Store dataStore, ECTester.Config cfg) { - super(dataStore, cfg, "composite"); + super(dataStore, cfg, "composite", ""); } @Override @@ -44,15 +39,15 @@ public class CompositeCurvesSuite extends TestSuite { continue; } if ((curve.getBits() == cfg.bits || cfg.all)) { - tests.add(new Test.Simple(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, curve.getBits(), curve.getField()), Test.Result.SUCCESS)); - tests.add(new Test.Simple(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), Test.Result.ANY)); - tests.add(new Test.Simple(new Command.Generate(cardManager, ECTesterApplet.KEYPAIR_LOCAL), Test.Result.ANY)); + tests.add(new Test.Simple(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, curve.getBits(), curve.getField()), Result.Value.SUCCESS)); + tests.add(new Test.Simple(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), Result.Value.ANY)); + tests.add(new Test.Simple(new Command.Generate(cardManager, ECTesterApplet.KEYPAIR_LOCAL), Result.Value.ANY)); - //tests.add(new Test.Simple(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.CURVE_external, key.getParams(), key.flatten()), Test.Result.ANY)); - //tests.add(new Test.Simple(new Command.ECDH(cardManager, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_FALSE, EC_Consts.CORRUPTION_NONE, EC_Consts.KA_ECDH), Test.Result.FAILURE)); - tests.add(new Test.Simple(new Command.ECDH_direct(cardManager, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_FALSE, EC_Consts.CORRUPTION_NONE, EC_Consts.KA_ECDH, key.flatten()), Test.Result.FAILURE)); + //tests.add(new Test.Simple(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.CURVE_external, key.getParams(), key.flatten()), Result.Value.ANY)); + //tests.add(new Test.Simple(new Command.ECDH(cardManager, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_FALSE, EC_Consts.CORRUPTION_NONE, EC_Consts.KA_ECDH), Result.Value.FAILURE)); + tests.add(new Test.Simple(new Command.ECDH_direct(cardManager, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_FALSE, EC_Consts.CORRUPTION_NONE, EC_Consts.KA_ECDH, key.flatten()), Result.Value.FAILURE)); - tests.add(new Test.Simple(new Command.Cleanup(cardManager), Test.Result.ANY)); + tests.add(new Test.Simple(new Command.Cleanup(cardManager), Result.Value.ANY)); } } } diff --git a/src/cz/crcs/ectester/reader/test/DefaultSuite.java b/src/cz/crcs/ectester/reader/test/DefaultSuite.java index de069f9..722f375 100644 --- a/src/cz/crcs/ectester/reader/test/DefaultSuite.java +++ b/src/cz/crcs/ectester/reader/test/DefaultSuite.java @@ -16,18 +16,18 @@ import java.io.IOException; public class DefaultSuite extends TestSuite { public DefaultSuite(EC_Store dataStore, ECTester.Config cfg) { - super(dataStore, cfg, "default"); + super(dataStore, cfg, "default", "The default test suite tests basic support of ECDH and ECDSA."); } @Override public void setup(CardMngr cardManager) throws IOException { - tests.add(new Test.Simple(new Command.Support(cardManager), Test.Result.ANY)); + tests.add(new Test.Simple(new Command.Support(cardManager), Result.Value.ANY)); if (cfg.namedCurve != null) { if (cfg.primeField) { - tests.addAll(defaultCategoryTests(cardManager, cfg.namedCurve, KeyPair.ALG_EC_FP, Test.Result.SUCCESS, Test.Result.SUCCESS, Test.Result.SUCCESS, Test.Result.SUCCESS)); + tests.addAll(defaultCategoryTests(cardManager, cfg.namedCurve, KeyPair.ALG_EC_FP, Result.Value.SUCCESS, Result.Value.SUCCESS, Result.Value.SUCCESS, Result.Value.SUCCESS)); } if (cfg.binaryField) { - tests.addAll(defaultCategoryTests(cardManager, cfg.namedCurve, KeyPair.ALG_EC_F2M, Test.Result.SUCCESS, Test.Result.SUCCESS, Test.Result.SUCCESS, Test.Result.SUCCESS)); + tests.addAll(defaultCategoryTests(cardManager, cfg.namedCurve, KeyPair.ALG_EC_F2M, Result.Value.SUCCESS, Result.Value.SUCCESS, Result.Value.SUCCESS, Result.Value.SUCCESS)); } } else { if (cfg.all) { @@ -56,11 +56,11 @@ public class DefaultSuite extends TestSuite { } private void defaultTests(CardMngr cardManager, short keyLength, byte keyType) throws IOException { - tests.add(new Test.Simple(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, keyLength, keyType), Test.Result.SUCCESS)); + tests.add(new Test.Simple(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, keyLength, keyType), Result.Value.SUCCESS)); Command curve = Command.prepareCurve(cardManager, dataStore, cfg, ECTesterApplet.KEYPAIR_BOTH, keyLength, keyType); if (curve != null) - tests.add(new Test.Simple(curve, Test.Result.SUCCESS)); - tests.addAll(defaultCurveTests(cardManager, Test.Result.SUCCESS, Test.Result.SUCCESS, Test.Result.SUCCESS)); - tests.add(new Test.Simple(new Command.Cleanup(cardManager), Test.Result.ANY)); + tests.add(new Test.Simple(curve, Result.Value.SUCCESS)); + tests.addAll(defaultCurveTests(cardManager, Result.Value.SUCCESS, Result.Value.SUCCESS, Result.Value.SUCCESS)); + tests.add(new Test.Simple(new Command.Cleanup(cardManager), Result.Value.ANY)); } } diff --git a/src/cz/crcs/ectester/reader/test/InvalidCurvesSuite.java b/src/cz/crcs/ectester/reader/test/InvalidCurvesSuite.java index 3b6cb2f..e8bf3d7 100644 --- a/src/cz/crcs/ectester/reader/test/InvalidCurvesSuite.java +++ b/src/cz/crcs/ectester/reader/test/InvalidCurvesSuite.java @@ -22,7 +22,7 @@ import java.util.Map; public class InvalidCurvesSuite extends TestSuite { public InvalidCurvesSuite(EC_Store dataStore, ECTester.Config cfg) { - super(dataStore, cfg, "invalid"); + super(dataStore, cfg, "invalid", ""); } @Override @@ -51,15 +51,15 @@ public class InvalidCurvesSuite extends TestSuite { EC_Curve curve = e.getKey(); List<EC_Key.Public> keys = e.getValue(); - tests.add(new Test.Simple(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, curve.getBits(), curve.getField()), Test.Result.SUCCESS)); - tests.add(new Test.Simple(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), Test.Result.SUCCESS)); - tests.add(new Test.Simple(new Command.Generate(cardManager, ECTesterApplet.KEYPAIR_LOCAL), Test.Result.SUCCESS)); + tests.add(new Test.Simple(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, curve.getBits(), curve.getField()), Result.Value.SUCCESS)); + tests.add(new Test.Simple(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), Result.Value.SUCCESS)); + tests.add(new Test.Simple(new Command.Generate(cardManager, ECTesterApplet.KEYPAIR_LOCAL), Result.Value.SUCCESS)); for (EC_Key.Public pub : keys) { - // tests.add(new Test.Simple(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.CURVE_external, pub.getParams(), pub.flatten()), Test.Result.ANY)); - // tests.add(new Test.Simple(new Command.ECDH(cardManager, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_FALSE, EC_Consts.CORRUPTION_NONE, EC_Consts.KA_ANY), Test.Result.FAILURE)); - tests.add(new Test.Simple(new Command.ECDH_direct(cardManager, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_FALSE, EC_Consts.CORRUPTION_NONE, EC_Consts.KA_ANY, pub.flatten()), Test.Result.FAILURE)); + // tests.add(new Test.Simple(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.CURVE_external, pub.getParams(), pub.flatten()), Result.Value.ANY)); + // tests.add(new Test.Simple(new Command.ECDH(cardManager, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_FALSE, EC_Consts.CORRUPTION_NONE, EC_Consts.KA_ANY), Result.Value.FAILURE)); + tests.add(new Test.Simple(new Command.ECDH_direct(cardManager, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_FALSE, EC_Consts.CORRUPTION_NONE, EC_Consts.KA_ANY, pub.flatten()), Result.Value.FAILURE)); } - tests.add(new Test.Simple(new Command.Cleanup(cardManager), Test.Result.ANY)); + tests.add(new Test.Simple(new Command.Cleanup(cardManager), Result.Value.ANY)); } } } diff --git a/src/cz/crcs/ectester/reader/test/Result.java b/src/cz/crcs/ectester/reader/test/Result.java new file mode 100644 index 0000000..c6439ef --- /dev/null +++ b/src/cz/crcs/ectester/reader/test/Result.java @@ -0,0 +1,47 @@ +package cz.crcs.ectester.reader.test; + +/** + * @author Jan Jancar johny@neuromancer.sk + */ +public class Result { + + private Value value; + private String cause; + + public Result(Value value) { + this.value = value; + } + + public Result(Value value, String cause) { + this(value); + this.cause = cause; + } + + public Value getValue() { + return value; + } + + public String getCause() { + return cause; + } + + public enum Value { + SUCCESS, + FAILURE, + ANY + } + + public boolean compareTo(Result other) { + if (other == null) { + return false; + } + return value == other.value; + } + + public boolean compareTo(Value other) { + if (other == null) { + return false; + } + return value == other; + } +} diff --git a/src/cz/crcs/ectester/reader/test/Test.java b/src/cz/crcs/ectester/reader/test/Test.java index 1890e94..58da891 100644 --- a/src/cz/crcs/ectester/reader/test/Test.java +++ b/src/cz/crcs/ectester/reader/test/Test.java @@ -7,6 +7,8 @@ import javax.smartcardio.CardException; import java.util.function.BiFunction; import java.util.function.Function; +import static cz.crcs.ectester.reader.test.Result.Value; + /** * An abstract test that can be run and has a Result. * @@ -23,6 +25,20 @@ public abstract class Test { return result; } + public Value getResultValue() { + if (!hasRun) { + return null; + } + return result.getValue(); + } + + public String getResultCause() { + if (!hasRun) { + return null; + } + return result.getCause(); + } + public abstract String getDescription(); public boolean hasRun() { @@ -31,16 +47,6 @@ public abstract class Test { public abstract void run() throws CardException; - - /** - * A result of a Test. - */ - public enum Result { - SUCCESS, - FAILURE, - ANY - } - /** * A simple test that runs one Command to get and evaluate one Response * to get a Result and compare it with the expected one. @@ -50,18 +56,24 @@ public abstract class Test { private Command command; private Response response; - public Simple(Command command, Result expected) { + public Simple(Command command, BiFunction<Command, Response, Result> callback) { + this.command = command; + this.callback = callback; + } + + public Simple(Command command, Value expected, String ok, String nok) { this(command, (cmd, resp) -> { - if (expected == Result.ANY) - return Result.SUCCESS; - Result respResult = resp.successful() ? Result.SUCCESS : Result.FAILURE; - return respResult == expected ? Result.SUCCESS : Result.FAILURE; + if (expected == Value.ANY) { + return new Result(Value.SUCCESS, ok); + } + Value respResult = resp.successful() ? Value.SUCCESS : Value.FAILURE; + boolean cond = expected == respResult; + return new Result(cond ? Value.SUCCESS : Value.FAILURE, cond ? ok : nok); }); } - public Simple(Command command, BiFunction<Command, Response, Result> callback) { - this.command = command; - this.callback = callback; + public Simple(Command command, Value expected) { + this(command, expected, null, null); } public Command getCommand() { @@ -82,9 +94,9 @@ public abstract class Test { result = callback.apply(command, response); } else { if (response.successful()) { - result = Result.SUCCESS; + result = new Result(Value.SUCCESS); } else { - result = Result.FAILURE; + result = new Result(Value.FAILURE); } } hasRun = true; @@ -122,52 +134,52 @@ public abstract class Test { return new Compound(callback, description, tests); } - public static Compound all(Result what, Test... all) { + public static Compound all(Value what, Test... all) { return new Compound((tests) -> { for (Test test : tests) { - if (test.getResult() != what) { - return Result.FAILURE; + if (test.getResultValue() != what) { + return new Result(Value.FAILURE); } } - return Result.SUCCESS; + return new Result(Value.SUCCESS); }, all); } - public static Compound all(Result what, String description, Test... all) { + public static Compound all(Value what, String description, Test... all) { Compound result = Compound.all(what, all); result.setDescription(description); return result; } - public static Compound any(Result what, Test... any) { + public static Compound any(Value what, Test... any) { return new Compound((tests) -> { for (Test test : tests) { - if (test.getResult() == what) { - return Result.SUCCESS; + if (test.getResultValue() == what) { + return new Result(Value.SUCCESS); } } - return Result.FAILURE; + return new Result(Value.FAILURE); }, any); } - public static Compound any(Result what, String description, Test... any) { + public static Compound any(Value what, String description, Test... any) { Compound result = Compound.any(what, any); result.setDescription(description); return result; } - public static Compound mask(Result[] results, Test... masked) { + public static Compound mask(Value[] results, Test... masked) { return new Compound((tests) -> { for (int i = 0; i < results.length; ++i) { - if (results[i] != Result.ANY && results[i] != tests[i].getResult()) { - return Result.FAILURE; + if (results[i] != Value.ANY && results[i] != tests[i].getResultValue()) { + return new Result(Value.FAILURE); } } - return Result.SUCCESS; + return new Result(Value.SUCCESS); }, masked); } - public static Compound mask(Result[] results, String description, Test... masked) { + public static Compound mask(Value[] results, String description, Test... masked) { Compound result = Compound.mask(results, masked); result.setDescription(description); return result; diff --git a/src/cz/crcs/ectester/reader/test/TestSuite.java b/src/cz/crcs/ectester/reader/test/TestSuite.java index 6123a39..3b8476f 100644 --- a/src/cz/crcs/ectester/reader/test/TestSuite.java +++ b/src/cz/crcs/ectester/reader/test/TestSuite.java @@ -7,9 +7,7 @@ import cz.crcs.ectester.reader.CardMngr; import cz.crcs.ectester.reader.ECTester; import cz.crcs.ectester.reader.command.Command; import cz.crcs.ectester.reader.ec.*; -import cz.crcs.ectester.reader.output.TestWriter; -import javax.smartcardio.CardException; import java.io.IOException; import java.util.*; @@ -17,16 +15,17 @@ import java.util.*; * @author Jan Jancar johny@neuromancer.sk */ public abstract class TestSuite { - EC_Store dataStore; ECTester.Config cfg; String name; + String description; List<Test> tests = new LinkedList<>(); - TestSuite(EC_Store dataStore, ECTester.Config cfg, String name) { + TestSuite(EC_Store dataStore, ECTester.Config cfg, String name, String description) { this.dataStore = dataStore; this.cfg = cfg; this.name = name; + this.description = description; } public abstract void setup(CardMngr cardManager) throws IOException; @@ -39,6 +38,10 @@ public abstract class TestSuite { return name; } + public String getDescription() { + return description; + } + /** * @param cardManager cardManager to send APDU through * @param generateExpected expected result of the Generate command @@ -46,16 +49,16 @@ public abstract class TestSuite { * @param ecdsaExpected expected result of the ordinary ECDSA command * @return tests to run */ - List<Test> defaultCurveTests(CardMngr cardManager, Test.Result generateExpected, Test.Result ecdhExpected, Test.Result ecdsaExpected) { + List<Test> defaultCurveTests(CardMngr cardManager, Result.Value generateExpected, Result.Value ecdhExpected, Result.Value ecdsaExpected) { List<Test> tests = new LinkedList<>(); tests.add(new Test.Simple(new Command.Generate(cardManager, ECTesterApplet.KEYPAIR_BOTH), generateExpected)); tests.add(new Test.Simple(new Command.ECDH(cardManager, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.EXPORT_FALSE, EC_Consts.CORRUPTION_NONE, EC_Consts.KA_ECDH), ecdhExpected)); tests.add(new Test.Simple(new Command.ECDH(cardManager, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.EXPORT_FALSE, EC_Consts.CORRUPTION_COMPRESS, EC_Consts.KA_ECDH), ecdhExpected)); - tests.add(new Test.Simple(new Command.ECDH(cardManager, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.EXPORT_FALSE, EC_Consts.CORRUPTION_ONE, EC_Consts.KA_ECDH), Test.Result.FAILURE)); - tests.add(new Test.Simple(new Command.ECDH(cardManager, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.EXPORT_FALSE, EC_Consts.CORRUPTION_ZERO, EC_Consts.KA_ECDH), Test.Result.FAILURE)); - tests.add(new Test.Simple(new Command.ECDH(cardManager, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.EXPORT_FALSE, EC_Consts.CORRUPTION_MAX, EC_Consts.KA_ECDH), Test.Result.FAILURE)); - tests.add(new Test.Simple(new Command.ECDH(cardManager, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.EXPORT_FALSE, EC_Consts.CORRUPTION_FULLRANDOM, EC_Consts.KA_ECDH), Test.Result.FAILURE)); + tests.add(new Test.Simple(new Command.ECDH(cardManager, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.EXPORT_FALSE, EC_Consts.CORRUPTION_ONE, EC_Consts.KA_ECDH), Result.Value.FAILURE)); + tests.add(new Test.Simple(new Command.ECDH(cardManager, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.EXPORT_FALSE, EC_Consts.CORRUPTION_ZERO, EC_Consts.KA_ECDH), Result.Value.FAILURE)); + tests.add(new Test.Simple(new Command.ECDH(cardManager, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.EXPORT_FALSE, EC_Consts.CORRUPTION_MAX, EC_Consts.KA_ECDH), Result.Value.FAILURE)); + tests.add(new Test.Simple(new Command.ECDH(cardManager, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.EXPORT_FALSE, EC_Consts.CORRUPTION_FULLRANDOM, EC_Consts.KA_ECDH), Result.Value.FAILURE)); tests.add(new Test.Simple(new Command.ECDSA(cardManager, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_FALSE, null), ecdsaExpected)); return tests; @@ -71,7 +74,7 @@ public abstract class TestSuite { * @param ecdsaExpected expected result of the ordinary ECDSA command * @return tests to run */ - List<Test> defaultCategoryTests(CardMngr cardManager, String category, byte field, Test.Result setExpected, Test.Result generateExpected, Test.Result ecdhExpected, Test.Result ecdsaExpected) { + List<Test> defaultCategoryTests(CardMngr cardManager, String category, byte field, Result.Value setExpected, Result.Value generateExpected, Result.Value ecdhExpected, Result.Value ecdsaExpected) { List<Test> tests = new LinkedList<>(); Map<String, EC_Curve> curves = dataStore.getObjects(EC_Curve.class, category); if (curves == null) @@ -79,10 +82,10 @@ public abstract class TestSuite { for (Map.Entry<String, EC_Curve> entry : curves.entrySet()) { EC_Curve curve = entry.getValue(); if (curve.getField() == field && (curve.getBits() == cfg.bits || cfg.all)) { - tests.add(new Test.Simple(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, curve.getBits(), field), Test.Result.SUCCESS)); + tests.add(new Test.Simple(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, curve.getBits(), field), Result.Value.SUCCESS)); tests.add(new Test.Simple(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), setExpected)); tests.addAll(defaultCurveTests(cardManager, generateExpected, ecdhExpected, ecdsaExpected)); - tests.add(new Test.Simple(new Command.Cleanup(cardManager), Test.Result.ANY)); + tests.add(new Test.Simple(new Command.Cleanup(cardManager), Result.Value.ANY)); } } diff --git a/src/cz/crcs/ectester/reader/test/TestVectorSuite.java b/src/cz/crcs/ectester/reader/test/TestVectorSuite.java index 2a74d41..4a91940 100644 --- a/src/cz/crcs/ectester/reader/test/TestVectorSuite.java +++ b/src/cz/crcs/ectester/reader/test/TestVectorSuite.java @@ -22,7 +22,7 @@ import java.util.Map; public class TestVectorSuite extends TestSuite { public TestVectorSuite(EC_Store dataStore, ECTester.Config cfg) { - super(dataStore, cfg, "test"); + super(dataStore, cfg, "test", ""); } @Override @@ -55,22 +55,25 @@ public class TestVectorSuite extends TestSuite { } List<Test> testVector = new LinkedList<>(); - testVector.add(new Test.Simple(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, curve.getBits(), curve.getField()), Test.Result.SUCCESS)); - testVector.add(new Test.Simple(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), Test.Result.SUCCESS)); - //tests.add(new Test.Simple(new Command.Generate(cardManager, ECTesterApplet.KEYPAIR_BOTH), Test.Result.SUCCESS)); - testVector.add(new Test.Simple(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.CURVE_external, EC_Consts.PARAMETER_S, onekey.flatten(EC_Consts.PARAMETER_S)), Test.Result.SUCCESS)); - testVector.add(new Test.Simple(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.CURVE_external, EC_Consts.PARAMETER_W, otherkey.flatten(EC_Consts.PARAMETER_W)), Test.Result.SUCCESS)); + testVector.add(new Test.Simple(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, curve.getBits(), curve.getField()), Result.Value.SUCCESS)); + testVector.add(new Test.Simple(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), Result.Value.SUCCESS)); + //tests.add(new Test.Simple(new Command.Generate(cardManager, ECTesterApplet.KEYPAIR_BOTH), Result.Value.SUCCESS)); + testVector.add(new Test.Simple(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.CURVE_external, EC_Consts.PARAMETER_S, onekey.flatten(EC_Consts.PARAMETER_S)), Result.Value.SUCCESS)); + testVector.add(new Test.Simple(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.CURVE_external, EC_Consts.PARAMETER_W, otherkey.flatten(EC_Consts.PARAMETER_W)), Result.Value.SUCCESS)); testVector.add(new Test.Simple(new Command.ECDH(cardManager, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_TRUE, EC_Consts.CORRUPTION_NONE, result.getKA()), (command, response) -> { Response.ECDH dh = (Response.ECDH) response; - if (!dh.successful() || !dh.hasSecret()) - return Test.Result.FAILURE; + if (!dh.successful()) + return new Result(Result.Value.FAILURE, "ECDH was unsuccessful."); + if (!dh.hasSecret()) + return new Result(Result.Value.FAILURE, "ECDH response did not contain the derived secret."); if (!Util.compareBytes(dh.getSecret(), 0, result.getParam(0), 0, dh.secretLength())) { - return Test.Result.FAILURE; + int firstDiff = Util.diffBytes(dh.getSecret(), 0, result.getParam(0), 0, dh.secretLength()); + return new Result(Result.Value.FAILURE, "ECDH derived secret does not match the test, first difference was at byte " + String.valueOf(firstDiff) + "."); } - return Test.Result.SUCCESS; + return new Result(Result.Value.SUCCESS); })); - tests.add(Test.Compound.all(Test.Result.SUCCESS, "Test vector " + result.getId(), testVector.toArray(new Test[0]))); - tests.add(new Test.Simple(new Command.Cleanup(cardManager), Test.Result.ANY)); + tests.add(Test.Compound.all(Result.Value.SUCCESS, "Test vector " + result.getId(), testVector.toArray(new Test[0]))); + tests.add(new Test.Simple(new Command.Cleanup(cardManager), Result.Value.ANY)); } } diff --git a/src/cz/crcs/ectester/reader/test/WrongCurvesSuite.java b/src/cz/crcs/ectester/reader/test/WrongCurvesSuite.java index 95bbe1e..307a16a 100644 --- a/src/cz/crcs/ectester/reader/test/WrongCurvesSuite.java +++ b/src/cz/crcs/ectester/reader/test/WrongCurvesSuite.java @@ -17,7 +17,7 @@ import java.util.List; public class WrongCurvesSuite extends TestSuite { public WrongCurvesSuite(EC_Store dataStore, ECTester.Config cfg) { - super(dataStore, cfg, "wrong"); + super(dataStore, cfg, "wrong", ""); } @Override @@ -26,10 +26,10 @@ public class WrongCurvesSuite extends TestSuite { * These should generally fail, the curves aren't curves. */ if (cfg.primeField) { - tests.addAll(defaultCategoryTests(cardManager, cfg.testSuite, KeyPair.ALG_EC_FP, Test.Result.FAILURE, Test.Result.FAILURE, Test.Result.FAILURE, Test.Result.FAILURE)); + tests.addAll(defaultCategoryTests(cardManager, cfg.testSuite, KeyPair.ALG_EC_FP, Result.Value.FAILURE, Result.Value.FAILURE, Result.Value.FAILURE, Result.Value.FAILURE)); } 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)); + tests.addAll(defaultCategoryTests(cardManager, cfg.testSuite, KeyPair.ALG_EC_F2M, Result.Value.FAILURE, Result.Value.FAILURE, Result.Value.FAILURE, Result.Value.FAILURE)); } } } |
