diff options
| author | J08nY | 2017-11-26 19:03:51 +0100 |
|---|---|---|
| committer | J08nY | 2017-11-26 19:03:51 +0100 |
| commit | 942c287dc46227c87e8683a389d01006e23cb52a (patch) | |
| tree | 3b83ad60fbd7420fda37dcf2b0e909938a04bcf9 | |
| parent | 0fdfe31112924f51ca503c0ec0fff62ec20403c1 (diff) | |
| download | ECTester-942c287dc46227c87e8683a389d01006e23cb52a.tar.gz ECTester-942c287dc46227c87e8683a389d01006e23cb52a.tar.zst ECTester-942c287dc46227c87e8683a389d01006e23cb52a.zip | |
| -rw-r--r-- | src/cz/crcs/ectester/common/cli/TreeCommandLine.java | 14 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/common/ec/EC_Curve.java | 35 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/standalone/ECTesterStandalone.java | 127 |
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; } |
