aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJ08nY2017-11-18 15:16:05 +0100
committerJ08nY2017-11-18 15:16:05 +0100
commitfa6cea35cb6899f802d24951bf5e12639a251eb6 (patch)
treeeae7fb39773ccf3bd620d6645bb9d99cc3f5f836 /src
parent9da5f6ee8db4138b13af6d1d7bef279ed107288d (diff)
downloadECTester-fa6cea35cb6899f802d24951bf5e12639a251eb6.tar.gz
ECTester-fa6cea35cb6899f802d24951bf5e12639a251eb6.tar.zst
ECTester-fa6cea35cb6899f802d24951bf5e12639a251eb6.zip
Diffstat (limited to 'src')
-rw-r--r--src/cz/crcs/ectester/common/cli/Argument.java29
-rw-r--r--src/cz/crcs/ectester/common/cli/CLITools.java52
-rw-r--r--src/cz/crcs/ectester/common/cli/TreeCommandLine.java23
-rw-r--r--src/cz/crcs/ectester/common/cli/TreeParser.java20
-rw-r--r--src/cz/crcs/ectester/standalone/ECTesterStandalone.java127
5 files changed, 184 insertions, 67 deletions
diff --git a/src/cz/crcs/ectester/common/cli/Argument.java b/src/cz/crcs/ectester/common/cli/Argument.java
new file mode 100644
index 0000000..e9b6688
--- /dev/null
+++ b/src/cz/crcs/ectester/common/cli/Argument.java
@@ -0,0 +1,29 @@
+package cz.crcs.ectester.common.cli;
+
+/**
+ * @author Jan Jancar johny@neuromancer.sk
+ */
+public class Argument {
+ private String name;
+ private String desc;
+ private boolean required;
+
+ public Argument(String name, String desc, boolean isRequired) {
+ this.name = name;
+ this.desc = desc;
+ this.required = isRequired;
+ }
+
+
+ public String getName() {
+ return name;
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+
+ public boolean isRequired() {
+ return required;
+ }
+}
diff --git a/src/cz/crcs/ectester/common/cli/CLITools.java b/src/cz/crcs/ectester/common/cli/CLITools.java
index 1b73207..77b3794 100644
--- a/src/cz/crcs/ectester/common/cli/CLITools.java
+++ b/src/cz/crcs/ectester/common/cli/CLITools.java
@@ -25,14 +25,20 @@ public class CLITools {
help.printHelp(prog, header, options, footer, usage);
}
- private static void help(HelpFormatter help, PrintWriter pw, CommandLineParser cli, int depth) {
+ private static void help(HelpFormatter help, PrintWriter pw, CommandLineParser cli, Options opts, int depth) {
+ if (opts.getOptions().size() > 0) {
+ help.printOptions(pw, HelpFormatter.DEFAULT_WIDTH, opts, HelpFormatter.DEFAULT_LEFT_PAD + depth, HelpFormatter.DEFAULT_DESC_PAD);
+ }
if (cli instanceof TreeParser) {
TreeParser tp = (TreeParser) cli;
+ for (Argument arg : tp.getArgs()) {
+ String argname = arg.isRequired() ? "<" + arg.getName() + ">" : "[" + arg.getName() + "]";
+ help.printWrapped(pw, HelpFormatter.DEFAULT_WIDTH, String.format("%" + (depth + 1) + "s" + argname + " " + arg.getDesc(), " "));
+ }
tp.getParsers().forEach((key, value) -> {
- help.printWrapped(pw, HelpFormatter.DEFAULT_WIDTH, String.format("%" + String.valueOf(depth) + "s" + key + ":", " "));
- help.printOptions(pw, HelpFormatter.DEFAULT_WIDTH, value.getOptions(), HelpFormatter.DEFAULT_LEFT_PAD + depth, HelpFormatter.DEFAULT_DESC_PAD);
pw.println();
- CLITools.help(help, pw, value.getParser(), depth + 1);
+ help.printWrapped(pw, HelpFormatter.DEFAULT_WIDTH, String.format("%" + depth + "s" + key + ":", " "));
+ CLITools.help(help, pw, value.getParser(), value.getOptions(), depth + 1);
});
}
}
@@ -41,22 +47,37 @@ public class CLITools {
StringWriter sw = new StringWriter();
PrintWriter upw = new PrintWriter(sw);
help.printUsage(upw, HelpFormatter.DEFAULT_WIDTH, "", opts);
- upw.print(" ");
if (cli instanceof TreeParser) {
+ upw.print(" ");
TreeParser tp = (TreeParser) cli;
- if (!tp.isRequired()) {
+ String[] keys = tp.getParsers().keySet().toArray(new String[tp.getParsers().size()]);
+ if (keys.length > 0 && !tp.isRequired()) {
upw.print("[ ");
}
- tp.getParsers().forEach((key, value) -> {
- upw.print("( " + key + " ");
+
+ for (int i = 0; i < keys.length; ++i) {
+ String key = keys[i];
+ ParserOptions value = tp.getParsers().get(key);
+ upw.print("(" + key);
usage(help, upw, value.getParser(), value.getOptions());
upw.print(")");
- });
- if (!tp.isRequired()) {
+ if (i != keys.length - 1) {
+ upw.print(" | ");
+ }
+ }
+ Argument[] args = tp.getArgs().toArray(new Argument[tp.getArgs().size()]);
+ String[] argss = new String[tp.getArgs().size()];
+ for (int i = 0; i < args.length; ++i) {
+ Argument arg = args[i];
+ argss[i] = arg.isRequired() ? "<" + arg.getName() + ">" : "[" + arg.getName() + "]";
+ }
+ upw.print(String.join(" ", argss));
+
+ if (keys.length > 0 && !tp.isRequired()) {
upw.print(" ]");
}
}
- pw.println(sw.toString().substring(8).replace("\n", ""));
+ pw.println(sw.toString().replaceAll("usage:( )?", "").replace("\n", ""));
}
/**
@@ -67,18 +88,17 @@ public class CLITools {
help.setOptionComparator(null);
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
+ help.printWrapped(pw, HelpFormatter.DEFAULT_WIDTH, header);
if (printUsage) {
StringWriter uw = new StringWriter();
PrintWriter upw = new PrintWriter(uw);
usage(help, upw, baseParser, baseOpts);
- pw.print(prog + " usage: ");
+ pw.print("usage: " + prog);
help.printWrapped(pw, HelpFormatter.DEFAULT_WIDTH, uw.toString());
upw.close();
+ pw.println();
}
- help.printWrapped(pw, HelpFormatter.DEFAULT_WIDTH, header);
- help.printOptions(pw, HelpFormatter.DEFAULT_WIDTH, baseOpts, HelpFormatter.DEFAULT_LEFT_PAD, HelpFormatter.DEFAULT_DESC_PAD);
- pw.println();
- help(help, pw, baseParser, 1);
+ help(help, pw, baseParser, baseOpts, 1);
help.printWrapped(pw, HelpFormatter.DEFAULT_WIDTH, footer);
System.out.println(sw.toString());
}
diff --git a/src/cz/crcs/ectester/common/cli/TreeCommandLine.java b/src/cz/crcs/ectester/common/cli/TreeCommandLine.java
index ef6079e..e0927fa 100644
--- a/src/cz/crcs/ectester/common/cli/TreeCommandLine.java
+++ b/src/cz/crcs/ectester/common/cli/TreeCommandLine.java
@@ -5,6 +5,8 @@ import org.apache.commons.cli.Option;
import org.apache.commons.cli.ParseException;
import java.util.Iterator;
+import java.util.List;
+import java.util.Objects;
import java.util.Properties;
import java.util.function.BiFunction;
@@ -45,6 +47,10 @@ public class TreeCommandLine extends CommandLine {
return next;
}
+ public boolean isNext(String next) {
+ return Objects.equals(getNextName(), next);
+ }
+
public CommandLine getThis() {
return cli;
}
@@ -131,4 +137,21 @@ public class TreeCommandLine extends CommandLine {
public Option[] getOptions() {
return cli.getOptions();
}
+
+ public String getArg(int index) {
+ if (index < 0 || index >= cli.getArgs().length) {
+ return null;
+ }
+ return cli.getArgs()[index];
+ }
+
+ @Override
+ public String[] getArgs() {
+ return cli.getArgs();
+ }
+
+ @Override
+ public List<String> getArgList() {
+ return cli.getArgList();
+ }
}
diff --git a/src/cz/crcs/ectester/common/cli/TreeParser.java b/src/cz/crcs/ectester/common/cli/TreeParser.java
index 8e7edb4..9b197a5 100644
--- a/src/cz/crcs/ectester/common/cli/TreeParser.java
+++ b/src/cz/crcs/ectester/common/cli/TreeParser.java
@@ -10,12 +10,18 @@ import java.util.*;
public class TreeParser implements CommandLineParser {
private Map<String, ParserOptions> parsers;
private boolean required;
+ private List<Argument> args = Collections.emptyList();
public TreeParser(Map<String, ParserOptions> parsers, boolean required) {
this.parsers = parsers;
this.required = required;
}
+ public TreeParser(Map<String, ParserOptions> parsers, boolean required, List<Argument> args) {
+ this(parsers, required);
+ this.args = args;
+ }
+
public Map<String, ParserOptions> getParsers() {
return Collections.unmodifiableMap(parsers);
}
@@ -24,21 +30,25 @@ public class TreeParser implements CommandLineParser {
return required;
}
+ public List<Argument> getArgs() {
+ return Collections.unmodifiableList(args);
+ }
+
@Override
- public CommandLine parse(Options options, String[] arguments) throws ParseException {
+ public TreeCommandLine parse(Options options, String[] arguments) throws ParseException {
return this.parse(options, arguments, null);
}
- public CommandLine parse(Options options, String[] arguments, Properties properties) throws ParseException {
+ public TreeCommandLine parse(Options options, String[] arguments, Properties properties) throws ParseException {
return this.parse(options, arguments, properties, false);
}
@Override
- public CommandLine parse(Options options, String[] arguments, boolean stopAtNonOption) throws ParseException {
+ public TreeCommandLine parse(Options options, String[] arguments, boolean stopAtNonOption) throws ParseException {
return this.parse(options, arguments, null, stopAtNonOption);
}
- public CommandLine parse(Options options, String[] arguments, Properties properties, boolean stopAtNonOption) throws ParseException {
+ public TreeCommandLine parse(Options options, String[] arguments, Properties properties, boolean stopAtNonOption) throws ParseException {
DefaultParser thisParser = new DefaultParser();
CommandLine cli = thisParser.parse(options, arguments, properties, true);
@@ -67,7 +77,7 @@ public class TreeParser implements CommandLineParser {
System.arraycopy(args, 1, remainingArgs, 0, args.length - 1);
subCli = subparser.getParser().parse(subparser.getOptions(), remainingArgs, true);
} else if (matches.size() > 1) {
- throw new UnrecognizedOptionException("Ambiguous option: " + sub + ", couldn't match. Partially matches: " + String.join(",", matches.toArray(new String[0])) + ".", sub);
+ throw new AmbiguousOptionException(sub, matches);
}
} else {
if (required) {
diff --git a/src/cz/crcs/ectester/standalone/ECTesterStandalone.java b/src/cz/crcs/ectester/standalone/ECTesterStandalone.java
index 99253cc..3736e12 100644
--- a/src/cz/crcs/ectester/standalone/ECTesterStandalone.java
+++ b/src/cz/crcs/ectester/standalone/ECTesterStandalone.java
@@ -1,6 +1,6 @@
package cz.crcs.ectester.standalone;
-import cz.crcs.ectester.common.cli.CLITools;
+import cz.crcs.ectester.common.cli.*;
import cz.crcs.ectester.common.test.Result;
import cz.crcs.ectester.data.EC_Store;
import cz.crcs.ectester.standalone.consts.KeyPairGeneratorIdent;
@@ -8,13 +8,17 @@ import cz.crcs.ectester.standalone.libs.BouncyCastleLib;
import cz.crcs.ectester.standalone.libs.ECLibrary;
import cz.crcs.ectester.standalone.libs.JavaECLibrary;
import cz.crcs.ectester.standalone.libs.SunECLib;
-import org.apache.commons.cli.*;
+import cz.crcs.ectester.standalone.test.KeyGenerationTest;
+import cz.crcs.ectester.standalone.test.KeyGenerationTestable;
+import org.apache.commons.cli.DefaultParser;
+import org.apache.commons.cli.Option;
+import org.apache.commons.cli.Options;
+import org.apache.commons.cli.ParseException;
import java.io.IOException;
-import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
-import java.util.Arrays;
+import java.util.*;
/**
* Standalone part of ECTester, a tool for testing Elliptic curve implementations in software libraries.
@@ -29,6 +33,7 @@ public class ECTesterStandalone {
private Config cfg;
private Options opts = new Options();
+ private TreeParser optParser;
private static final String VERSION = "v0.1.0";
private static final String DESCRIPTION = "ECTesterStandalone " + VERSION + ", an Elliptic Curve Cryptography support tester/utility.";
private static final String LICENSE = "MIT Licensed\nCopyright (c) 2016-2017 Petr Svenda <petr@svenda.com>";
@@ -37,10 +42,10 @@ public class ECTesterStandalone {
private void run(String[] args) {
try {
- CommandLine cli = parseArgs(args);
+ TreeCommandLine cli = parseArgs(args);
if (cli.hasOption("help")) {
- CLITools.help("ECTesterStandalone.jar", CLI_HEADER, opts, CLI_FOOTER, true);
+ CLITools.help("ECTesterStandalone.jar", CLI_HEADER, opts, optParser, CLI_FOOTER, true);
return;
} else if (cli.hasOption("version")) {
CLITools.version(DESCRIPTION, LICENSE);
@@ -56,30 +61,23 @@ public class ECTesterStandalone {
}
for (ECLibrary lib : libs) {
- if (lib instanceof JavaECLibrary) {
- JavaECLibrary jlib = (JavaECLibrary) lib;
- lib.initialize();
- lib.getECKAs();
- lib.getECSigs();
- for (KeyPairGeneratorIdent ident : lib.getKPGs()) {
- try {
- KeyPairGenerator kpg = ident.getInstance(jlib.getProvider());
- kpg.initialize(192);
- KeyPair kp = kpg.genKeyPair();
- System.out.println(kp);
- } catch (NoSuchAlgorithmException e) {
- e.printStackTrace();
- }
- }
- }
-
+ lib.initialize();
}
- System.out.println(Arrays.toString(libs));
- if (cli.hasOption("generate")) {
- generate();
- } else if (cli.hasOption("list-libs")) {
+ if (cli.isNext("list-libs")) {
listLibraries();
+ } else if (cli.isNext("list-data")) {
+ CLITools.listNamed(dataStore, cli.getNext().getArg(0));
+ } else if (cli.isNext("ecdh")) {
+
+ } else if (cli.isNext("ecdsa")) {
+
+ } else if (cli.isNext("generate")) {
+ generate();
+ } else if (cli.isNext("test")) {
+
+ } else if (cli.isNext("export")) {
+
}
} catch (ParseException | IOException ex) {
@@ -87,32 +85,69 @@ public class ECTesterStandalone {
}
}
- private CommandLine parseArgs(String[] args) throws ParseException {
- OptionGroup actions = new OptionGroup();
- actions.setRequired(true);
- actions.addOption(Option.builder("V").longOpt("version").desc("Print version info.").build());
- actions.addOption(Option.builder("h").longOpt("help").desc("Print help.").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. [test_suite]:\n- default:\n- invalid:\n- wrong:\n- composite:\n- test-vectors:").hasArg().argName("test_suite").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("dhc").longOpt("ecdhc").desc("Do ECDHC, [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());
- actions.addOption(Option.builder("ln").longOpt("list-named").desc("Print the list of supported named curves and keys.").hasArg().argName("what").optionalArg(true).build());
- actions.addOption(Option.builder("ls").longOpt("list-libs").desc("List supported libraries.").build());
- opts.addOptionGroup(actions);
+ private TreeCommandLine parseArgs(String[] args) throws ParseException {
+ Map<String, ParserOptions> actions = new TreeMap<>();
+
+ Options testOpts = new Options();
+ ParserOptions test = new ParserOptions(new DefaultParser(), testOpts);
+ actions.put("test", test);
+
+ Options ecdhOpts = new Options();
+ ecdhOpts.addOption(Option.builder("t").longOpt("type").desc("Set KeyAgreement object [type].").hasArg().argName("type").optionalArg(false).build());
+ ParserOptions ecdh = new ParserOptions(new DefaultParser(), ecdhOpts);
+ actions.put("ecdh", ecdh);
+
+ Options ecdsaOpts = new Options();
+ ecdsaOpts.addOption(Option.builder("t").longOpt("type").desc("Set Signature object [type].").hasArg().argName("type").optionalArg(false).build());
+ ParserOptions ecdsa = new ParserOptions(new DefaultParser(), ecdsaOpts);
+ actions.put("ecdsa", ecdsa);
- CommandLineParser parser = new DefaultParser();
- return parser.parse(opts, args);
+ Options generateOpts = new Options();
+ generateOpts.addOption(Option.builder("n").longOpt("amount").hasArg().argName("amount").optionalArg(false).desc("Generate [amount] of EC keys.").build());
+ ParserOptions generate = new ParserOptions(new DefaultParser(), generateOpts);
+ actions.put("generate", generate);
+
+ Options exportOpts = new Options();
+ ParserOptions export = new ParserOptions(new DefaultParser(), exportOpts);
+ actions.put("export", export);
+
+ Options listDataOpts = new Options();
+ List<Argument> listDataArgs = new LinkedList<>();
+ listDataArgs.add(new Argument("what", "what to list.", false));
+ ParserOptions listData = new ParserOptions(new TreeParser(Collections.emptyMap(), false, listDataArgs), listDataOpts);
+ actions.put("list-data", listData);
+
+ Options listLibsOpts = new Options();
+ ParserOptions listLibs = new ParserOptions(new DefaultParser(), listLibsOpts);
+ actions.put("list-libs", listLibs);
+
+ optParser = new TreeParser(actions, false);
+
+ opts.addOption(Option.builder("V").longOpt("version").desc("Print version info.").build());
+ opts.addOption(Option.builder("h").longOpt("help").desc("Print help.").build());
+
+ return optParser.parse(opts, args);
}
/**
*
*/
private void generate() {
- EC_Curve curve = dataStore.getObject(EC_Curve.class, "secg/secp192r1");
- byte[] fp = curve.getParam(EC_Consts.PARAMETER_FP)[0];
-
+ for (ECLibrary lib : libs) {
+ if (lib instanceof JavaECLibrary) {
+ JavaECLibrary jlib = (JavaECLibrary) lib;
+ for (KeyPairGeneratorIdent ident : lib.getKPGs()) {
+ try {
+ KeyPairGenerator kpg = ident.getInstance(jlib.getProvider());
+ KeyGenerationTestable kgt = new KeyGenerationTestable(kpg, 192);
+ KeyGenerationTest kt = KeyGenerationTest.expect(kgt, Result.ExpectedValue.SUCCESS);
+ System.out.println(kt);
+ } catch (NoSuchAlgorithmException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
}
/**