aboutsummaryrefslogtreecommitdiff
path: root/src/cz/crcs/ectester/reader
diff options
context:
space:
mode:
authorpetrs2017-06-16 17:24:48 +0200
committerpetrs2017-06-16 17:24:48 +0200
commit7ab02af142427a996cedf7540ffa3345612fe1bc (patch)
tree058f525742c9af67506bee5a4108c06369c1f3ea /src/cz/crcs/ectester/reader
parent359b4bb5be1a822e389e54b9697504f4f0b43d34 (diff)
downloadECTester-7ab02af142427a996cedf7540ffa3345612fe1bc.tar.gz
ECTester-7ab02af142427a996cedf7540ffa3345612fe1bc.tar.zst
ECTester-7ab02af142427a996cedf7540ffa3345612fe1bc.zip
explicit support for reallocation of KeyAgreement engine with provided type
Diffstat (limited to 'src/cz/crcs/ectester/reader')
-rw-r--r--src/cz/crcs/ectester/reader/Command.java27
-rw-r--r--src/cz/crcs/ectester/reader/ECTester.java7
-rw-r--r--src/cz/crcs/ectester/reader/Response.java17
-rw-r--r--src/cz/crcs/ectester/reader/Util.java33
4 files changed, 84 insertions, 0 deletions
diff --git a/src/cz/crcs/ectester/reader/Command.java b/src/cz/crcs/ectester/reader/Command.java
index 5b7be01..8cb3a30 100644
--- a/src/cz/crcs/ectester/reader/Command.java
+++ b/src/cz/crcs/ectester/reader/Command.java
@@ -211,6 +211,33 @@ public abstract class Command {
return new Response.Allocate(response, elapsed, keyPair, keyLength, keyClass);
}
}
+
+ public static class AllocateKeyAgreement extends Command {
+
+ private byte kaType;
+
+
+ /**
+ * Creates the INS_ALLOCATE_KA instruction.
+ *
+ * @param cardManager cardManager to send APDU through
+ * @param kaType which type of KeyAgreement to use
+ */
+ protected AllocateKeyAgreement(CardMngr cardManager, byte kaType) {
+ super(cardManager);
+ this.kaType = kaType;
+ byte[] data = new byte[]{kaType};
+ this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_ALLOCATE_KA, 0x00, 0x00, data);
+ }
+
+ @Override
+ public Response.AllocateKeyAgreement send() throws CardException {
+ long elapsed = -System.nanoTime();
+ ResponseAPDU response = cardManager.send(cmd);
+ elapsed += System.nanoTime();
+ return new Response.AllocateKeyAgreement(response, elapsed, kaType);
+ }
+ }
/**
*
diff --git a/src/cz/crcs/ectester/reader/ECTester.java b/src/cz/crcs/ectester/reader/ECTester.java
index 3b5b84f..bb555f9 100644
--- a/src/cz/crcs/ectester/reader/ECTester.java
+++ b/src/cz/crcs/ectester/reader/ECTester.java
@@ -22,6 +22,7 @@
package cz.crcs.ectester.reader;
import cz.crcs.ectester.applet.ECTesterApplet;
+import static cz.crcs.ectester.applet.ECTesterApplet.KeyAgreement_ALG_EC_SVDP_DH;
import cz.crcs.ectester.applet.EC_Consts;
import cz.crcs.ectester.data.EC_Store;
import cz.crcs.ectester.reader.ec.EC_Category;
@@ -219,6 +220,7 @@ public class ECTester {
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());
+
opts.addOptionGroup(actions);
OptionGroup size = new OptionGroup();
@@ -259,6 +261,8 @@ public class ECTester {
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());
+ opts.addOption(Option.builder("ka").longOpt("ka-type").desc("Set KeyAgreement object [type], corresponds to JC.KeyAgreement constants.").hasArg().argName("type").optionalArg(true).build());
+
CommandLineParser parser = new DefaultParser();
return parser.parse(opts, args);
}
@@ -442,6 +446,7 @@ public class ECTester {
private void ecdh() throws IOException, CardException {
byte keyClass = cfg.primeField ? KeyPair.ALG_EC_FP : KeyPair.ALG_EC_F2M;
List<Response> prepare = new LinkedList<>();
+ prepare.add(new Command.AllocateKeyAgreement(cardManager, cfg.kaType).send()); // Prepare KeyAgreement or required type
prepare.add(new Command.Allocate(cardManager, ECTesterApplet.KEYPAIR_BOTH, (short) cfg.bits, keyClass).send());
Command curve = Command.prepareCurve(cardManager, dataStore, cfg, ECTesterApplet.KEYPAIR_BOTH, (short) cfg.bits, keyClass);
if (curve != null)
@@ -581,6 +586,7 @@ public class ECTester {
public boolean all;
public boolean primeField = false;
public boolean binaryField = false;
+ public byte kaType = KeyAgreement_ALG_EC_SVDP_DH;
public String namedCurve;
public String curveFile;
@@ -628,6 +634,7 @@ public class ECTester {
all = cli.hasOption("all");
primeField = cli.hasOption("fp");
binaryField = cli.hasOption("f2m");
+ kaType = Byte.parseByte(cli.getOptionValue("ka-type", "1"));
namedCurve = cli.getOptionValue("named-curve");
customCurve = cli.hasOption("custom");
diff --git a/src/cz/crcs/ectester/reader/Response.java b/src/cz/crcs/ectester/reader/Response.java
index d74724c..3df956e 100644
--- a/src/cz/crcs/ectester/reader/Response.java
+++ b/src/cz/crcs/ectester/reader/Response.java
@@ -154,9 +154,26 @@ public abstract class Response {
return out.toString();
}
+
/**
*
*/
+ public static class AllocateKeyAgreement extends Response {
+ byte kaType;
+ protected AllocateKeyAgreement(ResponseAPDU response, long time, byte kaType) {
+ super(response, time);
+ this.kaType = kaType;
+
+ parse(2, 0);
+ }
+
+ @Override
+ public String toString() {
+ return super.toString(String.format("Allocate KeyAgreement(%s) object", Util.getKATypeString(this.kaType)));
+ }
+
+ }
+
public static class Allocate extends Response {
private byte keyPair;
diff --git a/src/cz/crcs/ectester/reader/Util.java b/src/cz/crcs/ectester/reader/Util.java
index e7b7338..754cda3 100644
--- a/src/cz/crcs/ectester/reader/Util.java
+++ b/src/cz/crcs/ectester/reader/Util.java
@@ -1,6 +1,12 @@
package cz.crcs.ectester.reader;
import cz.crcs.ectester.applet.ECTesterApplet;
+import static cz.crcs.ectester.applet.ECTesterApplet.KeyAgreement_ALG_EC_PACE_GM;
+import static cz.crcs.ectester.applet.ECTesterApplet.KeyAgreement_ALG_EC_SVDP_DH;
+import static cz.crcs.ectester.applet.ECTesterApplet.KeyAgreement_ALG_EC_SVDP_DHC;
+import static cz.crcs.ectester.applet.ECTesterApplet.KeyAgreement_ALG_EC_SVDP_DHC_PLAIN;
+import static cz.crcs.ectester.applet.ECTesterApplet.KeyAgreement_ALG_EC_SVDP_DH_PLAIN;
+import static cz.crcs.ectester.applet.ECTesterApplet.KeyAgreement_ALG_EC_SVDP_DH_PLAIN_XY;
import cz.crcs.ectester.applet.EC_Consts;
import javacard.framework.ISO7816;
import javacard.security.CryptoException;
@@ -339,4 +345,31 @@ public class Util {
}
return algo;
}
+
+ public static String getKATypeString(byte kaType) {
+ String kaTypeString = "unknown";
+ switch (kaType) {
+ case KeyAgreement_ALG_EC_SVDP_DH:
+ kaTypeString = "ALG_EC_SVDP_DH";
+ break;
+ case KeyAgreement_ALG_EC_SVDP_DH_PLAIN:
+ kaTypeString = "ALG_EC_SVDP_DH_PLAIN";
+ break;
+ case KeyAgreement_ALG_EC_PACE_GM:
+ kaTypeString = "ALG_EC_PACE_GM";
+ break;
+ case KeyAgreement_ALG_EC_SVDP_DH_PLAIN_XY:
+ kaTypeString = "ALG_EC_SVDP_DH_PLAIN_XY";
+ break;
+ case KeyAgreement_ALG_EC_SVDP_DHC:
+ kaTypeString = "ALG_EC_SVDP_DHC";
+ break;
+ case KeyAgreement_ALG_EC_SVDP_DHC_PLAIN:
+ kaTypeString = "ALG_EC_SVDP_DHC_PLAIN";
+ break;
+ default:
+ kaTypeString = "unknown";
+ }
+ return kaTypeString;
+ }
}