summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJ08nY2017-11-26 19:03:51 +0100
committerJ08nY2017-11-26 19:03:51 +0100
commit942c287dc46227c87e8683a389d01006e23cb52a (patch)
tree3b83ad60fbd7420fda37dcf2b0e909938a04bcf9
parent0fdfe31112924f51ca503c0ec0fff62ec20403c1 (diff)
downloadECTester-942c287dc46227c87e8683a389d01006e23cb52a.tar.gz
ECTester-942c287dc46227c87e8683a389d01006e23cb52a.tar.zst
ECTester-942c287dc46227c87e8683a389d01006e23cb52a.zip
-rw-r--r--src/cz/crcs/ectester/common/cli/TreeCommandLine.java14
-rw-r--r--src/cz/crcs/ectester/common/ec/EC_Curve.java35
-rw-r--r--src/cz/crcs/ectester/standalone/ECTesterStandalone.java127
3 files changed, 131 insertions, 45 deletions
diff --git a/src/cz/crcs/ectester/common/cli/TreeCommandLine.java b/src/cz/crcs/ectester/common/cli/TreeCommandLine.java
index 39607dc..7de6ef1 100644
--- a/src/cz/crcs/ectester/common/cli/TreeCommandLine.java
+++ b/src/cz/crcs/ectester/common/cli/TreeCommandLine.java
@@ -3,7 +3,6 @@ package cz.crcs.ectester.common.cli;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.ParseException;
-import sun.reflect.generics.tree.Tree;
import java.util.Iterator;
import java.util.List;
@@ -150,20 +149,21 @@ public class TreeCommandLine extends CommandLine {
}
public boolean hasArg(int index) {
- if (next != null) {
- return next.hasArg(index);
- }
- return Math.abs(index) < cli.getArgs().length;
+ return getArg(index) != null;
}
public String getArg(int index) {
if (next != null) {
return next.getArg(index);
}
- if (index >= cli.getArgs().length) {
+ String[] args = cli.getArgs();
+ if (index >= args.length) {
+ return null;
+ }
+ if (index < 0 && -index > args.length) {
return null;
}
- return index < 0 ? cli.getArgs()[cli.getArgs().length + index] : cli.getArgs()[index];
+ return index < 0 ? args[args.length + index] : args[index];
}
@Override
diff --git a/src/cz/crcs/ectester/common/ec/EC_Curve.java b/src/cz/crcs/ectester/common/ec/EC_Curve.java
index 19cfe2d..478ce7d 100644
--- a/src/cz/crcs/ectester/common/ec/EC_Curve.java
+++ b/src/cz/crcs/ectester/common/ec/EC_Curve.java
@@ -1,8 +1,12 @@
package cz.crcs.ectester.common.ec;
import cz.crcs.ectester.applet.EC_Consts;
+import cz.crcs.ectester.common.Util;
import javacard.security.KeyPair;
+import java.math.BigInteger;
+import java.security.spec.*;
+
/**
* An Elliptic curve, contains parameters Fp/F2M, A, B, G, R, (K)?.
*
@@ -49,4 +53,35 @@ public class EC_Curve extends EC_Params {
public String toString() {
return "<" + getId() + "> " + (field == KeyPair.ALG_EC_FP ? "Prime" : "Binary") + " field Elliptic curve (" + String.valueOf(bits) + "b)" + (desc == null ? "" : ": " + desc);
}
+
+ public ECParameterSpec toSpec() {
+ ECField field;
+ if (this.field == KeyPair.ALG_EC_FP) {
+ field = new ECFieldFp(new BigInteger(1, getData(0)));
+ } else {
+ byte[][] fieldData = getParam(EC_Consts.PARAMETER_F2M);
+ int m = Util.getShort(fieldData[0], 0);
+ int e1 = Util.getShort(fieldData[1], 0);
+ int e2 = Util.getShort(fieldData[2], 0);
+ int e3 = Util.getShort(fieldData[3], 0);
+ int[] powers = new int[]{e1, e2, e3};
+ field = new ECFieldF2m(m, powers);
+ }
+
+ BigInteger a = new BigInteger(1, getParam(EC_Consts.PARAMETER_A)[0]);
+ BigInteger b = new BigInteger(1, getParam(EC_Consts.PARAMETER_B)[0]);
+
+ EllipticCurve curve = new EllipticCurve(field, a, b);
+
+ byte[][] G = getParam(EC_Consts.PARAMETER_G);
+ BigInteger gx = new BigInteger(1, G[0]);
+ BigInteger gy = new BigInteger(1, G[1]);
+ ECPoint generator = new ECPoint(gx, gy);
+
+ BigInteger n = new BigInteger(1, getParam(EC_Consts.PARAMETER_R)[0]);
+
+ int h = Util.getShort(getParam(EC_Consts.PARAMETER_K)[0], 0);
+
+ return new ECParameterSpec(curve, generator, n, h);
+ }
}
diff --git a/src/cz/crcs/ectester/standalone/ECTesterStandalone.java b/src/cz/crcs/ectester/standalone/ECTesterStandalone.java
index dc65856..a2c52fc 100644
--- a/src/cz/crcs/ectester/standalone/ECTesterStandalone.java
+++ b/src/cz/crcs/ectester/standalone/ECTesterStandalone.java
@@ -1,6 +1,7 @@
package cz.crcs.ectester.standalone;
import cz.crcs.ectester.common.cli.*;
+import cz.crcs.ectester.common.ec.EC_Curve;
import cz.crcs.ectester.data.EC_Store;
import cz.crcs.ectester.standalone.consts.KeyAgreementIdent;
import cz.crcs.ectester.standalone.consts.KeyPairGeneratorIdent;
@@ -13,12 +14,14 @@ 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 sun.reflect.generics.tree.Tree;
import java.io.IOException;
+import java.security.InvalidAlgorithmParameterException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
+import java.security.interfaces.ECPrivateKey;
+import java.security.interfaces.ECPublicKey;
import java.util.*;
import java.util.stream.Collectors;
@@ -29,10 +32,9 @@ import java.util.stream.Collectors;
* @version v0.1.0
*/
public class ECTesterStandalone {
-
private ECLibrary[] libs = new ECLibrary[]{new SunECLib(), new BouncyCastleLib()};
private EC_Store dataStore;
- private Config cfg = new Config();
+ private Config cfg;
private Options opts = new Options();
private TreeParser optParser;
@@ -55,7 +57,11 @@ public class ECTesterStandalone {
return;
}
- cfg.readOptions(cli);
+
+ cfg = new Config(libs);
+ if (!cfg.readOptions(cli)) {
+ return;
+ }
dataStore = new EC_Store();
if (cli.hasOption("list-named")) {
@@ -83,8 +89,10 @@ public class ECTesterStandalone {
}
- } catch (ParseException | IOException ex) {
+ } catch (ParseException | NoSuchAlgorithmException | IOException ex) {
System.err.println(ex.getMessage());
+ } catch (InvalidAlgorithmParameterException e) {
+ e.printStackTrace();
}
}
@@ -106,6 +114,7 @@ public class ECTesterStandalone {
actions.put("ecdsa", ecdsa);
Options generateOpts = new Options();
+ generateOpts.addOption(Option.builder("nc").longOpt("named-curve").desc("Use a named curve, from CurveDB: <cat/id>").hasArg().argName("cat/id").build());
generateOpts.addOption(Option.builder("n").longOpt("amount").hasArg().argName("amount").optionalArg(false).desc("Generate [amount] of EC keys.").build());
generateOpts.addOption(Option.builder("t").longOpt("type").hasArg().argName("type").optionalArg(false).desc("Set KeyPairGenerator object [type].").build());
generateOpts.addOption(Option.builder("b").longOpt("bits").hasArg().argName("n").optionalArg(false).desc("What size of curve to use.").build());
@@ -139,39 +148,42 @@ public class ECTesterStandalone {
/**
*
*/
- private void generate() {
- if (!cli.hasArg(0)) {
- System.err.println("Missing library name argument.");
- return;
- }
- String libraryName = cli.getArg(0);
-
- List<ECLibrary> matchedLibs = new LinkedList<>();
- for (ECLibrary lib : libs) {
- if (lib.name().toLowerCase().contains(libraryName.toLowerCase())) {
- matchedLibs.add(lib);
+ private void generate() throws NoSuchAlgorithmException, InvalidAlgorithmParameterException {
+ if (cfg.selected instanceof JavaECLibrary) {
+ JavaECLibrary jlib = (JavaECLibrary) cfg.selected;
+ KeyPairGeneratorIdent ident = null;
+ String algo = cli.getOptionValue("generate.type", "EC");
+ for (KeyPairGeneratorIdent kpIdent : jlib.getKPGs()) {
+ if (kpIdent.contains(algo)) {
+ ident = kpIdent;
+ break;
+ }
}
- }
- if (matchedLibs.size() == 0) {
- System.err.println("No library found.");
- } else if (matchedLibs.size() > 1) {
- System.err.println("Multiple matching libraries found: " + String.join(",", matchedLibs.stream().map(ECLibrary::name).collect(Collectors.toList())));
- } else {
- ECLibrary lib = matchedLibs.get(0);
- if (lib instanceof JavaECLibrary) {
- JavaECLibrary jlib = (JavaECLibrary) lib;
- for (KeyPairGeneratorIdent ident : lib.getKPGs()) {
- if (!ident.contains(cli.getOptionValue("generate.type", "EC"))) {
- continue;
- }
- try {
- KeyPairGenerator kpg = ident.getInstance(jlib.getProvider());
- kpg.initialize(Integer.parseInt(cli.getOptionValue("generate.bits", "256")));
- KeyPair kp = kpg.genKeyPair();
- System.out.println(kp.getPrivate());
- } catch (NoSuchAlgorithmException e) {
- e.printStackTrace();
+ if (ident == null) {
+ throw new NoSuchAlgorithmException(algo);
+ } else {
+ KeyPairGenerator kpg = ident.getInstance(jlib.getProvider());
+ if (cli.hasOption("generate.bits")) {
+ int bits = Integer.parseInt(cli.getOptionValue("generate.bits", "256"));
+ kpg.initialize(bits);
+ } else if (cli.hasOption("generate.named-curve")) {
+ String curveName = cli.getOptionValue("generate.named-curve");
+ EC_Curve curve = dataStore.getObject(EC_Curve.class, curveName);
+ if (curve == null) {
+ System.err.println("Curve not found: " + curveName);
+ return;
}
+ kpg.initialize(curve.toSpec());
+ } else {
+ kpg.initialize(256);
+ }
+
+ int amount = Integer.parseInt(cli.getOptionValue("generate.amount", "1"));
+ for (int i = 0; i < amount; ++i) {
+ KeyPair kp = kpg.genKeyPair();
+ ECPrivateKey privateKey = (ECPrivateKey) kp.getPrivate();
+ ECPublicKey publicKey = (ECPublicKey) kp.getPublic();
+ System.out.println(privateKey);
}
}
}
@@ -182,7 +194,7 @@ public class ECTesterStandalone {
*/
private void listLibraries() {
for (ECLibrary lib : libs) {
- if (lib.isInitialized()) {
+ if (lib.isInitialized() && (cfg.selected == null || lib == cfg.selected)) {
System.out.println("\t- " + lib.name());
Set<KeyPairGeneratorIdent> kpgs = lib.getKPGs();
if (!kpgs.isEmpty()) {
@@ -205,10 +217,49 @@ public class ECTesterStandalone {
app.run(args);
}
+
+ /**
+ *
+ */
public static class Config {
- public ECLibrary selected;
+ private ECLibrary[] libs;
+ public ECLibrary selected = null;
+
+ public Config(ECLibrary[] libs) {
+ this.libs = libs;
+ }
boolean readOptions(TreeCommandLine cli) {
+ if (cli.isNext("generate")) {
+ if (!cli.hasArg(-1)) {
+ System.err.println("Missing library name argument.");
+ return false;
+ }
+
+ if (cli.hasOption("generate.bits") && cli.hasOption("generate.named-curve")) {
+ System.err.println("");
+ return false;
+ }
+ }
+
+ String libraryName = cli.getArg(-1);
+ if (libraryName != null) {
+ List<ECLibrary> matchedLibs = new LinkedList<>();
+ for (ECLibrary lib : libs) {
+ if (lib.name().toLowerCase().contains(libraryName.toLowerCase())) {
+ matchedLibs.add(lib);
+ }
+ }
+ if (matchedLibs.size() == 0) {
+ System.err.println("No library " + libraryName + " found.");
+ return false;
+ } else if (matchedLibs.size() > 1) {
+ System.err.println("Multiple matching libraries found: " + String.join(",", matchedLibs.stream().map(ECLibrary::name).collect(Collectors.toList())));
+ return false;
+ } else {
+ selected = matchedLibs.get(0);
+ }
+ }
return true;
}