aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJ08nY2019-03-18 10:44:39 +0100
committerJ08nY2019-03-18 10:44:39 +0100
commit648d8718af10186e5c585844f6bb8c32e244c3a0 (patch)
tree88b4fd80c4044b6febba2e28e6f1cdabdfceccb4
parentf85110c524d53aa856ebfedb2a7c4cd516179126 (diff)
downloadECTester-648d8718af10186e5c585844f6bb8c32e244c3a0.tar.gz
ECTester-648d8718af10186e5c585844f6bb8c32e244c3a0.tar.zst
ECTester-648d8718af10186e5c585844f6bb8c32e244c3a0.zip
-rw-r--r--README.md36
-rw-r--r--src/cz/crcs/ectester/applet/ECTesterApplet.java1
-rw-r--r--src/cz/crcs/ectester/applet/ECTesterAppletExtended.java1
-rw-r--r--src/cz/crcs/ectester/common/util/Util.java15
-rw-r--r--src/cz/crcs/ectester/reader/CardMngr.java34
-rw-r--r--src/cz/crcs/ectester/reader/ECTesterReader.java90
-rw-r--r--src/cz/crcs/ectester/standalone/ECTesterStandalone.java3
7 files changed, 93 insertions, 87 deletions
diff --git a/README.md b/README.md
index a766235..bdc8cd8 100644
--- a/README.md
+++ b/README.md
@@ -53,18 +53,18 @@ See `java -jar ECTesterReader.jar -h`, `java -jar ECTesterReader.jar -ls` and [D
-t,--test <test_suite[:from[:to]]> Test ECC support. Optionally specify
a test number to run only a part of
a test suite. <test_suite>:
- - default:
- - compression:
- - invalid:
- - twist:
- - degenerate:
- - cofactor:
- - wrong:
- - signature:
- - composite:
- - test-vectors:
- - edge-cases:
- - miscellaneous:
+ - default
+ - compression
+ - invalid
+ - twist
+ - degenerate
+ - cofactor
+ - wrong
+ - signature
+ - composite
+ - test-vectors
+ - edge-cases
+ - miscellaneous
-dh,--ecdh <count> Do EC KeyAgreement (ECDH...),
[count] times.
-dsa,--ecdsa <count> Sign data with ECDSA, [count] times.
@@ -109,12 +109,21 @@ See `java -jar ECTesterReader.jar -h`, `java -jar ECTesterReader.jar -ls` and [D
running command in dry run mode and
normal mode, and subtracting the
two.
+ --time-unit <unit> Use given time unit in measurement,
+ one of: milli, micro, nano.
--cleanup Send the cleanup command trigerring
JCSystem.requestObjectDeletion()
after some operations.
-s,--simulate Simulate a card with jcardsim
instead of using a terminal.
-y,--yes Accept all warnings and prompts.
+ -to,--test-options <options> Test options to use:
+ - preset: Use preset semi-random
+ private keys (derived from curve)
+ instead of generating keypairs on
+ the cards when the test needs one.
+ - random: Use fully random private
+ keys instead of generating keypairs.
-ka,--ka-type <type> Set KeyAgreement object [type],
corresponds to JC.KeyAgreement
constants.
@@ -198,7 +207,8 @@ Lists the implemented test suites and gives their short description.
Get and print ECTester applet info from an applet installed on a card.
Outputs:
-
+ - Card ATR
+ - Negotiated protocol (T=0/T=1)
- ECTester applet version
- ECTester APDU support (basic/extended APDU)
- JavaCard API version
diff --git a/src/cz/crcs/ectester/applet/ECTesterApplet.java b/src/cz/crcs/ectester/applet/ECTesterApplet.java
index b222d46..e9e7235 100644
--- a/src/cz/crcs/ectester/applet/ECTesterApplet.java
+++ b/src/cz/crcs/ectester/applet/ECTesterApplet.java
@@ -1,6 +1,7 @@
/*
* ECTester, tool for testing Elliptic curve cryptography implementations.
* Copyright (c) 2016-2019 Petr Svenda <petr@svenda.com>
+ * Copyright (c) 2016-2019 Jan Jancar <johny@neuromancer.sk>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
diff --git a/src/cz/crcs/ectester/applet/ECTesterAppletExtended.java b/src/cz/crcs/ectester/applet/ECTesterAppletExtended.java
index 79ccf7b..cbbe650 100644
--- a/src/cz/crcs/ectester/applet/ECTesterAppletExtended.java
+++ b/src/cz/crcs/ectester/applet/ECTesterAppletExtended.java
@@ -1,6 +1,7 @@
/*
* ECTester, tool for testing Elliptic curve cryptography implementations.
* Copyright (c) 2016-2019 Petr Svenda <petr@svenda.com>
+ * Copyright (c) 2016-2019 Jan Jancar <johny@neuromancer.sk>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
diff --git a/src/cz/crcs/ectester/common/util/Util.java b/src/cz/crcs/ectester/common/util/Util.java
new file mode 100644
index 0000000..7f18368
--- /dev/null
+++ b/src/cz/crcs/ectester/common/util/Util.java
@@ -0,0 +1,15 @@
+package cz.crcs.ectester.common.util;
+
+public class Util {
+ public static long convertTime(long nanos, String timeUnit) {
+ switch (timeUnit) {
+ default:
+ case "nano":
+ return nanos;
+ case "micro":
+ return nanos / 1000;
+ case "milli":
+ return nanos / 1000000;
+ }
+ }
+}
diff --git a/src/cz/crcs/ectester/reader/CardMngr.java b/src/cz/crcs/ectester/reader/CardMngr.java
index 87384c3..0a01d9e 100644
--- a/src/cz/crcs/ectester/reader/CardMngr.java
+++ b/src/cz/crcs/ectester/reader/CardMngr.java
@@ -8,7 +8,6 @@ import javacard.framework.ISO7816;
import javax.smartcardio.*;
import java.util.*;
-import java.util.function.Function;
/**
* @author Petr Svenda petr@svenda.com
@@ -184,6 +183,18 @@ public class CardMngr {
chunking = state;
}
+ public String getProtocol() {
+ if (simulate) {
+ return simulator.getProtocol();
+ } else {
+ if (card != null) {
+ return card.getProtocol();
+ } else {
+ return null;
+ }
+ }
+ }
+
// Functions for CPLC taken and modified from https://github.com/martinpaljak/GlobalPlatformPro
private static final byte CLA_GP = (byte) 0x80;
private static final byte ISO7816_INS_GET_DATA = (byte) 0xCA;
@@ -280,6 +291,18 @@ public class CardMngr {
}
}
+ public ATR getATR() {
+ if (simulate) {
+ return new ATR(simulator.getATR());
+ } else {
+ if (card != null) {
+ return card.getATR();
+ } else {
+ return null;
+ }
+ }
+ }
+
public CPLC getCPLC() throws CardException {
byte[] data = fetchCPLC();
return new CPLC(data);
@@ -311,13 +334,6 @@ public class CardMngr {
}
}
- public ATR getATR() {
- if (simulate) {
- return new ATR(simulator.getATR());
- } else {
- return card.getATR();
- }
- }
public static List<CardTerminal> getReaderList() {
try {
@@ -336,7 +352,7 @@ public class CardMngr {
byte[] data = apdu.getBytes();
int numChunks = (data.length + 254) / 255;
for (int i = 0; i < numChunks; ++i) {
- int chunkStart = i *255;
+ int chunkStart = i * 255;
int chunkLength = 255;
if (chunkStart + chunkLength > data.length) {
chunkLength = data.length - chunkStart;
diff --git a/src/cz/crcs/ectester/reader/ECTesterReader.java b/src/cz/crcs/ectester/reader/ECTesterReader.java
index e0a8a24..cb64b4c 100644
--- a/src/cz/crcs/ectester/reader/ECTesterReader.java
+++ b/src/cz/crcs/ectester/reader/ECTesterReader.java
@@ -1,6 +1,7 @@
/*
* ECTester, tool for testing Elliptic curve cryptography implementations.
* Copyright (c) 2016-2019 Petr Svenda <petr@svenda.com>
+ * Copyright (c) 2016-2019 Jan Jancar <johny@neuromancer.sk>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -29,10 +30,8 @@ import cz.crcs.ectester.common.cli.Colors;
import cz.crcs.ectester.common.ec.EC_Curve;
import cz.crcs.ectester.common.output.OutputLogger;
import cz.crcs.ectester.common.output.TestWriter;
-import cz.crcs.ectester.common.util.ByteUtil;
-import cz.crcs.ectester.common.util.CardUtil;
-import cz.crcs.ectester.common.util.ECUtil;
-import cz.crcs.ectester.common.util.FileUtil;
+import cz.crcs.ectester.common.util.Util;
+import cz.crcs.ectester.common.util.*;
import cz.crcs.ectester.data.EC_Store;
import cz.crcs.ectester.reader.command.Command;
import cz.crcs.ectester.reader.output.FileTestWriter;
@@ -77,7 +76,7 @@ public class ECTesterReader {
public static final String VERSION = "v0.3.2";
public static String GIT_COMMIT = "";
private static String DESCRIPTION;
- private static String LICENSE = "MIT Licensed\nCopyright (c) 2016-2018 Petr Svenda <petr@svenda.com>";
+ private static String LICENSE = "MIT Licensed\nCopyright © 2016-2019 Petr Svenda <petr@svenda.com>\nCopyright © 2016-2019 Jan Jancar <johny@neuromancer.sk>";
private static String CLI_HEADER;
private static String CLI_FOOTER = "\n" + LICENSE;
@@ -249,54 +248,6 @@ public class ECTesterReader {
* @throws ParseException if there are any problems encountered while parsing the command line tokens
*/
private CommandLine parseArgs(String[] args) throws ParseException {
- /*
- * Actions:
- * -V / --version
- * -h / --help
- * -e / --export
- * -g / --generate [amount]
- * -t / --test [test_suite]
- * -dh / --ecdh [count]]
- * -dsa / --ecdsa [count]
- * -ln / --list-named [obj]
- * -ls / --list-suites
- * -nfo / --info
- *
- * Options:
- * -b / --bit-size <b> // -a / --all
- *
- * -fp / --prime-field
- * -f2m / --binary-field
- *
- * -u / --custom
- * -nc / --named-curve <cat/id>
- * -c / --curve <curve_file> field,a,b,gx,gy,r,k
- *
- * -pub / --public <pubkey_file> wx,wy
- * -npub / --named-public <cat/id>
- *
- * -priv / --private <privkey_file> s
- * -npriv / --named-private <cat/id>
- *
- * -k / --key <key_file> wx,wy,s
- * -nk / --named-key <cat/id>
- *
- * -v / --verbose
- *
- * -i / --input <input_file>
- * -o / --output <output_file>
- * --format <format>
- * -l / --log [log_file]
- *
- * -f / --fresh
- * --cleanup
- * -s / --simulate
- * -y / --yes
- * -ka/ --ka-type <type>
- * -sig/--sig-type <type>
- * -C / --color
- * -to/ --test-options <opts>
- */
OptionGroup actions = new OptionGroup();
actions.setRequired(true);
actions.addOption(Option.builder("V").longOpt("version").desc("Print version info.").build());
@@ -348,6 +299,7 @@ public class ECTesterReader {
opts.addOption(Option.builder().longOpt("fixed-public").desc("Generate public key only once, keep it for later ECDH.").build());
opts.addOption(Option.builder("f").longOpt("fresh").desc("Generate fresh keys (set domain parameters before every generation).").build());
opts.addOption(Option.builder().longOpt("time").desc("Output better timing values, by running command in dry run mode and normal mode, and subtracting the two.").build());
+ opts.addOption(Option.builder().longOpt("time-unit").desc("Use given time unit in measurement, one of: milli, micro, nano.").hasArg().argName("unit").build());
opts.addOption(Option.builder().longOpt("cleanup").desc("Send the cleanup command trigerring JCSystem.requestObjectDeletion() after some operations.").build());
opts.addOption(Option.builder("s").longOpt("simulate").desc("Simulate a card with jcardsim instead of using a terminal.").build());
opts.addOption(Option.builder("y").longOpt("yes").desc("Accept all warnings and prompts.").build());
@@ -390,11 +342,13 @@ public class ECTesterReader {
private void info() throws CardException {
Response.GetInfo info = new Command.GetInfo(cardManager).send();
- System.out.println(String.format("ECTester applet version: %s", info.getVersion()));
- System.out.println(String.format("ECTester applet APDU support: %s", (info.getBase() == ECTesterApplet.BASE_221) ? "basic" : "extended length"));
- System.out.println(String.format("JavaCard API version: %.1f", info.getJavaCardVersion()));
- System.out.println(String.format("JavaCard supports system cleanup: %s", info.getCleanupSupport()));
- System.out.println(String.format("Array sizes (apduBuf, ram, ram2, apduArr): %d %d %d %d", info.getApduBufferLength(), info.getRamArrayLength(), info.getRamArray2Length(), info.getApduArrayLength()));
+ System.out.println(String.format("Card ATR:\t\t\t\t%s", ByteUtil.bytesToHex(cardManager.getATR().getBytes(), false)));
+ System.out.println(String.format("Card protocol:\t\t\t\t%s", cardManager.getProtocol()));
+ System.out.println(String.format("ECTester applet version:\t\t%s", info.getVersion()));
+ System.out.println(String.format("ECTester applet APDU support:\t\t%s", (info.getBase() == ECTesterApplet.BASE_221) ? "basic" : "extended length"));
+ System.out.println(String.format("JavaCard API version:\t\t\t%.1f", info.getJavaCardVersion()));
+ System.out.println(String.format("JavaCard supports system cleanup:\t%s", info.getCleanupSupport()));
+ System.out.println(String.format("Array sizes (apduBuf,ram,ram2,apduArr):\t%d %d %d %d", info.getApduBufferLength(), info.getRamArrayLength(), info.getRamArray2Length(), info.getApduArrayLength()));
}
/**
@@ -461,7 +415,7 @@ public class ECTesterReader {
respWriter.outputResponse(allocate);
OutputStreamWriter keysFile = FileUtil.openFiles(cfg.outputs);
- keysFile.write("index;genTime[milli];exportTime[milli];pubW;privS\n");
+ keysFile.write(String.format("index;genTime[%s];exportTime[%s];pubW;privS\n", cfg.timeUnit, cfg.timeUnit));
int generated = 0;
int retry = 0;
@@ -495,7 +449,7 @@ public class ECTesterReader {
String pub = ByteUtil.bytesToHex(export.getParameter(ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.PARAMETER_W), false);
String priv = ByteUtil.bytesToHex(export.getParameter(ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.PARAMETER_S), false);
- String line = String.format("%d;%d;%d;%s;%s\n", generated, time / 1000000, export.getDuration() / 1000000, pub, priv);
+ String line = String.format("%d;%d;%d;%s;%s\n", generated, Util.convertTime(time, cfg.timeUnit), Util.convertTime(export.getDuration(), cfg.timeUnit), pub, priv);
keysFile.write(line);
keysFile.flush();
generated++;
@@ -601,7 +555,7 @@ public class ECTesterReader {
OutputStreamWriter out = null;
if (cfg.outputs != null) {
out = FileUtil.openFiles(cfg.outputs);
- out.write("index;time[milli];pubW;privS;secret\n");
+ out.write(String.format("index;time[%s];pubW;privS;secret\n", cfg.timeUnit));
}
Response gen = new Command.Generate(cardManager, ECTesterApplet.KEYPAIR_BOTH).send();
@@ -669,7 +623,7 @@ public class ECTesterReader {
if (out != null) {
time += result.getDuration();
- out.write(String.format("%d;%d;%s;%s;%s\n", done, time / 1000000, ByteUtil.bytesToHex(pubkey_bytes, false), ByteUtil.bytesToHex(privkey_bytes, false), ByteUtil.bytesToHex(result.getSecret(), false)));
+ out.write(String.format("%d;%d;%s;%s;%s\n", done, Util.convertTime(time, cfg.timeUnit), ByteUtil.bytesToHex(pubkey_bytes, false), ByteUtil.bytesToHex(privkey_bytes, false), ByteUtil.bytesToHex(result.getSecret(), false)));
out.flush();
}
@@ -727,7 +681,7 @@ public class ECTesterReader {
OutputStreamWriter out = FileUtil.openFiles(cfg.outputs);
if (out != null) {
- out.write("index;signTime[milli];verifyTime[milli];data;pubW;privS;signature;nonce;valid\n");
+ out.write(String.format("index;signTime[%s];verifyTime[%s];data;pubW;privS;signature;nonce;valid\n", cfg.timeUnit, cfg.timeUnit));
}
Command.Export export = new Command.Export(cardManager, ECTesterApplet.KEYPAIR_LOCAL, EC_Consts.KEY_BOTH, EC_Consts.PARAMETERS_KEYPAIR);
@@ -800,7 +754,7 @@ public class ECTesterReader {
k = ByteUtil.bytesToHex(kValue.toByteArray(), false);
}
}
- out.write(String.format("%d;%d;%d;%s;%s;%s;%s;%s;%d\n", done, signTime / 1000000, verifyTime / 1000000, dataString, pub, priv, ByteUtil.bytesToHex(signature, false), k, verifyResp.successful() ? 1 : 0));
+ out.write(String.format("%d;%d;%d;%s;%s;%s;%s;%s;%d\n", done, Util.convertTime(signTime, cfg.timeUnit), Util.convertTime(verifyTime, cfg.timeUnit), dataString, pub, priv, ByteUtil.bytesToHex(signature, false), k, verifyResp.successful() ? 1 : 0));
out.flush();
}
@@ -856,6 +810,7 @@ public class ECTesterReader {
public String[] outputs;
public boolean fresh = false;
public boolean time = false;
+ public String timeUnit;
public boolean cleanup = false;
public boolean simulate = false;
public boolean yes = false;
@@ -922,6 +877,13 @@ public class ECTesterReader {
color = cli.hasOption("color");
Colors.enabled = color;
+ timeUnit = cli.getOptionValue("time-unit", "micro");
+ String[] times = new String[]{"milli", "micro", "nano"};
+ if (!Arrays.asList(times).contains(timeUnit)) {
+ System.err.println(Colors.error("Wrong time unit " + timeUnit + ". Should be one of " + Arrays.toString(times)));
+ return false;
+ }
+
if (cli.hasOption("list-named")) {
listNamed = cli.getOptionValue("list-named");
return true;
diff --git a/src/cz/crcs/ectester/standalone/ECTesterStandalone.java b/src/cz/crcs/ectester/standalone/ECTesterStandalone.java
index 1b4d9b8..e39944b 100644
--- a/src/cz/crcs/ectester/standalone/ECTesterStandalone.java
+++ b/src/cz/crcs/ectester/standalone/ECTesterStandalone.java
@@ -1,6 +1,7 @@
/*
* ECTester, tool for testing Elliptic curve cryptography implementations.
* Copyright (c) 2016-2018 Petr Svenda <petr@svenda.com>
+ * Copyright (c) 2016-2019 Jan Jancar <johny@neuromancer.sk>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -85,7 +86,7 @@ public class ECTesterStandalone {
private TreeCommandLine cli;
public static final String VERSION = "v0.3.2";
private static final String DESCRIPTION = "ECTesterStandalone " + VERSION + ", an Elliptic Curve Cryptography support tester/utility.";
- private static final String LICENSE = "MIT Licensed\nCopyright (c) 2016-2018 Petr Svenda <petr@svenda.com>";
+ private static final String LICENSE = "MIT Licensed\nCopyright © 2016-2019 Petr Svenda <petr@svenda.com>\nCopyright © 2016-2019 Jan Jancar <johny@neuromancer.sk>";
private static final String CLI_HEADER = "\n" + DESCRIPTION + "\n\n";
private static final String CLI_FOOTER = "\n" + LICENSE;