aboutsummaryrefslogtreecommitdiff
path: root/src/cz/crcs/ectester/reader/ec/EC_Params.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/cz/crcs/ectester/reader/ec/EC_Params.java')
-rw-r--r--src/cz/crcs/ectester/reader/ec/EC_Params.java111
1 files changed, 20 insertions, 91 deletions
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;
- }
}