aboutsummaryrefslogtreecommitdiff
path: root/src/cz/crcs/ectester/applet/ECTesterApplet.java
diff options
context:
space:
mode:
authorJ08nY2017-06-02 00:47:35 +0200
committerJ08nY2017-06-02 00:47:35 +0200
commit7cc7c46edc4fc788c4ce2e7aaf64d01b645629d0 (patch)
tree97ca0ca568a0afe11884fed999602a2d02132a1f /src/cz/crcs/ectester/applet/ECTesterApplet.java
parentdc05a5025543f14c633f663f2b366ab3b53b45da (diff)
downloadECTester-7cc7c46edc4fc788c4ce2e7aaf64d01b645629d0.tar.gz
ECTester-7cc7c46edc4fc788c4ce2e7aaf64d01b645629d0.tar.zst
ECTester-7cc7c46edc4fc788c4ce2e7aaf64d01b645629d0.zip
Diffstat (limited to 'src/cz/crcs/ectester/applet/ECTesterApplet.java')
-rw-r--r--src/cz/crcs/ectester/applet/ECTesterApplet.java65
1 files changed, 62 insertions, 3 deletions
diff --git a/src/cz/crcs/ectester/applet/ECTesterApplet.java b/src/cz/crcs/ectester/applet/ECTesterApplet.java
index a7d8537..c2e2c63 100644
--- a/src/cz/crcs/ectester/applet/ECTesterApplet.java
+++ b/src/cz/crcs/ectester/applet/ECTesterApplet.java
@@ -51,9 +51,10 @@ public class ECTesterApplet extends Applet implements ExtendedLength {
public static final byte INS_GENERATE = (byte) 0x5e;
public static final byte INS_EXPORT = (byte) 0x5f;
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;
+ public static final byte INS_ECDH_DIRECT = (byte) 0x61;
+ public static final byte INS_ECDSA = (byte) 0x62;
+ public static final byte INS_CLEANUP = (byte) 0x63;
+ public static final byte INS_SUPPORT = (byte) 0x64;
// PARAMETERS for P1 and P2
public static final byte KEYPAIR_LOCAL = (byte) 0x01;
@@ -164,6 +165,9 @@ public class ECTesterApplet extends Applet implements ExtendedLength {
case INS_ECDH:
length = insECDH(apdu);
break;
+ case INS_ECDH_DIRECT:
+ length = insECDH_direct(apdu);
+ break;
case INS_ECDSA:
length = insECDSA(apdu);
break;
@@ -358,6 +362,26 @@ public class ECTesterApplet extends Applet implements ExtendedLength {
}
/**
+ *
+ * @param apdu P1 = byte privkey (KEYPAIR_*)
+ * @return P2 = byte export (EXPORT_TRUE || EXPORT_FALSE)
+ * DATA = short corruption (EC_Consts.CORRUPTION_* | ...)
+ * byte type (EC_Consts.KA_* | ...)
+ * short length
+ * byte[] pubkey
+ */
+ private short insECDH_direct(APDU apdu) {
+ byte privkey = apduArray[ISO7816.OFFSET_P1];
+ byte export = apduArray[ISO7816.OFFSET_P2];
+ short cdata = apdu.getOffsetCdata();
+ short corruption = Util.getShort(apduArray, cdata);
+ byte type = apduArray[(short) (cdata + 2)];
+ short length = Util.getShort(apduArray, (short) (cdata + 3));
+
+ return ecdh_direct(privkey, export, corruption, type, (short) (cdata + 5), length, apdu.getBuffer(), (short) 0);
+ }
+
+ /**
* Performs ECDSA signature and verification on data provided or random, using the keyPair in P1(local/remote).
* returns ecdsa SW, {@code if(export == EXPORT_TRUE)} => short signature_length, byte[] signature
*
@@ -581,6 +605,41 @@ public class ECTesterApplet extends Applet implements ExtendedLength {
return length;
}
+ private short ecdh_direct(byte privkey, byte export, short corruption, byte type, short keyOffset, short keyLength, byte[] outBuffer, short outOffset) {
+ short length = 0;
+
+ KeyPair priv = ((privkey & KEYPAIR_LOCAL) != 0) ? localKeypair : remoteKeypair;
+
+ short secretLength = 0;
+ switch (type) {
+ case EC_Consts.KA_ECDH:
+ secretLength = keyTester.testECDH_direct(priv, apduArray, keyOffset, keyLength, outBuffer, outOffset, corruption);
+ break;
+ case EC_Consts.KA_ECDHC:
+ secretLength = keyTester.testECDHC_direct(priv, apduArray, keyOffset, keyLength, outBuffer, outOffset, corruption);
+ break;
+ case EC_Consts.KA_BOTH:
+ secretLength = keyTester.testBOTH_direct(priv, apduArray, keyOffset, keyLength, outBuffer, outOffset, corruption);
+ break;
+ case EC_Consts.KA_ANY:
+ secretLength = keyTester.testANY_direct(priv, apduArray, keyOffset, keyLength, outBuffer, outOffset, corruption);
+ break;
+ default:
+ ISOException.throwIt(ISO7816.SW_FUNC_NOT_SUPPORTED);
+ }
+
+ Util.setShort(outBuffer, outOffset, keyTester.getSW());
+ length += 2;
+
+ if ((export == EXPORT_TRUE)) {
+ Util.setShort(outBuffer, (short) (outOffset + length), secretLength);
+ length += 2;
+ Util.arrayCopyNonAtomic(ramArray2, (short) 0, outBuffer, (short) (outOffset + length), secretLength);
+ length += secretLength;
+ }
+ return length;
+ }
+
/**
* @param sign keyPair to use for signing and verification
* @param export whether to export ECDSA signature