aboutsummaryrefslogtreecommitdiff
path: root/src/cz/crcs/ectester/reader
diff options
context:
space:
mode:
authorJ08nY2017-12-12 12:32:25 +0100
committerJ08nY2017-12-12 12:32:25 +0100
commit4dbc748a207bcee2c8fbe22566646b27a9f61dc0 (patch)
treefdf069ac9a25ff82f9509826425bd4796c514da0 /src/cz/crcs/ectester/reader
parente329190e496ecf847cfd7afa886ac08cacb2fc92 (diff)
parent9e8fbbc907f4157988ac425af4dce541f7e42328 (diff)
downloadECTester-4dbc748a207bcee2c8fbe22566646b27a9f61dc0.tar.gz
ECTester-4dbc748a207bcee2c8fbe22566646b27a9f61dc0.tar.zst
ECTester-4dbc748a207bcee2c8fbe22566646b27a9f61dc0.zip
Merge branch 'feature/standalone-lib-testing' into devel
Diffstat (limited to 'src/cz/crcs/ectester/reader')
-rw-r--r--src/cz/crcs/ectester/reader/CardMngr.java16
-rw-r--r--src/cz/crcs/ectester/reader/ECTesterReader.java68
-rw-r--r--src/cz/crcs/ectester/reader/command/Command.java85
-rw-r--r--src/cz/crcs/ectester/reader/output/ResponseWriter.java14
-rw-r--r--src/cz/crcs/ectester/reader/output/TestWriter.java15
-rw-r--r--src/cz/crcs/ectester/reader/output/TextTestWriter.java87
-rw-r--r--src/cz/crcs/ectester/reader/output/XMLTestWriter.java147
-rw-r--r--src/cz/crcs/ectester/reader/output/YAMLTestWriter.java115
-rw-r--r--src/cz/crcs/ectester/reader/response/Response.java20
-rw-r--r--src/cz/crcs/ectester/reader/test/CardCompositeCurvesSuite.java (renamed from src/cz/crcs/ectester/reader/test/CompositeCurvesSuite.java)14
-rw-r--r--src/cz/crcs/ectester/reader/test/CardDefaultSuite.java (renamed from src/cz/crcs/ectester/reader/test/DefaultSuite.java)12
-rw-r--r--src/cz/crcs/ectester/reader/test/CardInvalidCurvesSuite.java (renamed from src/cz/crcs/ectester/reader/test/InvalidCurvesSuite.java)14
-rw-r--r--src/cz/crcs/ectester/reader/test/CardTestSuite.java (renamed from src/cz/crcs/ectester/reader/test/TestSuite.java)48
-rw-r--r--src/cz/crcs/ectester/reader/test/CardTestVectorSuite.java (renamed from src/cz/crcs/ectester/reader/test/TestVectorSuite.java)42
-rw-r--r--src/cz/crcs/ectester/reader/test/CardWrongCurvesSuite.java (renamed from src/cz/crcs/ectester/reader/test/WrongCurvesSuite.java)4
-rw-r--r--src/cz/crcs/ectester/reader/test/CommandTest.java76
-rw-r--r--src/cz/crcs/ectester/reader/test/CommandTestable.java47
-rw-r--r--src/cz/crcs/ectester/reader/test/SimpleTest.java71
-rw-r--r--src/cz/crcs/ectester/reader/test/TestRunner.java29
19 files changed, 302 insertions, 622 deletions
diff --git a/src/cz/crcs/ectester/reader/CardMngr.java b/src/cz/crcs/ectester/reader/CardMngr.java
index ad5b368..cea46bc 100644
--- a/src/cz/crcs/ectester/reader/CardMngr.java
+++ b/src/cz/crcs/ectester/reader/CardMngr.java
@@ -2,7 +2,7 @@ package cz.crcs.ectester.reader;
import com.licel.jcardsim.io.CAD;
import com.licel.jcardsim.io.JavaxSmartCardInterface;
-import cz.crcs.ectester.common.Util;
+import cz.crcs.ectester.common.util.ByteUtil;
import javacard.framework.AID;
import javax.smartcardio.*;
@@ -80,7 +80,7 @@ public class CardMngr {
//reset the card
if (verbose)
- System.out.println(Util.bytesToHex(card.getATR().getBytes()));
+ System.out.println(ByteUtil.bytesToHex(card.getATR().getBytes()));
cardFound = true;
}
@@ -109,7 +109,7 @@ public class CardMngr {
try {
card = terminal.connect("*");
ATR atr = card.getATR();
- System.out.println(terminalIndex + " : " + terminal.getName() + " - " + Util.bytesToHex(atr.getBytes()));
+ System.out.println(terminalIndex + " : " + terminal.getName() + " - " + ByteUtil.bytesToHex(atr.getBytes()));
terminalIndex++;
} catch (CardException ex) {
ex.printStackTrace(System.out);
@@ -227,7 +227,7 @@ public class CardMngr {
System.out.println(">>>>");
System.out.println(apdu);
- System.out.println(Util.bytesToHex(apdu.getBytes()));
+ System.out.println(ByteUtil.bytesToHex(apdu.getBytes()));
}
long elapsed = -System.nanoTime();
@@ -238,7 +238,7 @@ public class CardMngr {
if (verbose) {
System.out.println(responseAPDU);
- System.out.println(Util.bytesToHex(responseAPDU.getBytes()));
+ System.out.println(ByteUtil.bytesToHex(responseAPDU.getBytes()));
}
if (responseAPDU.getSW1() == (byte) 0x61) {
@@ -248,7 +248,7 @@ public class CardMngr {
responseAPDU = channel.transmit(apduToSend);
if (verbose)
- System.out.println(Util.bytesToHex(responseAPDU.getBytes()));
+ System.out.println(ByteUtil.bytesToHex(responseAPDU.getBytes()));
}
if (verbose) {
@@ -277,7 +277,7 @@ public class CardMngr {
if (verbose) {
System.out.println(">>>>");
System.out.println(apdu);
- System.out.println(Util.bytesToHex(apdu.getBytes()));
+ System.out.println(ByteUtil.bytesToHex(apdu.getBytes()));
}
ResponseAPDU response = simulator.transmitCommand(apdu);
@@ -285,7 +285,7 @@ public class CardMngr {
if (verbose) {
System.out.println(response);
- System.out.println(Util.bytesToHex(responseBytes));
+ System.out.println(ByteUtil.bytesToHex(responseBytes));
System.out.println("<<<<");
}
diff --git a/src/cz/crcs/ectester/reader/ECTesterReader.java b/src/cz/crcs/ectester/reader/ECTesterReader.java
index 0bbe8f7..6fa7068 100644
--- a/src/cz/crcs/ectester/reader/ECTesterReader.java
+++ b/src/cz/crcs/ectester/reader/ECTesterReader.java
@@ -23,12 +23,12 @@ package cz.crcs.ectester.reader;
import cz.crcs.ectester.applet.ECTesterApplet;
import cz.crcs.ectester.applet.EC_Consts;
-import cz.crcs.ectester.common.Util;
-import cz.crcs.ectester.common.ec.EC_Category;
-import cz.crcs.ectester.common.ec.EC_Data;
+import cz.crcs.ectester.common.cli.CLITools;
import cz.crcs.ectester.common.ec.EC_Params;
-import cz.crcs.ectester.common.output.OutputLogger;
+import cz.crcs.ectester.common.output.*;
import cz.crcs.ectester.common.test.TestException;
+import cz.crcs.ectester.common.test.TestRunner;
+import cz.crcs.ectester.common.util.ByteUtil;
import cz.crcs.ectester.data.EC_Store;
import cz.crcs.ectester.reader.command.Command;
import cz.crcs.ectester.reader.output.*;
@@ -79,11 +79,10 @@ public class ECTesterReader {
//if help, print and quit
if (cli.hasOption("help")) {
- help();
+ CLITools.help("ECTesterReader.jar", CLI_HEADER, opts, CLI_FOOTER, true);
return;
} else if (cli.hasOption("version")) {
- System.out.println(DESCRIPTION);
- System.out.println(LICENSE);
+ CLITools.version(DESCRIPTION, LICENSE);
return;
}
cfg = new Config();
@@ -96,7 +95,7 @@ public class ECTesterReader {
dataStore = new EC_Store();
//if list, print and quit
if (cli.hasOption("list-named")) {
- list();
+ CLITools.listNamed(dataStore, cli.getOptionValue("list-named"));
return;
}
@@ -312,39 +311,6 @@ public class ECTesterReader {
}
/**
- * Prints help.
- */
- private void help() {
- HelpFormatter help = new HelpFormatter();
- help.setOptionComparator(null);
- help.printHelp("ECTesterReader.jar", CLI_HEADER, opts, CLI_FOOTER, true);
- }
-
- /**
- * List categories and named curves.
- */
- private void list() {
- Map<String, EC_Category> categories = dataStore.getCategories();
- if (cfg.listNamed == null) {
- // print all categories, briefly
- for (EC_Category cat : categories.values()) {
- System.out.println(cat);
- }
- } else if (categories.containsKey(cfg.listNamed)) {
- // print given category
- System.out.println(categories.get(cfg.listNamed));
- } else {
- // print given object
- EC_Data object = dataStore.getObject(EC_Data.class, cfg.listNamed);
- if (object != null) {
- System.out.println(object);
- } else {
- System.err.println("Named object " + cfg.listNamed + " not found!");
- }
- }
- }
-
- /**
* Exports default card/simulation EC domain parameters to output file.
*
* @throws CardException if APDU transmission fails
@@ -420,8 +386,8 @@ public class ECTesterReader {
}
respWriter.outputResponse(response);
- String pub = Util.bytesToHex(export.getParameter(ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.PARAMETER_W), false);
- String priv = Util.bytesToHex(export.getParameter(ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.PARAMETER_S), false);
+ String pub = ByteUtil.bytesToHex(export.getParameter(ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.PARAMETER_W), false);
+ String priv = ByteUtil.bytesToHex(export.getParameter(ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.PARAMETER_S), false);
String line = String.format("%d;%d;%s;%s\n", generated, elapsed / 1000000, pub, priv);
keysFile.write(line);
keysFile.flush();
@@ -440,14 +406,14 @@ public class ECTesterReader {
* @throws IOException if an IO error occurs when writing to key file.
*/
private void test() throws IOException, TestException {
- TestSuite suite;
+ CardTestSuite suite;
switch (cfg.testSuite) {
case "default":
- suite = new DefaultSuite(dataStore, cfg);
+ suite = new CardDefaultSuite(dataStore, cfg);
break;
case "test-vectors":
- suite = new TestVectorSuite(dataStore, cfg);
+ suite = new CardTestVectorSuite(dataStore, cfg);
break;
default:
// These tests are dangerous, prompt before them.
@@ -466,13 +432,13 @@ public class ECTesterReader {
switch (cfg.testSuite) {
case "wrong":
- suite = new WrongCurvesSuite(dataStore, cfg);
+ suite = new CardWrongCurvesSuite(dataStore, cfg);
break;
case "composite":
- suite = new CompositeCurvesSuite(dataStore, cfg);
+ suite = new CardCompositeCurvesSuite(dataStore, cfg);
break;
case "invalid":
- suite = new InvalidCurvesSuite(dataStore, cfg);
+ suite = new CardInvalidCurvesSuite(dataStore, cfg);
break;
default:
System.err.println("Unknown test suite.");
@@ -542,7 +508,7 @@ public class ECTesterReader {
}
if (out != null) {
- out.write(String.format("%d;%d;%s\n", done, perform.getDuration() / 1000000, Util.bytesToHex(perform.getSecret(), false)));
+ out.write(String.format("%d;%d;%s\n", done, perform.getDuration() / 1000000, ByteUtil.bytesToHex(perform.getSecret(), false)));
}
++done;
@@ -619,7 +585,7 @@ public class ECTesterReader {
}
if (out != null) {
- out.write(String.format("%d;%d;%s\n", done, perform.getDuration() / 1000000, Util.bytesToHex(perform.getSignature(), false)));
+ out.write(String.format("%d;%d;%s\n", done, perform.getDuration() / 1000000, ByteUtil.bytesToHex(perform.getSignature(), false)));
}
++done;
diff --git a/src/cz/crcs/ectester/reader/command/Command.java b/src/cz/crcs/ectester/reader/command/Command.java
index 9d23322..922a33a 100644
--- a/src/cz/crcs/ectester/reader/command/Command.java
+++ b/src/cz/crcs/ectester/reader/command/Command.java
@@ -2,11 +2,11 @@ package cz.crcs.ectester.reader.command;
import cz.crcs.ectester.applet.ECTesterApplet;
import cz.crcs.ectester.applet.EC_Consts;
+import cz.crcs.ectester.common.util.ByteUtil;
import cz.crcs.ectester.data.EC_Store;
import cz.crcs.ectester.reader.CardMngr;
import cz.crcs.ectester.reader.ECTesterReader;
import cz.crcs.ectester.reader.response.Response;
-import cz.crcs.ectester.common.Util;
import cz.crcs.ectester.common.ec.EC_Curve;
import cz.crcs.ectester.common.ec.EC_Key;
import cz.crcs.ectester.common.ec.EC_Keypair;
@@ -174,7 +174,7 @@ public abstract class Command {
if (privkey == null) {
throw new IOException("Couldn't read the private key file correctly.");
}
- data = Util.concatenate(data, privkey);
+ data = ByteUtil.concatenate(data, privkey);
}
return new Command.Set(cardManager, keyPair, EC_Consts.CURVE_external, params, data);
}
@@ -203,7 +203,7 @@ public abstract class Command {
this.keyClass = keyClass;
byte[] data = new byte[]{0, 0, keyClass};
- Util.setShort(data, 0, keyLength);
+ ByteUtil.setShort(data, 0, keyLength);
this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_ALLOCATE, keyPair, 0x00, data);
}
@@ -214,13 +214,19 @@ public abstract class Command {
elapsed += System.nanoTime();
return new Response.Allocate(response, elapsed, keyPair, keyLength, keyClass);
}
+
+ @Override
+ public String toString() {
+ return "Allocate";
+ }
}
-
- public static class AllocateKeyAgreement extends Command {
+ /**
+ *
+ */
+ public static class AllocateKeyAgreement extends Command {
private byte kaType;
-
/**
* Creates the INS_ALLOCATE_KA instruction.
*
@@ -241,6 +247,11 @@ public abstract class Command {
elapsed += System.nanoTime();
return new Response.AllocateKeyAgreement(response, elapsed, kaType);
}
+
+ @Override
+ public String toString() {
+ return "AllocateKeyAgreement";
+ }
}
/**
@@ -267,6 +278,11 @@ public abstract class Command {
elapsed += System.nanoTime();
return new Response.Clear(response, elapsed, keyPair);
}
+
+ @Override
+ public String toString() {
+ return "Clear";
+ }
}
/**
@@ -296,7 +312,7 @@ public abstract class Command {
int len = external != null ? 2 + external.length : 2;
byte[] data = new byte[len];
- Util.setShort(data, 0, params);
+ ByteUtil.setShort(data, 0, params);
if (external != null) {
System.arraycopy(external, 0, data, 2, external.length);
}
@@ -311,6 +327,11 @@ public abstract class Command {
elapsed += System.nanoTime();
return new Response.Set(response, elapsed, keyPair, curve, params);
}
+
+ @Override
+ public String toString() {
+ return "Set";
+ }
}
/**
@@ -337,7 +358,7 @@ public abstract class Command {
this.corruption = corruption;
byte[] data = new byte[3];
- Util.setShort(data, 0, params);
+ ByteUtil.setShort(data, 0, params);
data[2] = corruption;
this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_CORRUPT, keyPair, key, data);
@@ -350,6 +371,11 @@ public abstract class Command {
elapsed += System.nanoTime();
return new Response.Corrupt(response, elapsed, keyPair, key, params, corruption);
}
+
+ @Override
+ public String toString() {
+ return "Corrupt";
+ }
}
/**
@@ -378,6 +404,11 @@ public abstract class Command {
elapsed += System.nanoTime();
return new Response.Generate(response, elapsed, keyPair);
}
+
+ @Override
+ public String toString() {
+ return "Generate";
+ }
}
/**
@@ -403,7 +434,7 @@ public abstract class Command {
this.params = params;
byte[] data = new byte[2];
- Util.setShort(data, 0, params);
+ ByteUtil.setShort(data, 0, params);
this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_EXPORT, keyPair, key, data);
}
@@ -415,6 +446,11 @@ public abstract class Command {
elapsed += System.nanoTime();
return new Response.Export(response, elapsed, keyPair, key, params);
}
+
+ @Override
+ public String toString() {
+ return "Export";
+ }
}
/**
@@ -446,7 +482,7 @@ public abstract class Command {
this.type = type;
byte[] data = new byte[]{export, 0,0, type};
- Util.setShort(data, 1, corruption);
+ ByteUtil.setShort(data, 1, corruption);
this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_ECDH, pubkey, privkey, data);
}
@@ -458,6 +494,11 @@ public abstract class Command {
elapsed += System.nanoTime();
return new Response.ECDH(response, elapsed, pubkey, privkey, export, corruption, type);
}
+
+ @Override
+ public String toString() {
+ return "ECDH";
+ }
}
/**
@@ -489,7 +530,7 @@ public abstract class Command {
this.pubkey = pubkey;
byte[] data = new byte[3 + pubkey.length];
- Util.setShort(data, 0, corruption);
+ ByteUtil.setShort(data, 0, corruption);
data[2] = type;
System.arraycopy(pubkey, 0, data, 3, pubkey.length);
@@ -503,6 +544,11 @@ public abstract class Command {
elapsed += System.nanoTime();
return new Response.ECDH(response, elapsed, ECTesterApplet.KEYPAIR_REMOTE, privkey, export, corruption, type);
}
+
+ @Override
+ public String toString() {
+ return "ECDH_direct";
+ }
}
public static class ECDSA extends Command {
@@ -526,7 +572,7 @@ public abstract class Command {
int len = raw != null ? raw.length : 0;
byte[] data = new byte[2 + len];
- Util.setShort(data, 0, (short) len);
+ ByteUtil.setShort(data, 0, (short) len);
if (raw != null) {
System.arraycopy(raw, 0, data, 2, len);
}
@@ -541,6 +587,11 @@ public abstract class Command {
elapsed += System.nanoTime();
return new Response.ECDSA(response, elapsed, keyPair, export, raw);
}
+
+ @Override
+ public String toString() {
+ return "ECDSA";
+ }
}
/**
@@ -564,6 +615,11 @@ public abstract class Command {
elapsed += System.nanoTime();
return new Response.Cleanup(response, elapsed);
}
+
+ @Override
+ public String toString() {
+ return "Cleanup";
+ }
}
/**
@@ -587,6 +643,11 @@ public abstract class Command {
elapsed += System.nanoTime();
return new Response.Support(response, elapsed);
}
+
+ @Override
+ public String toString() {
+ return "Support";
+ }
}
}
diff --git a/src/cz/crcs/ectester/reader/output/ResponseWriter.java b/src/cz/crcs/ectester/reader/output/ResponseWriter.java
index 0f5b6e8..f8837f8 100644
--- a/src/cz/crcs/ectester/reader/output/ResponseWriter.java
+++ b/src/cz/crcs/ectester/reader/output/ResponseWriter.java
@@ -1,6 +1,6 @@
package cz.crcs.ectester.reader.output;
-import cz.crcs.ectester.common.Util;
+import cz.crcs.ectester.common.util.CardUtil;
import cz.crcs.ectester.reader.response.Response;
import java.io.PrintStream;
@@ -20,20 +20,24 @@ public class ResponseWriter {
for (int j = 0; j < r.getNumSW(); ++j) {
short sw = r.getSW(j);
if (sw != 0) {
- suffix.append(" ").append(Util.getSWString(sw));
+ suffix.append(" ").append(CardUtil.getSWString(sw));
}
}
if (suffix.length() == 0) {
- suffix.append(" [").append(Util.getSW(r.getNaturalSW())).append("]");
+ suffix.append(" [").append(CardUtil.getSW(r.getNaturalSW())).append("]");
}
return String.format("%4d ms ┃ %s", r.getDuration() / 1000000, suffix);
}
- public void outputResponse(Response r) {
+ public String responseString(Response r) {
String out = "";
out += String.format("%-70s", r.getDescription()) + " ┃ ";
out += responseSuffix(r);
- output.println(out);
+ return out;
+ }
+
+ public void outputResponse(Response r) {
+ output.println(responseString(r));
output.flush();
}
}
diff --git a/src/cz/crcs/ectester/reader/output/TestWriter.java b/src/cz/crcs/ectester/reader/output/TestWriter.java
deleted file mode 100644
index d79252d..0000000
--- a/src/cz/crcs/ectester/reader/output/TestWriter.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package cz.crcs.ectester.reader.output;
-
-import cz.crcs.ectester.common.test.Test;
-import cz.crcs.ectester.reader.test.TestSuite;
-
-/**
- * @author Jan Jancar johny@neuromancer.sk
- */
-public interface TestWriter {
- void begin(TestSuite suite);
-
- void outputTest(Test t);
-
- void end();
-}
diff --git a/src/cz/crcs/ectester/reader/output/TextTestWriter.java b/src/cz/crcs/ectester/reader/output/TextTestWriter.java
deleted file mode 100644
index 07b2a2f..0000000
--- a/src/cz/crcs/ectester/reader/output/TextTestWriter.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package cz.crcs.ectester.reader.output;
-
-import cz.crcs.ectester.common.test.CompoundTest;
-import cz.crcs.ectester.common.test.Test;
-import cz.crcs.ectester.reader.test.SimpleTest;
-import cz.crcs.ectester.reader.test.TestSuite;
-
-import java.io.PrintStream;
-
-/**
- * @author Jan Jancar johny@neuromancer.sk
- */
-public class TextTestWriter implements TestWriter {
- private PrintStream output;
- private ResponseWriter respWriter;
-
- public static int BASE_WIDTH = 76;
-
- public TextTestWriter(PrintStream output) {
- this.output = output;
- this.respWriter = new ResponseWriter(output);
- }
-
- @Override
- public void begin(TestSuite suite) {
- output.println("=== Running test suite: " + suite.getName() + " ===");
- output.println("=== " + suite.getDescription());
- }
-
- private String testString(Test t, int offset) {
- if (!t.hasRun()) {
- return null;
- }
-
- StringBuilder out = new StringBuilder();
- if (t instanceof SimpleTest) {
- SimpleTest test = (SimpleTest) t;
- out.append(test.ok() ? "OK " : "NOK ");
- out.append("━ ");
- int width = BASE_WIDTH - (offset + out.length());
- String widthSpec = "%-" + String.valueOf(width) + "s";
- out.append(String.format(widthSpec, t.getDescription()));
- out.append(" ┃ ");
- out.append(String.format("%-9s", test.getResultValue().name()));
- out.append(" ┃ ");
- out.append(respWriter.responseSuffix(test.getResponse()));
- } else {
- CompoundTest test = (CompoundTest) t;
- out.append(test.ok() ? "OK " : "NOK ");
- out.append("┳ ");
- int width = BASE_WIDTH - (offset + out.length());
- String widthSpec = "%-" + String.valueOf(width) + "s";
- out.append(String.format(widthSpec, t.getDescription()));
- out.append(" ┃ ");
- out.append(String.format("%-9s", test.getResultValue().name()));
- out.append(" ┃ ");
- out.append(test.getResultCause());
- out.append(System.lineSeparator());
- Test[] tests = test.getTests();
- for (int i = 0; i < tests.length; ++i) {
- if (i == tests.length - 1) {
- out.append(" ┗ ");
- } else {
- out.append(" ┣ ");
- }
- out.append(testString(tests[i], offset + 6));
- if (i != tests.length - 1) {
- out.append(System.lineSeparator());
- }
- }
- }
-
- return out.toString();
- }
-
- @Override
- public void outputTest(Test t) {
- if (!t.hasRun())
- return;
- output.println(testString(t, 0));
- output.flush();
- }
-
- @Override
- public void end() {
- }
-}
diff --git a/src/cz/crcs/ectester/reader/output/XMLTestWriter.java b/src/cz/crcs/ectester/reader/output/XMLTestWriter.java
deleted file mode 100644
index 24a308c..0000000
--- a/src/cz/crcs/ectester/reader/output/XMLTestWriter.java
+++ /dev/null
@@ -1,147 +0,0 @@
-package cz.crcs.ectester.reader.output;
-
-import cz.crcs.ectester.common.test.CompoundTest;
-import cz.crcs.ectester.common.Util;
-import cz.crcs.ectester.reader.command.Command;
-import cz.crcs.ectester.reader.response.Response;
-import cz.crcs.ectester.common.test.Test;
-import cz.crcs.ectester.reader.test.SimpleTest;
-import cz.crcs.ectester.reader.test.TestSuite;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.OutputKeys;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-import java.io.OutputStream;
-
-/**
- * @author Jan Jancar johny@neuromancer.sk
- */
-public class XMLTestWriter implements TestWriter {
- private OutputStream output;
- private DocumentBuilder db;
- private Document doc;
- private Node root;
-
- public XMLTestWriter(OutputStream output) throws ParserConfigurationException {
- this.output = output;
- this.db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
- }
-
- @Override
- public void begin(TestSuite suite) {
- doc = db.newDocument();
- Element rootElem = doc.createElement("testSuite");
- rootElem.setAttribute("name", suite.getName());
- rootElem.setAttribute("desc", suite.getDescription());
-
- root = rootElem;
- doc.appendChild(root);
- }
-
- private Element commandElement(Command c) {
- Element commandElem = doc.createElement("command");
-
- Element apdu = doc.createElement("apdu");
- apdu.setTextContent(Util.bytesToHex(c.getAPDU().getBytes()));
- commandElem.appendChild(apdu);
-
- return commandElem;
- }
-
- private Element responseElement(Response r) {
- Element responseElem = doc.createElement("response");
- responseElem.setAttribute("successful", r.successful() ? "true" : "false");
-
- Element apdu = doc.createElement("apdu");
- apdu.setTextContent(Util.bytesToHex(r.getAPDU().getBytes()));
- responseElem.appendChild(apdu);
-
- Element naturalSW = doc.createElement("natural-sw");
- naturalSW.setTextContent(String.valueOf(Short.toUnsignedInt(r.getNaturalSW())));
- responseElem.appendChild(naturalSW);
-
- Element sws = doc.createElement("sws");
- for (int i = 0; i < r.getNumSW(); ++i) {
- Element sw = doc.createElement("sw");
- sw.setTextContent(String.valueOf(Short.toUnsignedInt(r.getSW(i))));
- sws.appendChild(sw);
- }
- responseElem.appendChild(sws);
-
- Element duration = doc.createElement("duration");
- duration.setTextContent(String.valueOf(r.getDuration()));
- responseElem.appendChild(duration);
-
- Element description = doc.createElement("desc");
- description.setTextContent(r.getDescription());
- responseElem.appendChild(description);
-
- return responseElem;
- }
-
- private Element testElement(Test t) {
- Element testElem = doc.createElement("test");
-
- if (t instanceof SimpleTest) {
- SimpleTest test = (SimpleTest) t;
- testElem.setAttribute("type", "simple");
- testElem.appendChild(commandElement(test.getCommand()));
- testElem.appendChild(responseElement(test.getResponse()));
- } else if (t instanceof CompoundTest) {
- CompoundTest test = (CompoundTest) t;
- testElem.setAttribute("type", "compound");
- for (Test innerTest : test.getTests()) {
- testElem.appendChild(testElement(innerTest));
- }
- }
-
- Element description = doc.createElement("desc");
- description.setTextContent(t.getDescription());
- testElem.appendChild(description);
-
- Element result = doc.createElement("result");
- 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);
- testElem.appendChild(result);
-
- return testElem;
- }
-
- @Override
- public void outputTest(Test t) {
- if (!t.hasRun())
- return;
- root.appendChild(testElement(t));
- }
-
- @Override
- public void end() {
- try {
- DOMSource domSource = new DOMSource(doc);
- StreamResult result = new StreamResult(output);
- TransformerFactory tf = TransformerFactory.newInstance();
- Transformer transformer = tf.newTransformer();
- transformer.setOutputProperty(OutputKeys.INDENT, "yes");
- transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
- transformer.transform(domSource, result);
- } catch (TransformerException e) {
- e.printStackTrace();
- }
- }
-} \ No newline at end of file
diff --git a/src/cz/crcs/ectester/reader/output/YAMLTestWriter.java b/src/cz/crcs/ectester/reader/output/YAMLTestWriter.java
deleted file mode 100644
index c637a13..0000000
--- a/src/cz/crcs/ectester/reader/output/YAMLTestWriter.java
+++ /dev/null
@@ -1,115 +0,0 @@
-package cz.crcs.ectester.reader.output;
-
-import cz.crcs.ectester.common.test.CompoundTest;
-import cz.crcs.ectester.common.Util;
-import cz.crcs.ectester.reader.command.Command;
-import cz.crcs.ectester.reader.response.Response;
-import cz.crcs.ectester.common.test.Test;
-import cz.crcs.ectester.reader.test.SimpleTest;
-import cz.crcs.ectester.reader.test.TestSuite;
-import org.yaml.snakeyaml.DumperOptions;
-import org.yaml.snakeyaml.Yaml;
-
-import java.io.PrintStream;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Jan Jancar johny@neuromancer.sk
- */
-public class YAMLTestWriter implements TestWriter {
- private PrintStream output;
- private Map<String, Object> testRun;
- private Map<String, String> testSuite;
- private List<Object> tests;
-
- public YAMLTestWriter(PrintStream output) {
- this.output = output;
- }
-
- @Override
- public void begin(TestSuite suite) {
- output.println("---");
- testRun = new HashMap<>();
- testSuite = new HashMap<>();
- tests = new LinkedList<>();
- testSuite.put("name", suite.getName());
- testSuite.put("desc", suite.getDescription());
-
- testRun.put("suite", testSuite);
- testRun.put("tests", tests);
- }
-
- private Map<String, Object> commandObject(Command c) {
- Map<String, Object> commandObj = new HashMap<>();
- commandObj.put("apdu", Util.bytesToHex(c.getAPDU().getBytes()));
- return commandObj;
- }
-
- private Map<String, Object> responseObject(Response r) {
- Map<String, Object> responseObj = new HashMap<>();
- responseObj.put("successful", r.successful());
- responseObj.put("apdu", Util.bytesToHex(r.getAPDU().getBytes()));
- responseObj.put("natural_sw", Short.toUnsignedInt(r.getNaturalSW()));
- List<Integer> sws = new LinkedList<>();
- for (int i = 0; i < r.getNumSW(); ++i) {
- sws.add(Short.toUnsignedInt(r.getSW(i)));
- }
- responseObj.put("sws", sws);
- responseObj.put("duration", r.getDuration());
- responseObj.put("desc", r.getDescription());
- return responseObj;
- }
-
- private Map<String, Object> testObject(Test t) {
- Map<String, Object> testObj = new HashMap<>();
-
- if (t instanceof SimpleTest) {
- SimpleTest test = (SimpleTest) t;
- testObj.put("type", "simple");
- testObj.put("command", commandObject(test.getCommand()));
- testObj.put("response", responseObject(test.getResponse()));
- } else if (t instanceof CompoundTest) {
- CompoundTest test = (CompoundTest) t;
- testObj.put("type", "compound");
- List<Map<String, Object>> tests = new LinkedList<>();
- for (Test innerTest : test.getTests()) {
- tests.add(testObject(innerTest));
- }
- testObj.put("tests", tests);
- }
-
- testObj.put("desc", t.getDescription());
- Map<String, Object> result = new HashMap<>();
- result.put("ok", t.ok());
- result.put("value", t.getResultValue().name());
- result.put("cause", t.getResultCause());
- testObj.put("result", result);
-
- return testObj;
- }
-
- @Override
- public void outputTest(Test t) {
- if (!t.hasRun())
- return;
- tests.add(testObject(t));
- }
-
- @Override
- public void end() {
- DumperOptions options = new DumperOptions();
- options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
- options.setPrettyFlow(true);
- Yaml yaml = new Yaml(options);
-
- Map<String, Object> result = new HashMap<>();
- result.put("testRun", testRun);
- String out = yaml.dump(result);
-
- output.println(out);
- output.println("---");
- }
-}
diff --git a/src/cz/crcs/ectester/reader/response/Response.java b/src/cz/crcs/ectester/reader/response/Response.java
index 4158ac3..3b5d98b 100644
--- a/src/cz/crcs/ectester/reader/response/Response.java
+++ b/src/cz/crcs/ectester/reader/response/Response.java
@@ -2,7 +2,8 @@ package cz.crcs.ectester.reader.response;
import cz.crcs.ectester.applet.ECTesterApplet;
import cz.crcs.ectester.applet.EC_Consts;
-import cz.crcs.ectester.common.Util;
+import cz.crcs.ectester.common.util.ByteUtil;
+import cz.crcs.ectester.common.util.CardUtil;
import javacard.framework.ISO7816;
import javacard.security.KeyPair;
@@ -12,7 +13,6 @@ import javax.smartcardio.ResponseAPDU;
* @author Jan Jancar johny@neuromancer.sk
*/
public abstract class Response {
-
private ResponseAPDU resp;
private long time;
private short[] sws;
@@ -36,7 +36,7 @@ public abstract class Response {
//parse SWs in response
for (int i = 0; i < numSW; ++i) {
if (getLength() >= (offset + 2)) {
- short sw = Util.getShort(data, offset);
+ short sw = ByteUtil.getShort(data, offset);
offset += 2;
sws[i] = sw;
if (sw != ISO7816.SW_NO_ERROR) {
@@ -62,7 +62,7 @@ public abstract class Response {
error = true;
break;
}
- short paramLength = Util.getShort(data, offset);
+ short paramLength = ByteUtil.getShort(data, offset);
offset += 2;
if (data.length < offset + paramLength) {
error = true;
@@ -87,6 +87,10 @@ public abstract class Response {
return (short) resp.getSW();
}
+ public short[] getSWs() {
+ return sws;
+ }
+
public short getSW(int index) {
return sws[index];
}
@@ -140,7 +144,7 @@ public abstract class Response {
@Override
public String getDescription() {
- return String.format("Allocated KeyAgreement(%s) object", Util.getKATypeString(this.kaType));
+ return String.format("Allocated KeyAgreement(%s) object", CardUtil.getKATypeString(this.kaType));
}
}
@@ -289,7 +293,7 @@ public abstract class Response {
@Override
public String getDescription() {
- String corrupt = Util.getCorruption(corruption);
+ String corrupt = CardUtil.getCorruption(corruption);
String pair;
if (keyPair == ECTesterApplet.KEYPAIR_BOTH) {
@@ -476,7 +480,7 @@ public abstract class Response {
@Override
public String getDescription() {
- String algo = Util.getKA(type);
+ String algo = CardUtil.getKA(type);
String pub = pubkey == ECTesterApplet.KEYPAIR_LOCAL ? "local" : "remote";
String priv = privkey == ECTesterApplet.KEYPAIR_LOCAL ? "local" : "remote";
@@ -485,7 +489,7 @@ public abstract class Response {
if (corruption == EC_Consts.CORRUPTION_NONE) {
validity = "unchanged";
} else {
- validity = Util.getCorruption(corruption);
+ validity = CardUtil.getCorruption(corruption);
}
return String.format("%s of %s pubkey and %s privkey(%s point)", algo, pub, priv, validity);
}
diff --git a/src/cz/crcs/ectester/reader/test/CompositeCurvesSuite.java b/src/cz/crcs/ectester/reader/test/CardCompositeCurvesSuite.java
index 2e711a2..930a0d0 100644
--- a/src/cz/crcs/ectester/reader/test/CompositeCurvesSuite.java
+++ b/src/cz/crcs/ectester/reader/test/CardCompositeCurvesSuite.java
@@ -17,9 +17,9 @@ import static cz.crcs.ectester.common.test.Result.ExpectedValue;
/**
* @author Jan Jancar johny@neuromancer.sk
*/
-public class CompositeCurvesSuite extends TestSuite {
+public class CardCompositeCurvesSuite extends CardTestSuite {
- public CompositeCurvesSuite(EC_Store dataStore, ECTesterReader.Config cfg) {
+ public CardCompositeCurvesSuite(EC_Store dataStore, ECTesterReader.Config cfg) {
super(dataStore, cfg, "composite", "The composite suite tests ECDH over curves with composite order. This should generally fail, as using such a curve is unsafe.");
}
@@ -41,12 +41,12 @@ public class CompositeCurvesSuite extends TestSuite {
continue;
}
if ((curve.getBits() == cfg.bits || cfg.all)) {
- tests.add(new SimpleTest(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, curve.getBits(), curve.getField()), ExpectedValue.SUCCESS));
- tests.add(new SimpleTest(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), ExpectedValue.ANY));
- tests.add(new SimpleTest(new Command.Generate(cardManager, ECTesterApplet.KEYPAIR_LOCAL), ExpectedValue.ANY));
+ tests.add(CommandTest.expect(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, curve.getBits(), curve.getField()), ExpectedValue.SUCCESS));
+ tests.add(CommandTest.expect(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), ExpectedValue.ANY));
+ tests.add(CommandTest.expect(new Command.Generate(cardManager, ECTesterApplet.KEYPAIR_LOCAL), ExpectedValue.ANY));
Command ecdhCommand = new Command.ECDH_direct(cardManager, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_FALSE, EC_Consts.CORRUPTION_NONE, EC_Consts.KA_ECDH, key.flatten());
- tests.add(new SimpleTest(ecdhCommand, ExpectedValue.FAILURE, "Card correctly rejected to do ECDH over a composite order curve.", "Card incorrectly does ECDH over a composite order curve, leaks bits of private key."));
- tests.add(new SimpleTest(new Command.Cleanup(cardManager), ExpectedValue.ANY));
+ tests.add(CommandTest.expect(ecdhCommand, ExpectedValue.FAILURE, "Card correctly rejected to do ECDH over a composite order curve.", "Card incorrectly does ECDH over a composite order curve, leaks bits of private key."));
+ tests.add(CommandTest.expect(new Command.Cleanup(cardManager), ExpectedValue.ANY));
}
}
}
diff --git a/src/cz/crcs/ectester/reader/test/DefaultSuite.java b/src/cz/crcs/ectester/reader/test/CardDefaultSuite.java
index fb8fdab..06818d4 100644
--- a/src/cz/crcs/ectester/reader/test/DefaultSuite.java
+++ b/src/cz/crcs/ectester/reader/test/CardDefaultSuite.java
@@ -15,15 +15,15 @@ import static cz.crcs.ectester.common.test.Result.ExpectedValue;
/**
* @author Jan Jancar johny@neuromancer.sk
*/
-public class DefaultSuite extends TestSuite {
+public class CardDefaultSuite extends CardTestSuite {
- public DefaultSuite(EC_Store dataStore, ECTesterReader.Config cfg) {
+ public CardDefaultSuite(EC_Store dataStore, ECTesterReader.Config cfg) {
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 SimpleTest(new Command.Support(cardManager), ExpectedValue.ANY));
+ tests.add(CommandTest.expect(new Command.Support(cardManager), ExpectedValue.ANY));
if (cfg.namedCurve != null) {
String desc = "Default tests over the " + cfg.namedCurve + " curve category.";
if (cfg.primeField) {
@@ -59,11 +59,11 @@ public class DefaultSuite extends TestSuite {
}
private void defaultTests(CardMngr cardManager, short keyLength, byte keyType) throws IOException {
- tests.add(new SimpleTest(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, keyLength, keyType), ExpectedValue.SUCCESS));
+ tests.add(CommandTest.expect(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, keyLength, keyType), ExpectedValue.SUCCESS));
Command curve = Command.prepareCurve(cardManager, dataStore, cfg, ECTesterApplet.KEYPAIR_BOTH, keyLength, keyType);
if (curve != null)
- tests.add(new SimpleTest(curve, ExpectedValue.SUCCESS));
+ tests.add(CommandTest.expect(curve, ExpectedValue.SUCCESS));
tests.add(defaultCurveTests(cardManager, ExpectedValue.SUCCESS, ExpectedValue.SUCCESS, ExpectedValue.ANY, ExpectedValue.SUCCESS, "Default tests."));
- tests.add(new SimpleTest(new Command.Cleanup(cardManager), ExpectedValue.ANY));
+ tests.add(CommandTest.expect(new Command.Cleanup(cardManager), ExpectedValue.ANY));
}
}
diff --git a/src/cz/crcs/ectester/reader/test/InvalidCurvesSuite.java b/src/cz/crcs/ectester/reader/test/CardInvalidCurvesSuite.java
index 1f71ad5..e4e55c9 100644
--- a/src/cz/crcs/ectester/reader/test/InvalidCurvesSuite.java
+++ b/src/cz/crcs/ectester/reader/test/CardInvalidCurvesSuite.java
@@ -23,9 +23,9 @@ import static cz.crcs.ectester.common.test.Result.ExpectedValue;
/**
* @author Jan Jancar johny@neuromancer.sk
*/
-public class InvalidCurvesSuite extends TestSuite {
+public class CardInvalidCurvesSuite extends CardTestSuite {
- public InvalidCurvesSuite(EC_Store dataStore, ECTesterReader.Config cfg) {
+ public CardInvalidCurvesSuite(EC_Store dataStore, ECTesterReader.Config cfg) {
super(dataStore, cfg, "invalid", "The invalid curve suite tests whether the card rejects points outside of the curve during ECDH.");
}
@@ -55,16 +55,16 @@ public class InvalidCurvesSuite extends TestSuite {
EC_Curve curve = e.getKey();
List<EC_Key.Public> keys = e.getValue();
- tests.add(new SimpleTest(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, curve.getBits(), curve.getField()), ExpectedValue.SUCCESS));
- tests.add(new SimpleTest(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), ExpectedValue.SUCCESS));
- tests.add(new SimpleTest(new Command.Generate(cardManager, ECTesterApplet.KEYPAIR_LOCAL), ExpectedValue.SUCCESS));
+ tests.add(CommandTest.expect(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, curve.getBits(), curve.getField()), ExpectedValue.SUCCESS));
+ tests.add(CommandTest.expect(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), ExpectedValue.SUCCESS));
+ tests.add(CommandTest.expect(new Command.Generate(cardManager, ECTesterApplet.KEYPAIR_LOCAL), ExpectedValue.SUCCESS));
List<Test> ecdhTests = new LinkedList<>();
for (EC_Key.Public pub : keys) {
Command ecdhCommand = new Command.ECDH_direct(cardManager, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_FALSE, EC_Consts.CORRUPTION_NONE, EC_Consts.KA_ANY, pub.flatten());
- ecdhTests.add(new SimpleTest(ecdhCommand, ExpectedValue.FAILURE, "Card correctly rejected point on invalid curve." , "Card incorrectly accepted point on invalid curve."));
+ ecdhTests.add(CommandTest.expect(ecdhCommand, ExpectedValue.FAILURE, "Card correctly rejected point on invalid curve." , "Card incorrectly accepted point on invalid curve."));
}
tests.add(CompoundTest.all(ExpectedValue.SUCCESS, "Invalid curve test of " + curve.getId(), ecdhTests.toArray(new Test[0])));
- tests.add(new SimpleTest(new Command.Cleanup(cardManager), ExpectedValue.ANY));
+ tests.add(CommandTest.expect(new Command.Cleanup(cardManager), ExpectedValue.ANY));
}
}
}
diff --git a/src/cz/crcs/ectester/reader/test/TestSuite.java b/src/cz/crcs/ectester/reader/test/CardTestSuite.java
index dc8167b..3da5158 100644
--- a/src/cz/crcs/ectester/reader/test/TestSuite.java
+++ b/src/cz/crcs/ectester/reader/test/CardTestSuite.java
@@ -6,13 +6,13 @@ import cz.crcs.ectester.common.ec.EC_Curve;
import cz.crcs.ectester.common.test.CompoundTest;
import cz.crcs.ectester.common.test.Result;
import cz.crcs.ectester.common.test.Test;
+import cz.crcs.ectester.common.test.TestSuite;
import cz.crcs.ectester.data.EC_Store;
import cz.crcs.ectester.reader.CardMngr;
import cz.crcs.ectester.reader.ECTesterReader;
import cz.crcs.ectester.reader.command.Command;
import java.io.IOException;
-import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@@ -24,34 +24,16 @@ import static cz.crcs.ectester.common.test.Result.Value;
/**
* @author Jan Jancar johny@neuromancer.sk
*/
-public abstract class TestSuite {
- EC_Store dataStore;
+public abstract class CardTestSuite extends TestSuite {
ECTesterReader.Config cfg;
- String name;
- String description;
- List<Test> tests = new LinkedList<>();
- TestSuite(EC_Store dataStore, ECTesterReader.Config cfg, String name, String description) {
- this.dataStore = dataStore;
+ CardTestSuite(EC_Store dataStore, ECTesterReader.Config cfg, String name, String description) {
+ super(dataStore, name, description);
this.cfg = cfg;
- this.name = name;
- this.description = description;
}
public abstract void setup(CardMngr cardManager) throws IOException;
- public List<Test> getTests() {
- return Collections.unmodifiableList(tests);
- }
-
- public String getName() {
- return name;
- }
-
- public String getDescription() {
- return description;
- }
-
/**
* @param cardManager cardManager to send APDU through
* @param generateExpected expected result of the Generate command
@@ -64,14 +46,14 @@ public abstract class TestSuite {
Test defaultCurveTests(CardMngr cardManager, ExpectedValue generateExpected, ExpectedValue ecdhExpected, ExpectedValue ecdhCompressExpected, ExpectedValue ecdsaExpected, String description) {
List<Test> tests = new LinkedList<>();
- tests.add(new SimpleTest(new Command.Generate(cardManager, ECTesterApplet.KEYPAIR_BOTH), generateExpected));
- tests.add(new SimpleTest(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 SimpleTest(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 SimpleTest(new Command.ECDH(cardManager, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.EXPORT_FALSE, EC_Consts.CORRUPTION_ONE, EC_Consts.KA_ECDH), ExpectedValue.FAILURE));
- tests.add(new SimpleTest(new Command.ECDH(cardManager, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.EXPORT_FALSE, EC_Consts.CORRUPTION_ZERO, EC_Consts.KA_ECDH), ExpectedValue.FAILURE));
- tests.add(new SimpleTest(new Command.ECDH(cardManager, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.EXPORT_FALSE, EC_Consts.CORRUPTION_MAX, EC_Consts.KA_ECDH), ExpectedValue.FAILURE));
- tests.add(new SimpleTest(new Command.ECDH(cardManager, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.EXPORT_FALSE, EC_Consts.CORRUPTION_FULLRANDOM, EC_Consts.KA_ECDH), ExpectedValue.FAILURE));
- tests.add(new SimpleTest(new Command.ECDSA(cardManager, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_FALSE, null), ecdsaExpected));
+ tests.add(CommandTest.expect(new Command.Generate(cardManager, ECTesterApplet.KEYPAIR_BOTH), generateExpected));
+ tests.add(CommandTest.expect(new Command.ECDH(cardManager, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.EXPORT_FALSE, EC_Consts.CORRUPTION_NONE, EC_Consts.KA_ECDH), ecdhExpected));
+ tests.add(CommandTest.expect(new Command.ECDH(cardManager, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.EXPORT_FALSE, EC_Consts.CORRUPTION_COMPRESS, EC_Consts.KA_ECDH), ecdhExpected));
+ tests.add(CommandTest.expect(new Command.ECDH(cardManager, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.EXPORT_FALSE, EC_Consts.CORRUPTION_ONE, EC_Consts.KA_ECDH), ExpectedValue.FAILURE));
+ tests.add(CommandTest.expect(new Command.ECDH(cardManager, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.EXPORT_FALSE, EC_Consts.CORRUPTION_ZERO, EC_Consts.KA_ECDH), ExpectedValue.FAILURE));
+ tests.add(CommandTest.expect(new Command.ECDH(cardManager, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.EXPORT_FALSE, EC_Consts.CORRUPTION_MAX, EC_Consts.KA_ECDH), ExpectedValue.FAILURE));
+ tests.add(CommandTest.expect(new Command.ECDH(cardManager, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.EXPORT_FALSE, EC_Consts.CORRUPTION_FULLRANDOM, EC_Consts.KA_ECDH), ExpectedValue.FAILURE));
+ tests.add(CommandTest.expect(new Command.ECDSA(cardManager, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_FALSE, null), ecdsaExpected));
return CompoundTest.function((testArray) -> {
Function<ExpectedValue, String> shouldHave = (expected) -> {
@@ -126,10 +108,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 SimpleTest(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, curve.getBits(), field), ExpectedValue.SUCCESS));
- tests.add(new SimpleTest(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), setExpected));
+ tests.add(CommandTest.expect(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, curve.getBits(), field), ExpectedValue.SUCCESS));
+ tests.add(CommandTest.expect(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), setExpected));
tests.add(defaultCurveTests(cardManager, generateExpected, ecdhExpected, ecdhCompressedExpected, ecdsaExpected, description));
- tests.add(new SimpleTest(new Command.Cleanup(cardManager), ExpectedValue.ANY));
+ tests.add(CommandTest.expect(new Command.Cleanup(cardManager), ExpectedValue.ANY));
}
}
diff --git a/src/cz/crcs/ectester/reader/test/TestVectorSuite.java b/src/cz/crcs/ectester/reader/test/CardTestVectorSuite.java
index 3f11a79..72e3cce 100644
--- a/src/cz/crcs/ectester/reader/test/TestVectorSuite.java
+++ b/src/cz/crcs/ectester/reader/test/CardTestVectorSuite.java
@@ -2,15 +2,16 @@ package cz.crcs.ectester.reader.test;
import cz.crcs.ectester.applet.ECTesterApplet;
import cz.crcs.ectester.applet.EC_Consts;
+import cz.crcs.ectester.common.ec.*;
import cz.crcs.ectester.common.test.CompoundTest;
import cz.crcs.ectester.common.test.Result;
import cz.crcs.ectester.common.test.Test;
+import cz.crcs.ectester.common.test.TestCallback;
+import cz.crcs.ectester.common.util.ByteUtil;
import cz.crcs.ectester.data.EC_Store;
import cz.crcs.ectester.reader.CardMngr;
import cz.crcs.ectester.reader.ECTesterReader;
-import cz.crcs.ectester.common.Util;
import cz.crcs.ectester.reader.command.Command;
-import cz.crcs.ectester.common.ec.*;
import cz.crcs.ectester.reader.response.Response;
import javacard.security.KeyPair;
@@ -25,9 +26,9 @@ import static cz.crcs.ectester.common.test.Result.Value;
/**
* @author Jan Jancar johny@neuromancer.sk
*/
-public class TestVectorSuite extends TestSuite {
+public class CardTestVectorSuite extends CardTestSuite {
- public TestVectorSuite(EC_Store dataStore, ECTesterReader.Config cfg) {
+ public CardTestVectorSuite(EC_Store dataStore, ECTesterReader.Config cfg) {
super(dataStore, cfg, "test", "The test-vectors suite contains a collection of test vectors which test basic ECDH correctness.");
}
@@ -61,25 +62,28 @@ public class TestVectorSuite extends TestSuite {
}
List<Test> testVector = new LinkedList<>();
- testVector.add(new SimpleTest(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, curve.getBits(), curve.getField()), ExpectedValue.SUCCESS));
- testVector.add(new SimpleTest(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), ExpectedValue.SUCCESS));
+ testVector.add(CommandTest.expect(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, curve.getBits(), curve.getField()), ExpectedValue.SUCCESS));
+ testVector.add(CommandTest.expect(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), ExpectedValue.SUCCESS));
//tests.add(new Test.Simple(new Command.Generate(cardManager, ECTesterApplet.KEYPAIR_BOTH), ExpectedValue.SUCCESS));
- testVector.add(new SimpleTest(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.CURVE_external, EC_Consts.PARAMETER_S, onekey.flatten(EC_Consts.PARAMETER_S)), ExpectedValue.SUCCESS));
- testVector.add(new SimpleTest(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.CURVE_external, EC_Consts.PARAMETER_W, otherkey.flatten(EC_Consts.PARAMETER_W)), ExpectedValue.SUCCESS));
- testVector.add(new SimpleTest(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())
- return new Result(Value.FAILURE, "ECDH was unsuccessful.");
- if (!dh.hasSecret())
- return new Result(Value.FAILURE, "ECDH response did not contain the derived secret.");
- if (!Util.compareBytes(dh.getSecret(), 0, result.getData(0), 0, dh.secretLength())) {
- int firstDiff = Util.diffBytes(dh.getSecret(), 0, result.getData(0), 0, dh.secretLength());
- return new Result(Value.FAILURE, "ECDH derived secret does not match the test, first difference was at byte " + String.valueOf(firstDiff) + ".");
+ testVector.add(CommandTest.expect(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.CURVE_external, EC_Consts.PARAMETER_S, onekey.flatten(EC_Consts.PARAMETER_S)), ExpectedValue.SUCCESS));
+ testVector.add(CommandTest.expect(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.CURVE_external, EC_Consts.PARAMETER_W, otherkey.flatten(EC_Consts.PARAMETER_W)), ExpectedValue.SUCCESS));
+ testVector.add(CommandTest.function(new Command.ECDH(cardManager, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_TRUE, EC_Consts.CORRUPTION_NONE, result.getKA()), new TestCallback<CommandTestable>() {
+ @Override
+ public Result apply(CommandTestable testable) {
+ Response.ECDH dh = (Response.ECDH) testable.getResponse();
+ if (!dh.successful())
+ return new Result(Value.FAILURE, "ECDH was unsuccessful.");
+ if (!dh.hasSecret())
+ return new Result(Value.FAILURE, "ECDH response did not contain the derived secret.");
+ if (!ByteUtil.compareBytes(dh.getSecret(), 0, result.getData(0), 0, dh.secretLength())) {
+ int firstDiff = ByteUtil.diffBytes(dh.getSecret(), 0, result.getData(0), 0, dh.secretLength());
+ return new Result(Value.FAILURE, "ECDH derived secret does not match the test, first difference was at byte " + String.valueOf(firstDiff) + ".");
+ }
+ return new Result(Value.SUCCESS);
}
- return new Result(Value.SUCCESS);
}));
tests.add(CompoundTest.all(ExpectedValue.SUCCESS, "Test vector " + result.getId(), testVector.toArray(new Test[0])));
- tests.add(new SimpleTest(new Command.Cleanup(cardManager), ExpectedValue.ANY));
+ tests.add(CommandTest.expect(new Command.Cleanup(cardManager), ExpectedValue.ANY));
}
}
diff --git a/src/cz/crcs/ectester/reader/test/WrongCurvesSuite.java b/src/cz/crcs/ectester/reader/test/CardWrongCurvesSuite.java
index 76da718..4c529da 100644
--- a/src/cz/crcs/ectester/reader/test/WrongCurvesSuite.java
+++ b/src/cz/crcs/ectester/reader/test/CardWrongCurvesSuite.java
@@ -12,9 +12,9 @@ import static cz.crcs.ectester.common.test.Result.ExpectedValue;
/**
* @author Jan Jancar johny@neuromancer.sk
*/
-public class WrongCurvesSuite extends TestSuite {
+public class CardWrongCurvesSuite extends CardTestSuite {
- public WrongCurvesSuite(EC_Store dataStore, ECTesterReader.Config cfg) {
+ public CardWrongCurvesSuite(EC_Store dataStore, ECTesterReader.Config cfg) {
super(dataStore, cfg, "wrong", "The wrong curve suite tests whether the card rejects domain parameters which are not curves.");
}
diff --git a/src/cz/crcs/ectester/reader/test/CommandTest.java b/src/cz/crcs/ectester/reader/test/CommandTest.java
new file mode 100644
index 0000000..a08d820
--- /dev/null
+++ b/src/cz/crcs/ectester/reader/test/CommandTest.java
@@ -0,0 +1,76 @@
+package cz.crcs.ectester.reader.test;
+
+import cz.crcs.ectester.common.test.Result;
+import cz.crcs.ectester.common.test.SimpleTest;
+import cz.crcs.ectester.common.test.TestCallback;
+import cz.crcs.ectester.common.test.TestException;
+import cz.crcs.ectester.reader.command.Command;
+import cz.crcs.ectester.reader.response.Response;
+
+/**
+ * A simple test that runs one Command to get and evaluate one Response
+ * to get a Result and compare it with the expected one.
+ */
+public class CommandTest extends SimpleTest<CommandTestable> {
+ private CommandTest(CommandTestable command, TestCallback<CommandTestable> callback) {
+ super(command, callback);
+ }
+
+ public static CommandTest function(CommandTestable command, TestCallback<CommandTestable> callback) {
+ return new CommandTest(command, callback);
+ }
+
+ public static CommandTest function(Command command, TestCallback<CommandTestable> callback) {
+ return function(new CommandTestable(command), callback);
+ }
+
+ public static CommandTest expect(CommandTestable command, Result.ExpectedValue expected, String ok, String nok) {
+ return new CommandTest(command, new TestCallback<CommandTestable>() {
+ @Override
+ public Result apply(CommandTestable commandTestable) {
+ Response resp = commandTestable.getResponse();
+ Result.Value resultValue = Result.Value.fromExpected(expected, resp.successful(), resp.error());
+ return new Result(resultValue, resultValue.ok() ? ok : nok);
+ }
+ });
+ }
+
+ public static CommandTest expect(Command command, Result.ExpectedValue expectedValue, String ok, String nok) {
+ return expect(new CommandTestable(command), expectedValue, ok, nok);
+ }
+
+ public static CommandTest expect(CommandTestable command, Result.ExpectedValue expected) {
+ return expect(command, expected, null, null);
+ }
+
+ public static CommandTest expect(Command command, Result.ExpectedValue expectedValue) {
+ return expect(command, expectedValue, null, null);
+ }
+
+ public Command getCommand() {
+ return testable.getCommand();
+ }
+
+ public Response getResponse() {
+ return testable.getResponse();
+ }
+
+ @Override
+ public void run() throws TestException {
+ if (hasRun)
+ return;
+
+ testable.run();
+ result = callback.apply(testable);
+ hasRun = true;
+ }
+
+ @Override
+ public String getDescription() {
+ if (hasRun) {
+ return testable.getResponse().getDescription();
+ } else {
+ return testable.getCommand().toString();
+ }
+ }
+}
diff --git a/src/cz/crcs/ectester/reader/test/CommandTestable.java b/src/cz/crcs/ectester/reader/test/CommandTestable.java
new file mode 100644
index 0000000..4025c61
--- /dev/null
+++ b/src/cz/crcs/ectester/reader/test/CommandTestable.java
@@ -0,0 +1,47 @@
+package cz.crcs.ectester.reader.test;
+
+import cz.crcs.ectester.common.test.BaseTestable;
+import cz.crcs.ectester.common.test.TestException;
+import cz.crcs.ectester.reader.command.Command;
+import cz.crcs.ectester.reader.response.Response;
+
+import javax.smartcardio.CardException;
+
+/**
+ * @author Jan Jancar johny@neuromancer.sk
+ */
+public class CommandTestable extends BaseTestable {
+ private Command command;
+ private Response response;
+
+ public CommandTestable(Command command) {
+ this.command = command;
+ }
+
+ public Command getCommand() {
+ return command;
+ }
+
+ public Response getResponse() {
+ return response;
+ }
+
+ @Override
+ public void run() throws TestException {
+ try {
+ response = command.send();
+ } catch (CardException e) {
+ throw new TestException(e);
+ }
+
+ hasRun = true;
+ if (response.error()) {
+ error = true;
+ } else if (response.successful()) {
+ ok = true;
+ }
+ meta.clear();
+ meta.put("natural-sw", response.getNaturalSW());
+ meta.put("sws", response.getSWs());
+ }
+}
diff --git a/src/cz/crcs/ectester/reader/test/SimpleTest.java b/src/cz/crcs/ectester/reader/test/SimpleTest.java
deleted file mode 100644
index 067f43e..0000000
--- a/src/cz/crcs/ectester/reader/test/SimpleTest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package cz.crcs.ectester.reader.test;
-
-import cz.crcs.ectester.common.test.Result;
-import cz.crcs.ectester.common.test.Test;
-import cz.crcs.ectester.common.test.TestException;
-import cz.crcs.ectester.reader.command.Command;
-import cz.crcs.ectester.reader.response.Response;
-
-import javax.smartcardio.CardException;
-import java.util.function.BiFunction;
-
-/**
- * A simple test that runs one Command to get and evaluate one Response
- * to get a Result and compare it with the expected one.
- */
-public class SimpleTest extends Test {
- private BiFunction<Command, Response, Result> callback;
- private Command command;
- private Response response;
-
- public SimpleTest(Command command, BiFunction<Command, Response, Result> callback) {
- this.command = command;
- this.callback = callback;
- }
-
- public SimpleTest(Command command, Result.ExpectedValue expected, String ok, String nok) {
- this(command, (cmd, resp) -> {
- Result.Value resultValue = Result.Value.fromExpected(expected, resp.successful(), resp.error());
- return new Result(resultValue, resultValue.ok() ? ok : nok);
- });
- }
-
- public SimpleTest(Command command, Result.ExpectedValue expected) {
- this(command, expected, null, null);
- }
-
- public Command getCommand() {
- return command;
- }
-
- public Response getResponse() {
- return response;
- }
-
- @Override
- public void run() throws TestException {
- if (hasRun)
- return;
-
- try {
- response = command.send();
- } catch (CardException e) {
- throw new TestException(e);
- }
- if (callback != null) {
- result = callback.apply(command, response);
- } else {
- if (response.successful()) {
- result = new Result(Result.Value.SUCCESS);
- } else {
- result = new Result(Result.Value.FAILURE);
- }
- }
- hasRun = true;
- }
-
- @Override
- public String getDescription() {
- return response.getDescription();
- }
-}
diff --git a/src/cz/crcs/ectester/reader/test/TestRunner.java b/src/cz/crcs/ectester/reader/test/TestRunner.java
deleted file mode 100644
index dcc78db..0000000
--- a/src/cz/crcs/ectester/reader/test/TestRunner.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package cz.crcs.ectester.reader.test;
-
-import cz.crcs.ectester.common.test.Test;
-import cz.crcs.ectester.common.test.TestException;
-import cz.crcs.ectester.reader.output.TestWriter;
-
-/**
- * @author Jan Jancar johny@neuromancer.sk
- */
-public class TestRunner {
- private TestSuite suite;
- private TestWriter writer;
-
- public TestRunner(TestSuite suite, TestWriter writer) {
- this.suite = suite;
- this.writer = writer;
- }
-
- public void run() throws TestException {
- writer.begin(suite);
- for (Test t : suite.getTests()) {
- if (!t.hasRun()) {
- t.run();
- writer.outputTest(t);
- }
- }
- writer.end();
- }
-}