aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJ08nY2017-10-25 21:33:31 +0200
committerJ08nY2017-10-25 21:33:31 +0200
commitca283e0c28ad2050c25f12817db8f8103f1cedc1 (patch)
tree8ba32cac50109656c8a6a1961aff04a91433c9a8 /src
parent2c6c2a2d35292368b7263fedb6db508da7ded4c4 (diff)
downloadECTester-ca283e0c28ad2050c25f12817db8f8103f1cedc1.tar.gz
ECTester-ca283e0c28ad2050c25f12817db8f8103f1cedc1.tar.zst
ECTester-ca283e0c28ad2050c25f12817db8f8103f1cedc1.zip
Diffstat (limited to 'src')
-rw-r--r--src/cz/crcs/ectester/reader/ECTester.java10
-rw-r--r--src/cz/crcs/ectester/reader/Util.java10
-rw-r--r--src/cz/crcs/ectester/reader/output/TextTestWriter.java4
-rw-r--r--src/cz/crcs/ectester/reader/output/XMLTestWriter.java11
-rw-r--r--src/cz/crcs/ectester/reader/output/YAMLTestWriter.java3
-rw-r--r--src/cz/crcs/ectester/reader/test/CompositeCurvesSuite.java21
-rw-r--r--src/cz/crcs/ectester/reader/test/DefaultSuite.java16
-rw-r--r--src/cz/crcs/ectester/reader/test/InvalidCurvesSuite.java16
-rw-r--r--src/cz/crcs/ectester/reader/test/Result.java47
-rw-r--r--src/cz/crcs/ectester/reader/test/Test.java82
-rw-r--r--src/cz/crcs/ectester/reader/test/TestSuite.java27
-rw-r--r--src/cz/crcs/ectester/reader/test/TestVectorSuite.java27
-rw-r--r--src/cz/crcs/ectester/reader/test/WrongCurvesSuite.java6
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));
}
}
}