aboutsummaryrefslogtreecommitdiff
path: root/src/cz/crcs/ectester/reader
diff options
context:
space:
mode:
authorJ08nY2017-03-26 00:20:29 +0100
committerJ08nY2017-03-26 00:20:29 +0100
commitde1736c211dc8d27961ef0495c82d25fbf813e05 (patch)
tree34bb31a99e8b82dd707c80ed971d7687bdc023de /src/cz/crcs/ectester/reader
parent66516ffeaca12b9cc9811c1dd948fc2cd2564c29 (diff)
downloadECTester-de1736c211dc8d27961ef0495c82d25fbf813e05.tar.gz
ECTester-de1736c211dc8d27961ef0495c82d25fbf813e05.tar.zst
ECTester-de1736c211dc8d27961ef0495c82d25fbf813e05.zip
Refactored EC_Params, renamed EC_Data, added first test vectors.
Diffstat (limited to 'src/cz/crcs/ectester/reader')
-rw-r--r--src/cz/crcs/ectester/reader/ECTester.java139
-rw-r--r--src/cz/crcs/ectester/reader/ec/EC_Data.java135
-rw-r--r--src/cz/crcs/ectester/reader/ec/EC_Params.java111
3 files changed, 235 insertions, 150 deletions
diff --git a/src/cz/crcs/ectester/reader/ECTester.java b/src/cz/crcs/ectester/reader/ECTester.java
index 2f26275..247a260 100644
--- a/src/cz/crcs/ectester/reader/ECTester.java
+++ b/src/cz/crcs/ectester/reader/ECTester.java
@@ -24,7 +24,7 @@ package cz.crcs.ectester.reader;
import cz.crcs.ectester.applet.ECTesterApplet;
import cz.crcs.ectester.applet.EC_Consts;
import cz.crcs.ectester.data.EC_Category;
-import cz.crcs.ectester.data.EC_Data;
+import cz.crcs.ectester.data.EC_Store;
import cz.crcs.ectester.reader.ec.EC_Curve;
import cz.crcs.ectester.reader.ec.EC_Key;
import cz.crcs.ectester.reader.ec.EC_Keypair;
@@ -47,7 +47,7 @@ public class ECTester {
private CardMngr cardManager;
private DirtyLogger systemOutLogger;
- private EC_Data dataDB;
+ private EC_Store dataStore;
//Options
private int optBits;
@@ -108,7 +108,7 @@ public class ECTester {
return;
}
- dataDB = new EC_Data();
+ dataStore = new EC_Store();
//if list, print and quit
if (cli.hasOption("list-named")) {
list();
@@ -462,7 +462,7 @@ public class ECTester {
* List categories and named curves.
*/
private void list() {
- Map<String, EC_Category> categories = dataDB.getCategories();
+ Map<String, EC_Category> categories = dataStore.getCategories();
for (EC_Category cat : categories.values()) {
System.out.println("\t- " + cat.getName() + ": " + (cat.getDesc() == null ? "" : cat.getDesc()));
@@ -597,34 +597,16 @@ public class ECTester {
List<Command> commands = new LinkedList<>();
if (optTestCase.equalsIgnoreCase("default")) {
- if (optAll) {
- if (optNamedCurve != null) {
- Map<String, EC_Curve> curves = dataDB.getObjects(EC_Curve.class, optNamedCurve);
- if (optPrimeField) {
- for (Map.Entry<String, EC_Curve> entry : curves.entrySet()) {
- EC_Curve curve = entry.getValue();
- if (curve.getField() == KeyPair.ALG_EC_FP) {
- commands.add(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, curve.getBits(), KeyPair.ALG_EC_FP));
- byte[] external = curve.flatten();
- commands.add(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), external));
- commands.addAll(testCurve());
- commands.add(new Command.Cleanup(cardManager));
- }
- }
- }
- if (optBinaryField) {
- for (Map.Entry<String, EC_Curve> entry : curves.entrySet()) {
- EC_Curve curve = entry.getValue();
- if (curve.getField() == KeyPair.ALG_EC_F2M) {
- commands.add(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, curve.getBits(), KeyPair.ALG_EC_F2M));
- byte[] external = curve.flatten();
- commands.add(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), external));
- commands.addAll(testCurve());
- commands.add(new Command.Cleanup(cardManager));
- }
- }
- }
- } else {
+
+ if (optNamedCurve != null) {
+ if (optPrimeField) {
+ commands.addAll(testCurves(optNamedCurve, KeyPair.ALG_EC_FP));
+ }
+ if (optBinaryField) {
+ commands.addAll(testCurves(optNamedCurve, KeyPair.ALG_EC_F2M));
+ }
+ } else {
+ if (optAll) {
if (optPrimeField) {
//iterate over prime curve sizes used: EC_Consts.FP_SIZES
for (short keyLength : EC_Consts.FP_SIZES) {
@@ -643,32 +625,41 @@ public class ECTester {
commands.add(new Command.Cleanup(cardManager));
}
}
- }
- } else {
- if (optPrimeField) {
- commands.add(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, (short) optBits, KeyPair.ALG_EC_FP));
- commands.addAll(prepareCurve(ECTesterApplet.KEYPAIR_BOTH, (short) optBits, KeyPair.ALG_EC_FP));
- commands.addAll(testCurve());
- commands.add(new Command.Cleanup(cardManager));
- }
+ } else {
+ if (optPrimeField) {
+ commands.add(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, (short) optBits, KeyPair.ALG_EC_FP));
+ commands.addAll(prepareCurve(ECTesterApplet.KEYPAIR_BOTH, (short) optBits, KeyPair.ALG_EC_FP));
+ commands.addAll(testCurve());
+ commands.add(new Command.Cleanup(cardManager));
+ }
- if (optBinaryField) {
- commands.add(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, (short) optBits, KeyPair.ALG_EC_F2M));
- commands.addAll(prepareCurve(ECTesterApplet.KEYPAIR_BOTH, (short) optBits, KeyPair.ALG_EC_F2M));
- commands.addAll(testCurve());
- commands.add(new Command.Cleanup(cardManager));
+ if (optBinaryField) {
+ commands.add(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, (short) optBits, KeyPair.ALG_EC_F2M));
+ commands.addAll(prepareCurve(ECTesterApplet.KEYPAIR_BOTH, (short) optBits, KeyPair.ALG_EC_F2M));
+ commands.addAll(testCurve());
+ commands.add(new Command.Cleanup(cardManager));
+ }
}
}
} else if (optTestCase.equalsIgnoreCase("wrong")) {
-
+ if (optPrimeField) {
+ commands.addAll(testCurves("wrong", KeyPair.ALG_EC_FP));
+ }
+ if (optBinaryField) {
+ commands.addAll(testCurves("wrong", KeyPair.ALG_EC_F2M));
+ }
} else if (optTestCase.equalsIgnoreCase("non-prime")) {
+ } else if (optTestCase.equalsIgnoreCase("smallpub")) {
+
} else if (optTestCase.equalsIgnoreCase("invalid")) {
}
List<Response> test = Command.sendAll(commands);
systemOutLogger.println(Response.toString(test));
+
+ //
}
/**
@@ -685,15 +676,14 @@ public class ECTester {
systemOutLogger.println(Response.toString(prepare));
+ byte pubkey = (optAnyPublic || optAnyKey) ? ECTesterApplet.KEYPAIR_REMOTE : ECTesterApplet.KEYPAIR_LOCAL;
+ byte privkey = (optAnyPrivate || optAnyKey) ? ECTesterApplet.KEYPAIR_REMOTE : ECTesterApplet.KEYPAIR_LOCAL;
+
List<Command> generate = new LinkedList<>();
+ generate.add(new Command.Generate(cardManager, ECTesterApplet.KEYPAIR_BOTH));
if (optAnyPublic || optAnyPrivate || optAnyKey) {
- generate.add(new Command.Generate(cardManager, ECTesterApplet.KEYPAIR_LOCAL));
generate.add(prepareKey(ECTesterApplet.KEYPAIR_REMOTE));
- } else {
- generate.add(new Command.Generate(cardManager, ECTesterApplet.KEYPAIR_BOTH));
}
- byte pubkey = (optAnyPublic || optAnyKey) ? ECTesterApplet.KEYPAIR_REMOTE : ECTesterApplet.KEYPAIR_LOCAL;
- byte privkey = (optAnyPrivate || optAnyKey) ? ECTesterApplet.KEYPAIR_REMOTE : ECTesterApplet.KEYPAIR_LOCAL;
FileWriter out = null;
if (optOutput != null) {
@@ -816,7 +806,7 @@ public class ECTester {
} else if (optNamedCurve != null) {
// Set a named curve.
// parse optNamedCurve -> cat / id | cat | id
- EC_Curve curve = dataDB.getObject(EC_Curve.class, optNamedCurve);
+ EC_Curve curve = dataStore.getObject(EC_Curve.class, optNamedCurve);
if (curve == null) {
throw new IOException("Curve could no be found.");
}
@@ -873,7 +863,7 @@ public class ECTester {
keypair.readCSV(in);
in.close();
} else {
- keypair = dataDB.getObject(EC_Keypair.class, optNamedKey);
+ keypair = dataStore.getObject(EC_Keypair.class, optNamedKey);
}
data = keypair.flatten();
@@ -892,12 +882,15 @@ public class ECTester {
pub.readCSV(in);
in.close();
} else {
- pub = dataDB.getObject(EC_Key.Public.class, optNamedPublic);
+ pub = dataStore.getObject(EC_Key.Public.class, optNamedPublic);
+ if (pub == null) {
+ pub = dataStore.getObject(EC_Keypair.class, optNamedPublic);
+ }
}
- byte[] pubkey = pub.flatten();
+ byte[] pubkey = pub.flatten(EC_Consts.PARAMETER_W);
if (pubkey == null) {
- throw new IOException("Couldn't read the key file correctly.");
+ throw new IOException("Couldn't read the public key file correctly.");
}
data = pubkey;
}
@@ -911,12 +904,15 @@ public class ECTester {
priv.readCSV(in);
in.close();
} else {
- priv = dataDB.getObject(EC_Key.Public.class, optNamedPrivate);
+ priv = dataStore.getObject(EC_Key.Public.class, optNamedPrivate);
+ if (priv == null) {
+ priv = dataStore.getObject(EC_Keypair.class, optNamedPrivate);
+ }
}
- byte[] privkey = priv.flatten();
+ byte[] privkey = priv.flatten(EC_Consts.PARAMETER_S);
if (privkey == null) {
- throw new IOException("Couldn't read the key file correctly.");
+ throw new IOException("Couldn't read the private key file correctly.");
}
data = Util.concatenate(data, privkey);
}
@@ -939,6 +935,31 @@ public class ECTester {
return commands;
}
+ /**
+ * @param category
+ * @param field
+ * @return
+ * @throws IOException
+ */
+ private List<Command> testCurves(String category, byte field) throws IOException {
+ List<Command> commands = new LinkedList<>();
+ Map<String, EC_Curve> curves = dataStore.getObjects(EC_Curve.class, category);
+ if (curves == null)
+ return commands;
+ for (Map.Entry<String, EC_Curve> entry : curves.entrySet()) {
+ EC_Curve curve = entry.getValue();
+ if (curve.getField() == field && (curve.getBits() == optBits || optAll)) {
+ commands.add(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, curve.getBits(), field));
+ byte[] external = curve.flatten();
+ commands.add(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), external));
+ commands.addAll(testCurve());
+ commands.add(new Command.Cleanup(cardManager));
+ }
+ }
+
+ return commands;
+ }
+
public static void main(String[] args) {
ECTester app = new ECTester();
app.run(args);
diff --git a/src/cz/crcs/ectester/reader/ec/EC_Data.java b/src/cz/crcs/ectester/reader/ec/EC_Data.java
new file mode 100644
index 0000000..c1fb54c
--- /dev/null
+++ b/src/cz/crcs/ectester/reader/ec/EC_Data.java
@@ -0,0 +1,135 @@
+package cz.crcs.ectester.reader.ec;
+
+import cz.crcs.ectester.reader.Util;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Scanner;
+import java.util.regex.Pattern;
+
+/**
+ * @author Jan Jancar johny@neuromancer.sk
+ */
+public class EC_Data {
+ private static final Pattern hex = Pattern.compile("(0x|0X)?[a-fA-F\\d]+");
+
+ int count;
+ byte[][] data;
+
+ EC_Data() {
+ }
+
+ public EC_Data(int count) {
+ this.count = count;
+ this.data = new byte[count][];
+ }
+
+ public EC_Data(byte[][] data) {
+ this.count = data.length;
+ this.data = data;
+ }
+
+ public byte[][] getData() {
+ return data;
+ }
+
+ public boolean hasData() {
+ return data != null;
+ }
+
+ public byte[] flatten() {
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ for (byte[] param : data) {
+ byte[] length = new byte[2];
+ Util.setShort(length, 0, (short) param.length);
+
+ out.write(length, 0, 2);
+ out.write(param, 0, param.length);
+ }
+
+ return out.toByteArray();
+ }
+
+ public String[] expand() {
+ List<String> out = new ArrayList<>(count);
+ for (byte[] param : data) {
+ out.add(Util.bytesToHex(param, false));
+ }
+
+ return out.toArray(new String[out.size()]);
+ }
+
+ private static byte[] pad(byte[] data) {
+ if (data.length == 1) {
+ return new byte[]{(byte) 0, data[0]};
+ } else if (data.length == 0 || data.length > 2) {
+ return data;
+ }
+ return null;
+ }
+
+ private static byte[] parse(String param) {
+ byte[] data;
+ if (param.startsWith("0x") || param.startsWith("0X")) {
+ data = Util.hexToBytes(param.substring(2));
+ } else {
+ data = Util.hexToBytes(param);
+ }
+ if (data == null)
+ return new byte[0];
+ if (data.length < 2)
+ return pad(data);
+ return data;
+ }
+
+ private boolean readHex(String[] hex) {
+ if (hex.length != count) {
+ return false;
+ }
+
+ for (int i = 0; i < count; ++i) {
+ this.data[i] = parse(hex[i]);
+ }
+ return true;
+ }
+
+ public boolean readCSV(InputStream in) {
+ Scanner s = new Scanner(in);
+
+ s.useDelimiter(",|;");
+ List<String> data = new LinkedList<>();
+ while (s.hasNext()) {
+ String field = s.next();
+ data.add(field.replaceAll("\\s+", ""));
+ }
+
+ if (data.isEmpty()) {
+ return false;
+ }
+ for (String param : data) {
+ if (!hex.matcher(param).matches()) {
+ return false;
+ }
+ }
+ return readHex(data.toArray(new String[data.size()]));
+ }
+
+ public boolean readBytes(byte[] data) {
+ //TODO
+ return false;
+ }
+
+ public void writeCSV(OutputStream out) throws IOException {
+ String[] hex = expand();
+ Writer w = new OutputStreamWriter(out);
+ for (int i = 0; i < hex.length; ++i) {
+ w.write(hex[i]);
+ if (i < hex.length - 1) {
+ w.write(",");
+ }
+ }
+ w.flush();
+ }
+}
diff --git a/src/cz/crcs/ectester/reader/ec/EC_Params.java b/src/cz/crcs/ectester/reader/ec/EC_Params.java
index fa5515c..00747b1 100644
--- a/src/cz/crcs/ectester/reader/ec/EC_Params.java
+++ b/src/cz/crcs/ectester/reader/ec/EC_Params.java
@@ -3,29 +3,25 @@ package cz.crcs.ectester.reader.ec;
import cz.crcs.ectester.applet.EC_Consts;
import cz.crcs.ectester.reader.Util;
-import java.io.*;
+import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
-import java.util.LinkedList;
import java.util.List;
-import java.util.Scanner;
-import java.util.regex.Pattern;
/**
* @author Jan Jancar johny@neuromancer.sk
*/
-public class EC_Params {
- private static final Pattern hex = Pattern.compile("(0x|0X)?[a-fA-F\\d]+");
-
+public class EC_Params extends EC_Data {
private short params;
- private byte[][] data;
public EC_Params(short params) {
this.params = params;
- this.data = new byte[numParams()][];
+ this.count = numParams();
+ this.data = new byte[this.count][];
}
public EC_Params(short params, byte[][] data) {
this.params = params;
+ this.count = data.length;
this.data = data;
}
@@ -45,7 +41,7 @@ public class EC_Params {
if (paramMask == EC_Consts.PARAMETER_F2M) {
num += 3;
}
- if (paramMask == EC_Consts.PARAMETER_W || paramMask == EC_Consts.PARAMETER_G){
+ if (paramMask == EC_Consts.PARAMETER_W || paramMask == EC_Consts.PARAMETER_G) {
num += 1;
}
++num;
@@ -55,32 +51,29 @@ public class EC_Params {
return num;
}
- public byte[][] getData() {
- return data;
- }
-
- public boolean hasData() {
- return data != null;
+ @Override
+ public byte[] flatten() {
+ return flatten(params);
}
- public byte[] flatten() {
+ public byte[] flatten(short params) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
short paramMask = EC_Consts.PARAMETER_FP;
int i = 0;
while (paramMask <= EC_Consts.PARAMETER_S) {
- short masked = (short) (params & paramMask);
+ short masked = (short) (this.params & params & paramMask);
+ short shallow = (short) (this.params & paramMask);
if (masked != 0) {
byte[] param = data[i];
if (masked == EC_Consts.PARAMETER_F2M) {
//add m, e_1, e_2, e_3
param = Util.concatenate(param, data[i + 1], data[i + 2], data[i + 3]);
- i += 3;
if (param.length != 8)
throw new RuntimeException("PARAMETER_F2M length is not 8.(should be)");
}
if (masked == EC_Consts.PARAMETER_G || masked == EC_Consts.PARAMETER_W) {
//read another param (the y coord) and put into X962 format.
- byte[] y = data[++i];
+ byte[] y = data[i + 1];
param = Util.concatenate(new byte[]{4}, param, y); //<- ugly but works!
}
if (param.length == 0)
@@ -92,6 +85,12 @@ public class EC_Params {
out.write(length, 0, 2);
//write data
out.write(param, 0, param.length);
+ }
+ 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);
@@ -100,6 +99,7 @@ public class EC_Params {
return (out.size() == 0) ? null : out.toByteArray();
}
+ @Override
public String[] expand() {
List<String> out = new ArrayList<>();
@@ -136,75 +136,4 @@ public class EC_Params {
return out.toArray(new String[out.size()]);
}
- private static byte[] pad(byte[] data) {
- if (data.length == 1) {
- return new byte[]{(byte) 0, data[0]};
- } else if (data.length == 0 || data.length > 2) {
- return data;
- }
- return null;
- }
-
- private static byte[] parse(String param) {
- byte[] data;
- if (param.startsWith("0x") || param.startsWith("0X")) {
- data = Util.hexToBytes(param.substring(2));
- } else {
- data = Util.hexToBytes(param);
- }
- if (data == null)
- return new byte[0];
- if (data.length < 2)
- return pad(data);
- return data;
- }
-
- private boolean readHex(String[] hex) {
- if (hex.length != numParams()) {
- return false;
- }
-
- for (int i = 0; i < numParams(); ++i) {
- this.data[i] = parse(hex[i]);
- }
- return true;
- }
-
- public boolean readCSV(InputStream in) {
- Scanner s = new Scanner(in);
-
- s.useDelimiter(",|;");
- List<String> data = new LinkedList<String>();
- while (s.hasNext()) {
- String field = s.next();
- data.add(field.replaceAll("\\s+", ""));
- }
-
- if (data.isEmpty()) {
- return false;
- }
- for (String param : data) {
- if (!hex.matcher(param).matches()) {
- return false;
- }
- }
- return readHex(data.toArray(new String[data.size()]));
- }
-
- public void writeCSV(OutputStream out) throws IOException {
- String[] hex = expand();
- Writer w = new OutputStreamWriter(out);
- for (int i = 0; i < hex.length; ++i) {
- w.write(hex[i]);
- if (i < hex.length - 1) {
- w.write(",");
- }
- }
- w.flush();
- }
-
- public boolean readBytes(byte[] data) {
- //TODO
- return false;
- }
}