summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJ08nY2017-03-07 23:34:57 +0100
committerJ08nY2017-03-07 23:34:57 +0100
commit197434b2bb2882277b21044331d0a2b64bc314c8 (patch)
treeff44376bd4a3ec5130ca25f8ef30381b8bf43f02
parentb95ad7ba757be3d6405a548670f2f49e63bce92a (diff)
downloadECTester-197434b2bb2882277b21044331d0a2b64bc314c8.tar.gz
ECTester-197434b2bb2882277b21044331d0a2b64bc314c8.tar.zst
ECTester-197434b2bb2882277b21044331d0a2b64bc314c8.zip
-rw-r--r--dist/ECTester.jarbin207773 -> 208535 bytes
-rw-r--r--src/cz/crcs/ectester/reader/ECTester.java139
-rw-r--r--src/cz/crcs/ectester/reader/Response.java2
3 files changed, 93 insertions, 48 deletions
diff --git a/dist/ECTester.jar b/dist/ECTester.jar
index 2c2e665..0f2e8c6 100644
--- a/dist/ECTester.jar
+++ b/dist/ECTester.jar
Binary files differ
diff --git a/src/cz/crcs/ectester/reader/ECTester.java b/src/cz/crcs/ectester/reader/ECTester.java
index 6ccbbbe..d94279e 100644
--- a/src/cz/crcs/ectester/reader/ECTester.java
+++ b/src/cz/crcs/ectester/reader/ECTester.java
@@ -72,13 +72,17 @@ public class ECTester {
private String optKey = null;
private String optLog = null;
+
+ private String optInput;
private String optOutput = null;
private boolean optFresh = false;
private boolean optSimulate = false;
//Action-related options
private int optGenerateAmount;
- private String optECDSASign;
+ private int optECDHCount;
+ private int optECDSACount;
+
private Options opts = new Options();
private static final String CLI_HEADER = "\nECTester, a javacard Elliptic Curve Cryptograhy support tester/utility.\n\n";
@@ -220,8 +224,8 @@ public class ECTester {
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("dh").longOpt("ecdh").desc("Do ECDH.").build());
- actions.addOption(Option.builder("dsa").longOpt("ecdsa").desc("Sign data with ECDSA.").hasArg().argName("data_file").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);
OptionGroup size = new OptionGroup();
@@ -253,6 +257,7 @@ public class ECTester {
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("l").longOpt("log").desc("Log output into file [log_file].").hasArg().argName("log_file").optionalArg(true).build());
@@ -290,6 +295,7 @@ public class ECTester {
if (cli.hasOption("log")) {
optLog = cli.getOptionValue("log", String.format("ECTESTER_log_%d.log", System.currentTimeMillis() / 1000));
}
+ optInput = cli.getOptionValue("input");
optOutput = cli.getOptionValue("output");
optFresh = cli.hasOption("fresh");
optSimulate = cli.hasOption("simulate");
@@ -373,6 +379,12 @@ public class ECTester {
return false;
}
+ optECDHCount = Integer.parseInt(cli.getOptionValue("ecdh", "1"));
+ if (optECDHCount <= 0) {
+ System.err.println("ECDH count cannot be <= 0.");
+ return false;
+ }
+
} else if (cli.hasOption("ecdsa")) {
if (optPrimeField == optBinaryField) {
System.err.print("Need to specify field with -fp or -f2m. (not both)");
@@ -391,7 +403,11 @@ public class ECTester {
return false;
}
- optECDSASign = cli.getOptionValue("ecdsa");
+ optECDSACount = Integer.parseInt(cli.getOptionValue("ecdsa", "1"));
+ if (optECDSACount <= 0) {
+ System.err.println("ECDSA count cannot be <= 0.");
+ return false;
+ }
}
return true;
@@ -507,7 +523,7 @@ public class ECTester {
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(), EC_Consts.PARAMETERS_NONE, EC_Consts.CORRUPTION_NONE, external));
- commands.addAll(testCurve(curve.getBits(), KeyPair.ALG_EC_FP));
+ commands.addAll(testCurve());
}
}
}
@@ -518,7 +534,7 @@ public class ECTester {
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(), EC_Consts.PARAMETERS_NONE, EC_Consts.CORRUPTION_NONE, external));
- commands.addAll(testCurve(curve.getBits(), KeyPair.ALG_EC_F2M));
+ commands.addAll(testCurve());
}
}
}
@@ -528,7 +544,7 @@ public class ECTester {
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(keyLength, KeyPair.ALG_EC_FP));
+ commands.addAll(testCurve());
}
}
if (optBinaryField) {
@@ -536,7 +552,7 @@ public class ECTester {
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(keyLength, KeyPair.ALG_EC_F2M));
+ commands.addAll(testCurve());
}
}
}
@@ -544,13 +560,13 @@ public class ECTester {
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((short) optBits, KeyPair.ALG_EC_FP));
+ commands.addAll(testCurve());
}
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((short) optBits, KeyPair.ALG_EC_F2M));
+ commands.addAll(testCurve());
}
}
List<Response> test = Command.sendAll(commands);
@@ -565,29 +581,45 @@ public class ECTester {
*/
private void ecdh() throws IOException, CardException {
byte keyClass = optPrimeField ? KeyPair.ALG_EC_FP : KeyPair.ALG_EC_F2M;
- List<Response> ecdh = new LinkedList<>();
- ecdh.add(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, (short) optBits, keyClass).send());
- ecdh.addAll(Command.sendAll(prepareCurve(ECTesterApplet.KEYPAIR_BOTH, (short) optBits, keyClass)));
+ List<Response> prepare = new LinkedList<>();
+ prepare.add(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, (short) optBits, keyClass).send());
+ prepare.addAll(Command.sendAll(prepareCurve(ECTesterApplet.KEYPAIR_BOTH, (short) optBits, keyClass)));
+
+ systemOutLogger.println(Response.toString(prepare));
+ List<Command> generate = new LinkedList<>();
if (optPublic != null || optPrivate != null || optKey != null) {
- ecdh.add(new Command.Generate(cardManager, ECTesterApplet.KEYPAIR_LOCAL).send());
- ecdh.add(prepareKey(ECTesterApplet.KEYPAIR_REMOTE).send());
+ generate.add(new Command.Generate(cardManager, ECTesterApplet.KEYPAIR_LOCAL));
+ generate.add(prepareKey(ECTesterApplet.KEYPAIR_REMOTE));
} else {
- ecdh.add(new Command.Generate(cardManager, ECTesterApplet.KEYPAIR_BOTH).send());
+ generate.add(new Command.Generate(cardManager, ECTesterApplet.KEYPAIR_BOTH));
}
- Response.ECDH perform = new Command.ECDH(cardManager, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.EXPORT_TRUE, (byte) 0).send();
- ecdh.add(perform);
- systemOutLogger.println(Response.toString(ecdh));
+ int retry = 0;
+ int done = 0;
+ while (done < optECDHCount) {
+ List<Response> ecdh = Command.sendAll(generate);
+
+ Response.ECDH perform = new Command.ECDH(cardManager, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.EXPORT_TRUE, (byte) 0).send();
+ ecdh.add(perform);
+ systemOutLogger.println(Response.toString(ecdh));
+
+ if (!perform.successful() || !perform.hasSecret()) {
+ if (retry < 10) {
+ retry++;
+ continue;
+ } else {
+ System.err.println("Couldn't obtain ECDH secret from card response.");
+ break;
+ }
+ }
- if (!perform.hasSecret()) {
- System.err.println("Couldn't obtain ECDH secret from card response.");
- } else {
if (optOutput != null) {
FileWriter out = new FileWriter(optOutput);
out.write(Util.bytesToHex(perform.getSecret(), false));
out.close();
}
+ ++done;
}
}
@@ -598,42 +630,57 @@ public class ECTester {
* @throws IOException if an IO error occurs when writing to key file.
*/
private void ecdsa() throws CardException, IOException {
- byte keyClass = optPrimeField ? KeyPair.ALG_EC_FP : KeyPair.ALG_EC_F2M;
- List<Response> ecdsa = new LinkedList<>();
- ecdsa.add(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_LOCAL, (short) optBits, keyClass).send());
- ecdsa.addAll(Command.sendAll(prepareCurve(ECTesterApplet.KEYPAIR_LOCAL, (short) optBits, keyClass)));
-
- Response keys;
- if (optKey != null || (optPublic != null && optPrivate != null)) {
- keys = prepareKey(ECTesterApplet.KEYPAIR_LOCAL).send();
- } else {
- keys = new Command.Generate(cardManager, ECTesterApplet.KEYPAIR_LOCAL).send();
- }
- ecdsa.add(keys);
-
//read file, if asked to sign
byte[] data = null;
- if (optECDSASign != null) {
- File in = new File(optECDSASign);
+ if (optInput != null) {
+ File in = new File(optInput);
long len = in.length();
if (len == 0) {
- throw new FileNotFoundException("File " + optECDSASign + " not found.");
+ throw new FileNotFoundException(optInput);
}
data = Files.readAllBytes(in.toPath());
}
- Response.ECDSA perform = new Command.ECDSA(cardManager, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_TRUE, data).send();
- ecdsa.add(perform);
- systemOutLogger.println(Response.toString(ecdsa));
-
- if (!perform.hasSignature()) {
- System.err.println("Couldn't obtain ECDSA signature from card response.");
+ Command generate;
+ if (optKey != null || (optPublic != null && optPrivate != null)) {
+ generate = prepareKey(ECTesterApplet.KEYPAIR_LOCAL);
} else {
+ generate = new Command.Generate(cardManager, ECTesterApplet.KEYPAIR_LOCAL);
+ }
+
+ byte keyClass = optPrimeField ? KeyPair.ALG_EC_FP : KeyPair.ALG_EC_F2M;
+ List<Response> prepare = new LinkedList<>();
+ prepare.add(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_LOCAL, (short) optBits, keyClass).send());
+ prepare.addAll(Command.sendAll(prepareCurve(ECTesterApplet.KEYPAIR_LOCAL, (short) optBits, keyClass)));
+
+ systemOutLogger.println(Response.toString(prepare));
+
+ int retry = 0;
+ int done = 0;
+ while (done < optECDSACount) {
+ List<Response> ecdsa = new LinkedList<>();
+ ecdsa.add(generate.send());
+
+ Response.ECDSA perform = new Command.ECDSA(cardManager, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_TRUE, data).send();
+ ecdsa.add(perform);
+ systemOutLogger.println(Response.toString(ecdsa));
+
+ if (!perform.successful() || !perform.hasSignature()) {
+ if (retry < 10) {
+ retry++;
+ continue;
+ } else {
+ System.err.println("Couldn't obtain ECDSA signature from card response.");
+ break;
+ }
+ }
+
if (optOutput != null) {
FileWriter out = new FileWriter(optOutput);
out.write(Util.bytesToHex(perform.getSignature(), false));
out.close();
}
+ ++done;
}
}
@@ -758,12 +805,10 @@ public class ECTester {
}
/**
- * @param keyLength
- * @param keyClass
* @return
* @throws IOException
*/
- private List<Command> testCurve(short keyLength, byte keyClass) throws IOException {
+ private List<Command> testCurve() throws IOException {
List<Command> commands = new LinkedList<>();
commands.add(new Command.Generate(cardManager, ECTesterApplet.KEYPAIR_BOTH));
commands.add(new Command.ECDH(cardManager, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.EXPORT_FALSE, (byte) 0));
diff --git a/src/cz/crcs/ectester/reader/Response.java b/src/cz/crcs/ectester/reader/Response.java
index d1925b8..cdf82fc 100644
--- a/src/cz/crcs/ectester/reader/Response.java
+++ b/src/cz/crcs/ectester/reader/Response.java
@@ -127,7 +127,7 @@ public abstract class Response {
} else {
suffix = String.format("%s %s", Util.getPrintError(r.getSW1()), Util.getPrintError(r.getSW2()));
}
- out.append(String.format("%-55s: %s\n", message, suffix));
+ out.append(String.format("%-55s: %5d ms : %s\n", message, r.time/1000000, suffix));
}
return out.toString();
}