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