From 71006eb01c60b3556b620b7d4579d65ed6f86926 Mon Sep 17 00:00:00 2001 From: J08nY Date: Wed, 27 Dec 2017 01:10:06 +0100 Subject: Split output to remove cross-dependency of reader and standalone. --- .../ectester/standalone/output/XMLTestWriter.java | 82 ++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 src/cz/crcs/ectester/standalone/output/XMLTestWriter.java (limited to 'src/cz/crcs/ectester/standalone/output/XMLTestWriter.java') diff --git a/src/cz/crcs/ectester/standalone/output/XMLTestWriter.java b/src/cz/crcs/ectester/standalone/output/XMLTestWriter.java new file mode 100644 index 0000000..cc1a19e --- /dev/null +++ b/src/cz/crcs/ectester/standalone/output/XMLTestWriter.java @@ -0,0 +1,82 @@ +package cz.crcs.ectester.standalone.output; + +import cz.crcs.ectester.common.output.BaseXMLTestWriter; +import cz.crcs.ectester.common.test.Testable; +import cz.crcs.ectester.common.util.ByteUtil; +import cz.crcs.ectester.standalone.test.KeyAgreementTestable; +import cz.crcs.ectester.standalone.test.KeyGeneratorTestable; +import cz.crcs.ectester.standalone.test.SignatureTestable; +import org.w3c.dom.Element; + +import javax.xml.parsers.ParserConfigurationException; +import java.io.OutputStream; +import java.security.PrivateKey; +import java.security.PublicKey; + +/** + * @author Jan Jancar johny@neuromancer.sk + */ +public class XMLTestWriter extends BaseXMLTestWriter { + + public XMLTestWriter(OutputStream output) throws ParserConfigurationException { + super(output); + } + + private Element kaElement(KeyAgreementTestable kat) { + Element katElem = doc.createElement("key-agreement"); + + Element secret = doc.createElement("secret"); + secret.setTextContent(ByteUtil.bytesToHex(kat.getSecret())); + katElem.appendChild(secret); + + return katElem; + } + + private Element kgtElement(KeyGeneratorTestable kgt) { + Element kgtElem = doc.createElement("key-pair-generator"); + + 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())); + 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())); + keyPair.appendChild(privkey); + + return kgtElem; + } + + private Element sigElement(SignatureTestable sig) { + Element sigElem = doc.createElement("signature"); + sigElem.setAttribute("verified", sig.getVerified() ? "true" : "false"); + + Element raw = doc.createElement("raw"); + raw.setTextContent(ByteUtil.bytesToHex(sig.getSignature())); + sigElem.appendChild(raw); + + return sigElem; + } + + @Override + protected Element testableElement(Testable t) { + Element result = doc.createElement("test"); + if (t instanceof KeyGeneratorTestable) { + result.setAttribute("type", "key-pair-generator"); + result.appendChild(kgtElement((KeyGeneratorTestable) t)); + } else if (t instanceof KeyAgreementTestable) { + result.setAttribute("type", "key-agreement"); + result.appendChild(kaElement((KeyAgreementTestable) t)); + } else if (t instanceof SignatureTestable) { + result.setAttribute("type", "signature"); + result.appendChild(sigElement((SignatureTestable) t)); + } + return result; + } +} -- cgit v1.2.3-70-g09d2 From bbc29b640dc0a94e5faa48f647f3420316914c67 Mon Sep 17 00:00:00 2001 From: J08nY Date: Sat, 30 Dec 2017 03:43:13 +0100 Subject: Add more comprehensive XML output to standalone app. --- .../ectester/standalone/ECTesterStandalone.java | 60 +++++++++++++++++----- .../ectester/standalone/output/XMLTestWriter.java | 38 +++++++++++--- .../standalone/test/KeyAgreementTestable.java | 12 +++++ .../standalone/test/KeyGeneratorTestable.java | 4 ++ .../standalone/test/SignatureTestable.java | 4 ++ 5 files changed, 97 insertions(+), 21 deletions(-) (limited to 'src/cz/crcs/ectester/standalone/output/XMLTestWriter.java') 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 actions = new TreeMap<>(); + Option namedCurve = Option.builder("nc").longOpt("named-curve").desc("Use a named curve, from CurveDB: ").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: ").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 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: ").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: ").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: ").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; } -- cgit v1.2.3-70-g09d2 From 9b2cb89738abd4c83d8175069bcb1902ebe2997b Mon Sep 17 00:00:00 2001 From: J08nY Date: Sat, 30 Dec 2017 19:05:34 +0100 Subject: Fixed XML and YAML standalone output in case some tests fail. --- src/cz/crcs/ectester/common/util/ByteUtil.java | 6 +++ .../ectester/standalone/output/XMLTestWriter.java | 22 +++++++---- .../ectester/standalone/output/YAMLTestWriter.java | 45 ++++++++++++++++------ .../ectester/standalone/test/KeyAgreementTest.java | 2 +- .../ectester/standalone/test/KeyGeneratorTest.java | 2 +- .../ectester/standalone/test/SignatureTest.java | 2 +- util/plot_dh.py | 1 + util/plot_gen.py | 1 + 8 files changed, 59 insertions(+), 22 deletions(-) (limited to 'src/cz/crcs/ectester/standalone/output/XMLTestWriter.java') diff --git a/src/cz/crcs/ectester/common/util/ByteUtil.java b/src/cz/crcs/ectester/common/util/ByteUtil.java index 939e487..90c6eaa 100644 --- a/src/cz/crcs/ectester/common/util/ByteUtil.java +++ b/src/cz/crcs/ectester/common/util/ByteUtil.java @@ -84,6 +84,9 @@ public class ByteUtil { } public static String bytesToHex(byte[] data, boolean addSpace) { + if (data == null) { + return ""; + } return bytesToHex(data, 0, data.length, addSpace); } @@ -92,6 +95,9 @@ public class ByteUtil { } public static String bytesToHex(byte[] data, int offset, int len, boolean addSpace) { + if (data == null) { + return ""; + } StringBuilder buf = new StringBuilder(); for (int i = offset; i < (offset + len); i++) { buf.append(byteToHex(data[i])); diff --git a/src/cz/crcs/ectester/standalone/output/XMLTestWriter.java b/src/cz/crcs/ectester/standalone/output/XMLTestWriter.java index f1503cb..9606646 100644 --- a/src/cz/crcs/ectester/standalone/output/XMLTestWriter.java +++ b/src/cz/crcs/ectester/standalone/output/XMLTestWriter.java @@ -24,6 +24,9 @@ public class XMLTestWriter extends BaseXMLTestWriter { private Element pkeyElement(PublicKey pkey) { Element pubkey = doc.createElement("pubkey"); + if (pkey == null) { + return pubkey; + } pubkey.setAttribute("algorithm", pkey.getAlgorithm()); pubkey.setAttribute("format", pkey.getFormat()); pubkey.setTextContent(ByteUtil.bytesToHex(pkey.getEncoded())); @@ -32,6 +35,9 @@ public class XMLTestWriter extends BaseXMLTestWriter { private Element skeyElement(PrivateKey skey) { Element privkey = doc.createElement("privkey"); + if (skey == null) { + return privkey; + } privkey.setAttribute("algorithm", skey.getAlgorithm()); privkey.setAttribute("format", skey.getFormat()); privkey.setTextContent(ByteUtil.bytesToHex(skey.getEncoded())); @@ -62,13 +68,15 @@ public class XMLTestWriter extends BaseXMLTestWriter { kgtElem.setAttribute("algo", kgt.getKpg().getAlgorithm()); Element keyPair = doc.createElement("key-pair"); - PublicKey pkey = kgt.getKeyPair().getPublic(); - Element pubkey = pkeyElement(pkey); - keyPair.appendChild(pubkey); - - PrivateKey skey = kgt.getKeyPair().getPrivate(); - Element privkey = skeyElement(skey); - keyPair.appendChild(privkey); + if (kgt.getKeyPair() != null) { + PublicKey pkey = kgt.getKeyPair().getPublic(); + Element pubkey = pkeyElement(pkey); + keyPair.appendChild(pubkey); + + PrivateKey skey = kgt.getKeyPair().getPrivate(); + Element privkey = skeyElement(skey); + keyPair.appendChild(privkey); + } kgtElem.appendChild(keyPair); return kgtElem; diff --git a/src/cz/crcs/ectester/standalone/output/YAMLTestWriter.java b/src/cz/crcs/ectester/standalone/output/YAMLTestWriter.java index 7ede623..2133a8e 100644 --- a/src/cz/crcs/ectester/standalone/output/YAMLTestWriter.java +++ b/src/cz/crcs/ectester/standalone/output/YAMLTestWriter.java @@ -8,6 +8,7 @@ import cz.crcs.ectester.standalone.test.KeyGeneratorTestable; import cz.crcs.ectester.standalone.test.SignatureTestable; import java.io.PrintStream; +import java.security.Key; import java.security.PrivateKey; import java.security.PublicKey; import java.util.HashMap; @@ -21,32 +22,52 @@ public class YAMLTestWriter extends BaseYAMLTestWriter { super(output); } + private Map keyObject(Key key) { + Map kObject = new HashMap<>(); + if (key == null) { + return kObject; + } + kObject.put("algo", key.getAlgorithm()); + kObject.put("format", key.getFormat()); + kObject.put("raw", ByteUtil.bytesToHex(key.getEncoded())); + return kObject; + } + private Map kaObject(KeyAgreementTestable kat) { Map katObject = new HashMap<>(); + katObject.put("algo", kat.getKa().getAlgorithm()); katObject.put("secret", ByteUtil.bytesToHex(kat.getSecret())); + + PublicKey pkey = kat.getPublicKey(); + katObject.put("pubkey", keyObject(pkey)); + + PrivateKey skey = kat.getPrivateKey(); + katObject.put("privkey", keyObject(skey)); return katObject; } private Map kgtObject(KeyGeneratorTestable kgt) { Map kgtObject = new HashMap<>(); - Map pubObject = new HashMap<>(); - PublicKey pkey = kgt.getKeyPair().getPublic(); - pubObject.put("algorithm", pkey.getAlgorithm()); - pubObject.put("format", pkey.getFormat()); - pubObject.put("raw", ByteUtil.bytesToHex(pkey.getEncoded())); - kgtObject.put("pubkey", pubObject); + kgtObject.put("algo", kgt.getKpg().getAlgorithm()); + + Map keypair = new HashMap<>(); + if (kgt.getKeyPair() != null) { + PublicKey pkey = kgt.getKeyPair().getPublic(); + Map pubObject = keyObject(pkey); + keypair.put("pubkey", pubObject); + + PrivateKey skey = kgt.getKeyPair().getPrivate(); + Map privObject = keyObject(skey); + keypair.put("privkey", privObject); + } - Map privObject = new HashMap<>(); - PrivateKey skey = kgt.getKeyPair().getPrivate(); - privObject.put("algorithm", skey.getAlgorithm()); - privObject.put("format", skey.getFormat()); - privObject.put("raw", ByteUtil.bytesToHex(skey.getEncoded())); - kgtObject.put("privkey", privObject); + kgtObject.put("keypair", keypair); return kgtObject; } private Map sigObject(SignatureTestable sig) { Map sigObject = new HashMap<>(); + sigObject.put("algo", sig.getSig().getAlgorithm()); sigObject.put("verified", sig.getVerified()); sigObject.put("raw", ByteUtil.bytesToHex(sig.getSignature())); return sigObject; diff --git a/src/cz/crcs/ectester/standalone/test/KeyAgreementTest.java b/src/cz/crcs/ectester/standalone/test/KeyAgreementTest.java index e273a44..16a2080 100644 --- a/src/cz/crcs/ectester/standalone/test/KeyAgreementTest.java +++ b/src/cz/crcs/ectester/standalone/test/KeyAgreementTest.java @@ -43,7 +43,7 @@ public class KeyAgreementTest extends SimpleTest { @Override public String getDescription() { - return "KeyAgreement test"; + return "KeyAgreement " + testable.getKa().getAlgorithm(); } @Override diff --git a/src/cz/crcs/ectester/standalone/test/KeyGeneratorTest.java b/src/cz/crcs/ectester/standalone/test/KeyGeneratorTest.java index a57e28c..93273ca 100644 --- a/src/cz/crcs/ectester/standalone/test/KeyGeneratorTest.java +++ b/src/cz/crcs/ectester/standalone/test/KeyGeneratorTest.java @@ -28,7 +28,7 @@ public class KeyGeneratorTest extends SimpleTest { @Override public String getDescription() { - return "KeyPairGenerator test"; + return "KeyPairGenerator " + testable.getKpg().getAlgorithm(); } @Override diff --git a/src/cz/crcs/ectester/standalone/test/SignatureTest.java b/src/cz/crcs/ectester/standalone/test/SignatureTest.java index 97e387c..9746b91 100644 --- a/src/cz/crcs/ectester/standalone/test/SignatureTest.java +++ b/src/cz/crcs/ectester/standalone/test/SignatureTest.java @@ -28,7 +28,7 @@ public class SignatureTest extends SimpleTest { @Override public String getDescription() { - return "Signature test"; + return "Signature " + testable.getSig().getAlgorithm(); } @Override diff --git a/util/plot_dh.py b/util/plot_dh.py index 2aa7d21..8c1dfff 100755 --- a/util/plot_dh.py +++ b/util/plot_dh.py @@ -41,6 +41,7 @@ if __name__ == "__main__": pub_data = map(itemgetter(3), data) secret_data = map(itemgetter(4), data) + plt.style.use("ggplot") fig = plt.figure(tight_layout=True) fig.suptitle(opts.file) diff --git a/util/plot_gen.py b/util/plot_gen.py index db78f8d..016dd15 100755 --- a/util/plot_gen.py +++ b/util/plot_gen.py @@ -49,6 +49,7 @@ if __name__ == "__main__": priv_data = map(itemgetter(2), data) pub_data = map(itemgetter(3), data) + plt.style.use("ggplot") fig = plt.figure(tight_layout=True) fig.suptitle(opts.file) -- cgit v1.2.3-70-g09d2 From aeb322e1da26dcfc83762d9bc8df83667a22282a Mon Sep 17 00:00:00 2001 From: J08nY Date: Sun, 14 Jan 2018 15:26:30 +0100 Subject: Export CPLC data and card ATR in test suite outputs. --- .../ectester/common/output/BaseTextTestWriter.java | 3 ++ .../ectester/common/output/BaseXMLTestWriter.java | 3 ++ .../ectester/common/output/BaseYAMLTestWriter.java | 3 ++ src/cz/crcs/ectester/reader/CardMngr.java | 21 +++++++++--- .../ectester/reader/output/TextTestWriter.java | 29 +++++++++++++++++ .../crcs/ectester/reader/output/XMLTestWriter.java | 38 ++++++++++++++++++++++ .../ectester/reader/output/YAMLTestWriter.java | 33 +++++++++++++++++++ .../crcs/ectester/reader/test/CardTestSuite.java | 4 +++ .../ectester/standalone/output/TextTestWriter.java | 8 +++++ .../ectester/standalone/output/XMLTestWriter.java | 7 ++++ .../ectester/standalone/output/YAMLTestWriter.java | 7 ++++ 11 files changed, 151 insertions(+), 5 deletions(-) (limited to 'src/cz/crcs/ectester/standalone/output/XMLTestWriter.java') diff --git a/src/cz/crcs/ectester/common/output/BaseTextTestWriter.java b/src/cz/crcs/ectester/common/output/BaseTextTestWriter.java index 6ace3a0..29eb671 100644 --- a/src/cz/crcs/ectester/common/output/BaseTextTestWriter.java +++ b/src/cz/crcs/ectester/common/output/BaseTextTestWriter.java @@ -20,10 +20,13 @@ public abstract class BaseTextTestWriter implements TestWriter { public void begin(TestSuite suite) { output.println("═══ Running test suite: " + suite.getName() + " ═══"); output.println("═══ " + suite.getDescription()); + output.print(deviceString(suite)); } protected abstract String testableString(Testable t); + protected abstract String deviceString(TestSuite suite); + private String testString(Test t, String prefix) { if (!t.hasRun()) { return null; diff --git a/src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java b/src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java index 9d3c8f3..f3e9411 100644 --- a/src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java +++ b/src/cz/crcs/ectester/common/output/BaseXMLTestWriter.java @@ -39,10 +39,13 @@ public abstract class BaseXMLTestWriter implements TestWriter { root = rootElem; doc.appendChild(root); + root.appendChild(deviceElement(suite)); } protected abstract Element testableElement(Testable t); + protected abstract Element deviceElement(TestSuite suite); + private Element testElement(Test t) { Element testElem; if (t instanceof CompoundTest) { diff --git a/src/cz/crcs/ectester/common/output/BaseYAMLTestWriter.java b/src/cz/crcs/ectester/common/output/BaseYAMLTestWriter.java index af76927..0769e83 100644 --- a/src/cz/crcs/ectester/common/output/BaseYAMLTestWriter.java +++ b/src/cz/crcs/ectester/common/output/BaseYAMLTestWriter.java @@ -33,11 +33,14 @@ public abstract class BaseYAMLTestWriter implements TestWriter { testSuite.put("desc", suite.getDescription()); testRun.put("suite", testSuite); + testRun.put("device", deviceObject(suite)); testRun.put("tests", tests); } abstract protected Map testableObject(Testable t); + abstract protected Map deviceObject(TestSuite suite); + private Map testObject(Test t) { Map testObj; if (t instanceof CompoundTest) { diff --git a/src/cz/crcs/ectester/reader/CardMngr.java b/src/cz/crcs/ectester/reader/CardMngr.java index a959f2a..1e42c52 100644 --- a/src/cz/crcs/ectester/reader/CardMngr.java +++ b/src/cz/crcs/ectester/reader/CardMngr.java @@ -174,10 +174,10 @@ public class CardMngr { public byte[] fetchCPLC() throws CardException { // Try CPLC via GP - ResponseAPDU resp = sendAPDU(FETCH_GP_CPLC_APDU); + ResponseAPDU resp = send(FETCH_GP_CPLC_APDU); // If GP CLA fails, try with ISO if (resp.getSW() == (ISO7816.SW_CLA_NOT_SUPPORTED & 0xffff)) { - resp = sendAPDU(FETCH_ISO_CPLC_APDU); + resp = send(FETCH_ISO_CPLC_APDU); } if (resp.getSW() == (ISO7816.SW_NO_ERROR & 0xffff)) { return resp.getData(); @@ -207,10 +207,13 @@ public class CardMngr { ICPersonalizationEquipmentID } - private Map values = new HashMap<>(); + private Map values = new TreeMap<>(); public CPLC(byte[] data) { - if (data == null || data.length < 3 || data[2] != 0x2A) { + if (data == null) { + return; + } + if (data.length < 3 || data[2] != 0x2A) { throw new IllegalArgumentException("CPLC must be 0x2A bytes long"); } //offset = TLVUtils.skipTag(data, offset, (short)0x9F7F); @@ -263,7 +266,7 @@ public class CardMngr { return new CPLC(data); } - public String mapCPLCField(CPLC.Field field, byte[] value) { + public static String mapCPLCField(CPLC.Field field, byte[] value) { switch (field) { case ICFabricator: String id = ByteUtil.bytesToHex(value, false); @@ -289,6 +292,14 @@ public class CardMngr { } } + public ATR getATR() { + if (simulate) { + return new ATR(simulator.getATR()); + } else { + return card.getATR(); + } + } + public static List getReaderList() { try { TerminalFactory factory = TerminalFactory.getDefault(); diff --git a/src/cz/crcs/ectester/reader/output/TextTestWriter.java b/src/cz/crcs/ectester/reader/output/TextTestWriter.java index dedf561..eb52937 100644 --- a/src/cz/crcs/ectester/reader/output/TextTestWriter.java +++ b/src/cz/crcs/ectester/reader/output/TextTestWriter.java @@ -1,10 +1,16 @@ package cz.crcs.ectester.reader.output; import cz.crcs.ectester.common.output.BaseTextTestWriter; +import cz.crcs.ectester.common.test.TestSuite; import cz.crcs.ectester.common.test.Testable; +import cz.crcs.ectester.common.util.ByteUtil; +import cz.crcs.ectester.reader.CardMngr; +import cz.crcs.ectester.reader.test.CardTestSuite; import cz.crcs.ectester.reader.test.CommandTestable; +import javax.smartcardio.CardException; import java.io.PrintStream; +import java.util.Map; /** * @author Jan Jancar johny@neuromancer.sk @@ -25,4 +31,27 @@ public class TextTestWriter extends BaseTextTestWriter { } return ""; } + + @Override + protected String deviceString(TestSuite suite) { + if (suite instanceof CardTestSuite) { + CardTestSuite cardSuite = (CardTestSuite) suite; + StringBuilder sb = new StringBuilder(); + sb.append("═══ Card ATR: ").append(ByteUtil.bytesToHex(cardSuite.getCard().getATR().getBytes(), false)).append(System.lineSeparator()); + try { + CardMngr.CPLC cplc = cardSuite.getCard().getCPLC(); + if (!cplc.values().isEmpty()) { + sb.append("═══ Card CPLC data:").append(System.lineSeparator()); + for (Map.Entry entry : cplc.values().entrySet()) { + CardMngr.CPLC.Field field = entry.getKey(); + byte[] value = entry.getValue(); + sb.append("═══ ").append(field.name()).append(": ").append(CardMngr.mapCPLCField(field, value)); + } + } + } catch (CardException ignored) { + } + return sb.toString(); + } + return ""; + } } diff --git a/src/cz/crcs/ectester/reader/output/XMLTestWriter.java b/src/cz/crcs/ectester/reader/output/XMLTestWriter.java index d88a64e..356593e 100644 --- a/src/cz/crcs/ectester/reader/output/XMLTestWriter.java +++ b/src/cz/crcs/ectester/reader/output/XMLTestWriter.java @@ -1,15 +1,20 @@ package cz.crcs.ectester.reader.output; import cz.crcs.ectester.common.output.BaseXMLTestWriter; +import cz.crcs.ectester.common.test.TestSuite; import cz.crcs.ectester.common.test.Testable; import cz.crcs.ectester.common.util.ByteUtil; +import cz.crcs.ectester.reader.CardMngr; import cz.crcs.ectester.reader.command.Command; import cz.crcs.ectester.reader.response.Response; +import cz.crcs.ectester.reader.test.CardTestSuite; import cz.crcs.ectester.reader.test.CommandTestable; import org.w3c.dom.Element; +import javax.smartcardio.CardException; import javax.xml.parsers.ParserConfigurationException; import java.io.OutputStream; +import java.util.Map; /** * @author Jan Jancar johny@neuromancer.sk @@ -72,4 +77,37 @@ public class XMLTestWriter extends BaseXMLTestWriter { } return null; } + + private Element cplcElement(CardMngr card) { + Element result = doc.createElement("cplc"); + try { + CardMngr.CPLC cplc = card.getCPLC(); + if (!cplc.values().isEmpty()) { + for (Map.Entry entry : cplc.values().entrySet()) { + CardMngr.CPLC.Field field = entry.getKey(); + byte[] value = entry.getValue(); + Element keyVal = doc.createElement(field.name()); + keyVal.setTextContent(ByteUtil.bytesToHex(value, false)); + result.appendChild(keyVal); + } + } + } catch (CardException ignored) { + } + return result; + } + + @Override + protected Element deviceElement(TestSuite suite) { + if (suite instanceof CardTestSuite) { + CardTestSuite cardSuite = (CardTestSuite) suite; + Element result = doc.createElement("device"); + result.setAttribute("type", "card"); + result.appendChild(cplcElement(cardSuite.getCard())); + + Element atr = doc.createElement("ATR"); + atr.setTextContent(ByteUtil.bytesToHex(cardSuite.getCard().getATR().getBytes(), false)); + result.appendChild(atr); + } + return null; + } } \ No newline at end of file diff --git a/src/cz/crcs/ectester/reader/output/YAMLTestWriter.java b/src/cz/crcs/ectester/reader/output/YAMLTestWriter.java index 49a20f1..199f2c0 100644 --- a/src/cz/crcs/ectester/reader/output/YAMLTestWriter.java +++ b/src/cz/crcs/ectester/reader/output/YAMLTestWriter.java @@ -1,12 +1,16 @@ package cz.crcs.ectester.reader.output; import cz.crcs.ectester.common.output.BaseYAMLTestWriter; +import cz.crcs.ectester.common.test.TestSuite; import cz.crcs.ectester.common.test.Testable; import cz.crcs.ectester.common.util.ByteUtil; +import cz.crcs.ectester.reader.CardMngr; import cz.crcs.ectester.reader.command.Command; import cz.crcs.ectester.reader.response.Response; +import cz.crcs.ectester.reader.test.CardTestSuite; import cz.crcs.ectester.reader.test.CommandTestable; +import javax.smartcardio.CardException; import java.io.PrintStream; import java.util.HashMap; import java.util.LinkedList; @@ -54,4 +58,33 @@ public class YAMLTestWriter extends BaseYAMLTestWriter { } return null; } + + private Map cplcObject(CardMngr card) { + Map result = new HashMap<>(); + try { + CardMngr.CPLC cplc = card.getCPLC(); + if (!cplc.values().isEmpty()) { + for (Map.Entry entry : cplc.values().entrySet()) { + CardMngr.CPLC.Field field = entry.getKey(); + byte[] value = entry.getValue(); + result.put(field.name(), ByteUtil.bytesToHex(value, false)); + } + } + } catch (CardException ignored) { + } + return result; + } + + @Override + protected Map deviceObject(TestSuite suite) { + if (suite instanceof CardTestSuite) { + CardTestSuite cardSuite = (CardTestSuite) suite; + Map result = new HashMap<>(); + result.put("type", "card"); + result.put("cplc", cplcObject(cardSuite.getCard())); + result.put("ATR", ByteUtil.bytesToHex(cardSuite.getCard().getATR().getBytes(), false)); + return result; + } + return null; + } } diff --git a/src/cz/crcs/ectester/reader/test/CardTestSuite.java b/src/cz/crcs/ectester/reader/test/CardTestSuite.java index e12a588..b451265 100644 --- a/src/cz/crcs/ectester/reader/test/CardTestSuite.java +++ b/src/cz/crcs/ectester/reader/test/CardTestSuite.java @@ -116,4 +116,8 @@ public abstract class CardTestSuite extends TestSuite { return null; } + + public CardMngr getCard() { + return card; + } } diff --git a/src/cz/crcs/ectester/standalone/output/TextTestWriter.java b/src/cz/crcs/ectester/standalone/output/TextTestWriter.java index ddb1029..972af18 100644 --- a/src/cz/crcs/ectester/standalone/output/TextTestWriter.java +++ b/src/cz/crcs/ectester/standalone/output/TextTestWriter.java @@ -1,6 +1,7 @@ package cz.crcs.ectester.standalone.output; import cz.crcs.ectester.common.output.BaseTextTestWriter; +import cz.crcs.ectester.common.test.TestSuite; import cz.crcs.ectester.common.test.Testable; import java.io.PrintStream; @@ -15,6 +16,13 @@ public class TextTestWriter extends BaseTextTestWriter { @Override protected String testableString(Testable t) { + //TODO + return ""; + } + + @Override + protected String deviceString(TestSuite suite) { + //TODO return ""; } } \ No newline at end of file diff --git a/src/cz/crcs/ectester/standalone/output/XMLTestWriter.java b/src/cz/crcs/ectester/standalone/output/XMLTestWriter.java index 9606646..d2b16d8 100644 --- a/src/cz/crcs/ectester/standalone/output/XMLTestWriter.java +++ b/src/cz/crcs/ectester/standalone/output/XMLTestWriter.java @@ -1,6 +1,7 @@ package cz.crcs.ectester.standalone.output; import cz.crcs.ectester.common.output.BaseXMLTestWriter; +import cz.crcs.ectester.common.test.TestSuite; import cz.crcs.ectester.common.test.Testable; import cz.crcs.ectester.common.util.ByteUtil; import cz.crcs.ectester.standalone.test.KeyAgreementTestable; @@ -109,4 +110,10 @@ public class XMLTestWriter extends BaseXMLTestWriter { } return result; } + + @Override + protected Element deviceElement(TestSuite suite) { + //TODO + return null; + } } diff --git a/src/cz/crcs/ectester/standalone/output/YAMLTestWriter.java b/src/cz/crcs/ectester/standalone/output/YAMLTestWriter.java index 2133a8e..dfc6813 100644 --- a/src/cz/crcs/ectester/standalone/output/YAMLTestWriter.java +++ b/src/cz/crcs/ectester/standalone/output/YAMLTestWriter.java @@ -1,6 +1,7 @@ package cz.crcs.ectester.standalone.output; import cz.crcs.ectester.common.output.BaseYAMLTestWriter; +import cz.crcs.ectester.common.test.TestSuite; import cz.crcs.ectester.common.test.Testable; import cz.crcs.ectester.common.util.ByteUtil; import cz.crcs.ectester.standalone.test.KeyAgreementTestable; @@ -88,4 +89,10 @@ public class YAMLTestWriter extends BaseYAMLTestWriter { } return result; } + + @Override + protected Map deviceObject(TestSuite suite) { + //TODO + return null; + } } -- cgit v1.2.3-70-g09d2