aboutsummaryrefslogtreecommitdiff
path: root/src/cz/crcs/ectester/reader
diff options
context:
space:
mode:
authorJ08nY2017-05-04 20:48:43 +0200
committerJ08nY2017-05-04 20:48:43 +0200
commit8884b0f8d55fd9cb89597ddce6f74a5e9b538f7b (patch)
treeec48fa86d60f12d52bdb5b218b35e57b3a659643 /src/cz/crcs/ectester/reader
parentade2dffcd7723f4414e681cd80a374c6fe8001ef (diff)
downloadECTester-8884b0f8d55fd9cb89597ddce6f74a5e9b538f7b.tar.gz
ECTester-8884b0f8d55fd9cb89597ddce6f74a5e9b538f7b.tar.zst
ECTester-8884b0f8d55fd9cb89597ddce6f74a5e9b538f7b.zip
Added support for extended APDUs, fixed problems with large cmds
- Switched ECTesterApplet to Javacard 2.2.2 which supports Extended length APDUs (necessary for some Set commands when a large external curve is sent to the applet) - The incoming APDU is now copied over to a sufficiently large buffer before being processed - Simplified instruction processing logic - Renamed ECUtil to AppletUtil - Fixed padding error in nist/P-521
Diffstat (limited to 'src/cz/crcs/ectester/reader')
-rw-r--r--src/cz/crcs/ectester/reader/Command.java3
-rw-r--r--src/cz/crcs/ectester/reader/ECTester.java8
-rw-r--r--src/cz/crcs/ectester/reader/Response.java2
-rw-r--r--src/cz/crcs/ectester/reader/Test.java4
-rw-r--r--src/cz/crcs/ectester/reader/TestSuite.java26
-rw-r--r--src/cz/crcs/ectester/reader/Util.java215
6 files changed, 143 insertions, 115 deletions
diff --git a/src/cz/crcs/ectester/reader/Command.java b/src/cz/crcs/ectester/reader/Command.java
index 4e210ed..6c2b769 100644
--- a/src/cz/crcs/ectester/reader/Command.java
+++ b/src/cz/crcs/ectester/reader/Command.java
@@ -66,6 +66,9 @@ public abstract class Command {
if (curve.getBits() != keyLength) {
throw new IOException("Curve bits mismatch: " + curve.getBits() + " vs " + keyLength + " entered.");
}
+ if (curve.getField() != keyClass) {
+ throw new IOException("Curve field mismatch.");
+ }
byte[] external = curve.flatten();
if (external == null) {
diff --git a/src/cz/crcs/ectester/reader/ECTester.java b/src/cz/crcs/ectester/reader/ECTester.java
index 217b9ef..4ba8e9a 100644
--- a/src/cz/crcs/ectester/reader/ECTester.java
+++ b/src/cz/crcs/ectester/reader/ECTester.java
@@ -368,6 +368,9 @@ public class ECTester {
keysFile.flush();
generated++;
}
+ Response cleanup = new Command.Cleanup(cardManager).send();
+ systemOutLogger.println(cleanup.toString());
+
keysFile.close();
}
@@ -474,6 +477,8 @@ public class ECTester {
++done;
}
+ Response cleanup = new Command.Cleanup(cardManager).send();
+ systemOutLogger.println(cleanup.toString());
if (out != null)
out.close();
@@ -545,6 +550,9 @@ public class ECTester {
++done;
}
+ Response cleanup = new Command.Cleanup(cardManager).send();
+ systemOutLogger.println(cleanup.toString());
+
if (out != null)
out.close();
}
diff --git a/src/cz/crcs/ectester/reader/Response.java b/src/cz/crcs/ectester/reader/Response.java
index c82772f..d74724c 100644
--- a/src/cz/crcs/ectester/reader/Response.java
+++ b/src/cz/crcs/ectester/reader/Response.java
@@ -126,7 +126,7 @@ public abstract class Response {
}
}
if (suffix.length() == 0) {
- suffix.append(" ").append(Util.getSWString(getNaturalSW()));
+ suffix.append(" [").append(Util.getSW(getNaturalSW())).append("]");
}
return String.format("%-62s:%4d ms : %s", inner, time / 1000000, suffix);
}
diff --git a/src/cz/crcs/ectester/reader/Test.java b/src/cz/crcs/ectester/reader/Test.java
index 651274d..157e360 100644
--- a/src/cz/crcs/ectester/reader/Test.java
+++ b/src/cz/crcs/ectester/reader/Test.java
@@ -61,6 +61,10 @@ public class Test {
hasRun = true;
}
+ public boolean hasRun() {
+ return hasRun;
+ }
+
@Override
public String toString() {
if (hasRun) {
diff --git a/src/cz/crcs/ectester/reader/TestSuite.java b/src/cz/crcs/ectester/reader/TestSuite.java
index 5e9511b..414c2a9 100644
--- a/src/cz/crcs/ectester/reader/TestSuite.java
+++ b/src/cz/crcs/ectester/reader/TestSuite.java
@@ -4,6 +4,7 @@ import cz.crcs.ectester.applet.ECTesterApplet;
import cz.crcs.ectester.applet.EC_Consts;
import cz.crcs.ectester.data.EC_Store;
import cz.crcs.ectester.reader.ec.*;
+import javacard.security.Key;
import javacard.security.KeyPair;
import javax.smartcardio.CardException;
@@ -18,7 +19,6 @@ public abstract class TestSuite {
EC_Store dataStore;
ECTester.Config cfg;
String name;
- boolean hasRun = false;
List<Test> tests = new LinkedList<>();
TestSuite(EC_Store dataStore, ECTester.Config cfg, String name) {
@@ -29,10 +29,11 @@ public abstract class TestSuite {
public List<Test> run(CardMngr cardManager) throws CardException, IOException {
for (Test t : tests) {
- t.run();
- System.out.println(t);
+ if (!t.hasRun()) {
+ t.run();
+ System.out.println(t);
+ }
}
- hasRun = true;
return tests;
}
@@ -40,10 +41,6 @@ public abstract class TestSuite {
return Collections.unmodifiableList(tests);
}
- public boolean hasRun() {
- return hasRun;
- }
-
public String getName() {
return name;
}
@@ -171,6 +168,9 @@ public abstract class TestSuite {
if (curve.getBits() != cfg.bits && !cfg.all) {
continue;
}
+ if (curve.getField() == KeyPair.ALG_EC_FP && !cfg.primeField || curve.getField() == KeyPair.ALG_EC_F2M && !cfg.binaryField) {
+ continue;
+ }
EC_Params onekey = dataStore.getObject(EC_Keypair.class, result.getOneKey());
if (onekey == null) {
onekey = dataStore.getObject(EC_Key.Private.class, result.getOneKey());
@@ -206,7 +206,6 @@ public abstract class TestSuite {
public static class NonPrime extends TestSuite {
-
public NonPrime(EC_Store dataStore, ECTester.Config cfg) {
super(dataStore, cfg, "nonprime");
}
@@ -222,6 +221,12 @@ public abstract class TestSuite {
Map<String, EC_Key> keys = dataStore.getObjects(EC_Key.class, "nonprime");
for (EC_Key key : keys.values()) {
EC_Curve curve = dataStore.getObject(EC_Curve.class, key.getCurve());
+ if (cfg.namedCurve != null && !(key.getCurve().startsWith(cfg.namedCurve) || key.getCurve().equals(cfg.namedCurve))) {
+ continue;
+ }
+ if (curve.getField() == KeyPair.ALG_EC_FP && !cfg.primeField || curve.getField() == KeyPair.ALG_EC_F2M && !cfg.binaryField) {
+ continue;
+ }
if ((curve.getBits() == cfg.bits || cfg.all)) {
tests.add(new Test(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, curve.getBits(), curve.getField()), Test.Result.SUCCESS));
tests.add(new Test(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()), Test.Result.ANY));
@@ -256,6 +261,9 @@ public abstract class TestSuite {
if (curve.getBits() != cfg.bits && !cfg.all) {
continue;
}
+ if (curve.getField() == KeyPair.ALG_EC_FP && !cfg.primeField || curve.getField() == KeyPair.ALG_EC_F2M && !cfg.binaryField) {
+ continue;
+ }
List<EC_Key.Public> keys = curves.getOrDefault(curve, new LinkedList<>());
keys.add(key);
curves.putIfAbsent(curve, keys);
diff --git a/src/cz/crcs/ectester/reader/Util.java b/src/cz/crcs/ectester/reader/Util.java
index 986433f..3a7e9fe 100644
--- a/src/cz/crcs/ectester/reader/Util.java
+++ b/src/cz/crcs/ectester/reader/Util.java
@@ -166,115 +166,120 @@ public class Util {
}
}
+ public static String getSW(short sw) {
+ String str;
+ switch (sw) {
+ case ISO7816.SW_APPLET_SELECT_FAILED:
+ str = "APPLET_SELECT_FAILED";
+ break;
+ case ISO7816.SW_BYTES_REMAINING_00:
+ str = "BYTES_REMAINING";
+ break;
+ case ISO7816.SW_CLA_NOT_SUPPORTED:
+ str = "CLA_NOT_SUPPORTED";
+ break;
+ case ISO7816.SW_COMMAND_NOT_ALLOWED:
+ str = "COMMAND_NOT_ALLOWED";
+ break;
+ case ISO7816.SW_CONDITIONS_NOT_SATISFIED:
+ str = "CONDITIONS_NOT_SATISFIED";
+ break;
+ case ISO7816.SW_CORRECT_LENGTH_00:
+ str = "CORRECT_LENGTH";
+ break;
+ case ISO7816.SW_DATA_INVALID:
+ str = "DATA_INVALID";
+ break;
+ case ISO7816.SW_FILE_FULL:
+ str = "FILE_FULL";
+ break;
+ case ISO7816.SW_FILE_INVALID:
+ str = "FILE_INVALID";
+ break;
+ case ISO7816.SW_FILE_NOT_FOUND:
+ str = "FILE_NOT_FOUND";
+ break;
+ case ISO7816.SW_FUNC_NOT_SUPPORTED:
+ str = "FUNC_NOT_SUPPORTED";
+ break;
+ case ISO7816.SW_INCORRECT_P1P2:
+ str = "INCORRECT_P1P2";
+ break;
+ case ISO7816.SW_INS_NOT_SUPPORTED:
+ str = "INS_NOT_SUPPORTED";
+ break;
+ case ISO7816.SW_LOGICAL_CHANNEL_NOT_SUPPORTED:
+ str = "LOGICAL_CHANNEL_NOT_SUPPORTED";
+ break;
+ case ISO7816.SW_RECORD_NOT_FOUND:
+ str = "RECORD_NOT_FOUND";
+ break;
+ case ISO7816.SW_SECURE_MESSAGING_NOT_SUPPORTED:
+ str = "SECURE_MESSAGING_NOT_SUPPORTED";
+ break;
+ case ISO7816.SW_SECURITY_STATUS_NOT_SATISFIED:
+ str = "SECURITY_STATUS_NOT_SATISFIED";
+ break;
+ case ISO7816.SW_UNKNOWN:
+ str = "UNKNOWN";
+ break;
+ case ISO7816.SW_WARNING_STATE_UNCHANGED:
+ str = "WARNING_STATE_UNCHANGED";
+ break;
+ case ISO7816.SW_WRONG_DATA:
+ str = "WRONG_DATA";
+ break;
+ case ISO7816.SW_WRONG_LENGTH:
+ str = "WRONG_LENGTH";
+ break;
+ case ISO7816.SW_WRONG_P1P2:
+ str = "WRONG_P1P2";
+ break;
+ case CryptoException.ILLEGAL_VALUE:
+ str = "ILLEGAL_VALUE";
+ break;
+ case CryptoException.UNINITIALIZED_KEY:
+ str = "UNINITIALIZED_KEY";
+ break;
+ case CryptoException.NO_SUCH_ALGORITHM:
+ str = "NO_SUCH_ALG";
+ break;
+ case CryptoException.INVALID_INIT:
+ str = "INVALID_INIT";
+ break;
+ case CryptoException.ILLEGAL_USE:
+ str = "ILLEGAL_USE";
+ break;
+ case ECTesterApplet.SW_SIG_VERIFY_FAIL:
+ str = "SIG_VERIFY_FAIL";
+ break;
+ case ECTesterApplet.SW_DH_DHC_MISMATCH:
+ str = "DH_DHC_MISMATCH";
+ break;
+ case ECTesterApplet.SW_KEYPAIR_NULL:
+ str = "KEYPAIR_NULL";
+ break;
+ case ECTesterApplet.SW_KA_NULL:
+ str = "KA_NULL";
+ break;
+ case ECTesterApplet.SW_SIGNATURE_NULL:
+ str = "SIGNATURE_NULL";
+ break;
+ case ECTesterApplet.SW_OBJECT_NULL:
+ str = "OBJECT_NULL";
+ break;
+ default:
+ str = "unknown";
+ break;
+ }
+ return str;
+ }
+
public static String getSWString(short sw) {
if (sw == ISO7816.SW_NO_ERROR) {
return "OK\t(0x9000)";
} else {
- String str;
- switch (sw) {
- case ISO7816.SW_APPLET_SELECT_FAILED:
- str = "APPLET_SELECT_FAILED";
- break;
- case ISO7816.SW_BYTES_REMAINING_00:
- str = "BYTES_REMAINING";
- break;
- case ISO7816.SW_CLA_NOT_SUPPORTED:
- str = "CLA_NOT_SUPPORTED";
- break;
- case ISO7816.SW_COMMAND_NOT_ALLOWED:
- str = "COMMAND_NOT_ALLOWED";
- break;
- case ISO7816.SW_CONDITIONS_NOT_SATISFIED:
- str = "CONDITIONS_NOT_SATISFIED";
- break;
- case ISO7816.SW_CORRECT_LENGTH_00:
- str = "CORRECT_LENGTH";
- break;
- case ISO7816.SW_DATA_INVALID:
- str = "DATA_INVALID";
- break;
- case ISO7816.SW_FILE_FULL:
- str = "FILE_FULL";
- break;
- case ISO7816.SW_FILE_INVALID:
- str = "FILE_INVALID";
- break;
- case ISO7816.SW_FILE_NOT_FOUND:
- str = "FILE_NOT_FOUND";
- break;
- case ISO7816.SW_FUNC_NOT_SUPPORTED:
- str = "FUNC_NOT_SUPPORTED";
- break;
- case ISO7816.SW_INCORRECT_P1P2:
- str = "INCORRECT_P1P2";
- break;
- case ISO7816.SW_INS_NOT_SUPPORTED:
- str = "INS_NOT_SUPPORTED";
- break;
- case ISO7816.SW_LOGICAL_CHANNEL_NOT_SUPPORTED:
- str = "LOGICAL_CHANNEL_NOT_SUPPORTED";
- break;
- case ISO7816.SW_RECORD_NOT_FOUND:
- str = "RECORD_NOT_FOUND";
- break;
- case ISO7816.SW_SECURE_MESSAGING_NOT_SUPPORTED:
- str = "SECURE_MESSAGING_NOT_SUPPORTED";
- break;
- case ISO7816.SW_SECURITY_STATUS_NOT_SATISFIED:
- str = "SECURITY_STATUS_NOT_SATISFIED";
- break;
- case ISO7816.SW_UNKNOWN:
- str = "UNKNOWN";
- break;
- case ISO7816.SW_WARNING_STATE_UNCHANGED:
- str = "WARNING_STATE_UNCHANGED";
- break;
- case ISO7816.SW_WRONG_DATA:
- str = "WRONG_DATA";
- break;
- case ISO7816.SW_WRONG_LENGTH:
- str = "WRONG_LENGTH";
- break;
- case ISO7816.SW_WRONG_P1P2:
- str = "WRONG_P1P2";
- break;
- case CryptoException.ILLEGAL_VALUE:
- str = "ILLEGAL_VALUE";
- break;
- case CryptoException.UNINITIALIZED_KEY:
- str = "UNINITIALIZED_KEY";
- break;
- case CryptoException.NO_SUCH_ALGORITHM:
- str = "NO_SUCH_ALG";
- break;
- case CryptoException.INVALID_INIT:
- str = "INVALID_INIT";
- break;
- case CryptoException.ILLEGAL_USE:
- str = "ILLEGAL_USE";
- break;
- case ECTesterApplet.SW_SIG_VERIFY_FAIL:
- str = "SIG_VERIFY_FAIL";
- break;
- case ECTesterApplet.SW_DH_DHC_MISMATCH:
- str = "DH_DHC_MISMATCH";
- break;
- case ECTesterApplet.SW_KEYPAIR_NULL:
- str = "KEYPAIR_NULL";
- break;
- case ECTesterApplet.SW_KA_NULL:
- str = "KA_NULL";
- break;
- case ECTesterApplet.SW_SIGNATURE_NULL:
- str = "SIGNATURE_NULL";
- break;
- case ECTesterApplet.SW_OBJECT_NULL:
- str = "OBJECT_NULL";
- break;
- default:
- str = "unknown";
- break;
- }
+ String str = getSW(sw);
return String.format("fail\t(%s,\t0x%04x)", str, sw);
}
}