aboutsummaryrefslogtreecommitdiff
path: root/src/cz/crcs/ectester/reader
diff options
context:
space:
mode:
authorJ08nY2017-04-15 01:27:24 +0200
committerJ08nY2017-04-15 01:32:41 +0200
commit914931cfea79c7947b180069b0e67cc208971869 (patch)
tree0654e07bc134ad9bfbf7661bee076aa4c0890436 /src/cz/crcs/ectester/reader
parent45d1bb40cbc4c71e5b94e78f3a541e8f9cd8d62f (diff)
downloadECTester-914931cfea79c7947b180069b0e67cc208971869.tar.gz
ECTester-914931cfea79c7947b180069b0e67cc208971869.tar.zst
ECTester-914931cfea79c7947b180069b0e67cc208971869.zip
Add invalid curves test(partly) and some parameters (brainpool) for it
- curves.xml, keys.xml and results.xml's entries can now instead of file path to point to csv file, contain the csv data inline. - Moved EC_Category to reader package from data - Fixed printing of named objects - Added ECDH/C test for KA_BOTH which does ECDH and ECDHC on the applet side, compares the results and reports success/failure etc.
Diffstat (limited to 'src/cz/crcs/ectester/reader')
-rw-r--r--src/cz/crcs/ectester/reader/ECTester.java115
-rw-r--r--src/cz/crcs/ectester/reader/Response.java2
-rw-r--r--src/cz/crcs/ectester/reader/ec/EC_Category.java128
-rw-r--r--src/cz/crcs/ectester/reader/ec/EC_Curve.java2
-rw-r--r--src/cz/crcs/ectester/reader/ec/EC_KAResult.java2
-rw-r--r--src/cz/crcs/ectester/reader/ec/EC_Key.java4
-rw-r--r--src/cz/crcs/ectester/reader/ec/EC_Keypair.java2
7 files changed, 168 insertions, 87 deletions
diff --git a/src/cz/crcs/ectester/reader/ECTester.java b/src/cz/crcs/ectester/reader/ECTester.java
index cb3d298..6965d14 100644
--- a/src/cz/crcs/ectester/reader/ECTester.java
+++ b/src/cz/crcs/ectester/reader/ECTester.java
@@ -23,7 +23,6 @@ package cz.crcs.ectester.reader;
import cz.crcs.ectester.applet.ECTesterApplet;
import cz.crcs.ectester.applet.EC_Consts;
-import cz.crcs.ectester.data.EC_Category;
import cz.crcs.ectester.data.EC_Store;
import cz.crcs.ectester.reader.ec.*;
import javacard.security.KeyPair;
@@ -468,70 +467,18 @@ public class ECTester {
if (optListNamed == null) {
// print all categories, briefly
for (EC_Category cat : categories.values()) {
- System.out.println("\t- " + cat.getName() + ": " + (cat.getDesc() == null ? "" : cat.getDesc()));
-
- Map<String, EC_Curve> curves = cat.getObjects(EC_Curve.class);
- int size = curves.size();
- if (size > 0) {
- System.out.print("\t\tCurves: ");
- for (Map.Entry<String, EC_Curve> curve : curves.entrySet()) {
- System.out.print(curve.getKey());
- size--;
- if (size > 0)
- System.out.print(", ");
- }
- System.out.println();
- }
-
- Map<String, EC_Key> keys = cat.getObjects(EC_Key.class);
- size = keys.size();
- if (size > 0) {
- System.out.print("\t\tKeys: ");
- for (Map.Entry<String, EC_Key> key : keys.entrySet()) {
- System.out.print(key.getKey());
- size--;
- if (size > 0)
- System.out.print(", ");
- }
- System.out.println();
- }
-
- Map<String, EC_Keypair> keypairs = cat.getObjects(EC_Keypair.class);
- size = keypairs.size();
- if (size > 0) {
- System.out.print("\t\tKeypairs: ");
- for (Map.Entry<String, EC_Keypair> key : keypairs.entrySet()) {
- System.out.print(key.getKey());
- size--;
- if (size > 0)
- System.out.print(", ");
- }
- System.out.println();
- }
-
- Map<String, EC_KAResult> results = cat.getObjects(EC_KAResult.class);
- size = results.size();
- if (size > 0) {
- System.out.print("\t\tResults: ");
- for (Map.Entry<String, EC_KAResult> result : results.entrySet()) {
- System.out.print(result.getKey());
- size--;
- if (size > 0)
- System.out.print(", ");
- }
- System.out.println();
- }
-
- System.out.println();
+ System.out.println(cat);
}
} else if (categories.containsKey(optListNamed)) {
// print given category
- //TODO
+ System.out.println(categories.get(optListNamed));
} else {
// print given object
EC_Data object = dataStore.getObject(EC_Data.class, optListNamed);
if (object != null) {
System.out.println(object);
+ } else {
+ System.err.println("Named object " + optListNamed + " not found!");
}
}
}
@@ -562,9 +509,9 @@ public class ECTester {
// Cofactor generally isn't set on the default curve parameters on cards,
// since its not necessary for ECDH, only ECDHC which not many cards implement
// TODO: check if its assumend to be == 1?
- short domain_all = optPrimeField ? EC_Consts.PARAMETERS_DOMAIN_FP : EC_Consts.PARAMETERS_DOMAIN_F2M;
- short domain = (short) (domain_all ^ EC_Consts.PARAMETER_K);
- Response.Export export = new Command.Export(cardManager, ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.KEY_PUBLIC, domain_all).send();
+ short domainAll = optPrimeField ? EC_Consts.PARAMETERS_DOMAIN_FP : EC_Consts.PARAMETERS_DOMAIN_F2M;
+ short domain = (short) (domainAll ^ EC_Consts.PARAMETER_K);
+ Response.Export export = new Command.Export(cardManager, ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.KEY_PUBLIC, domainAll).send();
if (!export.successful()) {
export = new Command.Export(cardManager, ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.KEY_PUBLIC, domain).send();
}
@@ -722,12 +669,13 @@ public class ECTester {
// These tests are dangerous, prompt before them.
System.out.println("The test you selected (" + optTestSuite + ") is potentially dangerous.");
System.out.println("Some of these tests have caused temporary DoS of some cards.");
- System.out.print("Do you want to proceed? (y/n):");
+ System.out.print("Do you want to proceed? (y/n): ");
Scanner in = new Scanner(System.in);
String confirmation = in.nextLine();
if (!Arrays.asList("yes", "y", "Y").contains(confirmation)) {
return;
}
+ in.close();
if (optTestSuite.equals("wrong")) {
/* Just do the default tests on the wrong curves.
@@ -750,20 +698,35 @@ public class ECTester {
EC_Curve curve = dataStore.getObject(EC_Curve.class, key.getCurve());
if ((curve.getBits() == optBits || optAll)) {
commands.add(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, curve.getBits(), curve.getField()));
- commands.add(new Command.Generate(cardManager, ECTesterApplet.KEYPAIR_LOCAL));
commands.add(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()));
- commands.add(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.CURVE_external, key.getParams(), key.flatten()));
+ commands.add(new Command.Generate(cardManager, ECTesterApplet.KEYPAIR_LOCAL));
+ commands.add(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.CURVE_external, key.getParams(), key.flatten()));
commands.add(new Command.ECDH(cardManager, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_FALSE, EC_Consts.CORRUPTION_NONE, EC_Consts.KA_ECDH));
commands.add(new Command.Cleanup(cardManager));
}
}
} else if (optTestSuite.equals("invalid")) {
- /* Set original curves (secg/nist/brainpool). Generate local.
- * Try ECDH with invalid public keys of increasing (or decreasing) order.
- *
- */
- //TODO
- System.err.println("Currently not yet implemented.");
+ /* Set original curves (secg/nist/brainpool). Generate local.
+ * Try ECDH with invalid public keys of increasing (or decreasing) order.
+ */
+ Map<String, EC_Key.Public> pubkeys = dataStore.getObjects(EC_Key.Public.class, "invalid");
+ for (EC_Key.Public key : pubkeys.values()) {
+ EC_Curve curve = dataStore.getObject(EC_Curve.class, key.getCurve());
+ if (optNamedCurve != null && !(key.getCurve().startsWith(optNamedCurve) || key.getCurve().equals(optNamedCurve))) {
+ continue;
+ }
+ if (curve.getBits() != optBits && !optAll) {
+ continue;
+ }
+ commands.add(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, curve.getBits(), curve.getField()));
+ commands.add(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()));
+ commands.add(new Command.Generate(cardManager, ECTesterApplet.KEYPAIR_LOCAL));
+ commands.add(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.CURVE_external, key.getParams(), key.flatten()));
+ commands.add(new Command.ECDH(cardManager, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_FALSE, EC_Consts.CORRUPTION_NONE, EC_Consts.KA_BOTH));
+ //commands.add(new Command.ECDH(cardManager, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_FALSE, EC_Consts.CORRUPTION_NONE, EC_Consts.KA_ECDHC));
+ commands.add(new Command.Cleanup(cardManager));
+
+ }
}
}
@@ -771,14 +734,6 @@ public class ECTester {
List<Response> test = Command.sendAll(commands);
systemOutLogger.println(Response.toString(test, optTestSuite));
- for (Response response : test) {
- if (response instanceof Response.ECDH) {
- Response.ECDH ecdh = (Response.ECDH) response;
- if (ecdh.hasSecret()) {
- System.out.println(Util.bytesToHex(ecdh.getSecret(), false));
- }
- }
- }
}
/**
@@ -1039,9 +994,8 @@ public class ECTester {
}
/**
- *
* @return
- * @throws IOException if an IO error occurs when writing to key file.
+ * @throws IOException if an IO error occurs when writing to key file.
*/
private List<Command> testCurve() throws IOException {
List<Command> commands = new LinkedList<>();
@@ -1056,11 +1010,10 @@ public class ECTester {
}
/**
- *
* @param category
* @param field
* @return
- * @throws IOException if an IO error occurs when writing to key file.
+ * @throws IOException if an IO error occurs when writing to key file.
*/
private List<Command> testCurves(String category, byte field) throws IOException {
List<Command> commands = new LinkedList<>();
diff --git a/src/cz/crcs/ectester/reader/Response.java b/src/cz/crcs/ectester/reader/Response.java
index c3f2fe4..ee27260 100644
--- a/src/cz/crcs/ectester/reader/Response.java
+++ b/src/cz/crcs/ectester/reader/Response.java
@@ -137,7 +137,7 @@ public abstract class Response {
if (prefix != null)
out.append(prefix);
- out.append(String.format("%-58s:%4d ms : %s", message, r.time / 1000000, suffix));
+ out.append(String.format("%-62s:%4d ms : %s", message, r.time / 1000000, suffix));
if (i < responses.size() - 1) {
out.append("\n");
}
diff --git a/src/cz/crcs/ectester/reader/ec/EC_Category.java b/src/cz/crcs/ectester/reader/ec/EC_Category.java
new file mode 100644
index 0000000..a0c8755
--- /dev/null
+++ b/src/cz/crcs/ectester/reader/ec/EC_Category.java
@@ -0,0 +1,128 @@
+package cz.crcs.ectester.reader.ec;
+
+import java.util.Collections;
+import java.util.Map;
+import java.util.TreeMap;
+
+/**
+ * @author Jan Jancar johny@neuromancer.sk
+ */
+public class EC_Category {
+
+ private String name;
+ private String directory;
+ private String desc;
+
+ private Map<String, EC_Data> objects;
+
+
+ public EC_Category(String name, String directory) {
+ this.name = name;
+ this.directory = directory;
+ }
+
+ public EC_Category(String name, String directory, String desc) {
+ this(name, directory);
+ this.desc = desc;
+ }
+
+ public EC_Category(String name, String directory, String desc, Map<String, EC_Data> objects) {
+ this(name, directory, desc);
+ this.objects = objects;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getDirectory() {
+ return directory;
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+
+ public Map<String, EC_Data> getObjects() {
+ return Collections.unmodifiableMap(objects);
+ }
+
+ public <T extends EC_Data> Map<String, T> getObjects(Class<T> cls) {
+ Map<String, T> objs = new TreeMap<>();
+ for (Map.Entry<String, EC_Data> entry : objects.entrySet()) {
+ if (cls.isInstance(entry.getValue())) {
+ objs.put(entry.getKey(), cls.cast(entry.getValue()));
+ }
+ }
+ return Collections.unmodifiableMap(objs);
+ }
+
+ public <T extends EC_Data> T getObject(Class<T> cls, String id) {
+ EC_Data obj = objects.get(id);
+ if (cls.isInstance(obj)) {
+ return cls.cast(obj);
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder out = new StringBuilder();
+ out.append("\t- ").append(name).append((desc == null || desc.equals("")) ? "" : ": " + desc);
+ out.append(System.lineSeparator());
+
+ Map<String, EC_Curve> curves = getObjects(EC_Curve.class);
+ int size = curves.size();
+ if (size > 0) {
+ out.append("\t\tCurves: ");
+ for (Map.Entry<String, EC_Curve> curve : curves.entrySet()) {
+ out.append(curve.getKey());
+ size--;
+ if (size > 0)
+ out.append(", ");
+ }
+ out.append(System.lineSeparator());
+ }
+
+ Map<String, EC_Key> keys = getObjects(EC_Key.class);
+ size = keys.size();
+ if (size > 0) {
+ out.append("\t\tKeys: ");
+ for (Map.Entry<String, EC_Key> key : keys.entrySet()) {
+ out.append(key.getKey());
+ size--;
+ if (size > 0)
+ out.append(", ");
+ }
+ out.append(System.lineSeparator());
+ }
+
+ Map<String, EC_Keypair> keypairs = getObjects(EC_Keypair.class);
+ size = keypairs.size();
+ if (size > 0) {
+ out.append("\t\tKeypairs: ");
+ for (Map.Entry<String, EC_Keypair> key : keypairs.entrySet()) {
+ out.append(key.getKey());
+ size--;
+ if (size > 0)
+ out.append(", ");
+ }
+ out.append(System.lineSeparator());
+ }
+
+ Map<String, EC_KAResult> results = getObjects(EC_KAResult.class);
+ size = results.size();
+ if (size > 0) {
+ out.append("\t\tResults: ");
+ for (Map.Entry<String, EC_KAResult> result : results.entrySet()) {
+ out.append(result.getKey());
+ size--;
+ if (size > 0)
+ out.append(", ");
+ }
+ out.append(System.lineSeparator());
+ }
+ return out.toString();
+ }
+}
diff --git a/src/cz/crcs/ectester/reader/ec/EC_Curve.java b/src/cz/crcs/ectester/reader/ec/EC_Curve.java
index 953884f..9b783ec 100644
--- a/src/cz/crcs/ectester/reader/ec/EC_Curve.java
+++ b/src/cz/crcs/ectester/reader/ec/EC_Curve.java
@@ -43,6 +43,6 @@ public class EC_Curve extends EC_Params {
@Override
public String toString() {
- return "Elliptic curve (" + String.valueOf(bits) + "b): " + desc;
+ return "Elliptic curve (" + String.valueOf(bits) + "b)" + (desc == null ? "" : ": " + desc);
}
}
diff --git a/src/cz/crcs/ectester/reader/ec/EC_KAResult.java b/src/cz/crcs/ectester/reader/ec/EC_KAResult.java
index f1be49a..1385f12 100644
--- a/src/cz/crcs/ectester/reader/ec/EC_KAResult.java
+++ b/src/cz/crcs/ectester/reader/ec/EC_KAResult.java
@@ -50,7 +50,7 @@ public class EC_KAResult extends EC_Data {
@Override
public String toString() {
String agreement = ka == EC_Consts.KA_ECDH ? "ECDH" : "ECDHC";
- return agreement + " over " + curve + ", " + oneKey + " + " + otherKey + ": " + desc;
+ return agreement + " result over " + curve + ", " + oneKey + " + " + otherKey + (desc == null ? "" : ": " + desc);
}
}
diff --git a/src/cz/crcs/ectester/reader/ec/EC_Key.java b/src/cz/crcs/ectester/reader/ec/EC_Key.java
index 983ffa8..ad846b8 100644
--- a/src/cz/crcs/ectester/reader/ec/EC_Key.java
+++ b/src/cz/crcs/ectester/reader/ec/EC_Key.java
@@ -40,7 +40,7 @@ public class EC_Key extends EC_Params {
@Override
public String toString() {
- return "EC Public key, over " + getCurve() + ": " + getDesc();
+ return "EC Public key, over " + getCurve() + (getDesc() == null ? "" : ": " + getDesc());
}
}
@@ -56,7 +56,7 @@ public class EC_Key extends EC_Params {
@Override
public String toString() {
- return "EC Private key, over " + getCurve() + ": " + getDesc();
+ return "EC Private key, over " + getCurve() + (getDesc() == null ? "" : ": " + getDesc());
}
}
}
diff --git a/src/cz/crcs/ectester/reader/ec/EC_Keypair.java b/src/cz/crcs/ectester/reader/ec/EC_Keypair.java
index af4038a..bf87e9e 100644
--- a/src/cz/crcs/ectester/reader/ec/EC_Keypair.java
+++ b/src/cz/crcs/ectester/reader/ec/EC_Keypair.java
@@ -30,6 +30,6 @@ public class EC_Keypair extends EC_Params {
@Override
public String toString() {
- return "EC Keypair, over " + curve + ": " + desc;
+ return "EC Keypair, over " + curve + (desc == null ? "" : ": " + desc);
}
}