summaryrefslogtreecommitdiff
path: root/src/cz/crcs/ectester/standalone/test
diff options
context:
space:
mode:
Diffstat (limited to 'src/cz/crcs/ectester/standalone/test')
-rw-r--r--src/cz/crcs/ectester/standalone/test/KeyAgreementTest.java57
-rw-r--r--src/cz/crcs/ectester/standalone/test/KeyAgreementTestable.java124
-rw-r--r--src/cz/crcs/ectester/standalone/test/KeyGeneratorTest.java42
-rw-r--r--src/cz/crcs/ectester/standalone/test/KeyGeneratorTestable.java56
-rw-r--r--src/cz/crcs/ectester/standalone/test/SignatureTest.java42
-rw-r--r--src/cz/crcs/ectester/standalone/test/SignatureTestable.java107
-rw-r--r--src/cz/crcs/ectester/standalone/test/StandaloneDefaultSuite.java76
-rw-r--r--src/cz/crcs/ectester/standalone/test/StandaloneTestSuite.java23
8 files changed, 527 insertions, 0 deletions
diff --git a/src/cz/crcs/ectester/standalone/test/KeyAgreementTest.java b/src/cz/crcs/ectester/standalone/test/KeyAgreementTest.java
new file mode 100644
index 0000000..5f697c4
--- /dev/null
+++ b/src/cz/crcs/ectester/standalone/test/KeyAgreementTest.java
@@ -0,0 +1,57 @@
+package cz.crcs.ectester.standalone.test;
+
+import cz.crcs.ectester.common.test.Result;
+import cz.crcs.ectester.common.test.SimpleTest;
+import cz.crcs.ectester.common.test.TestCallback;
+import cz.crcs.ectester.common.test.TestException;
+
+import java.util.Arrays;
+
+/**
+ * @author Jan Jancar johny@neuromancer.sk
+ */
+public class KeyAgreementTest extends SimpleTest<KeyAgreementTestable> {
+ private KeyAgreementTest(KeyAgreementTestable ka, TestCallback<KeyAgreementTestable> callback) {
+ super(ka, callback);
+ }
+
+ public static KeyAgreementTest match(KeyAgreementTestable ka, byte[] expectedSecret) {
+ return new KeyAgreementTest(ka, new TestCallback<KeyAgreementTestable>() {
+ @Override
+ public Result apply(KeyAgreementTestable ka) {
+ if (Arrays.equals(ka.getSecret(), expectedSecret)) {
+ return new Result(Result.Value.SUCCESS, "The KeyAgreement result matched the expected derived secret.");
+ } else {
+ return new Result(Result.Value.FAILURE, "The KeyAgreement result did not match the expected derived secret.");
+ }
+ }
+ });
+ }
+
+ public static KeyAgreementTest expect(KeyAgreementTestable ka, Result.ExpectedValue expected) {
+ return new KeyAgreementTest(ka, new TestCallback<KeyAgreementTestable>() {
+ @Override
+ public Result apply(KeyAgreementTestable keyAgreementTestable) {
+ return new Result(Result.Value.fromExpected(expected, keyAgreementTestable.ok(), keyAgreementTestable.error()));
+ }
+ });
+ }
+
+ public static KeyAgreementTest function(KeyAgreementTestable ka, TestCallback<KeyAgreementTestable> callback) {
+ return new KeyAgreementTest(ka, callback);
+ }
+
+ @Override
+ public String getDescription() {
+ return "KeyAgreement " + testable.getKa().getAlgorithm();
+ }
+
+ @Override
+ public void run() throws TestException {
+ if (hasRun)
+ return;
+ testable.run();
+ result = callback.apply(testable);
+ hasRun = true;
+ }
+}
diff --git a/src/cz/crcs/ectester/standalone/test/KeyAgreementTestable.java b/src/cz/crcs/ectester/standalone/test/KeyAgreementTestable.java
new file mode 100644
index 0000000..de9356b
--- /dev/null
+++ b/src/cz/crcs/ectester/standalone/test/KeyAgreementTestable.java
@@ -0,0 +1,124 @@
+package cz.crcs.ectester.standalone.test;
+
+import cz.crcs.ectester.common.test.BaseTestable;
+import cz.crcs.ectester.common.test.TestException;
+
+import javax.crypto.KeyAgreement;
+import java.security.InvalidAlgorithmParameterException;
+import java.security.InvalidKeyException;
+import java.security.interfaces.ECPrivateKey;
+import java.security.interfaces.ECPublicKey;
+import java.security.spec.AlgorithmParameterSpec;
+import java.security.spec.ECParameterSpec;
+
+/**
+ * @author Jan Jancar johny@neuromancer.sk
+ */
+public class KeyAgreementTestable extends BaseTestable {
+ private KeyAgreement ka;
+ private ECPrivateKey privateKey;
+ private ECPublicKey publicKey;
+ private KeyGeneratorTestable kgtPrivate;
+ private KeyGeneratorTestable kgtPublic;
+ private AlgorithmParameterSpec spec;
+ private byte[] secret;
+
+ public KeyAgreementTestable(KeyAgreement ka, ECPrivateKey privateKey, ECPublicKey publicKey) {
+ this.ka = ka;
+ this.privateKey = privateKey;
+ this.publicKey = publicKey;
+ }
+
+ public KeyAgreementTestable(KeyAgreement ka, ECPrivateKey privateKey, ECPublicKey publicKey, ECParameterSpec spec) {
+ this(ka, privateKey, publicKey);
+ this.spec = spec;
+ }
+
+ public KeyAgreementTestable(KeyAgreement ka, KeyGeneratorTestable kgt, ECPrivateKey privateKey, ECParameterSpec spec) {
+ this(ka, privateKey, null, spec);
+ this.kgtPublic = kgt;
+ }
+
+ public KeyAgreementTestable(KeyAgreement ka, ECPublicKey publicKey, KeyGeneratorTestable kgt, ECParameterSpec spec) {
+ this(ka, null, publicKey, spec);
+ this.kgtPrivate = kgt;
+ }
+
+ public KeyAgreementTestable(KeyAgreement ka, KeyGeneratorTestable privKgt, KeyGeneratorTestable pubKgt, ECParameterSpec spec) {
+ this(ka, (ECPrivateKey) null, null, spec);
+ this.kgtPrivate = privKgt;
+ 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;
+ }
+ return secret;
+ }
+
+ @Override
+ public void run() throws TestException {
+ if (kgtPrivate != null) {
+ privateKey = (ECPrivateKey) kgtPrivate.getKeyPair().getPrivate();
+ }
+
+ if (kgtPublic != null) {
+ publicKey = (ECPublicKey) kgtPublic.getKeyPair().getPublic();
+ }
+
+ try {
+ if (spec != null) {
+ ka.init(privateKey, spec);
+ } else {
+ ka.init(privateKey);
+ }
+ } catch (InvalidKeyException | InvalidAlgorithmParameterException e) {
+ ok = false;
+ error = true;
+ hasRun = true;
+ return;
+ }
+
+ try {
+ ka.doPhase(publicKey, true);
+ } catch (IllegalStateException e) {
+ ok = false;
+ hasRun = true;
+ return;
+ } catch (InvalidKeyException e) {
+ ok = false;
+ error = true;
+ hasRun = true;
+ return;
+ }
+
+ try {
+ secret = ka.generateSecret();
+ } catch (IllegalStateException isex) {
+ ok = false;
+ hasRun = true;
+ return;
+ } catch (UnsupportedOperationException uoe) {
+ ok = false;
+ error = true;
+ hasRun = false;
+ return;
+ }
+
+ ok = true;
+ hasRun = true;
+ }
+}
diff --git a/src/cz/crcs/ectester/standalone/test/KeyGeneratorTest.java b/src/cz/crcs/ectester/standalone/test/KeyGeneratorTest.java
new file mode 100644
index 0000000..93273ca
--- /dev/null
+++ b/src/cz/crcs/ectester/standalone/test/KeyGeneratorTest.java
@@ -0,0 +1,42 @@
+package cz.crcs.ectester.standalone.test;
+
+import cz.crcs.ectester.common.test.Result;
+import cz.crcs.ectester.common.test.SimpleTest;
+import cz.crcs.ectester.common.test.TestCallback;
+import cz.crcs.ectester.common.test.TestException;
+
+/**
+ * @author Jan Jancar johny@neuromancer.sk
+ */
+public class KeyGeneratorTest extends SimpleTest<KeyGeneratorTestable> {
+ private KeyGeneratorTest(KeyGeneratorTestable kg, TestCallback<KeyGeneratorTestable> callback) {
+ super(kg, callback);
+ }
+
+ public static KeyGeneratorTest expect(KeyGeneratorTestable kg, Result.ExpectedValue expected) {
+ return new KeyGeneratorTest(kg, new TestCallback<KeyGeneratorTestable>() {
+ @Override
+ public Result apply(KeyGeneratorTestable keyGenerationTestable) {
+ return new Result(Result.Value.fromExpected(expected, keyGenerationTestable.ok(), keyGenerationTestable.error()));
+ }
+ });
+ }
+
+ public static KeyGeneratorTest function(KeyGeneratorTestable ka, TestCallback<KeyGeneratorTestable> callback) {
+ return new KeyGeneratorTest(ka, callback);
+ }
+
+ @Override
+ public String getDescription() {
+ return "KeyPairGenerator " + testable.getKpg().getAlgorithm();
+ }
+
+ @Override
+ public void run() throws TestException {
+ if (hasRun)
+ return;
+ testable.run();
+ result = callback.apply(testable);
+ hasRun = true;
+ }
+}
diff --git a/src/cz/crcs/ectester/standalone/test/KeyGeneratorTestable.java b/src/cz/crcs/ectester/standalone/test/KeyGeneratorTestable.java
new file mode 100644
index 0000000..3fca168
--- /dev/null
+++ b/src/cz/crcs/ectester/standalone/test/KeyGeneratorTestable.java
@@ -0,0 +1,56 @@
+package cz.crcs.ectester.standalone.test;
+
+import cz.crcs.ectester.common.test.BaseTestable;
+import cz.crcs.ectester.common.test.TestException;
+
+import java.security.InvalidAlgorithmParameterException;
+import java.security.KeyPair;
+import java.security.KeyPairGenerator;
+import java.security.spec.ECParameterSpec;
+
+public class KeyGeneratorTestable extends BaseTestable {
+ private KeyPair kp;
+ private KeyPairGenerator kpg;
+ private int keysize = 0;
+ private ECParameterSpec spec = null;
+
+ public KeyGeneratorTestable(KeyPairGenerator kpg) {
+ this.kpg = kpg;
+ }
+
+ public KeyGeneratorTestable(KeyPairGenerator kpg, int keysize) {
+ this.kpg = kpg;
+ this.keysize = keysize;
+ }
+
+ public KeyGeneratorTestable(KeyPairGenerator kpg, ECParameterSpec spec) {
+ this.kpg = kpg;
+ this.spec = spec;
+ }
+
+ public KeyPairGenerator getKpg() {
+ return kpg;
+ }
+
+ public KeyPair getKeyPair() {
+ return kp;
+ }
+
+ @Override
+ public void run() throws TestException {
+ try {
+ if (spec != null) {
+ kpg.initialize(spec);
+ } else if (keysize != 0) {
+ kpg.initialize(keysize);
+ }
+ } catch (InvalidAlgorithmParameterException e) {
+ hasRun = true;
+ ok = false;
+ return;
+ }
+ kp = kpg.genKeyPair();
+ hasRun = true;
+ ok = true;
+ }
+}
diff --git a/src/cz/crcs/ectester/standalone/test/SignatureTest.java b/src/cz/crcs/ectester/standalone/test/SignatureTest.java
new file mode 100644
index 0000000..9746b91
--- /dev/null
+++ b/src/cz/crcs/ectester/standalone/test/SignatureTest.java
@@ -0,0 +1,42 @@
+package cz.crcs.ectester.standalone.test;
+
+import cz.crcs.ectester.common.test.Result;
+import cz.crcs.ectester.common.test.SimpleTest;
+import cz.crcs.ectester.common.test.TestCallback;
+import cz.crcs.ectester.common.test.TestException;
+
+/**
+ * @author Jan Jancar johny@neuromancer.sk
+ */
+public class SignatureTest extends SimpleTest<SignatureTestable> {
+ private SignatureTest(SignatureTestable sig, TestCallback<SignatureTestable> callback) {
+ super(sig, callback);
+ }
+
+ public static SignatureTest expect(SignatureTestable kg, Result.ExpectedValue expected) {
+ return new SignatureTest(kg, new TestCallback<SignatureTestable>() {
+ @Override
+ public Result apply(SignatureTestable signatureTestable) {
+ return new Result(Result.Value.fromExpected(expected, signatureTestable.ok(), signatureTestable.error()));
+ }
+ });
+ }
+
+ public static SignatureTest function(SignatureTestable ka, TestCallback<SignatureTestable> callback) {
+ return new SignatureTest(ka, callback);
+ }
+
+ @Override
+ public String getDescription() {
+ return "Signature " + testable.getSig().getAlgorithm();
+ }
+
+ @Override
+ public void run() throws TestException {
+ if (hasRun)
+ return;
+ testable.run();
+ result = callback.apply(testable);
+ hasRun = true;
+ }
+}
diff --git a/src/cz/crcs/ectester/standalone/test/SignatureTestable.java b/src/cz/crcs/ectester/standalone/test/SignatureTestable.java
new file mode 100644
index 0000000..e434337
--- /dev/null
+++ b/src/cz/crcs/ectester/standalone/test/SignatureTestable.java
@@ -0,0 +1,107 @@
+package cz.crcs.ectester.standalone.test;
+
+import cz.crcs.ectester.common.test.BaseTestable;
+import cz.crcs.ectester.common.test.TestException;
+
+import java.security.InvalidKeyException;
+import java.security.SecureRandom;
+import java.security.Signature;
+import java.security.SignatureException;
+import java.security.interfaces.ECPrivateKey;
+import java.security.interfaces.ECPublicKey;
+
+public class SignatureTestable extends BaseTestable {
+ private Signature sig;
+ private ECPrivateKey signKey;
+ private ECPublicKey verifyKey;
+ private KeyGeneratorTestable kgt;
+ private byte[] data;
+ private byte[] signature;
+ private boolean verified;
+
+ public SignatureTestable(Signature sig, ECPrivateKey signKey, ECPublicKey verifyKey, byte[] data) {
+ this.sig = sig;
+ this.signKey = signKey;
+ this.verifyKey = verifyKey;
+ this.data = data;
+ if (data == null) {
+ SecureRandom random = new SecureRandom();
+ this.data = new byte[32];
+ random.nextBytes(this.data);
+ }
+ }
+
+ public SignatureTestable(Signature sig, KeyGeneratorTestable kgt, byte[] data) {
+ this(sig, null, null, data);
+ this.kgt = kgt;
+ }
+
+ public Signature getSig() {
+ return sig;
+ }
+
+ public byte[] getData() {
+ return data;
+ }
+
+ public byte[] getSignature() {
+ return signature;
+ }
+
+ public boolean getVerified() {
+ return verified;
+ }
+
+ @Override
+ public void run() throws TestException {
+ if (kgt != null) {
+ signKey = (ECPrivateKey) kgt.getKeyPair().getPrivate();
+ verifyKey = (ECPublicKey) kgt.getKeyPair().getPublic();
+ }
+
+ try {
+ sig.initSign(signKey);
+ } catch (InvalidKeyException e) {
+ throw new TestException(e);
+ }
+
+ try {
+ sig.update(data);
+ } catch (SignatureException e) {
+ ok = false;
+ hasRun = true;
+ return;
+ }
+
+ try {
+ signature = sig.sign();
+ } catch (SignatureException e) {
+ ok = false;
+ hasRun = true;
+ return;
+ }
+
+ try {
+ sig.initVerify(verifyKey);
+ } catch (InvalidKeyException e) {
+ throw new TestException(e);
+ }
+
+ try {
+ sig.update(data);
+ } catch (SignatureException e) {
+ ok = false;
+ hasRun = true;
+ return;
+ }
+
+ try {
+ verified = sig.verify(signature);
+ } catch (SignatureException e) {
+ ok = false;
+ hasRun = true;
+ }
+ ok = true;
+ hasRun = true;
+ }
+}
diff --git a/src/cz/crcs/ectester/standalone/test/StandaloneDefaultSuite.java b/src/cz/crcs/ectester/standalone/test/StandaloneDefaultSuite.java
new file mode 100644
index 0000000..42d2e54
--- /dev/null
+++ b/src/cz/crcs/ectester/standalone/test/StandaloneDefaultSuite.java
@@ -0,0 +1,76 @@
+package cz.crcs.ectester.standalone.test;
+
+import cz.crcs.ectester.common.cli.TreeCommandLine;
+import cz.crcs.ectester.common.ec.EC_Curve;
+import cz.crcs.ectester.common.output.TestWriter;
+import cz.crcs.ectester.common.test.Result;
+import cz.crcs.ectester.data.EC_Store;
+import cz.crcs.ectester.standalone.ECTesterStandalone;
+import cz.crcs.ectester.standalone.consts.KeyAgreementIdent;
+import cz.crcs.ectester.standalone.consts.KeyPairGeneratorIdent;
+import cz.crcs.ectester.standalone.consts.SignatureIdent;
+
+import javax.crypto.KeyAgreement;
+import java.security.KeyPairGenerator;
+import java.security.Signature;
+import java.security.spec.ECParameterSpec;
+
+/**
+ * @author Jan Jancar johny@neuromancer.sk
+ */
+public class StandaloneDefaultSuite extends StandaloneTestSuite {
+
+ public StandaloneDefaultSuite(TestWriter writer, ECTesterStandalone.Config cfg, TreeCommandLine cli) {
+ super(writer, cfg, cli, "default", "The default test suite run basic support of ECDH and ECDSA.");
+ }
+
+ @Override
+ protected void runTests() throws Exception {
+ String kpgAlgo = cli.getOptionValue("test.kpg-type", "EC");
+ String kaAlgo = cli.getOptionValue("test.ka-type");
+ String sigAlgo = cli.getOptionValue("test.sig-type");
+
+ KeyPairGeneratorIdent kpgIdent = cfg.selected.getKPGs().stream()
+ .filter((ident) -> ident.contains(kpgAlgo))
+ .findFirst().get();
+ KeyPairGenerator kpg = kpgIdent.getInstance(cfg.selected.getProvider());
+
+ KeyGeneratorTestable kgtOne;
+ KeyGeneratorTestable kgtOther;
+ ECParameterSpec spec = null;
+ if (cli.hasOption("test.bits")) {
+ int bits = Integer.parseInt(cli.getOptionValue("test.bits"));
+ kgtOne = new KeyGeneratorTestable(kpg, bits);
+ kgtOther = new KeyGeneratorTestable(kpg, bits);
+ } else if (cli.hasOption("test.named-curve")) {
+ String curveName = cli.getOptionValue("test.named-curve");
+ EC_Curve curve = EC_Store.getInstance().getObject(EC_Curve.class, curveName);
+ if (curve == null) {
+ System.err.println("Curve not found: " + curveName);
+ return;
+ }
+ spec = curve.toSpec();
+ kgtOne = new KeyGeneratorTestable(kpg, spec);
+ kgtOther = new KeyGeneratorTestable(kpg, spec);
+ } else {
+ kgtOne = new KeyGeneratorTestable(kpg);
+ kgtOther = new KeyGeneratorTestable(kpg);
+ }
+
+ doTest(KeyGeneratorTest.expect(kgtOne, Result.ExpectedValue.SUCCESS));
+ doTest(KeyGeneratorTest.expect(kgtOther, Result.ExpectedValue.SUCCESS));
+
+ for (KeyAgreementIdent kaIdent : cfg.selected.getKAs()) {
+ if (kaAlgo == null || kaIdent.contains(kaAlgo)) {
+ KeyAgreement ka = kaIdent.getInstance(cfg.selected.getProvider());
+ doTest(KeyAgreementTest.expect(new KeyAgreementTestable(ka, kgtOne, kgtOther, spec), Result.ExpectedValue.SUCCESS));
+ }
+ }
+ for (SignatureIdent sigIdent : cfg.selected.getSigs()) {
+ if (sigAlgo == null || sigIdent.contains(sigAlgo)) {
+ Signature sig = sigIdent.getInstance(cfg.selected.getProvider());
+ doTest(SignatureTest.expect(new SignatureTestable(sig, kgtOne, null), Result.ExpectedValue.SUCCESS));
+ }
+ }
+ }
+}
diff --git a/src/cz/crcs/ectester/standalone/test/StandaloneTestSuite.java b/src/cz/crcs/ectester/standalone/test/StandaloneTestSuite.java
new file mode 100644
index 0000000..ad404c8
--- /dev/null
+++ b/src/cz/crcs/ectester/standalone/test/StandaloneTestSuite.java
@@ -0,0 +1,23 @@
+package cz.crcs.ectester.standalone.test;
+
+import cz.crcs.ectester.common.cli.TreeCommandLine;
+import cz.crcs.ectester.common.output.TestWriter;
+import cz.crcs.ectester.common.test.TestSuite;
+import cz.crcs.ectester.data.EC_Store;
+import cz.crcs.ectester.standalone.ECTesterStandalone;
+
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * @author Jan Jancar johny@neuromancer.sk
+ */
+public abstract class StandaloneTestSuite extends TestSuite {
+ TreeCommandLine cli;
+ ECTesterStandalone.Config cfg;
+
+ public StandaloneTestSuite(TestWriter writer, ECTesterStandalone.Config cfg, TreeCommandLine cli, String name, String description) {
+ super(writer, name, description);
+ this.cfg = cfg;
+ this.cli = cli;
+ }
+}