aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJ08nY2017-03-07 23:54:16 +0100
committerJ08nY2017-03-07 23:54:16 +0100
commitc6cb9f4cda4391713bd59cc1e1e7cae8d50cf331 (patch)
tree5f2b601b871acd66bbf154d002bbba29cbd52b96
parent197434b2bb2882277b21044331d0a2b64bc314c8 (diff)
downloadECTester-c6cb9f4cda4391713bd59cc1e1e7cae8d50cf331.tar.gz
ECTester-c6cb9f4cda4391713bd59cc1e1e7cae8d50cf331.tar.zst
ECTester-c6cb9f4cda4391713bd59cc1e1e7cae8d50cf331.zip
-rw-r--r--dist/ECTester.jarbin208535 -> 104311 bytes
-rw-r--r--src/cz/crcs/ectester/reader/CardMngr.java73
-rw-r--r--src/cz/crcs/ectester/reader/ECTester.java11
-rw-r--r--src/cz/crcs/ectester/reader/Response.java9
4 files changed, 64 insertions, 29 deletions
diff --git a/dist/ECTester.jar b/dist/ECTester.jar
index 0f2e8c6..8201bec 100644
--- a/dist/ECTester.jar
+++ b/dist/ECTester.jar
Binary files differ
diff --git a/src/cz/crcs/ectester/reader/CardMngr.java b/src/cz/crcs/ectester/reader/CardMngr.java
index 6875d2e..e11bcb3 100644
--- a/src/cz/crcs/ectester/reader/CardMngr.java
+++ b/src/cz/crcs/ectester/reader/CardMngr.java
@@ -22,6 +22,7 @@ public class CardMngr {
private JavaxSmartCardInterface simulator = null;
private boolean simulate = false;
+ private boolean verbose = true;
private final byte[] selectCM = {
(byte) 0x00, (byte) 0xa4, (byte) 0x04, (byte) 0x00, (byte) 0x07, (byte) 0xa0, (byte) 0x00, (byte) 0x00,
@@ -39,10 +40,14 @@ public class CardMngr {
public static final short NUMBER_OF_RECORDS = (short) 0x0a; // 10 records
public CardMngr() {
- this(false);
}
- public CardMngr(boolean simulate) {
+ public CardMngr(boolean verbose) {
+ this.verbose = verbose;
+ }
+
+ public CardMngr(boolean verbose, boolean simulate) {
+ this(verbose);
this.simulate = simulate;
}
@@ -54,22 +59,27 @@ public class CardMngr {
List<CardTerminal> terminalList = getReaderList();
if (terminalList == null || terminalList.isEmpty()) {
- System.out.println("No terminals found");
+ System.err.println("No terminals found");
return false;
}
//List numbers of Card readers
boolean cardFound = false;
for (int i = 0; i < terminalList.size(); i++) {
- System.out.println(i + " : " + terminalList.get(i));
+
+ if (verbose)
+ System.out.println(i + " : " + terminalList.get(i));
+
terminal = terminalList.get(i);
if (terminal.isCardPresent()) {
card = terminal.connect("*");
- System.out.println("card: " + card);
+ if (verbose)
+ System.out.println("card: " + card);
channel = card.getBasicChannel();
//reset the card
- System.out.println(Util.bytesToHex(card.getATR().getBytes()));
+ if (verbose)
+ System.out.println(Util.bytesToHex(card.getATR().getBytes()));
cardFound = true;
}
@@ -85,7 +95,7 @@ public class CardMngr {
// Test available card - if more present, let user to select one
List<CardTerminal> terminalList = CardMngr.getReaderList();
if (terminalList == null || terminalList.isEmpty()) {
- System.out.println("ERROR: No suitable reader with card detected. Please check your reader connection");
+ System.err.println("ERROR: No suitable reader with card detected. Please check your reader connection");
return false;
} else {
if (terminalList.size() == 1) {
@@ -116,7 +126,8 @@ public class CardMngr {
if (terminal != null) {
card = terminal.connect("*");
- System.out.println("card: " + card);
+ if (verbose)
+ System.out.println("card: " + card);
channel = card.getBasicChannel();
}
@@ -166,7 +177,7 @@ public class CardMngr {
ResponseAPDU resp = send(apdu);
if (resp.getSW() != 0x9000) { // 0x9000 is "OK"
- System.out.println("Fail to obtain card's response data");
+ System.err.println("Fail to obtain card's response data");
data = null;
} else {
byte temp[] = resp.getBytes();
@@ -191,7 +202,8 @@ public class CardMngr {
ResponseAPDU resp = send(apdu);
- System.out.println("Response: " + Integer.toHexString(resp.getSW()));
+ if (verbose)
+ System.out.println("Response: " + Integer.toHexString(resp.getSW()));
if (resp.getSW() != 0x6D00) { // Note: 0x6D00 is SW_INS_NOT_SUPPORTED
// something?
@@ -204,16 +216,18 @@ public class CardMngr {
TerminalFactory factory = TerminalFactory.getDefault();
return factory.terminals().list();
} catch (CardException ex) {
- System.out.println("Exception : " + ex);
+ System.err.println("Exception : " + ex);
return null;
}
}
public ResponseAPDU sendAPDU(CommandAPDU apdu) throws CardException {
- System.out.println(">>>>");
- System.out.println(apdu);
+ if (verbose) {
+ System.out.println(">>>>");
+ System.out.println(apdu);
- System.out.println(Util.bytesToHex(apdu.getBytes()));
+ System.out.println(Util.bytesToHex(apdu.getBytes()));
+ }
long elapsed = -System.nanoTime();
@@ -221,8 +235,10 @@ public class CardMngr {
elapsed += System.nanoTime();
- System.out.println(responseAPDU);
- System.out.println(Util.bytesToHex(responseAPDU.getBytes()));
+ if (verbose) {
+ System.out.println(responseAPDU);
+ System.out.println(Util.bytesToHex(responseAPDU.getBytes()));
+ }
if (responseAPDU.getSW1() == (byte) 0x61) {
CommandAPDU apduToSend = new CommandAPDU((byte) 0x00,
@@ -230,11 +246,14 @@ public class CardMngr {
responseAPDU.getSW1());
responseAPDU = channel.transmit(apduToSend);
- System.out.println(Util.bytesToHex(responseAPDU.getBytes()));
+ if (verbose)
+ System.out.println(Util.bytesToHex(responseAPDU.getBytes()));
}
- System.out.println("<<<<");
- System.out.println("Elapsed time (ms): " + elapsed / 1000000);
+ if (verbose) {
+ System.out.println("<<<<");
+ System.out.println("Elapsed time (ms): " + elapsed / 1000000);
+ }
return responseAPDU;
}
@@ -254,16 +273,20 @@ public class CardMngr {
}
public ResponseAPDU sendAPDUSimulator(CommandAPDU apdu) {
- System.out.println(">>>>");
- System.out.println(apdu);
- System.out.println(Util.bytesToHex(apdu.getBytes()));
+ if (verbose) {
+ System.out.println(">>>>");
+ System.out.println(apdu);
+ System.out.println(Util.bytesToHex(apdu.getBytes()));
+ }
ResponseAPDU response = simulator.transmitCommand(apdu);
byte[] responseBytes = response.getBytes();
- System.out.println(response);
- System.out.println(Util.bytesToHex(responseBytes));
- System.out.println("<<<<");
+ if (verbose) {
+ System.out.println(response);
+ System.out.println(Util.bytesToHex(responseBytes));
+ System.out.println("<<<<");
+ }
return response;
}
diff --git a/src/cz/crcs/ectester/reader/ECTester.java b/src/cz/crcs/ectester/reader/ECTester.java
index d94279e..c4d29a5 100644
--- a/src/cz/crcs/ectester/reader/ECTester.java
+++ b/src/cz/crcs/ectester/reader/ECTester.java
@@ -73,7 +73,8 @@ public class ECTester {
private String optLog = null;
- private String optInput;
+ private boolean optVerbose = false;
+ private String optInput = null;
private String optOutput = null;
private boolean optFresh = false;
private boolean optSimulate = false;
@@ -119,7 +120,7 @@ public class ECTester {
}
//init CardManager
- cardManager = new CardMngr(optSimulate);
+ cardManager = new CardMngr(optVerbose, optSimulate);
//connect or simulate connection
if (optSimulate) {
@@ -213,6 +214,9 @@ public class ECTester {
* -k / --key [key_file] wx,wy,s
* -nk / --named-key [cat/id]
*
+ * -v / --verbose
+ *
+ * -i / --input [input_file]
* -o / --output [output_file]
* -f / --fresh
* -s / --simulate
@@ -260,6 +264,7 @@ public class ECTester {
opts.addOption(Option.builder("i").longOpt("input").desc("Input from fileĀ [input_file], for ecdsa signing.").hasArg().argName("input_file").build());
opts.addOption(Option.builder("o").longOpt("output").desc("Output into file [output_file].").hasArg().argName("output_file").build());
opts.addOption(Option.builder("l").longOpt("log").desc("Log output into file [log_file].").hasArg().argName("log_file").optionalArg(true).build());
+ opts.addOption(Option.builder("v").longOpt("verbose").desc("Turn on verbose logging.").build());
opts.addOption(Option.builder("f").longOpt("fresh").desc("Generate fresh keys(set domain parameters before every generation).").build());
opts.addOption(Option.builder("s").longOpt("simulate").desc("Simulate a card with jcardsim instead of using a terminal.").build());
@@ -295,6 +300,8 @@ public class ECTester {
if (cli.hasOption("log")) {
optLog = cli.getOptionValue("log", String.format("ECTESTER_log_%d.log", System.currentTimeMillis() / 1000));
}
+
+ optVerbose = cli.hasOption("verbose");
optInput = cli.getOptionValue("input");
optOutput = cli.getOptionValue("output");
optFresh = cli.hasOption("fresh");
diff --git a/src/cz/crcs/ectester/reader/Response.java b/src/cz/crcs/ectester/reader/Response.java
index cdf82fc..28b6c17 100644
--- a/src/cz/crcs/ectester/reader/Response.java
+++ b/src/cz/crcs/ectester/reader/Response.java
@@ -119,7 +119,9 @@ public abstract class Response {
public static String toString(List<Response> responses) {
StringBuilder out = new StringBuilder();
- for (Response r : responses) {
+ for (int i = 0; i < responses.size(); ++i) {
+ Response r = responses.get(i);
+
String message = r.toString();
String suffix;
if (r.getNumSW() == 1) {
@@ -127,7 +129,10 @@ public abstract class Response {
} else {
suffix = String.format("%s %s", Util.getPrintError(r.getSW1()), Util.getPrintError(r.getSW2()));
}
- out.append(String.format("%-55s: %5d ms : %s\n", message, r.time/1000000, suffix));
+ out.append(String.format("%-55s: %5d ms : %s", message, r.time/1000000, suffix));
+ if (i < responses.size() - 1) {
+ out.append("\n");
+ }
}
return out.toString();
}