diff options
| author | J08nY | 2017-03-17 17:03:03 +0100 |
|---|---|---|
| committer | J08nY | 2017-03-17 17:03:03 +0100 |
| commit | ac63cf8f8f7fd1c85b1a7802144c6a79c516a413 (patch) | |
| tree | da76f293f490a9f827c2d87ae6c8e48e281e3e45 /src | |
| parent | 80b008850c961911ca9763947ebb6066f5288fff (diff) | |
| download | ECTester-ac63cf8f8f7fd1c85b1a7802144c6a79c516a413.tar.gz ECTester-ac63cf8f8f7fd1c85b1a7802144c6a79c516a413.tar.zst ECTester-ac63cf8f8f7fd1c85b1a7802144c6a79c516a413.zip | |
Diffstat (limited to 'src')
| -rw-r--r-- | src/cz/crcs/ectester/applet/ECKeyGenerator.java | 26 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/applet/ECKeyTester.java | 21 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/applet/ECTesterApplet.java | 35 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/reader/ECTester.java | 187 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/reader/Response.java | 4 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/reader/Util.java | 91 |
6 files changed, 243 insertions, 121 deletions
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); } } |
