diff options
| author | J08nY | 2017-06-02 00:47:35 +0200 |
|---|---|---|
| committer | J08nY | 2017-06-02 00:47:35 +0200 |
| commit | 7cc7c46edc4fc788c4ce2e7aaf64d01b645629d0 (patch) | |
| tree | 97ca0ca568a0afe11884fed999602a2d02132a1f /src/cz/crcs/ectester/applet/ECTesterApplet.java | |
| parent | dc05a5025543f14c633f663f2b366ab3b53b45da (diff) | |
| download | ECTester-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.java | 65 |
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 |
