aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--!uploader/ectester.capbin13653 -> 13573 bytes
-rw-r--r--dist/ECTester.jarbin215702 -> 218187 bytes
-rw-r--r--src/cz/crcs/ectester/applet/ECKeyGenerator.java26
-rw-r--r--src/cz/crcs/ectester/applet/ECKeyTester.java21
-rw-r--r--src/cz/crcs/ectester/applet/ECTesterApplet.java35
-rw-r--r--src/cz/crcs/ectester/reader/ECTester.java187
-rw-r--r--src/cz/crcs/ectester/reader/Response.java4
-rw-r--r--src/cz/crcs/ectester/reader/Util.java91
8 files changed, 243 insertions, 121 deletions
diff --git a/!uploader/ectester.cap b/!uploader/ectester.cap
index e517e19..dec01be 100644
--- a/!uploader/ectester.cap
+++ b/!uploader/ectester.cap
Binary files differ
diff --git a/dist/ECTester.jar b/dist/ECTester.jar
index 21cbcf7..6f8c516 100644
--- a/dist/ECTester.jar
+++ b/dist/ECTester.jar
Binary files differ
diff --git a/src/cz/crcs/ectester/applet/ECKeyGenerator.java b/src/cz/crcs/ectester/applet/ECKeyGenerator.java
index 8c9c38e..bd4b8c4 100644
--- a/src/cz/crcs/ectester/applet/ECKeyGenerator.java
+++ b/src/cz/crcs/ectester/applet/ECKeyGenerator.java
@@ -1,9 +1,9 @@
package cz.crcs.ectester.applet;
+import javacard.framework.CardRuntimeException;
import javacard.framework.ISO7816;
import javacard.framework.ISOException;
import javacard.framework.Util;
-import javacard.security.CryptoException;
import javacard.security.ECPrivateKey;
import javacard.security.ECPublicKey;
import javacard.security.KeyPair;
@@ -32,10 +32,8 @@ public class ECKeyGenerator {
} catch (Exception ignored) {
}
}
- } catch (CryptoException ce) {
+ } catch (CardRuntimeException ce) {
sw = ce.getReason();
- } catch (Exception e) {
- sw = ISO7816.SW_UNKNOWN;
}
return ecKeyPair;
}
@@ -45,10 +43,8 @@ public class ECKeyGenerator {
try {
if ((key & EC_Consts.KEY_PUBLIC) != 0) keypair.getPublic().clearKey();
if ((key & EC_Consts.KEY_PRIVATE) != 0) keypair.getPrivate().clearKey();
- } catch (CryptoException ce) {
+ } catch (CardRuntimeException ce) {
sw = ce.getReason();
- } catch (Exception e) {
- sw = ISO7816.SW_UNKNOWN;
}
return sw;
}
@@ -61,10 +57,8 @@ public class ECKeyGenerator {
sw = ISO7816.SW_NO_ERROR;
try {
keypair.genKeyPair();
- } catch (CryptoException ce) {
+ } catch (CardRuntimeException ce) {
sw = ce.getReason();
- } catch (Exception e) {
- sw = ISO7816.SW_UNKNOWN;
}
return sw;
}
@@ -224,10 +218,8 @@ public class ECKeyGenerator {
default:
ISOException.throwIt(ISO7816.SW_FUNC_NOT_SUPPORTED);
}
- } catch (CryptoException ce) {
+ } catch (CardRuntimeException ce) {
sw = ce.getReason();
- } catch (Exception e) {
- sw = ISO7816.SW_UNKNOWN;
}
return sw;
}
@@ -338,10 +330,8 @@ public class ECKeyGenerator {
default:
ISOException.throwIt(ISO7816.SW_FUNC_NOT_SUPPORTED);
}
- } catch (CryptoException ce) {
+ } catch (CardRuntimeException ce) {
sw = ce.getReason();
- } catch (Exception e) {
- sw = ISO7816.SW_UNKNOWN;
}
return length;
}
@@ -406,10 +396,8 @@ public class ECKeyGenerator {
}
param = (short) (param << 1);
}
- } catch (CryptoException ce) {
+ } catch (CardRuntimeException ce) {
sw = ce.getReason();
- } catch (Exception e) {
- sw = ISO7816.SW_UNKNOWN;
}
return sw;
}
diff --git a/src/cz/crcs/ectester/applet/ECKeyTester.java b/src/cz/crcs/ectester/applet/ECKeyTester.java
index 61848b8..a00b47d 100644
--- a/src/cz/crcs/ectester/applet/ECKeyTester.java
+++ b/src/cz/crcs/ectester/applet/ECKeyTester.java
@@ -1,6 +1,7 @@
package cz.crcs.ectester.applet;
+import javacard.framework.CardRuntimeException;
import javacard.framework.ISO7816;
import javacard.security.*;
@@ -22,10 +23,8 @@ public class ECKeyTester {
sw = ISO7816.SW_NO_ERROR;
try {
ecdhKeyAgreement = KeyAgreement.getInstance(KeyAgreement.ALG_EC_SVDP_DH, false);
- } catch (CryptoException ce) {
+ } catch (CardRuntimeException ce) {
sw = ce.getReason();
- } catch (Exception e) {
- sw = ISO7816.SW_UNKNOWN;
}
return sw;
}
@@ -34,10 +33,8 @@ public class ECKeyTester {
sw = ISO7816.SW_NO_ERROR;
try {
ecdhcKeyAgreement = KeyAgreement.getInstance(KeyAgreement.ALG_EC_SVDP_DHC, false);
- } catch (CryptoException ce) {
+ } catch (CardRuntimeException ce) {
sw = ce.getReason();
- } catch (Exception e) {
- sw = ISO7816.SW_UNKNOWN;
}
return sw;
}
@@ -46,10 +43,8 @@ public class ECKeyTester {
sw = ISO7816.SW_NO_ERROR;
try {
ecdsaSignature = Signature.getInstance(Signature.ALG_ECDSA_SHA, false);
- } catch (CryptoException ce) {
+ } catch (CardRuntimeException ce) {
sw = ce.getReason();
- } catch (Exception e) {
- sw = ISO7816.SW_UNKNOWN;
}
return sw;
}
@@ -60,10 +55,8 @@ public class ECKeyTester {
try {
ka.init(privateKey);
length = ka.generateSecret(pubkeyBuffer, pubkeyOffset, pubkeyLength, outputBuffer, outputOffset);
- } catch (CryptoException ce) {
+ } catch (CardRuntimeException ce) {
sw = ce.getReason();
- } catch (Exception e) {
- sw = ISO7816.SW_UNKNOWN;
}
return length;
}
@@ -135,10 +128,8 @@ public class ECKeyTester {
if (!correct) {
sw = ECTesterApplet.SW_SIG_VERIFY_FAIL;
}
- } catch (CryptoException ce) {
+ } catch (CardRuntimeException ce) {
sw = ce.getReason();
- } catch (Exception e) {
- sw = ISO7816.SW_UNKNOWN;
}
return length;
}
diff --git a/src/cz/crcs/ectester/applet/ECTesterApplet.java b/src/cz/crcs/ectester/applet/ECTesterApplet.java
index cdb0fbd..4dafd21 100644
--- a/src/cz/crcs/ectester/applet/ECTesterApplet.java
+++ b/src/cz/crcs/ectester/applet/ECTesterApplet.java
@@ -51,6 +51,7 @@ public class ECTesterApplet extends Applet {
public static final byte INS_EXPORT = (byte) 0x5f;
public static final byte INS_ECDH = (byte) 0x60;
public static final byte INS_ECDSA = (byte) 0x61;
+ public static final byte INS_CLEANUP = (byte) 0x62;
// PARAMETERS for P1 and P2
public static final byte KEYPAIR_LOCAL = (byte) 0x01;
@@ -148,6 +149,9 @@ public class ECTesterApplet extends Applet {
case INS_ECDSA:
insECDSA(apdu);
break;
+ case INS_CLEANUP:
+ insCleanup(apdu);
+ break;
default:
// The INS code is not supported by the dispatcher
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
@@ -368,6 +372,18 @@ public class ECTesterApplet extends Applet {
}
/**
+ *
+ */
+ private void insCleanup(APDU apdu) {
+ apdu.setIncomingAndReceive();
+ byte[] apdubuf = apdu.getBuffer();
+
+ short len = cleanup(apdubuf, (short) 0);
+
+ apdu.setOutgoingAndSend((short) 0, len);
+ }
+
+ /**
* @param keyPair which keyPair to use, local/remote (KEYPAIR_* | ...)
* @param keyLength key length to set
* @param keyClass key class to allocate
@@ -556,4 +572,23 @@ public class ECTesterApplet extends Applet {
return length;
}
+
+ /**
+ *
+ * @param buffer
+ * @param offset
+ * @return
+ */
+ private short cleanup(byte[] buffer, short offset) {
+ short sw = ISO7816.SW_NO_ERROR;
+ try {
+ if (JCSystem.isObjectDeletionSupported())
+ JCSystem.requestObjectDeletion();
+ } catch (CardRuntimeException crex) {
+ sw = crex.getReason();
+ }
+
+ Util.setShort(buffer, offset, sw);
+ return 2;
+ }
}
diff --git a/src/cz/crcs/ectester/reader/ECTester.java b/src/cz/crcs/ectester/reader/ECTester.java
index cc8e0aa..9398a69 100644
--- a/src/cz/crcs/ectester/reader/ECTester.java
+++ b/src/cz/crcs/ectester/reader/ECTester.java
@@ -35,10 +35,7 @@ import org.apache.commons.cli.*;
import javax.smartcardio.CardException;
import java.io.*;
import java.nio.file.Files;
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
/**
* Reader part of ECTester, a tool for testing Elliptic curve support on javacards.
@@ -85,6 +82,7 @@ public class ECTester {
private boolean optSimulate = false;
//Action-related options
+ private String optTestCase;
private int optGenerateAmount;
private int optECDHCount;
private int optECDSACount;
@@ -162,7 +160,24 @@ public class ECTester {
for (Object opt : moex.getMissingOptions().toArray()) {
if (opt instanceof OptionGroup) {
for (Option o : ((OptionGroup) opt).getOptions()) {
- System.err.println(o);
+ System.err.print("-" + o.getOpt());
+
+ if (o.hasLongOpt()) {
+ System.err.print("\t/ --" + o.getLongOpt() + " ");
+ }
+
+ if (o.hasArg()) {
+ if (o.hasOptionalArg()) {
+ System.err.print("[" + o.getArgName() + "] ");
+ } else {
+ System.err.print("<" + o.getArgName() + "> ");
+ }
+ }
+
+ if (o.getDescription() != null) {
+ System.err.print("\t\t\t" + o.getDescription());
+ }
+ System.err.println();
}
} else if (opt instanceof String) {
System.err.println(opt);
@@ -192,34 +207,36 @@ public class ECTester {
* -h / --help
* -e / --export
* -g / --generate [amount]
- * -t / --test
- * -dh / --ecdh
- * -dsa / --ecdsa [data_file]
+ * -t / --test [test_case]
+ * -dh / --ecdh [count]
+ * -dsa / --ecdsa [count]
* -ln / --list-named
*
* Options:
- * -b / --bit-size [b] // -a / --all
+ * -b / --bit-size <b> // -a / --all
*
* -fp / --prime-field
* -f2m / --binary-field
*
* -u / --custom
- * -n / --named [cat/id]
- * -c / --curve [curve_file] field,a,b,gx,gy,r,k
+ * -nc / --named-curve <cat/id>
+ * -c / --curve <curve_file> field,a,b,gx,gy,r,k
*
- * -pub / --public [pubkey_file] wx,wy
- * -npub / --named-public [cat/id]
+ * -pub / --public <pubkey_file> wx,wy
+ * -npub / --named-public <cat/id>
*
- * -priv / --private [privkey_file] s
- * -npriv / --named-private [cat/id]
+ * -priv / --private <privkey_file> s
+ * -npriv / --named-private <cat/id>
*
- * -k / --key [key_file] wx,wy,s
- * -nk / --named-key [cat/id]
+ * -k / --key <key_file> wx,wy,s
+ * -nk / --named-key <cat/id>
*
* -v / --verbose
*
- * -i / --input [input_file]
- * -o / --output [output_file]
+ * -i / --input <input_file>
+ * -o / --output <output_file>
+ * -l / --log [log_file]
+ *
* -f / --fresh
* -s / --simulate
*/
@@ -229,7 +246,7 @@ public class ECTester {
actions.addOption(Option.builder("ln").longOpt("list-named").desc("Print the list of supported named curves and keys.").build());
actions.addOption(Option.builder("e").longOpt("export").desc("Export the defaut curve parameters of the card(if any).").build());
actions.addOption(Option.builder("g").longOpt("generate").desc("Generate [amount] of EC keys.").hasArg().argName("amount").optionalArg(true).build());
- actions.addOption(Option.builder("t").longOpt("test").desc("Test ECC support.").build());
+ actions.addOption(Option.builder("t").longOpt("test").desc("Test ECC support.").hasArg().argName("test_case").optionalArg(true).build());
actions.addOption(Option.builder("dh").longOpt("ecdh").desc("Do ECDH, [count] times.").hasArg().argName("count").optionalArg(true).build());
actions.addOption(Option.builder("dsa").longOpt("ecdsa").desc("Sign data with ECDSA, [count] times.").hasArg().argName("count").optionalArg(true).build());
opts.addOptionGroup(actions);
@@ -240,35 +257,35 @@ public class ECTester {
opts.addOptionGroup(size);
OptionGroup curve = new OptionGroup();
- curve.addOption(Option.builder("nc").longOpt("named-curve").desc("Use a named curve.").hasArg().argName("cat/id").build());
- curve.addOption(Option.builder("c").longOpt("curve").desc("Use curve from file [curve_file] (field,a,b,gx,gy,r,k).").hasArg().argName("curve_file").build());
- curve.addOption(Option.builder("u").longOpt("custom").desc("Use a custom curve(applet-side embedded, SECG curves).").build());
+ curve.addOption(Option.builder("nc").longOpt("named-curve").desc("Use a named curve, from CurveDB: <cat/id>").hasArg().argName("cat/id").build());
+ curve.addOption(Option.builder("c").longOpt("curve").desc("Use curve from file <curve_file> (field,a,b,gx,gy,r,k).").hasArg().argName("curve_file").build());
+ curve.addOption(Option.builder("u").longOpt("custom").desc("Use a custom curve (applet-side embedded, SECG curves).").build());
opts.addOptionGroup(curve);
opts.addOption(Option.builder("fp").longOpt("prime-field").desc("Use prime field curve.").build());
opts.addOption(Option.builder("f2m").longOpt("binary-field").desc("Use binary field curve.").build());
OptionGroup pub = new OptionGroup();
- pub.addOption(Option.builder("npub").longOpt("named-public").desc("Use public key from KeyDB: [cat/id]").hasArg().argName("cat/id").build());
- pub.addOption(Option.builder("pub").longOpt("public").desc("Use public key from file [pubkey_file] (wx,wy).").hasArg().argName("pubkey_file").build());
+ pub.addOption(Option.builder("npub").longOpt("named-public").desc("Use public key from KeyDB: <cat/id>").hasArg().argName("cat/id").build());
+ pub.addOption(Option.builder("pub").longOpt("public").desc("Use public key from file <pubkey_file> (wx,wy).").hasArg().argName("pubkey_file").build());
opts.addOptionGroup(pub);
OptionGroup priv = new OptionGroup();
- priv.addOption(Option.builder("npriv").longOpt("named-private").desc("Use private key from KeyDB: [cat/id]").hasArg().argName("cat/id").build());
- priv.addOption(Option.builder("priv").longOpt("private").desc("Use private key from file [privkey_file] (s).").hasArg().argName("privkey_file").build());
+ priv.addOption(Option.builder("npriv").longOpt("named-private").desc("Use private key from KeyDB: <cat/id>").hasArg().argName("cat/id").build());
+ priv.addOption(Option.builder("priv").longOpt("private").desc("Use private key from file <privkey_file> (s).").hasArg().argName("privkey_file").build());
opts.addOptionGroup(priv);
OptionGroup key = new OptionGroup();
- key.addOption(Option.builder("nk").longOpt("named-key").desc("Use keyPair from KeyDB: [cat/id]").hasArg().argName("cat/id").build());
- key.addOption(Option.builder("k").longOpt("key").desc("Use keyPair from file [key_file] (wx,wy,s).").hasArg().argName("key_file").build());
+ key.addOption(Option.builder("nk").longOpt("named-key").desc("Use keyPair from KeyDB: <cat/id>").hasArg().argName("cat/id").build());
+ key.addOption(Option.builder("k").longOpt("key").desc("Use keyPair from file <key_file> (wx,wy,s).").hasArg().argName("key_file").build());
opts.addOptionGroup(key);
- opts.addOption(Option.builder("i").longOpt("input").desc("Input from file [input_file], for ecdsa signing.").hasArg().argName("input_file").build());
- opts.addOption(Option.builder("o").longOpt("output").desc("Output into file [output_file].").hasArg().argName("output_file").build());
+ opts.addOption(Option.builder("i").longOpt("input").desc("Input from file <input_file>, for ECDSA signing.").hasArg().argName("input_file").build());
+ opts.addOption(Option.builder("o").longOpt("output").desc("Output into file <output_file>.").hasArg().argName("output_file").build());
opts.addOption(Option.builder("l").longOpt("log").desc("Log output into file [log_file].").hasArg().argName("log_file").optionalArg(true).build());
opts.addOption(Option.builder("v").longOpt("verbose").desc("Turn on verbose logging.").build());
- opts.addOption(Option.builder("f").longOpt("fresh").desc("Generate fresh keys(set domain parameters before every generation).").build());
+ opts.addOption(Option.builder("f").longOpt("fresh").desc("Generate fresh keys (set domain parameters before every generation).").build());
opts.addOption(Option.builder("s").longOpt("simulate").desc("Simulate a card with jcardsim instead of using a terminal.").build());
CommandLineParser parser = new DefaultParser();
@@ -383,6 +400,17 @@ public class ECTester {
optPrimeField = true;
}
+ optTestCase = cli.getOptionValue("test", "default");
+ List<String> tests = Arrays.asList("default", "non-prime", "invalid", "wrong");
+ if (!tests.contains(optTestCase)) {
+ System.err.print("Unknown test case. Should be one of: [");
+ for (String test : tests) {
+ System.err.print("\"" + test + "\",");
+ }
+ System.err.println("]");
+ return false;
+ }
+
} else if (cli.hasOption("ecdh")) {
if (optPrimeField == optBinaryField) {
System.err.print("Need to specify field with -fp or -f2m. (not both)");
@@ -401,7 +429,7 @@ public class ECTester {
} else if (cli.hasOption("ecdsa")) {
if (optPrimeField == optBinaryField) {
- System.err.print("Need to specify field with -fp or -f2m. (not both)");
+ System.err.print("Need to specify field with -fp or -f2m. (but not both)");
return false;
}
if (optAll) {
@@ -561,62 +589,73 @@ public class ECTester {
*/
private void test() throws IOException, CardException {
List<Command> commands = new LinkedList<>();
- if (optAll) {
- if (optNamedCurve != null) {
- Map<String, EC_Curve> curves = dataDB.getObjects(EC_Curve.class, optNamedCurve);
- if (optPrimeField) {
- for (Map.Entry<String, EC_Curve> entry : curves.entrySet()) {
- EC_Curve curve = entry.getValue();
- if (curve.getField() == KeyPair.ALG_EC_FP) {
- commands.add(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, curve.getBits(), KeyPair.ALG_EC_FP));
- byte[] external = curve.flatten();
- commands.add(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), external));
+
+ if (optTestCase.equalsIgnoreCase("default")) {
+ if (optAll) {
+ if (optNamedCurve != null) {
+ Map<String, EC_Curve> curves = dataDB.getObjects(EC_Curve.class, optNamedCurve);
+ if (optPrimeField) {
+ for (Map.Entry<String, EC_Curve> entry : curves.entrySet()) {
+ EC_Curve curve = entry.getValue();
+ if (curve.getField() == KeyPair.ALG_EC_FP) {
+ commands.add(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, curve.getBits(), KeyPair.ALG_EC_FP));
+ byte[] external = curve.flatten();
+ commands.add(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), external));
+ commands.addAll(testCurve());
+ }
+ }
+ }
+ if (optBinaryField) {
+ for (Map.Entry<String, EC_Curve> entry : curves.entrySet()) {
+ EC_Curve curve = entry.getValue();
+ if (curve.getField() == KeyPair.ALG_EC_F2M) {
+ commands.add(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, curve.getBits(), KeyPair.ALG_EC_F2M));
+ byte[] external = curve.flatten();
+ commands.add(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), external));
+ commands.addAll(testCurve());
+ }
+ }
+ }
+ } else {
+ if (optPrimeField) {
+ //iterate over prime curve sizes used: EC_Consts.FP_SIZES
+ for (short keyLength : EC_Consts.FP_SIZES) {
+ commands.add(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, keyLength, KeyPair.ALG_EC_FP));
+ commands.addAll(prepareCurve(ECTesterApplet.KEYPAIR_BOTH, keyLength, KeyPair.ALG_EC_FP));
commands.addAll(testCurve());
}
}
- }
- if (optBinaryField) {
- for (Map.Entry<String, EC_Curve> entry : curves.entrySet()) {
- EC_Curve curve = entry.getValue();
- if (curve.getField() == KeyPair.ALG_EC_F2M) {
- commands.add(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, curve.getBits(), KeyPair.ALG_EC_F2M));
- byte[] external = curve.flatten();
- commands.add(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), external));
+ if (optBinaryField) {
+ //iterate over binary curve sizes used: EC_Consts.F2M_SIZES
+ for (short keyLength : EC_Consts.F2M_SIZES) {
+ commands.add(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, keyLength, KeyPair.ALG_EC_F2M));
+ commands.addAll(prepareCurve(ECTesterApplet.KEYPAIR_BOTH, keyLength, KeyPair.ALG_EC_F2M));
commands.addAll(testCurve());
}
}
}
} else {
if (optPrimeField) {
- //iterate over prime curve sizes used: EC_Consts.FP_SIZES
- for (short keyLength : EC_Consts.FP_SIZES) {
- commands.add(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, keyLength, KeyPair.ALG_EC_FP));
- commands.addAll(prepareCurve(ECTesterApplet.KEYPAIR_BOTH, keyLength, KeyPair.ALG_EC_FP));
- commands.addAll(testCurve());
- }
+ commands.add(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, (short) optBits, KeyPair.ALG_EC_FP));
+ commands.addAll(prepareCurve(ECTesterApplet.KEYPAIR_BOTH, (short) optBits, KeyPair.ALG_EC_FP));
+ commands.addAll(testCurve());
}
+
if (optBinaryField) {
- //iterate over binary curve sizes used: EC_Consts.F2M_SIZES
- for (short keyLength : EC_Consts.F2M_SIZES) {
- commands.add(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, keyLength, KeyPair.ALG_EC_F2M));
- commands.addAll(prepareCurve(ECTesterApplet.KEYPAIR_BOTH, keyLength, KeyPair.ALG_EC_F2M));
- commands.addAll(testCurve());
- }
+ commands.add(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, (short) optBits, KeyPair.ALG_EC_F2M));
+ commands.addAll(prepareCurve(ECTesterApplet.KEYPAIR_BOTH, (short) optBits, KeyPair.ALG_EC_F2M));
+ commands.addAll(testCurve());
}
}
- } else {
- if (optPrimeField) {
- commands.add(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, (short) optBits, KeyPair.ALG_EC_FP));
- commands.addAll(prepareCurve(ECTesterApplet.KEYPAIR_BOTH, (short) optBits, KeyPair.ALG_EC_FP));
- commands.addAll(testCurve());
- }
+ } else if (optTestCase.equalsIgnoreCase("wrong")) {
+
+ } else if (optTestCase.equalsIgnoreCase("non-prime")) {
+
+ } else if (optTestCase.equalsIgnoreCase("invalid")) {
- if (optBinaryField) {
- commands.add(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, (short) optBits, KeyPair.ALG_EC_F2M));
- commands.addAll(prepareCurve(ECTesterApplet.KEYPAIR_BOTH, (short) optBits, KeyPair.ALG_EC_F2M));
- commands.addAll(testCurve());
- }
}
+
+
List<Response> test = Command.sendAll(commands);
systemOutLogger.println(Response.toString(test));
}
diff --git a/src/cz/crcs/ectester/reader/Response.java b/src/cz/crcs/ectester/reader/Response.java
index 21e80d7..7cc85bf 100644
--- a/src/cz/crcs/ectester/reader/Response.java
+++ b/src/cz/crcs/ectester/reader/Response.java
@@ -125,9 +125,9 @@ public abstract class Response {
String message = r.toString();
String suffix;
if (r.getNumSW() == 1) {
- suffix = String.format("%s", Util.getPrintError(r.getSW1()));
+ suffix = String.format("%s", Util.getSWString(r.getSW1()));
} else {
- suffix = String.format("%s %s", Util.getPrintError(r.getSW1()), Util.getPrintError(r.getSW2()));
+ suffix = String.format("%s %s", Util.getSWString(r.getSW1()), Util.getSWString(r.getSW2()));
}
out.append(String.format("%-58s:%4d ms : %s", message, r.time / 1000000, suffix));
if (i < responses.size() - 1) {
diff --git a/src/cz/crcs/ectester/reader/Util.java b/src/cz/crcs/ectester/reader/Util.java
index 91a34d7..489de44 100644
--- a/src/cz/crcs/ectester/reader/Util.java
+++ b/src/cz/crcs/ectester/reader/Util.java
@@ -103,32 +103,101 @@ public class Util {
return out;
}
- public static String getPrintError(short code) {
- if (code == ISO7816.SW_NO_ERROR) {
+ public static String getSWString(short sw) {
+ if (sw == ISO7816.SW_NO_ERROR) {
return "OK\t(0x9000)";
} else {
- String codeStr = "unknown";
- switch (code) {
+ 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 = "FILE_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:
- codeStr = "ILLEGAL_VALUE";
+ str = "ILLEGAL_VALUE";
break;
case CryptoException.UNINITIALIZED_KEY:
- codeStr = "UNINITIALIZED_KEY";
+ str = "UNINITIALIZED_KEY";
break;
case CryptoException.NO_SUCH_ALGORITHM:
- codeStr = "NO_SUCH_ALG";
+ str = "NO_SUCH_ALG";
break;
case CryptoException.INVALID_INIT:
- codeStr = "INVALID_INIT";
+ str = "INVALID_INIT";
break;
case CryptoException.ILLEGAL_USE:
- codeStr = "ILLEGAL_USE";
+ str = "ILLEGAL_USE";
break;
case ECTesterApplet.SW_SIG_VERIFY_FAIL:
- codeStr = "SIG_VERIFY_FAIL";
+ str = "SIG_VERIFY_FAIL";
+ break;
+ default:
+ str = "unknown";
break;
}
- return String.format("fail\t(%s,\t0x%04x)", codeStr, code);
+ return String.format("fail\t(%s,\t0x%04x)", str, sw);
}
}