aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJ08nY2017-03-28 16:04:13 +0200
committerJ08nY2017-03-28 16:04:13 +0200
commit83c963ae78407e7a14ac71096f81254364d1e605 (patch)
tree8218021c6b1c19a38554553039553167e437ef03
parentf66e8e9bf135a064ecadd70114fb921c826ccaca (diff)
downloadECTester-83c963ae78407e7a14ac71096f81254364d1e605.tar.gz
ECTester-83c963ae78407e7a14ac71096f81254364d1e605.tar.zst
ECTester-83c963ae78407e7a14ac71096f81254364d1e605.zip
-rw-r--r--!uploader/ectester.capbin13811 -> 13811 bytes
-rw-r--r--dist/ECTester.jarbin283414 -> 276755 bytes
-rw-r--r--src/cz/crcs/ectester/data/EC_Category.java15
-rw-r--r--src/cz/crcs/ectester/data/EC_Store.java95
-rw-r--r--src/cz/crcs/ectester/data/schema.xsd43
-rw-r--r--src/cz/crcs/ectester/data/test/results.xml174
-rw-r--r--src/cz/crcs/ectester/reader/ECTester.java55
-rw-r--r--src/cz/crcs/ectester/reader/ec/EC_Data.java8
-rw-r--r--src/cz/crcs/ectester/reader/ec/EC_KAResult.java48
9 files changed, 394 insertions, 44 deletions
diff --git a/!uploader/ectester.cap b/!uploader/ectester.cap
index de865a9..6a16aa8 100644
--- a/!uploader/ectester.cap
+++ b/!uploader/ectester.cap
Binary files differ
diff --git a/dist/ECTester.jar b/dist/ECTester.jar
index 977185a..ffe19d1 100644
--- a/dist/ECTester.jar
+++ b/dist/ECTester.jar
Binary files differ
diff --git a/src/cz/crcs/ectester/data/EC_Category.java b/src/cz/crcs/ectester/data/EC_Category.java
index 859b942..57d9ca3 100644
--- a/src/cz/crcs/ectester/data/EC_Category.java
+++ b/src/cz/crcs/ectester/data/EC_Category.java
@@ -1,5 +1,6 @@
package cz.crcs.ectester.data;
+import cz.crcs.ectester.reader.ec.EC_Data;
import cz.crcs.ectester.reader.ec.EC_Params;
import java.util.Collections;
@@ -15,7 +16,7 @@ public class EC_Category {
private String directory;
private String desc;
- private Map<String, EC_Params> objects;
+ private Map<String, EC_Data> objects;
public EC_Category(String name, String directory) {
@@ -28,7 +29,7 @@ public class EC_Category {
this.desc = desc;
}
- public EC_Category(String name, String directory, String desc, Map<String, EC_Params> objects) {
+ public EC_Category(String name, String directory, String desc, Map<String, EC_Data> objects) {
this(name, directory, desc);
this.objects = objects;
}
@@ -45,13 +46,13 @@ public class EC_Category {
return desc;
}
- public Map<String, EC_Params> getObjects() {
+ public Map<String, EC_Data> getObjects() {
return Collections.unmodifiableMap(objects);
}
- public <T extends EC_Params> Map<String, T> getObjects(Class<T> cls) {
+ public <T extends EC_Data> Map<String, T> getObjects(Class<T> cls) {
Map<String, T> objs = new TreeMap<>();
- for (Map.Entry<String, EC_Params> entry : objects.entrySet()) {
+ for (Map.Entry<String, EC_Data> entry : objects.entrySet()) {
if (cls.isInstance(entry.getValue())) {
objs.put(entry.getKey(), cls.cast(entry.getValue()));
}
@@ -59,8 +60,8 @@ public class EC_Category {
return Collections.unmodifiableMap(objs);
}
- public <T extends EC_Params> T getObject(Class<T> cls, String id) {
- EC_Params obj = objects.get(id);
+ public <T extends EC_Data> T getObject(Class<T> cls, String id) {
+ EC_Data obj = objects.get(id);
if (cls.isInstance(obj)) {
return cls.cast(obj);
} else {
diff --git a/src/cz/crcs/ectester/data/EC_Store.java b/src/cz/crcs/ectester/data/EC_Store.java
index aec635e..abf0a9b 100644
--- a/src/cz/crcs/ectester/data/EC_Store.java
+++ b/src/cz/crcs/ectester/data/EC_Store.java
@@ -1,11 +1,8 @@
package cz.crcs.ectester.data;
-import cz.crcs.ectester.reader.ec.EC_Curve;
-import cz.crcs.ectester.reader.ec.EC_Key;
-import cz.crcs.ectester.reader.ec.EC_Keypair;
-import cz.crcs.ectester.reader.ec.EC_Params;
+import cz.crcs.ectester.applet.EC_Consts;
+import cz.crcs.ectester.reader.ec.*;
import javacard.security.KeyPair;
-import org.omg.PortableInterceptor.SYSTEM_EXCEPTION;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
@@ -36,7 +33,7 @@ public class EC_Store {
private Map<String, EC_Category> categories;
- public EC_Store() {
+ public EC_Store() throws IOException {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
@@ -61,18 +58,24 @@ public class EC_Store {
@Override
public void fatalError(SAXParseException exception) throws SAXException {
System.err.println("EC_Store | Fatal : " + exception);
+ throw new SAXException(exception);
}
});
parse();
- } catch (ParserConfigurationException | IOException | SAXException e) {
+ } catch (ParserConfigurationException | SAXException e) {
e.printStackTrace();
}
}
private void parse() throws SAXException, ParserConfigurationException, IOException {
- Document categoriesDoc = db.parse(this.getClass().getResourceAsStream("/cz/crcs/ectester/data/categories.xml"));
+ InputStream categories = this.getClass().getResourceAsStream("/cz/crcs/ectester/data/categories.xml");
+ if (categories == null) {
+ throw new IOException();
+ }
+ Document categoriesDoc = db.parse(categories);
+ categories.close();
categoriesDoc.normalize();
NodeList catList = categoriesDoc.getElementsByTagName("category");
@@ -96,11 +99,11 @@ public class EC_Store {
private EC_Category parseCategory(String name, String dir, String desc) throws ParserConfigurationException, IOException, SAXException {
- Map<String, EC_Params> objMap = new TreeMap<>();
+ Map<String, EC_Data> objMap = new TreeMap<>();
- InputStream curvesStream = this.getClass().getResourceAsStream("/cz/crcs/ectester/data/" + dir + "/curves.xml");
- if (curvesStream != null) {
- Document curvesDoc = db.parse(curvesStream);
+ InputStream curves = this.getClass().getResourceAsStream("/cz/crcs/ectester/data/" + dir + "/curves.xml");
+ if (curves != null) {
+ Document curvesDoc = db.parse(curves);
curvesDoc.normalize();
NodeList curveList = curvesDoc.getElementsByTagName("curve");
@@ -138,11 +141,12 @@ public class EC_Store {
throw new SAXException("?");
}
}
+ curves.close();
}
- InputStream keysStream = this.getClass().getResourceAsStream("/cz/crcs/ectester/data/" + dir + "/keys.xml");
- if (keysStream != null) {
- Document keysDoc = db.parse(keysStream);
+ InputStream keys = this.getClass().getResourceAsStream("/cz/crcs/ectester/data/" + dir + "/keys.xml");
+ if (keys != null) {
+ Document keysDoc = db.parse(keys);
keysDoc.normalize();
NodeList directs = keysDoc.getDocumentElement().getChildNodes();
@@ -174,6 +178,51 @@ public class EC_Store {
throw new SAXException("?");
}
}
+ keys.close();
+ }
+
+ InputStream results = this.getClass().getResourceAsStream("/cz/crcs/ectester/data/" + dir + "/results.xml");
+ if (results != null) {
+ Document resultsDoc = db.parse(results);
+ resultsDoc.normalize();
+
+ NodeList directs = resultsDoc.getDocumentElement().getChildNodes();
+ for (int i = 0; i < directs.getLength(); ++i) {
+ Node direct = directs.item(i);
+ if (direct instanceof Element) {
+ Element elem = (Element) direct;
+
+ Node id = elem.getElementsByTagName("id").item(0);
+ Node ka = elem.getElementsByTagName("ka").item(0);
+ Node file = elem.getElementsByTagName("file").item(0);
+ Node curve = elem.getElementsByTagName("curve").item(0);
+ Node onekey = elem.getElementsByTagName("onekey").item(0);
+ Node otherkey = elem.getElementsByTagName("otherkey").item(0);
+
+ NodeList descc = elem.getElementsByTagName("desc");
+ String descs = null;
+ if (descc.getLength() != 0) {
+ descs = descc.item(0).getTextContent();
+ }
+
+ byte kab;
+ if (ka.getTextContent().equals("DH")) {
+ kab = EC_Consts.KA_ECDH;
+ } else {
+ kab = EC_Consts.KA_ECDHC;
+ }
+
+ EC_KAResult kaResult = new EC_KAResult(kab, curve.getTextContent(), onekey.getTextContent(), otherkey.getTextContent(), descs);
+ if (!kaResult.readCSV(this.getClass().getResourceAsStream("/cz/crcs/ectester/data/" + dir + "/" + file.getTextContent()))) {
+ throw new IOException("Invalid csv data.");
+ }
+
+ objMap.put(id.getTextContent(), kaResult);
+ } else {
+ throw new SAXException("?");
+ }
+ }
+ results.close();
}
return new EC_Category(name, dir, desc, objMap);
@@ -199,7 +248,7 @@ public class EC_Store {
} else {
throw new SAXException("?");
}
- if(!result.readCSV(this.getClass().getResourceAsStream("/cz/crcs/ectester/data/" + dir + "/" + file.getTextContent()))) {
+ if (!result.readCSV(this.getClass().getResourceAsStream("/cz/crcs/ectester/data/" + dir + "/" + file.getTextContent()))) {
throw new IOException("Invalid CSV data.");
}
return result;
@@ -213,7 +262,7 @@ public class EC_Store {
return categories.get(category);
}
- public Map<String, EC_Params> getObjects(String category) {
+ public Map<String, EC_Data> getObjects(String category) {
EC_Category cat = categories.get(category);
if (cat != null) {
return cat.getObjects();
@@ -221,7 +270,7 @@ public class EC_Store {
return null;
}
- public <T extends EC_Params> Map<String, T> getObjects(Class<T> objClass, String category) {
+ public <T extends EC_Data> Map<String, T> getObjects(Class<T> objClass, String category) {
EC_Category cat = categories.get(category);
if (cat != null) {
return cat.getObjects(objClass);
@@ -229,7 +278,7 @@ public class EC_Store {
return null;
}
- public <T extends EC_Params> T getObject(Class<T> objClass, String category, String id) {
+ public <T extends EC_Data> T getObject(Class<T> objClass, String category, String id) {
EC_Category cat = categories.get(category);
if (cat != null) {
return cat.getObject(objClass, id);
@@ -237,12 +286,12 @@ public class EC_Store {
return null;
}
- public <T extends EC_Params> T getObject(Class<T> objClass, String query) {
- String[] parts = query.split("/");
- if (parts.length != 2) {
+ public <T extends EC_Data> T getObject(Class<T> objClass, String query) {
+ int split = query.indexOf("/");
+ if (split < 0) {
return null;
}
- return getObject(objClass, parts[0], parts[1]);
+ return getObject(objClass, query.substring(0, split), query.substring(split + 1));
}
}
diff --git a/src/cz/crcs/ectester/data/schema.xsd b/src/cz/crcs/ectester/data/schema.xsd
index a4dbe15..8f9427d 100644
--- a/src/cz/crcs/ectester/data/schema.xsd
+++ b/src/cz/crcs/ectester/data/schema.xsd
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" ?>
-<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<!-- /<category>/curves.xml -->
@@ -12,13 +12,13 @@
</xs:simpleType>
<xs:complexType name="curveType">
- <xs:sequence>
+ <xs:all>
<xs:element name="id" type="xs:string"/>
<xs:element name="bits" type="xs:positiveInteger"/>
<xs:element name="field" type="fieldType"/>
<xs:element name="file" type="xs:string"/>
<xs:element name="desc" type="xs:string" minOccurs="0"/>
- </xs:sequence>
+ </xs:all>
</xs:complexType>
<xs:element name="curves">
@@ -32,12 +32,12 @@
<!-- /<category>/keys.xml -->
<xs:complexType name="keyType">
- <xs:sequence>
+ <xs:all>
<xs:element name="id" type="xs:string"/>
<xs:element name="file" type="xs:string"/>
<xs:element name="curve" type="xs:string"/>
<xs:element name="desc" type="xs:string" minOccurs="0"/>
- </xs:sequence>
+ </xs:all>
</xs:complexType>
<xs:element name="keys">
@@ -52,14 +52,43 @@
</xs:complexType>
</xs:element>
+ <!-- /<category>/results.xml -->
+
+ <xs:simpleType name="kaType">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="DH"/>
+ <xs:enumeration value="DHC"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:complexType name="resultType">
+ <xs:all>
+ <xs:element name="id" type="xs:string"/>
+ <xs:element name="ka" type="kaType"/>
+ <xs:element name="file" type="xs:string"/>
+ <xs:element name="curve" type="xs:string"/>
+ <xs:element name="onekey" type="xs:string"/>
+ <xs:element name="otherkey" type="xs:string"/>
+ <xs:element name="desc" type="xs:string" minOccurs="0"/>
+ </xs:all>
+ </xs:complexType>
+
+ <xs:element name="results">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="result" type="resultType" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
<!-- /categories.xml -->
<xs:complexType name="categoryType">
- <xs:sequence>
+ <xs:all>
<xs:element name="name" type="xs:string"/>
<xs:element name="directory" type="xs:string"/>
<xs:element name="desc" minOccurs="0" type="xs:string"/>
- </xs:sequence>
+ </xs:all>
</xs:complexType>
<xs:element name="categories">
diff --git a/src/cz/crcs/ectester/data/test/results.xml b/src/cz/crcs/ectester/data/test/results.xml
new file mode 100644
index 0000000..e382cd4
--- /dev/null
+++ b/src/cz/crcs/ectester/data/test/results.xml
@@ -0,0 +1,174 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<results xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="../schema.xsd">
+ <result>
+ <id>secp160r1-dh</id>
+ <ka>DH</ka>
+ <file>secg/secp160r1-dh-sha1.csv</file>
+ <curve>secg/secp160r1</curve>
+ <onekey>test/secp160r1-U</onekey>
+ <otherkey>test/secp160r1-V</otherkey>
+ </result>
+ <result>
+ <id>sect163k1-dh</id>
+ <ka>DH</ka>
+ <file>secg/sect163k1-dh-sha1.csv</file>
+ <curve>secg/sect163k1</curve>
+ <onekey>test/sect163k1-U</onekey>
+ <otherkey>test/sect163k1-V</otherkey>
+ </result>
+
+ <result>
+ <id>brainpoolP224r1-dh</id>
+ <ka>DH</ka>
+ <file>brainpool/brainpoolP224r1-dh-sha1.csv</file>
+ <curve>brainpool/brainpoolP224r1</curve>
+ <onekey>test/brainpoolP224r1-A</onekey>
+ <otherkey>test/brainpoolP224r1-B</otherkey>
+ </result>
+ <result>
+ <id>brainpoolP256r1-dh</id>
+ <ka>DH</ka>
+ <file>brainpool/brainpoolP256r1-dh-sha1.csv</file>
+ <curve>brainpool/brainpoolP256r1</curve>
+ <onekey>test/brainpoolP256r1-A</onekey>
+ <otherkey>test/brainpoolP256r1-B</otherkey>
+ </result>
+ <result>
+ <id>brainpoolP384r1-dh</id>
+ <ka>DH</ka>
+ <file>brainpool/brainpoolP384r1-dh-sha1.csv</file>
+ <curve>brainpool/brainpoolP384r1</curve>
+ <onekey>test/brainpoolP384r1-A</onekey>
+ <otherkey>test/brainpoolP384r1-B</otherkey>
+ </result>
+ <result>
+ <id>brainpoolP512r1-dh</id>
+ <ka>DH</ka>
+ <file>brainpool/brainpoolP512r1-dh-sha1.csv</file>
+ <curve>brainpool/brainpoolP512r1</curve>
+ <onekey>test/brainpoolP512r1-A</onekey>
+ <otherkey>test/brainpoolP512r1-B</otherkey>
+ </result>
+
+ <result>
+ <id>b163-dhc</id>
+ <ka>DHC</ka>
+ <file>nist/b163-dhc-sha1.csv</file>
+ <curve>nist/B-163</curve>
+ <onekey>test/b163-A</onekey>
+ <otherkey>test/b163-B</otherkey>
+ </result>
+ <result>
+ <id>b233-dhc</id>
+ <ka>DHC</ka>
+ <file>nist/b233-dhc-sha1.csv</file>
+ <curve>nist/B-233</curve>
+ <onekey>test/b233-A</onekey>
+ <otherkey>test/b233-B</otherkey>
+ </result>
+ <result>
+ <id>b283-dhc</id>
+ <ka>DHC</ka>
+ <file>nist/b283-dhc-sha1.csv</file>
+ <curve>nist/B-283</curve>
+ <onekey>test/b283-A</onekey>
+ <otherkey>test/b283-B</otherkey>
+ </result>
+ <result>
+ <id>b409-dhc</id>
+ <ka>DHC</ka>
+ <file>nist/b409-dhc-sha1.csv</file>
+ <curve>nist/B-409</curve>
+ <onekey>test/b409-A</onekey>
+ <otherkey>test/b409-B</otherkey>
+ </result>
+ <result>
+ <id>b571-dhc</id>
+ <ka>DHC</ka>
+ <file>nist/b571-dhc-sha1.csv</file>
+ <curve>nist/B-571</curve>
+ <onekey>test/b571-A</onekey>
+ <otherkey>test/b571-B</otherkey>
+ </result>
+ <result>
+ <id>k163-dhc</id>
+ <ka>DHC</ka>
+ <file>nist/k163-dhc-sha1.csv</file>
+ <curve>nist/B-163</curve>
+ <onekey>test/k163-A</onekey>
+ <otherkey>test/k163-B</otherkey>
+ </result>
+ <result>
+ <id>k233-dhc</id>
+ <ka>DHC</ka>
+ <file>nist/k233-dhc-sha1.csv</file>
+ <curve>nist/B-233</curve>
+ <onekey>test/k233-A</onekey>
+ <otherkey>test/k233-B</otherkey>
+ </result>
+ <result>
+ <id>k283-dhc</id>
+ <ka>DHC</ka>
+ <file>nist/k283-dhc-sha1.csv</file>
+ <curve>nist/B-283</curve>
+ <onekey>test/k283-A</onekey>
+ <otherkey>test/k283-B</otherkey>
+ </result>
+ <result>
+ <id>k409-dhc</id>
+ <ka>DHC</ka>
+ <file>nist/k409-dhc-sha1.csv</file>
+ <curve>nist/B-409</curve>
+ <onekey>test/k409-A</onekey>
+ <otherkey>test/k409-B</otherkey>
+ </result>
+ <result>
+ <id>k571-dhc</id>
+ <ka>DHC</ka>
+ <file>nist/k571-dhc-sha1.csv</file>
+ <curve>nist/B-571</curve>
+ <onekey>test/k571-A</onekey>
+ <otherkey>test/k571-B</otherkey>
+ </result>
+ <result>
+ <id>p192-dhc</id>
+ <ka>DHC</ka>
+ <file>nist/p192-dhc-sha1.csv</file>
+ <curve>nist/P-192</curve>
+ <onekey>test/p192-A</onekey>
+ <otherkey>test/p192-B</otherkey>
+ </result>
+ <result>
+ <id>p224-dhc</id>
+ <ka>DHC</ka>
+ <file>nist/p224-dhc-sha1.csv</file>
+ <curve>nist/P-224</curve>
+ <onekey>test/p224-A</onekey>
+ <otherkey>test/p224-B</otherkey>
+ </result>
+ <result>
+ <id>p256-dhc</id>
+ <ka>DHC</ka>
+ <file>nist/p256-dhc-sha1.csv</file>
+ <curve>nist/P-256</curve>
+ <onekey>test/p256-A</onekey>
+ <otherkey>test/p256-B</otherkey>
+ </result>
+ <result>
+ <id>p384-dhc</id>
+ <ka>DHC</ka>
+ <file>nist/p384-dhc-sha1.csv</file>
+ <curve>nist/P-384</curve>
+ <onekey>test/p384-A</onekey>
+ <otherkey>test/p384-B</otherkey>
+ </result>
+ <result>
+ <id>p521-dhc</id>
+ <ka>DHC</ka>
+ <file>nist/p521-dhc-sha1.csv</file>
+ <curve>nist/P-521</curve>
+ <onekey>test/p521-A</onekey>
+ <otherkey>test/p521-B</otherkey>
+ </result>
+</results> \ No newline at end of file
diff --git a/src/cz/crcs/ectester/reader/ECTester.java b/src/cz/crcs/ectester/reader/ECTester.java
index b8b0c04..9926d3e 100644
--- a/src/cz/crcs/ectester/reader/ECTester.java
+++ b/src/cz/crcs/ectester/reader/ECTester.java
@@ -25,10 +25,7 @@ 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_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;
-import cz.crcs.ectester.reader.ec.EC_Params;
+import cz.crcs.ectester.reader.ec.*;
import javacard.security.KeyPair;
import org.apache.commons.cli.*;
@@ -248,7 +245,7 @@ public class ECTester {
actions.addOption(Option.builder("ln").longOpt("list-named").desc("Print the list of supported named curves and keys.").hasArg().argName("what").optionalArg(true).build());
actions.addOption(Option.builder("e").longOpt("export").desc("Export the defaut curve parameters of the card(if any).").build());
actions.addOption(Option.builder("g").longOpt("generate").desc("Generate [amount] of EC keys.").hasArg().argName("amount").optionalArg(true).build());
- actions.addOption(Option.builder("t").longOpt("test").desc("Test ECC support.").hasArg().argName("test_case").optionalArg(true).build());
+ actions.addOption(Option.builder("t").longOpt("test").desc("Test ECC support. <test_case>:\n- default:\n- invalid:\n- wrong:\n- nonprime:\n- smallpub:\n- test-vectors:").hasArg().argName("test_case").optionalArg(true).build());
actions.addOption(Option.builder("dh").longOpt("ecdh").desc("Do ECDH, [count] times.").hasArg().argName("count").optionalArg(true).build());
actions.addOption(Option.builder("dhc").longOpt("ecdhc").desc("Do ECDHC, [count] times.").hasArg().argName("count").optionalArg(true).build());
actions.addOption(Option.builder("dsa").longOpt("ecdsa").desc("Sign data with ECDSA, [count] times.").hasArg().argName("count").optionalArg(true).build());
@@ -511,6 +508,20 @@ public class ECTester {
}
System.out.println();
}
+
+ Map<String, EC_KAResult> results = cat.getObjects(EC_KAResult.class);
+ size = results.size();
+ if (size > 0) {
+ System.out.print("\t\tResults: ");
+ for (Map.Entry<String, EC_KAResult> result : results.entrySet()) {
+ System.out.print(result.getKey());
+ size--;
+ if (size > 0)
+ System.out.print(", ");
+ }
+ System.out.println();
+ }
+
System.out.println();
}
} else if (categories.containsKey(optListNamed)) {
@@ -669,7 +680,30 @@ public class ECTester {
* Do ECDH both ways, export and verify that the result is correct.
*
*/
- //TODO
+ Map<String, EC_KAResult> results = dataStore.getObjects(EC_KAResult.class, "test");
+ for (EC_KAResult result : results.values()) {
+ EC_Curve curve = dataStore.getObject(EC_Curve.class, result.getCurve());
+ EC_Params onekey = dataStore.getObject(EC_Keypair.class, result.getOneKey());
+ if (onekey == null) {
+ onekey = dataStore.getObject(EC_Key.Private.class, result.getOneKey());
+ }
+ EC_Params otherkey = dataStore.getObject(EC_Keypair.class, result.getOtherKey());
+ if (otherkey == null) {
+ otherkey = dataStore.getObject(EC_Key.Public.class, result.getOtherKey());
+ }
+ if (onekey == null || otherkey == null) {
+ throw new IOException("Test vector keys not located");
+ }
+
+ commands.add(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, curve.getBits(), curve.getField()));
+ commands.add(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()));
+ commands.add(new Command.Generate(cardManager, ECTesterApplet.KEYPAIR_BOTH));
+ commands.add(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.CURVE_external, EC_Consts.PARAMETER_S, onekey.flatten(EC_Consts.PARAMETER_S)));
+ commands.add(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.CURVE_external, EC_Consts.PARAMETER_W, otherkey.flatten(EC_Consts.PARAMETER_W)));
+ commands.add(new Command.ECDH(cardManager, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_TRUE, EC_Consts.CORRUPTION_NONE, result.getKA()));
+ //TODO add compare with result.getParam(0);
+ commands.add(new Command.Cleanup(cardManager));
+ }
} else {
// These tests are dangerous, prompt before them.
@@ -721,7 +755,14 @@ public class ECTester {
List<Response> test = Command.sendAll(commands);
systemOutLogger.println(Response.toString(test));
- //
+ for (Response response : test) {
+ if (response instanceof Response.ECDH) {
+ Response.ECDH ecdh = (Response.ECDH) response;
+ if (ecdh.hasSecret()) {
+ System.out.println(Util.bytesToHex(ecdh.getSecret(), false));
+ }
+ }
+ }
}
/**
diff --git a/src/cz/crcs/ectester/reader/ec/EC_Data.java b/src/cz/crcs/ectester/reader/ec/EC_Data.java
index c1fb54c..2e1eb29 100644
--- a/src/cz/crcs/ectester/reader/ec/EC_Data.java
+++ b/src/cz/crcs/ectester/reader/ec/EC_Data.java
@@ -31,6 +31,10 @@ public class EC_Data {
this.data = data;
}
+ public int getCount() {
+ return count;
+ }
+
public byte[][] getData() {
return data;
}
@@ -39,6 +43,10 @@ public class EC_Data {
return data != null;
}
+ public byte[] getParam(int index) {
+ return data[index];
+ }
+
public byte[] flatten() {
ByteArrayOutputStream out = new ByteArrayOutputStream();
for (byte[] param : data) {
diff --git a/src/cz/crcs/ectester/reader/ec/EC_KAResult.java b/src/cz/crcs/ectester/reader/ec/EC_KAResult.java
new file mode 100644
index 0000000..e556f90
--- /dev/null
+++ b/src/cz/crcs/ectester/reader/ec/EC_KAResult.java
@@ -0,0 +1,48 @@
+package cz.crcs.ectester.reader.ec;
+
+/**
+ * @author Jan Jancar johny@neuromancer.sk
+ */
+public class EC_KAResult extends EC_Data {
+
+ private byte ka;
+ private String curve;
+ private String oneKey;
+ private String otherKey;
+
+ private String desc;
+
+ public EC_KAResult(byte ka, String curve, String oneKey, String otherKey) {
+ super(1);
+ this.ka = ka;
+ this.curve = curve;
+ this.oneKey = oneKey;
+ this.otherKey = otherKey;
+ }
+
+ public EC_KAResult(byte ka, String curve, String oneKey, String otherKey, String desc) {
+ this(ka, curve, oneKey, otherKey);
+ this.desc = desc;
+ }
+
+ public byte getKA() {
+ return ka;
+ }
+
+ public String getCurve() {
+ return curve;
+ }
+
+ public String getOneKey() {
+ return oneKey;
+ }
+
+ public String getOtherKey() {
+ return otherKey;
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+
+}