aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/cz/crcs/ectester/standalone/ECTesterStandalone.java60
-rw-r--r--src/cz/crcs/ectester/standalone/output/XMLTestWriter.java38
-rw-r--r--src/cz/crcs/ectester/standalone/test/KeyAgreementTestable.java12
-rw-r--r--src/cz/crcs/ectester/standalone/test/KeyGeneratorTestable.java4
-rw-r--r--src/cz/crcs/ectester/standalone/test/SignatureTestable.java4
5 files changed, 97 insertions, 21 deletions
diff --git a/src/cz/crcs/ectester/standalone/ECTesterStandalone.java b/src/cz/crcs/ectester/standalone/ECTesterStandalone.java
index 237897c..b1b71a5 100644
--- a/src/cz/crcs/ectester/standalone/ECTesterStandalone.java
+++ b/src/cz/crcs/ectester/standalone/ECTesterStandalone.java
@@ -2,6 +2,7 @@ package cz.crcs.ectester.standalone;
import cz.crcs.ectester.common.cli.*;
import cz.crcs.ectester.common.ec.EC_Curve;
+import cz.crcs.ectester.common.output.TestWriter;
import cz.crcs.ectester.common.test.TestException;
import cz.crcs.ectester.common.test.TestRunner;
import cz.crcs.ectester.common.util.ByteUtil;
@@ -12,6 +13,8 @@ import cz.crcs.ectester.standalone.consts.KeyPairGeneratorIdent;
import cz.crcs.ectester.standalone.consts.SignatureIdent;
import cz.crcs.ectester.standalone.libs.*;
import cz.crcs.ectester.standalone.output.TextTestWriter;
+import cz.crcs.ectester.standalone.output.XMLTestWriter;
+import cz.crcs.ectester.standalone.output.YAMLTestWriter;
import cz.crcs.ectester.standalone.test.StandaloneDefaultSuite;
import cz.crcs.ectester.standalone.test.StandaloneTestSuite;
import org.apache.commons.cli.DefaultParser;
@@ -20,6 +23,7 @@ import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import javax.crypto.KeyAgreement;
+import javax.xml.parsers.ParserConfigurationException;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
@@ -90,7 +94,7 @@ public class ECTesterStandalone {
export();
}
- } catch (ParseException | IOException ex) {
+ } catch (ParseException | ParserConfigurationException | IOException ex) {
System.err.println(ex.getMessage());
} catch (InvalidAlgorithmParameterException | InvalidParameterException e) {
System.err.println("Invalid algorithm parameter: " + e.getMessage());
@@ -105,43 +109,49 @@ public class ECTesterStandalone {
private TreeCommandLine parseArgs(String[] args) throws ParseException {
Map<String, ParserOptions> actions = new TreeMap<>();
+ Option namedCurve = Option.builder("nc").longOpt("named-curve").desc("Use a named curve, from CurveDB: <cat/id>").hasArg().argName("cat/id").build();
+ Option bits = Option.builder("b").longOpt("bits").hasArg().argName("n").optionalArg(false).desc("What size of curve to use.").build();
+
Options testOpts = new Options();
- ParserOptions test = new ParserOptions(new DefaultParser(), testOpts);
+ testOpts.addOption(bits);
+ testOpts.addOption(namedCurve);
testOpts.addOption(Option.builder("gt").longOpt("kpg-type").desc("Set the KeyPairGenerator object [type].").hasArg().argName("type").optionalArg(false).build());
testOpts.addOption(Option.builder("kt").longOpt("ka-type").desc("Set the KeyAgreement object [type].").hasArg().argName("type").optionalArg(false).build());
testOpts.addOption(Option.builder("st").longOpt("sig-type").desc("Set the Signature object [type].").hasArg().argName("type").optionalArg(false).build());
- testOpts.addOption(Option.builder("b").longOpt("bits").hasArg().argName("n").optionalArg(false).desc("What size of curve to use.").build());
- testOpts.addOption(Option.builder("nc").longOpt("named-curve").desc("Use a named curve, from CurveDB: <cat/id>").hasArg().argName("cat/id").build());
+ testOpts.addOption(Option.builder("f").longOpt("format").desc("Set the output format, one of text,yaml,xml.").hasArg().argName("format").optionalArg(false).build());
+ List<Argument> testArgs = new LinkedList<>();
+ testArgs.add(new Argument("test_suite", "The test suite to run.", true));
+ ParserOptions test = new ParserOptions(new DefaultParser(), testOpts, testArgs);
actions.put("test", test);
Options ecdhOpts = new Options();
+ ecdhOpts.addOption(bits);
+ ecdhOpts.addOption(namedCurve);
ecdhOpts.addOption(Option.builder("t").longOpt("type").desc("Set KeyAgreement object [type].").hasArg().argName("type").optionalArg(false).build());
ecdhOpts.addOption(Option.builder("n").longOpt("amount").hasArg().argName("amount").optionalArg(false).desc("Do ECDH [amount] times.").build());
- ecdhOpts.addOption(Option.builder("b").longOpt("bits").hasArg().argName("n").optionalArg(false).desc("What size of curve to use.").build());
- ecdhOpts.addOption(Option.builder("nc").longOpt("named-curve").desc("Use a named curve, from CurveDB: <cat/id>").hasArg().argName("cat/id").build());
ParserOptions ecdh = new ParserOptions(new DefaultParser(), ecdhOpts);
actions.put("ecdh", ecdh);
Options ecdsaOpts = new Options();
+ ecdsaOpts.addOption(bits);
+ ecdsaOpts.addOption(namedCurve);
ecdsaOpts.addOption(Option.builder("t").longOpt("type").desc("Set Signature object [type].").hasArg().argName("type").optionalArg(false).build());
ecdsaOpts.addOption(Option.builder("n").longOpt("amount").hasArg().argName("amount").optionalArg(false).desc("Do ECDSA [amount] times.").build());
- ecdsaOpts.addOption(Option.builder("b").longOpt("bits").hasArg().argName("n").optionalArg(false).desc("What size of curve to use.").build());
- ecdsaOpts.addOption(Option.builder("nc").longOpt("named-curve").desc("Use a named curve, from CurveDB: <cat/id>").hasArg().argName("cat/id").build());
ecdsaOpts.addOption(Option.builder("f").longOpt("file").hasArg().argName("file").optionalArg(false).desc("Input [file] to sign.").build());
ParserOptions ecdsa = new ParserOptions(new DefaultParser(), ecdsaOpts);
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(bits);
+ generateOpts.addOption(namedCurve);
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());
ParserOptions generate = new ParserOptions(new DefaultParser(), generateOpts);
actions.put("generate", generate);
Options exportOpts = new Options();
exportOpts.addOption(Option.builder("t").longOpt("type").hasArg().argName("type").optionalArg(false).desc("Set KeyPair object [type].").build());
- exportOpts.addOption(Option.builder("b").longOpt("bits").hasArg().argName("n").optionalArg(false).desc("What size of curve to use.").build());
+ exportOpts.addOption(bits);
ParserOptions export = new ParserOptions(new DefaultParser(), exportOpts);
actions.put("export", export);
@@ -403,9 +413,24 @@ public class ECTesterStandalone {
/**
*
*/
- private void test() throws NoSuchAlgorithmException, TestException {
+ private void test() throws NoSuchAlgorithmException, TestException, ParserConfigurationException {
+ TestWriter writer;
+ switch (cli.getOptionValue("test.format", "text").toLowerCase()) {
+ case "yaml":
+ case "yml":
+ writer = new YAMLTestWriter(System.out);
+ break;
+ case "xml":
+ writer = new XMLTestWriter(System.out);
+ break;
+ case "text":
+ default:
+ writer = new TextTestWriter(System.out);
+ break;
+ }
+
StandaloneTestSuite suite = new StandaloneDefaultSuite(dataStore, cfg, cli);
- TestRunner runner = new TestRunner(suite, new TextTestWriter(System.out));
+ TestRunner runner = new TestRunner(suite, writer);
suite.setup();
runner.run();
}
@@ -490,6 +515,15 @@ public class ECTesterStandalone {
}
}
+ if (cli.hasOption("test.format")) {
+ String fmt = cli.getOptionValue("test.format");
+ String formats[] = new String[]{"text", "xml", "yaml", "yml"};
+ if (!Arrays.asList(formats).contains(fmt.toLowerCase())) {
+ System.err.println("Invalid format specified.");
+ return false;
+ }
+ }
+
return true;
}
}
diff --git a/src/cz/crcs/ectester/standalone/output/XMLTestWriter.java b/src/cz/crcs/ectester/standalone/output/XMLTestWriter.java
index cc1a19e..f1503cb 100644
--- a/src/cz/crcs/ectester/standalone/output/XMLTestWriter.java
+++ b/src/cz/crcs/ectester/standalone/output/XMLTestWriter.java
@@ -22,40 +22,62 @@ public class XMLTestWriter extends BaseXMLTestWriter {
super(output);
}
+ private Element pkeyElement(PublicKey pkey) {
+ Element pubkey = doc.createElement("pubkey");
+ pubkey.setAttribute("algorithm", pkey.getAlgorithm());
+ pubkey.setAttribute("format", pkey.getFormat());
+ pubkey.setTextContent(ByteUtil.bytesToHex(pkey.getEncoded()));
+ return pubkey;
+ }
+
+ private Element skeyElement(PrivateKey skey) {
+ Element privkey = doc.createElement("privkey");
+ privkey.setAttribute("algorithm", skey.getAlgorithm());
+ privkey.setAttribute("format", skey.getFormat());
+ privkey.setTextContent(ByteUtil.bytesToHex(skey.getEncoded()));
+ return privkey;
+ }
+
private Element kaElement(KeyAgreementTestable kat) {
Element katElem = doc.createElement("key-agreement");
+ katElem.setAttribute("algo", kat.getKa().getAlgorithm());
Element secret = doc.createElement("secret");
secret.setTextContent(ByteUtil.bytesToHex(kat.getSecret()));
katElem.appendChild(secret);
+ PublicKey pkey = kat.getPublicKey();
+ Element pubkey = pkeyElement(pkey);
+ katElem.appendChild(pubkey);
+
+ PrivateKey skey = kat.getPrivateKey();
+ Element privkey = skeyElement(skey);
+ katElem.appendChild(privkey);
+
return katElem;
}
private Element kgtElement(KeyGeneratorTestable kgt) {
Element kgtElem = doc.createElement("key-pair-generator");
+ kgtElem.setAttribute("algo", kgt.getKpg().getAlgorithm());
Element keyPair = doc.createElement("key-pair");
- Element pubkey = doc.createElement("pubkey");
PublicKey pkey = kgt.getKeyPair().getPublic();
- pubkey.setAttribute("algorithm", pkey.getAlgorithm());
- pubkey.setAttribute("format", pkey.getFormat());
- pubkey.setTextContent(ByteUtil.bytesToHex(pkey.getEncoded()));
+ Element pubkey = pkeyElement(pkey);
keyPair.appendChild(pubkey);
- Element privkey = doc.createElement("privkey");
PrivateKey skey = kgt.getKeyPair().getPrivate();
- privkey.setAttribute("algorithm", skey.getAlgorithm());
- privkey.setAttribute("format", skey.getFormat());
- privkey.setTextContent(ByteUtil.bytesToHex(skey.getEncoded()));
+ Element privkey = skeyElement(skey);
keyPair.appendChild(privkey);
+ kgtElem.appendChild(keyPair);
return kgtElem;
}
private Element sigElement(SignatureTestable sig) {
Element sigElem = doc.createElement("signature");
sigElem.setAttribute("verified", sig.getVerified() ? "true" : "false");
+ sigElem.setAttribute("algo", sig.getSig().getAlgorithm());
Element raw = doc.createElement("raw");
raw.setTextContent(ByteUtil.bytesToHex(sig.getSignature()));
diff --git a/src/cz/crcs/ectester/standalone/test/KeyAgreementTestable.java b/src/cz/crcs/ectester/standalone/test/KeyAgreementTestable.java
index 8e9b0dd..de9356b 100644
--- a/src/cz/crcs/ectester/standalone/test/KeyAgreementTestable.java
+++ b/src/cz/crcs/ectester/standalone/test/KeyAgreementTestable.java
@@ -50,6 +50,18 @@ public class KeyAgreementTestable extends BaseTestable {
this.kgtPublic = pubKgt;
}
+ public KeyAgreement getKa() {
+ return ka;
+ }
+
+ public ECPublicKey getPublicKey() {
+ return publicKey;
+ }
+
+ public ECPrivateKey getPrivateKey() {
+ return privateKey;
+ }
+
public byte[] getSecret() {
if (!hasRun) {
return null;
diff --git a/src/cz/crcs/ectester/standalone/test/KeyGeneratorTestable.java b/src/cz/crcs/ectester/standalone/test/KeyGeneratorTestable.java
index ca7f1e7..3fca168 100644
--- a/src/cz/crcs/ectester/standalone/test/KeyGeneratorTestable.java
+++ b/src/cz/crcs/ectester/standalone/test/KeyGeneratorTestable.java
@@ -28,6 +28,10 @@ public class KeyGeneratorTestable extends BaseTestable {
this.spec = spec;
}
+ public KeyPairGenerator getKpg() {
+ return kpg;
+ }
+
public KeyPair getKeyPair() {
return kp;
}
diff --git a/src/cz/crcs/ectester/standalone/test/SignatureTestable.java b/src/cz/crcs/ectester/standalone/test/SignatureTestable.java
index 564a6bf..e434337 100644
--- a/src/cz/crcs/ectester/standalone/test/SignatureTestable.java
+++ b/src/cz/crcs/ectester/standalone/test/SignatureTestable.java
@@ -36,6 +36,10 @@ public class SignatureTestable extends BaseTestable {
this.kgt = kgt;
}
+ public Signature getSig() {
+ return sig;
+ }
+
public byte[] getData() {
return data;
}