From 565d312568da433f213b3d7ea67861b7784b2115 Mon Sep 17 00:00:00 2001
From: J08nY
Date: Thu, 30 Mar 2017 01:51:46 +0200
Subject: Added more documentation, anomalous curves, support command.
- Added CURVES.md, FORMAT.md and TESTS.md that talk a bit about what
ECTester actually does/support.
- Added anomalous curves (where |F_p| = #|E(F_p)|), meaning these curves
have a trace of one and ECDLP over them reduces to easy DLP over
multiplicative F*_p. These concrete curves are from Atsuko Miyaji's
paper: Elliptic curves over F_p Suitable for Cryptosystems.
- Added Support command that queries the results of KeyAgreement and
Signature allocations.
- Renamed smallpub curves to nonprime curves.
- Fixed nonprime curves test suite.
---
src/cz/crcs/ectester/applet/ECKeyTester.java | 12 ++++
src/cz/crcs/ectester/applet/ECTesterApplet.java | 46 ++++++++++++--
src/cz/crcs/ectester/data/anomalous/curves.xml | 74 +++++++++-------------
.../crcs/ectester/data/anomalous/miyaji128a1.csv | 1 +
.../crcs/ectester/data/anomalous/miyaji128a2.csv | 1 +
.../crcs/ectester/data/anomalous/miyaji128b1.csv | 1 +
.../crcs/ectester/data/anomalous/miyaji128b2.csv | 1 +
src/cz/crcs/ectester/data/categories.xml | 6 +-
src/cz/crcs/ectester/data/nonprime/curves.xml | 46 ++++++++++++++
src/cz/crcs/ectester/data/nonprime/keys.xml | 48 ++++++++++++++
src/cz/crcs/ectester/data/nonprime/nonprime128.csv | 1 +
.../ectester/data/nonprime/nonprime128_pub.csv | 1 +
src/cz/crcs/ectester/data/nonprime/nonprime160.csv | 1 +
.../ectester/data/nonprime/nonprime160_pub.csv | 1 +
src/cz/crcs/ectester/data/nonprime/nonprime192.csv | 1 +
.../ectester/data/nonprime/nonprime192_pub.csv | 1 +
src/cz/crcs/ectester/data/nonprime/nonprime224.csv | 1 +
.../ectester/data/nonprime/nonprime224_pub.csv | 1 +
src/cz/crcs/ectester/data/nonprime/nonprime256.csv | 1 +
.../ectester/data/nonprime/nonprime256_pub.csv | 1 +
src/cz/crcs/ectester/data/nonprime/nonprime384.csv | 1 +
.../ectester/data/nonprime/nonprime384_pub.csv | 1 +
src/cz/crcs/ectester/data/nonprime/nonprime521.csv | 1 +
.../ectester/data/nonprime/nonprime521_pub.csv | 1 +
src/cz/crcs/ectester/data/smallpub/curves.xml | 46 --------------
src/cz/crcs/ectester/data/smallpub/ecsp128.csv | 1 -
src/cz/crcs/ectester/data/smallpub/ecsp128_pub.csv | 1 -
src/cz/crcs/ectester/data/smallpub/ecsp160.csv | 1 -
src/cz/crcs/ectester/data/smallpub/ecsp160_pub.csv | 1 -
src/cz/crcs/ectester/data/smallpub/ecsp192.csv | 1 -
src/cz/crcs/ectester/data/smallpub/ecsp192_pub.csv | 1 -
src/cz/crcs/ectester/data/smallpub/ecsp224.csv | 1 -
src/cz/crcs/ectester/data/smallpub/ecsp224_pub.csv | 1 -
src/cz/crcs/ectester/data/smallpub/ecsp256.csv | 1 -
src/cz/crcs/ectester/data/smallpub/ecsp256_pub.csv | 1 -
src/cz/crcs/ectester/data/smallpub/ecsp384.csv | 1 -
src/cz/crcs/ectester/data/smallpub/ecsp384_pub.csv | 1 -
src/cz/crcs/ectester/data/smallpub/ecsp521.csv | 1 -
src/cz/crcs/ectester/data/smallpub/ecsp521_pub.csv | 1 -
src/cz/crcs/ectester/data/smallpub/keys.xml | 48 --------------
src/cz/crcs/ectester/reader/Command.java | 33 ++++++++--
src/cz/crcs/ectester/reader/ECTester.java | 58 ++++++++++-------
src/cz/crcs/ectester/reader/Response.java | 64 ++++++++++++-------
43 files changed, 298 insertions(+), 215 deletions(-)
create mode 100644 src/cz/crcs/ectester/data/anomalous/miyaji128a1.csv
create mode 100644 src/cz/crcs/ectester/data/anomalous/miyaji128a2.csv
create mode 100644 src/cz/crcs/ectester/data/anomalous/miyaji128b1.csv
create mode 100644 src/cz/crcs/ectester/data/anomalous/miyaji128b2.csv
create mode 100644 src/cz/crcs/ectester/data/nonprime/curves.xml
create mode 100644 src/cz/crcs/ectester/data/nonprime/keys.xml
create mode 100644 src/cz/crcs/ectester/data/nonprime/nonprime128.csv
create mode 100644 src/cz/crcs/ectester/data/nonprime/nonprime128_pub.csv
create mode 100644 src/cz/crcs/ectester/data/nonprime/nonprime160.csv
create mode 100644 src/cz/crcs/ectester/data/nonprime/nonprime160_pub.csv
create mode 100644 src/cz/crcs/ectester/data/nonprime/nonprime192.csv
create mode 100644 src/cz/crcs/ectester/data/nonprime/nonprime192_pub.csv
create mode 100644 src/cz/crcs/ectester/data/nonprime/nonprime224.csv
create mode 100644 src/cz/crcs/ectester/data/nonprime/nonprime224_pub.csv
create mode 100644 src/cz/crcs/ectester/data/nonprime/nonprime256.csv
create mode 100644 src/cz/crcs/ectester/data/nonprime/nonprime256_pub.csv
create mode 100644 src/cz/crcs/ectester/data/nonprime/nonprime384.csv
create mode 100644 src/cz/crcs/ectester/data/nonprime/nonprime384_pub.csv
create mode 100644 src/cz/crcs/ectester/data/nonprime/nonprime521.csv
create mode 100644 src/cz/crcs/ectester/data/nonprime/nonprime521_pub.csv
delete mode 100644 src/cz/crcs/ectester/data/smallpub/curves.xml
delete mode 100644 src/cz/crcs/ectester/data/smallpub/ecsp128.csv
delete mode 100644 src/cz/crcs/ectester/data/smallpub/ecsp128_pub.csv
delete mode 100644 src/cz/crcs/ectester/data/smallpub/ecsp160.csv
delete mode 100644 src/cz/crcs/ectester/data/smallpub/ecsp160_pub.csv
delete mode 100644 src/cz/crcs/ectester/data/smallpub/ecsp192.csv
delete mode 100644 src/cz/crcs/ectester/data/smallpub/ecsp192_pub.csv
delete mode 100644 src/cz/crcs/ectester/data/smallpub/ecsp224.csv
delete mode 100644 src/cz/crcs/ectester/data/smallpub/ecsp224_pub.csv
delete mode 100644 src/cz/crcs/ectester/data/smallpub/ecsp256.csv
delete mode 100644 src/cz/crcs/ectester/data/smallpub/ecsp256_pub.csv
delete mode 100644 src/cz/crcs/ectester/data/smallpub/ecsp384.csv
delete mode 100644 src/cz/crcs/ectester/data/smallpub/ecsp384_pub.csv
delete mode 100644 src/cz/crcs/ectester/data/smallpub/ecsp521.csv
delete mode 100644 src/cz/crcs/ectester/data/smallpub/ecsp521_pub.csv
delete mode 100644 src/cz/crcs/ectester/data/smallpub/keys.xml
(limited to 'src')
diff --git a/src/cz/crcs/ectester/applet/ECKeyTester.java b/src/cz/crcs/ectester/applet/ECKeyTester.java
index 7ef6150..e22094b 100644
--- a/src/cz/crcs/ectester/applet/ECKeyTester.java
+++ b/src/cz/crcs/ectester/applet/ECKeyTester.java
@@ -148,6 +148,18 @@ public class ECKeyTester {
return ecdsaSignature;
}
+ public boolean hasECDH() {
+ return ecdhKeyAgreement != null;
+ }
+
+ public boolean hasECDHC() {
+ return ecdhcKeyAgreement != null;
+ }
+
+ public boolean hasECDSA() {
+ return ecdsaSignature != null;
+ }
+
public short getSW() {
return sw;
}
diff --git a/src/cz/crcs/ectester/applet/ECTesterApplet.java b/src/cz/crcs/ectester/applet/ECTesterApplet.java
index e17d102..f9fb5da 100644
--- a/src/cz/crcs/ectester/applet/ECTesterApplet.java
+++ b/src/cz/crcs/ectester/applet/ECTesterApplet.java
@@ -52,6 +52,7 @@ public class ECTesterApplet extends Applet {
public static final byte INS_ECDH = (byte) 0x60;
public static final byte INS_ECDSA = (byte) 0x61;
public static final byte INS_CLEANUP = (byte) 0x62;
+ public static final byte INS_SUPPORT = (byte) 0x63;
// PARAMETERS for P1 and P2
public static final byte KEYPAIR_LOCAL = (byte) 0x01;
@@ -74,10 +75,13 @@ public class ECTesterApplet extends Applet {
private RandomData randomData = null;
- private KeyPair localKeypair = null;
- private KeyPair remoteKeypair = null;
private ECKeyTester keyTester = null;
+ private short ecdhSW;
+ private short ecdhcSW;
+ private short ecdsaSW;
private ECKeyGenerator keyGenerator = null;
+ private KeyPair localKeypair = null;
+ private KeyPair remoteKeypair = null;
protected ECTesterApplet(byte[] buffer, short offset, byte length) {
if (length > 9) {
@@ -102,9 +106,9 @@ public class ECTesterApplet extends Applet {
keyGenerator = new ECKeyGenerator();
keyTester = new ECKeyTester();
- keyTester.allocateECDH();
- keyTester.allocateECDHC();
- keyTester.allocateECDSA();
+ ecdhSW = keyTester.allocateECDH();
+ ecdhcSW = keyTester.allocateECDHC();
+ ecdsaSW = keyTester.allocateECDSA();
}
register();
}
@@ -152,6 +156,9 @@ public class ECTesterApplet extends Applet {
case INS_CLEANUP:
insCleanup(apdu);
break;
+ case INS_SUPPORT:
+ insSupport(apdu);
+ break;
default:
// The INS code is not supported by the dispatcher
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
@@ -375,6 +382,7 @@ public class ECTesterApplet extends Applet {
/**
*
+ * @param apdu
*/
private void insCleanup(APDU apdu) {
apdu.setIncomingAndReceive();
@@ -385,6 +393,19 @@ public class ECTesterApplet extends Applet {
apdu.setOutgoingAndSend((short) 0, len);
}
+ /**
+ *
+ * @param apdu
+ */
+ private void insSupport(APDU apdu) {
+ apdu.setIncomingAndReceive();
+ byte[] apdubuf = apdu.getBuffer();
+
+ short len = support(apdubuf, (short) 0);
+
+ apdu.setOutgoingAndSend((short) 0, len);
+ }
+
/**
* @param keyPair which keyPair to use, local/remote (KEYPAIR_* | ...)
* @param keyLength key length to set
@@ -606,4 +627,19 @@ public class ECTesterApplet extends Applet {
Util.setShort(buffer, offset, sw);
return 2;
}
+
+ /**
+ *
+ * @param buffer
+ * @param offset
+ * @return
+ */
+ private short support(byte[] buffer, short offset) {
+
+ Util.setShort(buffer, offset, ecdhSW);
+ Util.setShort(buffer, (short) (offset+2), ecdhcSW);
+ Util.setShort(buffer, (short) (offset+4), ecdsaSW);
+
+ return 6;
+ }
}
diff --git a/src/cz/crcs/ectester/data/anomalous/curves.xml b/src/cz/crcs/ectester/data/anomalous/curves.xml
index c478657..b0b9b02 100644
--- a/src/cz/crcs/ectester/data/anomalous/curves.xml
+++ b/src/cz/crcs/ectester/data/anomalous/curves.xml
@@ -1,48 +1,32 @@
-
-
\ No newline at end of file
+
+ miyaji128a1
+ 128
+ prime
+ miyaji128a1.csv
+ First curve in the "Proposed scheme A" section of Atsuko Miyaji's paper.
+
+
+ miyaji128a2
+ 128
+ prime
+ miyaji128a2.csv
+ Second curve in the "Proposed scheme A" section of Atsuko Miyaji's paper.
+
+
+ miyaji128b1
+ 128
+ prime
+ miyaji128b1.csv
+ First curve in the "Proposed scheme B" section of Atsuko Miyaji's paper.
+
+
+ miyaji128b2
+ 128
+ prime
+ miyaji128b2.csv
+ Second curve in the "Proposed scheme B" section of Atsuko Miyaji's paper.
+
+
diff --git a/src/cz/crcs/ectester/data/anomalous/miyaji128a1.csv b/src/cz/crcs/ectester/data/anomalous/miyaji128a1.csv
new file mode 100644
index 0000000..b1a84a0
--- /dev/null
+++ b/src/cz/crcs/ectester/data/anomalous/miyaji128a1.csv
@@ -0,0 +1 @@
+80000000000001a86a91e9356e5fee11,1210cb7f8a3466b805b546960dd43f69,644a5a3e53a634ee06fa903172806914,55b40a8932013efa328cbe8abaf2f4ec,44375dc6a29cac1982fbf98c86da2707,80000000000001a86a91e9356e5fee11,1
diff --git a/src/cz/crcs/ectester/data/anomalous/miyaji128a2.csv b/src/cz/crcs/ectester/data/anomalous/miyaji128a2.csv
new file mode 100644
index 0000000..70098c0
--- /dev/null
+++ b/src/cz/crcs/ectester/data/anomalous/miyaji128a2.csv
@@ -0,0 +1 @@
+fffffffffffffe1c2758f379fd46b0d9,5e2336fa13c5c6ce7add23893c0dfec7,7bf26de6e350dc183c58c09ad8237e00,1d8b7c787fdc92d299ec14e7916e5f7d,67621e61f115a2544364c1cd52e3cfa7,fffffffffffffe1c2758f379fd46b0d9,1
diff --git a/src/cz/crcs/ectester/data/anomalous/miyaji128b1.csv b/src/cz/crcs/ectester/data/anomalous/miyaji128b1.csv
new file mode 100644
index 0000000..5c1f8b8
--- /dev/null
+++ b/src/cz/crcs/ectester/data/anomalous/miyaji128b1.csv
@@ -0,0 +1 @@
+800000000000037554ac874c19cdaedf,00000000000000000000000000000000,000000000000000000000000000000c0,635217788a2ff48664a09cb3cdf72b2e,5e69c2309032ef3cb1e41b1a245822be,800000000000037554ac874c19cdaedf,1
diff --git a/src/cz/crcs/ectester/data/anomalous/miyaji128b2.csv b/src/cz/crcs/ectester/data/anomalous/miyaji128b2.csv
new file mode 100644
index 0000000..fdb77a0
--- /dev/null
+++ b/src/cz/crcs/ectester/data/anomalous/miyaji128b2.csv
@@ -0,0 +1 @@
+fffffffffffffe2a71fec762d2427ce7,00000000000000000000000000000000,000000000000000000000000000000c0,428e6765064e4a745b2aaae87ef7f0f7,3daee1541c98c3d51eec13a1f6177531,fffffffffffffe2a71fec762d2427ce7,1
diff --git a/src/cz/crcs/ectester/data/categories.xml b/src/cz/crcs/ectester/data/categories.xml
index d0c9f39..100d962 100644
--- a/src/cz/crcs/ectester/data/categories.xml
+++ b/src/cz/crcs/ectester/data/categories.xml
@@ -22,9 +22,9 @@
SEC 2: Recommended Elliptic Curve Domain Parameters version 2.0 January 27, 2010
- smallpub
- smallpub
- Non-prime order curves, with points of very small order pregenerated. Useful for testing in ECDH.
+ nonprime
+ nonprime
+ Non-prime order curves, with points of very small order pregenerated.
wrong
diff --git a/src/cz/crcs/ectester/data/nonprime/curves.xml b/src/cz/crcs/ectester/data/nonprime/curves.xml
new file mode 100644
index 0000000..e0eb78a
--- /dev/null
+++ b/src/cz/crcs/ectester/data/nonprime/curves.xml
@@ -0,0 +1,46 @@
+
+
+
+ nonprime128
+ 128
+ prime
+ nonprime128.csv
+
+
+ nonprime160
+ 160
+ prime
+ nonprime160.csv
+
+
+ nonprime192
+ 192
+ prime
+ nonprime192.csv
+
+
+ nonprime224
+ 224
+ prime
+ nonprime224.csv
+
+
+ nonprime256
+ 256
+ prime
+ nonprime256.csv
+
+
+ nonprime384
+ 384
+ prime
+ nonprime384.csv
+
+
+ nonprime521
+ 521
+ prime
+ nonprime521.csv
+
+
\ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/nonprime/keys.xml b/src/cz/crcs/ectester/data/nonprime/keys.xml
new file mode 100644
index 0000000..c10ae65
--- /dev/null
+++ b/src/cz/crcs/ectester/data/nonprime/keys.xml
@@ -0,0 +1,48 @@
+
+
+
+ nonprime128-pub
+ nonprime128_pub.csv
+ nonprime/nonprime128
+ order = 5
+
+
+ nonprime160-pub
+ nonprime160_pub.csv
+ nonprime/nonprime160
+ order = 3
+
+
+ nonprime192-pub
+ nonprime192_pub.csv
+ nonprime/nonprime192
+ order = 3
+
+
+ nonprime224-pub
+ nonprime224_pub.csv
+ nonprime/nonprime224
+ order = 5
+
+
+ nonprime256-pub
+ nonprime256_pub.csv
+ nonprime/nonprime256
+ order = 3
+
+
+ nonprime384-pub
+ nonprime384_pub.csv
+ nonprime/nonprime384
+ order = 3
+
+
+ nonprime521-pub
+ nonprime521_pub.csv
+ nonprime/nonprime521
+ order = 5
+
+
\ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/nonprime/nonprime128.csv b/src/cz/crcs/ectester/data/nonprime/nonprime128.csv
new file mode 100644
index 0000000..f541010
--- /dev/null
+++ b/src/cz/crcs/ectester/data/nonprime/nonprime128.csv
@@ -0,0 +1 @@
+cfba21fd0483b1f300fa2506a5a566ef,36d9a5acac27a008e36cbe3e9f103fde,a67cf5fa09fb1db902068c87046ae21e,47d78391a4b9fff6a0db1292f9cd0e6a,9aed9c92f8bb3dbd42402165a270bd6f,cfba21fd0483b1f333d61a5af6ada2c7,1
\ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/nonprime/nonprime128_pub.csv b/src/cz/crcs/ectester/data/nonprime/nonprime128_pub.csv
new file mode 100644
index 0000000..78a8cb4
--- /dev/null
+++ b/src/cz/crcs/ectester/data/nonprime/nonprime128_pub.csv
@@ -0,0 +1 @@
+63901e122761d9c16565b2f38e991f71,b9d99fbc3154a96ca23ecff770cbbe4f
\ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/nonprime/nonprime160.csv b/src/cz/crcs/ectester/data/nonprime/nonprime160.csv
new file mode 100644
index 0000000..e556020
--- /dev/null
+++ b/src/cz/crcs/ectester/data/nonprime/nonprime160.csv
@@ -0,0 +1 @@
+dc13490ff9857b111f44c0500770a6457e683223,a3ecd7d51e79d72d2700184c795aa8a6b8e66573,8ac43592905f995cb13f3694317bf470adafb645,5f8e88afc117c722859fe8e55647bca69ba82150,93e6dcaee271e9f2838c98b7d06eccc5d7c800e5,dc13490ff9857b111f446ef4a6d1e1715f6a6dff,1
\ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/nonprime/nonprime160_pub.csv b/src/cz/crcs/ectester/data/nonprime/nonprime160_pub.csv
new file mode 100644
index 0000000..7b92733
--- /dev/null
+++ b/src/cz/crcs/ectester/data/nonprime/nonprime160_pub.csv
@@ -0,0 +1 @@
+59c9c3c8aef29f1c1c500cafb4726da6086e6eb0,d695a76005eddb26afd40ee20904778bb3497bb1
\ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/nonprime/nonprime192.csv b/src/cz/crcs/ectester/data/nonprime/nonprime192.csv
new file mode 100644
index 0000000..bc55089
--- /dev/null
+++ b/src/cz/crcs/ectester/data/nonprime/nonprime192.csv
@@ -0,0 +1 @@
+ce714cc3a15ce7e5dab068c9a1f8be00aad480abccaeefc3,597c781f64c33eb8ef919c415911518ea323be88b9437caf,f81585a1b18f233d70add7ee1342d2035c386a92e3ab8320,150ff0a40deac6462b5987418617fdeeb6bfd76d4d60a067,843d577371c5dce122c2ff206b2f42fa0b842b49bdaf990f,ce714cc3a15ce7e5dab068c9a30bc92915bd8662ae882887,1
\ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/nonprime/nonprime192_pub.csv b/src/cz/crcs/ectester/data/nonprime/nonprime192_pub.csv
new file mode 100644
index 0000000..5432c1d
--- /dev/null
+++ b/src/cz/crcs/ectester/data/nonprime/nonprime192_pub.csv
@@ -0,0 +1 @@
+17047f91dbe33032c9d09bd29ceadd8a09ccc32ac6309541,6a726de54fbd59cfc352e838b337fa005a97180816135e6a
\ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/nonprime/nonprime224.csv b/src/cz/crcs/ectester/data/nonprime/nonprime224.csv
new file mode 100644
index 0000000..09b9c01
--- /dev/null
+++ b/src/cz/crcs/ectester/data/nonprime/nonprime224.csv
@@ -0,0 +1 @@
+eed4c3d98f1c9b9518f116263db770366877d12df6a9cf08b96dd4bb,8d4dddb0317d6a6bf9a4dbbed3a43fa21f79869c5ab9729d239e9282,46873614be3dffc9218082322210c0616140286f2d160503c1a9250d,961bbb1fc9955a71c91a50aedcd2f14fccb660af992b0030b9c90b36,1c00f6d0bd405dd7d3016fb8c0c75e4ecec70fe61237f6d24008a5fd,eed4c3d98f1c9b9518f116263db821c36a06adae17162ad3162f68c3,1
\ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/nonprime/nonprime224_pub.csv b/src/cz/crcs/ectester/data/nonprime/nonprime224_pub.csv
new file mode 100644
index 0000000..319ca3a
--- /dev/null
+++ b/src/cz/crcs/ectester/data/nonprime/nonprime224_pub.csv
@@ -0,0 +1 @@
+cfd92aea0f79190c48ca703eb8a9baa7099a23bb39578261fe4d0f04,257a3d98de44bd25404977a4ac7fc56d3d4e827f085b7cf5247524c4
\ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/nonprime/nonprime256.csv b/src/cz/crcs/ectester/data/nonprime/nonprime256.csv
new file mode 100644
index 0000000..d5bf3c0
--- /dev/null
+++ b/src/cz/crcs/ectester/data/nonprime/nonprime256.csv
@@ -0,0 +1 @@
+c9a803b1eaf849f1c02cfd1dbfac68623985c88b37103b338ae11d2597ee8445,4841c5775a24a884ca36ec362b44645a2f60b25d002c4fc1d9f139870fe0cc71,1b097456751f3534190dae568f80a2c6ff55dddfe072a7dc6467a4b6476b6880,a1fd34a27afb1340b8e4a7db2a5ec5a1432c6dc8555af9f78fca2cf740cab2b7,98419c698cab6c7dbb53eb2751417b52ccded4680c5e09543f93c7886c3a173e,c9a803b1eaf849f1c02cfd1dbfac6863128c5b1fc5acd5b5e0fc0a7311fb5b1d,1
\ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/nonprime/nonprime256_pub.csv b/src/cz/crcs/ectester/data/nonprime/nonprime256_pub.csv
new file mode 100644
index 0000000..d27ffdc
--- /dev/null
+++ b/src/cz/crcs/ectester/data/nonprime/nonprime256_pub.csv
@@ -0,0 +1 @@
+75fce70968862d53e29548aad70582514e960d8128bd3c5f8c4dbe2cf8dad653,55aa4b7d3882fb0a83bd00c9c3bae17f1024d64aec67e1db38ef671e6350beae
\ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/nonprime/nonprime384.csv b/src/cz/crcs/ectester/data/nonprime/nonprime384.csv
new file mode 100644
index 0000000..c58d74b
--- /dev/null
+++ b/src/cz/crcs/ectester/data/nonprime/nonprime384.csv
@@ -0,0 +1 @@
+d0df6c96cff7081be80d22b005758a2e2f046e15fe020ef886e21b492ac57257a923144bcad989ab6341bd3b700f914b,45c64503be019afd3462b361ad2b2a3bca0aeccc5494a624fb632455e62b4f0c98f944fa97c37811da039823cd77c906,d85583f7f11ad23ec75ed5a414153a06d6640936b8103f5df691fa95cf2afa78f3ea5addc225b144964048c9f7592ae4,2b1341d12dff4f9cf9427c4752962b4c2bdc8fbcd80652516c421cc523212a01ea63c79d6e9a9c84933e353e212416ec,ce416c6e75fa9fd205ed48fc4e3099cbb1d6ed031b7ddbff1d634eb97a83d9b780cfd4dedfdd2c7604d143196c08d933,d0df6c96cff7081be80d22b005758a2e2f046e15fe020ef7664ed51d7701c86bf2a1e9f3002c26fe002314c3c92f1ca9,1
\ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/nonprime/nonprime384_pub.csv b/src/cz/crcs/ectester/data/nonprime/nonprime384_pub.csv
new file mode 100644
index 0000000..80f2cd6
--- /dev/null
+++ b/src/cz/crcs/ectester/data/nonprime/nonprime384_pub.csv
@@ -0,0 +1 @@
+a4bd575bf20300b0cf8a2f41dd5a03e908966a4229a5f22f5c190d3641ac2d32b7b24a63482cbbcd0c2257f834834ef1,38d51c8f9e90592f567e81d0e4855e79731b5797857a4c7dc270653bc9f0c31e84693007b09cebf710d5ae3237303949
\ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/nonprime/nonprime521.csv b/src/cz/crcs/ectester/data/nonprime/nonprime521.csv
new file mode 100644
index 0000000..f6835f1
--- /dev/null
+++ b/src/cz/crcs/ectester/data/nonprime/nonprime521.csv
@@ -0,0 +1 @@
+01d3df430924956e210a605b4dbf4a2e909d7a801658978c88ffd68dcc817f5cc79cf188d9ee82d1a51c44cbd31e9cc5b816d76d5b1312b005f7b68919e275dac99f,00401639f36f2ee45fc164ea3e1f14f4803fd7a77ffdfb392c3f8fe95d1aea331467f4618d59aeee49d5d7c70caf320f7dd1ac166114f562413449991d3aa1a2c49e,004a26a8c47fce204ba953015fa86708c0de720f27523988b097e774168c15f7a215aaf18a5f1b9579ab3db935d45be14c9a87b71170396909b14d06f7a09975b3a6,01c880ae0a355a52791fc9600fd8b35726e9d799101489161c8f90a9c6631d09b3cb347584837d9deb8566a9c5846aded0d01eb947b4affd34e8ea7dbe733cbedafa,00050f12672f163f19d5d493eb82ef777b0213dd4e0cf75a9b99724fbdb54b0cc4e037bf86a48bac28467bdd936c314ce13f6ec7ec69ea09ae4f5444df4b2a117a66,01d3df430924956e210a605b4dbf4a2e909d7a801658978c88ffd68dcc817f5cc7ba0838717c1947f93cfdd3ed87ec2c2df181c7ada553346ec1495732a1e7ffe9b3,1
\ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/nonprime/nonprime521_pub.csv b/src/cz/crcs/ectester/data/nonprime/nonprime521_pub.csv
new file mode 100644
index 0000000..5cceee6
--- /dev/null
+++ b/src/cz/crcs/ectester/data/nonprime/nonprime521_pub.csv
@@ -0,0 +1 @@
+002844df0f31f46a40e6c7006cde99155bd5d18d0e4150178a8e307d6aec08fd02d466c03c49b49c2654b7c9a32d88ca014016a7eddd44217be915505d228efb9389,0105921e2172c3050ba4c9d2e744fc5b7b5e8451751e6780c6de88229497be7d23550beefa0cb7fafebb4dd9fad1244c6733befe5a97710f0dc56dc08d9d9df9d846
\ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/smallpub/curves.xml b/src/cz/crcs/ectester/data/smallpub/curves.xml
deleted file mode 100644
index 50c1d0c..0000000
--- a/src/cz/crcs/ectester/data/smallpub/curves.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-
-
-
- ecsp128
- 128
- prime
- ecsp128.csv
-
-
- ecsp160
- 160
- prime
- ecsp160.csv
-
-
- ecsp192
- 192
- prime
- ecsp192.csv
-
-
- ecsp224
- 224
- prime
- ecsp224.csv
-
-
- ecsp256
- 256
- prime
- ecsp256.csv
-
-
- ecsp384
- 384
- prime
- ecsp384.csv
-
-
- ecsp521
- 521
- prime
- ecsp521.csv
-
-
\ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/smallpub/ecsp128.csv b/src/cz/crcs/ectester/data/smallpub/ecsp128.csv
deleted file mode 100644
index f541010..0000000
--- a/src/cz/crcs/ectester/data/smallpub/ecsp128.csv
+++ /dev/null
@@ -1 +0,0 @@
-cfba21fd0483b1f300fa2506a5a566ef,36d9a5acac27a008e36cbe3e9f103fde,a67cf5fa09fb1db902068c87046ae21e,47d78391a4b9fff6a0db1292f9cd0e6a,9aed9c92f8bb3dbd42402165a270bd6f,cfba21fd0483b1f333d61a5af6ada2c7,1
\ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/smallpub/ecsp128_pub.csv b/src/cz/crcs/ectester/data/smallpub/ecsp128_pub.csv
deleted file mode 100644
index 78a8cb4..0000000
--- a/src/cz/crcs/ectester/data/smallpub/ecsp128_pub.csv
+++ /dev/null
@@ -1 +0,0 @@
-63901e122761d9c16565b2f38e991f71,b9d99fbc3154a96ca23ecff770cbbe4f
\ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/smallpub/ecsp160.csv b/src/cz/crcs/ectester/data/smallpub/ecsp160.csv
deleted file mode 100644
index e556020..0000000
--- a/src/cz/crcs/ectester/data/smallpub/ecsp160.csv
+++ /dev/null
@@ -1 +0,0 @@
-dc13490ff9857b111f44c0500770a6457e683223,a3ecd7d51e79d72d2700184c795aa8a6b8e66573,8ac43592905f995cb13f3694317bf470adafb645,5f8e88afc117c722859fe8e55647bca69ba82150,93e6dcaee271e9f2838c98b7d06eccc5d7c800e5,dc13490ff9857b111f446ef4a6d1e1715f6a6dff,1
\ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/smallpub/ecsp160_pub.csv b/src/cz/crcs/ectester/data/smallpub/ecsp160_pub.csv
deleted file mode 100644
index 7b92733..0000000
--- a/src/cz/crcs/ectester/data/smallpub/ecsp160_pub.csv
+++ /dev/null
@@ -1 +0,0 @@
-59c9c3c8aef29f1c1c500cafb4726da6086e6eb0,d695a76005eddb26afd40ee20904778bb3497bb1
\ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/smallpub/ecsp192.csv b/src/cz/crcs/ectester/data/smallpub/ecsp192.csv
deleted file mode 100644
index bc55089..0000000
--- a/src/cz/crcs/ectester/data/smallpub/ecsp192.csv
+++ /dev/null
@@ -1 +0,0 @@
-ce714cc3a15ce7e5dab068c9a1f8be00aad480abccaeefc3,597c781f64c33eb8ef919c415911518ea323be88b9437caf,f81585a1b18f233d70add7ee1342d2035c386a92e3ab8320,150ff0a40deac6462b5987418617fdeeb6bfd76d4d60a067,843d577371c5dce122c2ff206b2f42fa0b842b49bdaf990f,ce714cc3a15ce7e5dab068c9a30bc92915bd8662ae882887,1
\ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/smallpub/ecsp192_pub.csv b/src/cz/crcs/ectester/data/smallpub/ecsp192_pub.csv
deleted file mode 100644
index 5432c1d..0000000
--- a/src/cz/crcs/ectester/data/smallpub/ecsp192_pub.csv
+++ /dev/null
@@ -1 +0,0 @@
-17047f91dbe33032c9d09bd29ceadd8a09ccc32ac6309541,6a726de54fbd59cfc352e838b337fa005a97180816135e6a
\ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/smallpub/ecsp224.csv b/src/cz/crcs/ectester/data/smallpub/ecsp224.csv
deleted file mode 100644
index 09b9c01..0000000
--- a/src/cz/crcs/ectester/data/smallpub/ecsp224.csv
+++ /dev/null
@@ -1 +0,0 @@
-eed4c3d98f1c9b9518f116263db770366877d12df6a9cf08b96dd4bb,8d4dddb0317d6a6bf9a4dbbed3a43fa21f79869c5ab9729d239e9282,46873614be3dffc9218082322210c0616140286f2d160503c1a9250d,961bbb1fc9955a71c91a50aedcd2f14fccb660af992b0030b9c90b36,1c00f6d0bd405dd7d3016fb8c0c75e4ecec70fe61237f6d24008a5fd,eed4c3d98f1c9b9518f116263db821c36a06adae17162ad3162f68c3,1
\ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/smallpub/ecsp224_pub.csv b/src/cz/crcs/ectester/data/smallpub/ecsp224_pub.csv
deleted file mode 100644
index 319ca3a..0000000
--- a/src/cz/crcs/ectester/data/smallpub/ecsp224_pub.csv
+++ /dev/null
@@ -1 +0,0 @@
-cfd92aea0f79190c48ca703eb8a9baa7099a23bb39578261fe4d0f04,257a3d98de44bd25404977a4ac7fc56d3d4e827f085b7cf5247524c4
\ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/smallpub/ecsp256.csv b/src/cz/crcs/ectester/data/smallpub/ecsp256.csv
deleted file mode 100644
index d5bf3c0..0000000
--- a/src/cz/crcs/ectester/data/smallpub/ecsp256.csv
+++ /dev/null
@@ -1 +0,0 @@
-c9a803b1eaf849f1c02cfd1dbfac68623985c88b37103b338ae11d2597ee8445,4841c5775a24a884ca36ec362b44645a2f60b25d002c4fc1d9f139870fe0cc71,1b097456751f3534190dae568f80a2c6ff55dddfe072a7dc6467a4b6476b6880,a1fd34a27afb1340b8e4a7db2a5ec5a1432c6dc8555af9f78fca2cf740cab2b7,98419c698cab6c7dbb53eb2751417b52ccded4680c5e09543f93c7886c3a173e,c9a803b1eaf849f1c02cfd1dbfac6863128c5b1fc5acd5b5e0fc0a7311fb5b1d,1
\ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/smallpub/ecsp256_pub.csv b/src/cz/crcs/ectester/data/smallpub/ecsp256_pub.csv
deleted file mode 100644
index d27ffdc..0000000
--- a/src/cz/crcs/ectester/data/smallpub/ecsp256_pub.csv
+++ /dev/null
@@ -1 +0,0 @@
-75fce70968862d53e29548aad70582514e960d8128bd3c5f8c4dbe2cf8dad653,55aa4b7d3882fb0a83bd00c9c3bae17f1024d64aec67e1db38ef671e6350beae
\ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/smallpub/ecsp384.csv b/src/cz/crcs/ectester/data/smallpub/ecsp384.csv
deleted file mode 100644
index c58d74b..0000000
--- a/src/cz/crcs/ectester/data/smallpub/ecsp384.csv
+++ /dev/null
@@ -1 +0,0 @@
-d0df6c96cff7081be80d22b005758a2e2f046e15fe020ef886e21b492ac57257a923144bcad989ab6341bd3b700f914b,45c64503be019afd3462b361ad2b2a3bca0aeccc5494a624fb632455e62b4f0c98f944fa97c37811da039823cd77c906,d85583f7f11ad23ec75ed5a414153a06d6640936b8103f5df691fa95cf2afa78f3ea5addc225b144964048c9f7592ae4,2b1341d12dff4f9cf9427c4752962b4c2bdc8fbcd80652516c421cc523212a01ea63c79d6e9a9c84933e353e212416ec,ce416c6e75fa9fd205ed48fc4e3099cbb1d6ed031b7ddbff1d634eb97a83d9b780cfd4dedfdd2c7604d143196c08d933,d0df6c96cff7081be80d22b005758a2e2f046e15fe020ef7664ed51d7701c86bf2a1e9f3002c26fe002314c3c92f1ca9,1
\ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/smallpub/ecsp384_pub.csv b/src/cz/crcs/ectester/data/smallpub/ecsp384_pub.csv
deleted file mode 100644
index 80f2cd6..0000000
--- a/src/cz/crcs/ectester/data/smallpub/ecsp384_pub.csv
+++ /dev/null
@@ -1 +0,0 @@
-a4bd575bf20300b0cf8a2f41dd5a03e908966a4229a5f22f5c190d3641ac2d32b7b24a63482cbbcd0c2257f834834ef1,38d51c8f9e90592f567e81d0e4855e79731b5797857a4c7dc270653bc9f0c31e84693007b09cebf710d5ae3237303949
\ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/smallpub/ecsp521.csv b/src/cz/crcs/ectester/data/smallpub/ecsp521.csv
deleted file mode 100644
index f6835f1..0000000
--- a/src/cz/crcs/ectester/data/smallpub/ecsp521.csv
+++ /dev/null
@@ -1 +0,0 @@
-01d3df430924956e210a605b4dbf4a2e909d7a801658978c88ffd68dcc817f5cc79cf188d9ee82d1a51c44cbd31e9cc5b816d76d5b1312b005f7b68919e275dac99f,00401639f36f2ee45fc164ea3e1f14f4803fd7a77ffdfb392c3f8fe95d1aea331467f4618d59aeee49d5d7c70caf320f7dd1ac166114f562413449991d3aa1a2c49e,004a26a8c47fce204ba953015fa86708c0de720f27523988b097e774168c15f7a215aaf18a5f1b9579ab3db935d45be14c9a87b71170396909b14d06f7a09975b3a6,01c880ae0a355a52791fc9600fd8b35726e9d799101489161c8f90a9c6631d09b3cb347584837d9deb8566a9c5846aded0d01eb947b4affd34e8ea7dbe733cbedafa,00050f12672f163f19d5d493eb82ef777b0213dd4e0cf75a9b99724fbdb54b0cc4e037bf86a48bac28467bdd936c314ce13f6ec7ec69ea09ae4f5444df4b2a117a66,01d3df430924956e210a605b4dbf4a2e909d7a801658978c88ffd68dcc817f5cc7ba0838717c1947f93cfdd3ed87ec2c2df181c7ada553346ec1495732a1e7ffe9b3,1
\ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/smallpub/ecsp521_pub.csv b/src/cz/crcs/ectester/data/smallpub/ecsp521_pub.csv
deleted file mode 100644
index 5cceee6..0000000
--- a/src/cz/crcs/ectester/data/smallpub/ecsp521_pub.csv
+++ /dev/null
@@ -1 +0,0 @@
-002844df0f31f46a40e6c7006cde99155bd5d18d0e4150178a8e307d6aec08fd02d466c03c49b49c2654b7c9a32d88ca014016a7eddd44217be915505d228efb9389,0105921e2172c3050ba4c9d2e744fc5b7b5e8451751e6780c6de88229497be7d23550beefa0cb7fafebb4dd9fad1244c6733befe5a97710f0dc56dc08d9d9df9d846
\ No newline at end of file
diff --git a/src/cz/crcs/ectester/data/smallpub/keys.xml b/src/cz/crcs/ectester/data/smallpub/keys.xml
deleted file mode 100644
index fbdf5e8..0000000
--- a/src/cz/crcs/ectester/data/smallpub/keys.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-
-
-
- ecsp128-pub
- ecsp128_pub.csv
- smallpub/ecsp128
- order = 5
-
-
- ecsp160-pub
- ecsp160_pub.csv
- smallpub/ecsp160
- order = 3
-
-
- ecsp192-pub
- ecsp192_pub.csv
- smallpub/ecsp192
- order = 3
-
-
- ecsp224-pub
- ecsp224_pub.csv
- smallpub/ecsp224
- order = 5
-
-
- ecsp256-pub
- ecsp256_pub.csv
- smallpub/ecsp256
- order = 3
-
-
- ecsp384-pub
- ecsp384_pub.csv
- smallpub/ecsp384
- order = 3
-
-
- ecsp521-pub
- ecsp521_pub.csv
- smallpub/ecsp521
- order = 5
-
-
\ No newline at end of file
diff --git a/src/cz/crcs/ectester/reader/Command.java b/src/cz/crcs/ectester/reader/Command.java
index 92d9da1..24418be 100644
--- a/src/cz/crcs/ectester/reader/Command.java
+++ b/src/cz/crcs/ectester/reader/Command.java
@@ -49,7 +49,7 @@ public abstract class Command {
* @param keyLength key length to set
* @param keyClass key class to allocate
*/
- public Allocate(CardMngr cardManager, byte keyPair, short keyLength, byte keyClass) {
+ protected Allocate(CardMngr cardManager, byte keyPair, short keyLength, byte keyClass) {
super(cardManager);
this.keyPair = keyPair;
this.keyLength = keyLength;
@@ -79,7 +79,7 @@ public abstract class Command {
* @param cardManager
* @param keyPair which keyPair clear, local/remote (KEYPAIR_* || ...)
*/
- public Clear(CardMngr cardManager, byte keyPair) {
+ protected Clear(CardMngr cardManager, byte keyPair) {
super(cardManager);
this.keyPair = keyPair;
@@ -113,7 +113,7 @@ public abstract class Command {
* @param params parameters to set (EC_Consts.PARAMETER_* | ...)
* @param external external curve data, can be null
*/
- public Set(CardMngr cardManager, byte keyPair, byte curve, short params, byte[] external) {
+ protected Set(CardMngr cardManager, byte keyPair, byte curve, short params, byte[] external) {
super(cardManager);
this.keyPair = keyPair;
this.curve = curve;
@@ -190,7 +190,7 @@ public abstract class Command {
* @param cardManager
* @param keyPair which keyPair to generate, local/remote (KEYPAIR_* || ...)
*/
- public Generate(CardMngr cardManager, byte keyPair) {
+ protected Generate(CardMngr cardManager, byte keyPair) {
super(cardManager);
this.keyPair = keyPair;
@@ -222,7 +222,7 @@ public abstract class Command {
* @param key key to export from (EC_Consts.KEY_* | ...)
* @param params params to export (EC_Consts.PARAMETER_* | ...)
*/
- public Export(CardMngr cardManager, byte keyPair, byte key, short params) {
+ protected Export(CardMngr cardManager, byte keyPair, byte key, short params) {
super(cardManager);
this.keyPair = keyPair;
this.key = key;
@@ -263,7 +263,7 @@ public abstract class Command {
* @param corruption whether to invalidate the pubkey before ECDH (EC_Consts.CORRUPTION_* || ...)
* @param type
*/
- public ECDH(CardMngr cardManager, byte pubkey, byte privkey, byte export, byte corruption, byte type) {
+ protected ECDH(CardMngr cardManager, byte pubkey, byte privkey, byte export, byte corruption, byte type) {
super(cardManager);
this.pubkey = pubkey;
this.privkey = privkey;
@@ -298,7 +298,7 @@ public abstract class Command {
* @param export whether to export ECDSA signature
* @param raw data to sign, can be null, in which case random data is signed.
*/
- public ECDSA(CardMngr cardManager, byte keyPair, byte export, byte[] raw) {
+ protected ECDSA(CardMngr cardManager, byte keyPair, byte export, byte[] raw) {
super(cardManager);
this.keyPair = keyPair;
this.export = export;
@@ -342,5 +342,24 @@ public abstract class Command {
return new Response.Cleanup(response, elapsed);
}
}
+
+ /**
+ *
+ */
+ public static class Support extends Command {
+ protected Support(CardMngr cardManager) {
+ super(cardManager);
+
+ this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_SUPPORT, 0, 0);
+ }
+
+ @Override
+ public Response.Support send() throws CardException {
+ long elapsed = -System.nanoTime();
+ ResponseAPDU response = cardManager.send(cmd);
+ elapsed += System.nanoTime();
+ return new Response.Support(response, elapsed);
+ }
+ }
}
diff --git a/src/cz/crcs/ectester/reader/ECTester.java b/src/cz/crcs/ectester/reader/ECTester.java
index 9926d3e..716d4ea 100644
--- a/src/cz/crcs/ectester/reader/ECTester.java
+++ b/src/cz/crcs/ectester/reader/ECTester.java
@@ -80,7 +80,7 @@ public class ECTester {
//Action-related options
private String optListNamed;
- private String optTestCase;
+ private String optTestSuite;
private int optGenerateAmount;
private int optECDHCount;
private byte optECDHKA;
@@ -205,7 +205,7 @@ public class ECTester {
* -h / --help
* -e / --export
* -g / --generate [amount]
- * -t / --test [test_case]
+ * -t / --test [test_suite]
* -dh / --ecdh [count]
* -dhc / --ecdhc [count]
* -dsa / --ecdsa [count]
@@ -245,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. :\n- default:\n- invalid:\n- wrong:\n- nonprime:\n- smallpub:\n- test-vectors:").hasArg().argName("test_case").optionalArg(true).build());
+ actions.addOption(Option.builder("t").longOpt("test").desc("Test ECC support. [test_suite]:\n- default:\n- invalid:\n- wrong:\n- nonprime:\n- smallpub:\n- test-vectors:").hasArg().argName("test_suite").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());
@@ -304,7 +304,7 @@ public class ECTester {
optPrimeField = cli.hasOption("fp");
optBinaryField = cli.hasOption("f2m");
- optNamedCurve = cli.getOptionValue("named");
+ optNamedCurve = cli.getOptionValue("named-curve");
optCustomCurve = cli.hasOption("custom");
optCurveFile = cli.getOptionValue("curve");
@@ -405,10 +405,10 @@ public class ECTester {
optPrimeField = true;
}
- optTestCase = cli.getOptionValue("test", "default").toLowerCase();
- String[] tests = new String[]{"default", "nonprime", "invalid", "smallpub", "test-vectors", "wrong"};
+ optTestSuite = cli.getOptionValue("test", "default").toLowerCase();
+ String[] tests = new String[]{"default", "nonprime", "invalid", "test-vectors", "wrong"};
List testsList = Arrays.asList(tests);
- if (!testsList.contains(optTestCase)) {
+ if (!testsList.contains(optTestSuite)) {
System.err.println("Unknown test case. Should be one of: " + Arrays.toString(tests));
return false;
}
@@ -527,6 +527,9 @@ public class ECTester {
} else if (categories.containsKey(optListNamed)) {
// print given category
//TODO
+ } else {
+ // print given object
+ //TODO
}
}
@@ -631,7 +634,8 @@ public class ECTester {
private void test() throws IOException, CardException {
List commands = new LinkedList<>();
- if (optTestCase.equals("default")) {
+ if (optTestSuite.equals("default")) {
+ commands.add(new Command.Support(cardManager));
if (optNamedCurve != null) {
if (optPrimeField) {
commands.addAll(testCurves(optNamedCurve, KeyPair.ALG_EC_FP));
@@ -675,7 +679,7 @@ public class ECTester {
}
}
}
- } else if (optTestCase.equals("test-vectors")) {
+ } else if (optTestSuite.equals("test-vectors")) {
/* Set original curves (secg/nist/brainpool). Set keypairs from test vectors.
* Do ECDH both ways, export and verify that the result is correct.
*
@@ -683,6 +687,12 @@ public class ECTester {
Map results = dataStore.getObjects(EC_KAResult.class, "test");
for (EC_KAResult result : results.values()) {
EC_Curve curve = dataStore.getObject(EC_Curve.class, result.getCurve());
+ if (optNamedCurve != null && !(result.getCurve().startsWith(optNamedCurve) || result.getCurve().equals(optNamedCurve))) {
+ continue;
+ }
+ if (curve.getBits() != optBits && !optAll) {
+ continue;
+ }
EC_Params onekey = dataStore.getObject(EC_Keypair.class, result.getOneKey());
if (onekey == null) {
onekey = dataStore.getObject(EC_Key.Private.class, result.getOneKey());
@@ -707,53 +717,56 @@ public class ECTester {
} else {
// These tests are dangerous, prompt before them.
- System.out.println("The test you selected (" + optTestCase + ") is potentially dangerous.");
+ System.out.println("The test you selected (" + optTestSuite + ") is potentially dangerous.");
System.out.println("Some of these tests have caused temporary DoS of some cards.");
System.out.print("Do you want to proceed? (y/n):");
- String confirmation = System.console().readLine();
+ Scanner in = new Scanner(System.in);
+ String confirmation = in.nextLine();
if (!Arrays.asList("yes", "y", "Y").contains(confirmation)) {
return;
}
- if (optTestCase.equals("wrong") || optTestCase.equals("nonprime")) {
- /* Just do the default tests on the wrong and non-prime curves.
+ if (optTestSuite.equals("wrong")) {
+ /* Just do the default tests on the wrong curves.
* These should generally fail, the curves aren't safe.
*/
if (optPrimeField) {
- commands.addAll(testCurves(optTestCase, KeyPair.ALG_EC_FP));
+ commands.addAll(testCurves(optTestSuite, KeyPair.ALG_EC_FP));
}
if (optBinaryField) {
- commands.addAll(testCurves(optTestCase, KeyPair.ALG_EC_F2M));
+ commands.addAll(testCurves(optTestSuite, KeyPair.ALG_EC_F2M));
}
- } else if (optTestCase.equals("smallpub")) {
- /* Do the default tests with the public keys set to provided smallpub keys.
+ } else if (optTestSuite.equals("nonprime")) {
+ /* Do the default tests with the public keys set to provided nonprime keys.
* These should fail, the curves aren't safe so that if the computation with
* a small order public key succeeds the private key modulo the public key order
* is revealed.
*/
- Map keys = dataStore.getObjects(EC_Key.class, "smallpub");
+ Map keys = dataStore.getObjects(EC_Key.class, "nonprime");
for (EC_Key key : keys.values()) {
EC_Curve curve = dataStore.getObject(EC_Curve.class, key.getCurve());
if ((curve.getBits() == optBits || optAll)) {
commands.add(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, curve.getBits(), curve.getField()));
commands.add(new Command.Generate(cardManager, ECTesterApplet.KEYPAIR_LOCAL));
- commands.add(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()));
+ commands.add(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()));
+ commands.add(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_REMOTE, EC_Consts.CURVE_external, key.getParams(), key.flatten()));
commands.add(new Command.ECDH(cardManager, ECTesterApplet.KEYPAIR_REMOTE, ECTesterApplet.KEYPAIR_LOCAL, ECTesterApplet.EXPORT_FALSE, EC_Consts.CORRUPTION_NONE, EC_Consts.KA_ECDH));
commands.add(new Command.Cleanup(cardManager));
}
}
- } else if (optTestCase.equals("invalid")) {
+ } else if (optTestSuite.equals("invalid")) {
/* Set original curves (secg/nist/brainpool). Generate local.
* Try ECDH with invalid public keys of increasing (or decreasing) order.
*
*/
//TODO
+ System.err.println("Currently not yet implemented.");
}
}
List test = Command.sendAll(commands);
- systemOutLogger.println(Response.toString(test));
+ systemOutLogger.println(Response.toString(test, optTestSuite));
for (Response response : test) {
if (response instanceof Response.ECDH) {
@@ -1053,8 +1066,7 @@ public class ECTester {
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.add(new Command.Set(cardManager, ECTesterApplet.KEYPAIR_BOTH, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()));
commands.addAll(testCurve());
commands.add(new Command.Cleanup(cardManager));
}
diff --git a/src/cz/crcs/ectester/reader/Response.java b/src/cz/crcs/ectester/reader/Response.java
index 92d1b9f..4bb5b88 100644
--- a/src/cz/crcs/ectester/reader/Response.java
+++ b/src/cz/crcs/ectester/reader/Response.java
@@ -14,8 +14,7 @@ import java.util.List;
public abstract class Response {
private ResponseAPDU resp;
private long time;
- private short sw1 = 0;
- private short sw2 = 0;
+ private short[] sws;
private int numSW = 0;
private byte[][] params;
private boolean success = true;
@@ -27,23 +26,20 @@ public abstract class Response {
protected void parse(int numSW, int numParams) {
this.numSW = numSW;
+ this.sws = new short[numSW];
byte[] data = resp.getData();
int offset = 0;
//parse SWs in response
- if (--numSW >= 0 && getLength() >= 2) {
- sw1 = Util.getShort(data, offset);
- offset += 2;
- if (sw1 != ISO7816.SW_NO_ERROR) {
- success = false;
- }
- }
- if (--numSW >= 0 && getLength() >= 4) {
- sw2 = Util.getShort(data, offset);
- offset += 2;
- if (sw2 != ISO7816.SW_NO_ERROR) {
- success = false;
+ for (int i = 0; i < numSW; ++i) {
+ if (getLength() >= (offset + 2)) {
+ short sw = Util.getShort(data, offset);
+ offset += 2;
+ sws[i] = sw;
+ if (sw != ISO7816.SW_NO_ERROR) {
+ success = false;
+ }
}
}
@@ -79,11 +75,15 @@ public abstract class Response {
}
public short getSW1() {
- return sw1;
+ return sws[0];
}
public short getSW2() {
- return sw2;
+ return sws[1];
+ }
+
+ public short getSW(int index) {
+ return sws[index];
}
public int getNumSW() {
@@ -122,16 +122,16 @@ public abstract class Response {
}
public static String toString(List responses, String prefix) {
+ if (prefix != null)
+ prefix += " | ";
StringBuilder out = new StringBuilder();
for (int i = 0; i < responses.size(); ++i) {
Response r = responses.get(i);
String message = r.toString();
- String suffix;
- if (r.getNumSW() == 1) {
- suffix = String.format("%s", Util.getSWString(r.getSW1()));
- } else {
- suffix = String.format("%s %s", Util.getSWString(r.getSW1()), Util.getSWString(r.getSW2()));
+ String suffix = "";
+ for (int j = 0; j < r.getNumSW(); ++j) {
+ suffix += " " + Util.getSWString(r.getSW(j));
}
if (prefix != null)
@@ -153,7 +153,7 @@ public abstract class Response {
private short keyLength;
private byte keyClass;
- public Allocate(ResponseAPDU response, long time, byte keyPair, short keyLength, byte keyClass) {
+ protected Allocate(ResponseAPDU response, long time, byte keyPair, short keyLength, byte keyClass) {
super(response, time);
this.keyPair = keyPair;
this.keyLength = keyLength;
@@ -181,7 +181,7 @@ public abstract class Response {
public static class Clear extends Response {
private byte keyPair;
- public Clear(ResponseAPDU response, long time, byte keyPair) {
+ protected Clear(ResponseAPDU response, long time, byte keyPair) {
super(response, time);
this.keyPair = keyPair;
@@ -323,7 +323,7 @@ public abstract class Response {
private byte key;
private short parameters;
- public Export(ResponseAPDU response, long time, byte keyPair, byte key, short parameters) {
+ protected Export(ResponseAPDU response, long time, byte keyPair, byte key, short parameters) {
super(response, time);
this.keyPair = keyPair;
this.key = key;
@@ -527,6 +527,22 @@ public abstract class Response {
return String.format("Requested JCSystem object deletion");
}
+ }
+
+ /**
+ *
+ */
+ public static class Support extends Response {
+
+ protected Support(ResponseAPDU response, long time) {
+ super(response, time);
+ parse(3,0);
+ }
+
+ @Override
+ public String toString() {
+ return "Support of ECDH, ECDHC, ECDSA";
+ }
}
}
--
cgit v1.2.3-70-g09d2