aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/LIBS.md16
-rw-r--r--lib/bcprov-jdk15on-1.58.jarbin0 -> 3955990 bytes
-rw-r--r--nbproject/standalone/manifest.mf2
-rw-r--r--nbproject/standalone/project.properties1
-rw-r--r--src/cz/crcs/ectester/common/ec/EC_Data.java8
-rw-r--r--src/cz/crcs/ectester/common/ec/EC_Params.java43
-rw-r--r--src/cz/crcs/ectester/reader/ECTesterReader.java2
-rw-r--r--src/cz/crcs/ectester/reader/test/TestVectorSuite.java4
-rw-r--r--src/cz/crcs/ectester/standalone/ECTesterStandalone.java86
-rw-r--r--src/cz/crcs/ectester/standalone/libs/BouncyCastleLib.java21
10 files changed, 175 insertions, 8 deletions
diff --git a/docs/LIBS.md b/docs/LIBS.md
new file mode 100644
index 0000000..97a80ec
--- /dev/null
+++ b/docs/LIBS.md
@@ -0,0 +1,16 @@
+# Libraries
+
+Libraries with at least some ECC support:
+
+ - [BouncyCastle](https://bouncycastle.org/java.html)
+ - [Botan](https://botan.randombit.net/)
+ - [Crypto++](https://cryptopp.com/)
+ - [libgcrypt](https://www.gnupg.org/related_software/libgcrypt/)
+ - [libtomcrypt](http://www.libtom.net/LibTomCrypt/)
+ - [mbedTLS](https://tls.mbed.org/)
+ - [Nettle](http://www.lysator.liu.se/~nisse/nettle/)
+ - [OpenSSL](https://www.openssl.org/)
+ - [OpenSSL (FIPS mode)](https://www.openssl.org/docs/fipsnotes.html)
+ - [Sun EC](https://docs.oracle.com/javase/7/docs/technotes/guides/security/SunProviders.html#SunEC)
+ - [Microsoft CNG](https://msdn.microsoft.com/en-us/library/windows/desktop/aa376210(v=vs.85).aspx)
+ - [Microsoft .NET crypto](https://docs.microsoft.com/en-us/dotnet/standard/security/cryptography-model) \ No newline at end of file
diff --git a/lib/bcprov-jdk15on-1.58.jar b/lib/bcprov-jdk15on-1.58.jar
new file mode 100644
index 0000000..dae02cb
--- /dev/null
+++ b/lib/bcprov-jdk15on-1.58.jar
Binary files differ
diff --git a/nbproject/standalone/manifest.mf b/nbproject/standalone/manifest.mf
index 316e308..02f1e3e 100644
--- a/nbproject/standalone/manifest.mf
+++ b/nbproject/standalone/manifest.mf
@@ -1,4 +1,4 @@
Manifest-Version: 1.0
-Class-Path: lib/jcardsim-3.0.4-SNAPSHOT.jar lib/commons-cli-1.3.1.jar lib/snakeyaml-1.19.jar
+Class-Path: lib/bcprov-jdk15on-1.58.jar lib/jcardsim-3.0.4-SNAPSHOT.jar lib/commons-cli-1.3.1.jar lib/snakeyaml-1.19.jar
Main-Class: cz.crcs.ectester.standalone.ECTesterStandalone
diff --git a/nbproject/standalone/project.properties b/nbproject/standalone/project.properties
index 1952f1d..367ec51 100644
--- a/nbproject/standalone/project.properties
+++ b/nbproject/standalone/project.properties
@@ -33,6 +33,7 @@ excludes=
includes=**/common/**,**/standalone/**,**/data/**,**/applet/*
jar.compress=false
javac.classpath=\
+ lib/bcprov-jdk15on-1.58.jar:\
lib/jcardsim-3.0.4-SNAPSHOT.jar:\
lib/commons-cli-1.3.1.jar:\
lib/snakeyaml-1.19.jar
diff --git a/src/cz/crcs/ectester/common/ec/EC_Data.java b/src/cz/crcs/ectester/common/ec/EC_Data.java
index d308261..acd282a 100644
--- a/src/cz/crcs/ectester/common/ec/EC_Data.java
+++ b/src/cz/crcs/ectester/common/ec/EC_Data.java
@@ -55,12 +55,12 @@ public abstract class EC_Data {
return data;
}
- public boolean hasData() {
- return data != null;
+ public byte[] getData(int index) {
+ return data[index];
}
- public byte[] getParam(int index) {
- return data[index];
+ public boolean hasData() {
+ return data != null;
}
public byte[] flatten() {
diff --git a/src/cz/crcs/ectester/common/ec/EC_Params.java b/src/cz/crcs/ectester/common/ec/EC_Params.java
index d50ebb0..3fada93 100644
--- a/src/cz/crcs/ectester/common/ec/EC_Params.java
+++ b/src/cz/crcs/ectester/common/ec/EC_Params.java
@@ -44,6 +44,49 @@ public class EC_Params extends EC_Data {
return params;
}
+ public byte[][] getParam(short param) {
+ if (!hasParam(param)) {
+ return null;
+ }
+ if (Integer.bitCount(param) != 1) {
+ return null;
+ }
+ short paramMask = EC_Consts.PARAMETER_FP;
+ byte[][] result = null;
+ int i = 0;
+ while (paramMask <= EC_Consts.PARAMETER_S) {
+ short masked = (short) (this.params & param & paramMask);
+ short shallow = (short) (this.params & paramMask);
+ if (masked != 0) {
+ if (masked == EC_Consts.PARAMETER_F2M) {
+ result = new byte[4][];
+ result[0] = data[i].clone();
+ result[1] = data[i+1].clone();
+ result[2] = data[i+2].clone();
+ result[3] = data[i+3].clone();
+ break;
+ }
+ if (masked == EC_Consts.PARAMETER_G || masked == EC_Consts.PARAMETER_W) {
+ result = new byte[2][];
+ result[0] = data[i].clone();
+ result[1] = data[i+1].clone();
+ break;
+ }
+ result = new byte[1][];
+ result[0] = data[i].clone();
+ }
+ if (shallow == EC_Consts.PARAMETER_F2M) {
+ i += 4;
+ } else if (shallow == EC_Consts.PARAMETER_G || shallow == EC_Consts.PARAMETER_W) {
+ i += 2;
+ } else if (shallow != 0) {
+ i++;
+ }
+ paramMask = (short) (paramMask << 1);
+ }
+ return result;
+ }
+
public boolean hasParam(short param) {
return (params & param) != 0;
}
diff --git a/src/cz/crcs/ectester/reader/ECTesterReader.java b/src/cz/crcs/ectester/reader/ECTesterReader.java
index e13a683..0bbe8f7 100644
--- a/src/cz/crcs/ectester/reader/ECTesterReader.java
+++ b/src/cz/crcs/ectester/reader/ECTesterReader.java
@@ -63,7 +63,7 @@ public class ECTesterReader {
private Options opts = new Options();
private static final String VERSION = "v0.1.0";
- private static final String DESCRIPTION = "ECTesterReader " + VERSION + ", a javacard Elliptic Curve Cryptograhy support tester/utility.";
+ private static final String DESCRIPTION = "ECTesterReader " + VERSION + ", a javacard Elliptic Curve Cryptography support tester/utility.";
private static final String LICENSE = "MIT Licensed\nCopyright (c) 2016-2017 Petr Svenda <petr@svenda.com>";
private static final String CLI_HEADER = "\n" + DESCRIPTION + "\n\n";
private static final String CLI_FOOTER = "\n" + LICENSE;
diff --git a/src/cz/crcs/ectester/reader/test/TestVectorSuite.java b/src/cz/crcs/ectester/reader/test/TestVectorSuite.java
index 668056b..3f11a79 100644
--- a/src/cz/crcs/ectester/reader/test/TestVectorSuite.java
+++ b/src/cz/crcs/ectester/reader/test/TestVectorSuite.java
@@ -72,8 +72,8 @@ public class TestVectorSuite extends TestSuite {
return new Result(Value.FAILURE, "ECDH was unsuccessful.");
if (!dh.hasSecret())
return new Result(Value.FAILURE, "ECDH response did not contain the derived secret.");
- if (!Util.compareBytes(dh.getSecret(), 0, result.getParam(0), 0, dh.secretLength())) {
- int firstDiff = Util.diffBytes(dh.getSecret(), 0, result.getParam(0), 0, dh.secretLength());
+ if (!Util.compareBytes(dh.getSecret(), 0, result.getData(0), 0, dh.secretLength())) {
+ int firstDiff = Util.diffBytes(dh.getSecret(), 0, result.getData(0), 0, dh.secretLength());
return new Result(Value.FAILURE, "ECDH derived secret does not match the test, first difference was at byte " + String.valueOf(firstDiff) + ".");
}
return new Result(Value.SUCCESS);
diff --git a/src/cz/crcs/ectester/standalone/ECTesterStandalone.java b/src/cz/crcs/ectester/standalone/ECTesterStandalone.java
index cae4bb9..d2cbce1 100644
--- a/src/cz/crcs/ectester/standalone/ECTesterStandalone.java
+++ b/src/cz/crcs/ectester/standalone/ECTesterStandalone.java
@@ -1,8 +1,90 @@
package cz.crcs.ectester.standalone;
+import cz.crcs.ectester.common.Util;
+import cz.crcs.ectester.applet.EC_Consts;
+import cz.crcs.ectester.common.ec.EC_Curve;
+import cz.crcs.ectester.data.EC_Store;
+import org.apache.commons.cli.*;
+
+import java.io.IOException;
+
+/**
+ * Standalone part of ECTester, a tool for testing Elliptic curve implementations in software libraries.
+ *
+ * @author Jan Jancar johny@neuromancer.sk
+ * @version v0.1.0
+ */
public class ECTesterStandalone {
+ private EC_Store dataStore;
+ private Config cfg;
+
+ private Options opts = new Options();
+ private static final String VERSION = "v0.1.0";
+ private static final String DESCRIPTION = "ECTesterStandalone " + VERSION + ", an Elliptic Curve Cryptography support tester/utility.";
+ private static final String LICENSE = "MIT Licensed\nCopyright (c) 2016-2017 Petr Svenda <petr@svenda.com>";
+ private static final String CLI_HEADER = "\n" + DESCRIPTION + "\n\n";
+ private static final String CLI_FOOTER = "\n" + LICENSE;
+
private void run(String[] args) {
+ try {
+ CommandLine cli = parseArgs(args);
+
+ if (cli.hasOption("help")) {
+ help();
+ return;
+ } else if (cli.hasOption("version")) {
+ version();
+ return;
+ }
+
+ cfg = new Config();
+ dataStore = new EC_Store();
+
+ if (cli.hasOption("generate")) {
+ generate();
+ }
+
+ } catch (ParseException | IOException ex) {
+ System.err.println(ex.getMessage());
+ }
+ }
+
+ private CommandLine parseArgs(String[] args) throws ParseException {
+ OptionGroup actions = new OptionGroup();
+ actions.setRequired(true);
+ actions.addOption(Option.builder("V").longOpt("version").desc("Print version info.").build());
+ actions.addOption(Option.builder("h").longOpt("help").desc("Print help.").build());
+ actions.addOption(Option.builder("g").longOpt("generate").desc("Generate [amount] of EC keys.").hasArg().argName("amount").optionalArg(true).build());
+ opts.addOptionGroup(actions);
+
+ CommandLineParser parser = new DefaultParser();
+ return parser.parse(opts, args);
+ }
+
+ /**
+ * Prints help.
+ */
+ private void help() {
+ HelpFormatter help = new HelpFormatter();
+ help.setOptionComparator(null);
+ help.printHelp("ECTesterStandalone.jar", CLI_HEADER, opts, CLI_FOOTER, true);
+ }
+
+ /**
+ * Prints version info.
+ */
+ private void version() {
+ System.out.println(DESCRIPTION);
+ System.out.println(LICENSE);
+ }
+
+ /**
+ *
+ */
+ private void generate() {
+ EC_Curve curve = dataStore.getObject(EC_Curve.class, "secg/secp192r1");
+ byte[] fp = curve.getParam(EC_Consts.PARAMETER_FP)[0];
}
@@ -10,4 +92,8 @@ public class ECTesterStandalone {
ECTesterStandalone app = new ECTesterStandalone();
app.run(args);
}
+
+ public static class Config {
+
+ }
}
diff --git a/src/cz/crcs/ectester/standalone/libs/BouncyCastleLib.java b/src/cz/crcs/ectester/standalone/libs/BouncyCastleLib.java
new file mode 100644
index 0000000..78da737
--- /dev/null
+++ b/src/cz/crcs/ectester/standalone/libs/BouncyCastleLib.java
@@ -0,0 +1,21 @@
+package cz.crcs.ectester.standalone.libs;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+
+import java.security.Security;
+
+public class BouncyCastleLib {
+
+ public BouncyCastleLib() {
+
+ }
+
+ public boolean setUp() {
+ try {
+ Security.addProvider(new BouncyCastleProvider());
+ } catch (NullPointerException | SecurityException ignored) {
+ return false;
+ }
+ return true;
+ }
+
+}