diff options
| author | J08nY | 2024-03-22 23:58:55 +0100 |
|---|---|---|
| committer | J08nY | 2024-03-25 14:52:43 +0100 |
| commit | 73af477a8774e1ede5dd8de6491eb353dc0b12bd (patch) | |
| tree | 2d4e3b19bc5fb55308b886032312be76341736d4 /src/cz/crcs/ectester/reader/command/Command.java | |
| parent | 64b95fa059295e1dc23371c849f2302c1c18f5b4 (diff) | |
| download | ECTester-73af477a8774e1ede5dd8de6491eb353dc0b12bd.tar.gz ECTester-73af477a8774e1ede5dd8de6491eb353dc0b12bd.tar.zst ECTester-73af477a8774e1ede5dd8de6491eb353dc0b12bd.zip | |
Basic Gradle setup.
Diffstat (limited to 'src/cz/crcs/ectester/reader/command/Command.java')
| -rw-r--r-- | src/cz/crcs/ectester/reader/command/Command.java | 920 |
1 files changed, 0 insertions, 920 deletions
diff --git a/src/cz/crcs/ectester/reader/command/Command.java b/src/cz/crcs/ectester/reader/command/Command.java deleted file mode 100644 index 61e3900..0000000 --- a/src/cz/crcs/ectester/reader/command/Command.java +++ /dev/null @@ -1,920 +0,0 @@ -package cz.crcs.ectester.reader.command; - -import cz.crcs.ectester.applet.ECTesterApplet; -import cz.crcs.ectester.applet.EC_Consts; -import cz.crcs.ectester.common.ec.EC_Curve; -import cz.crcs.ectester.common.ec.EC_Params; -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.data.EC_Store; -import cz.crcs.ectester.reader.CardMngr; -import cz.crcs.ectester.reader.ECTesterReader; -import cz.crcs.ectester.reader.output.ResponseWriter; -import cz.crcs.ectester.reader.response.Response; -import javacard.security.KeyPair; - -import javax.smartcardio.CardException; -import javax.smartcardio.CommandAPDU; -import javax.smartcardio.ResponseAPDU; -import java.io.FileInputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -/** - * @author Jan Jancar johny@neuromancer.sk - */ -public abstract class Command implements Cloneable { - CommandAPDU cmd; - CardMngr cardManager; - // Workaround for a stupid Java bug that went unfixed for !12! years, - // and for the even more stupid module system, which cannot properly work - // with the fact that JCardSim has some java.* packages... - final byte[] GOD_DAMN_JAVA_BUG_6474858_AND_GOD_DAMN_JAVA_12_MODULE_SYSTEM = new byte[]{0}; - - - Command(CardMngr cardManager) { - this.cardManager = cardManager; - } - - public CommandAPDU getAPDU() { - return cmd; - } - - public abstract Response send() throws CardException; - - public static List<Response> sendAll(List<Command> commands) throws CardException { - List<Response> result = new ArrayList<>(); - for (Command cmd : commands) { - result.add(cmd.send()); - } - return result; - } - - public abstract String getDescription(); - - @Override - protected Command clone() throws CloneNotSupportedException { - return (Command) super.clone(); - } - - public static EC_Curve findCurve(ECTesterReader.Config cfg, short keyLength, byte keyClass) throws IOException { - if (cfg.customCurve) { - byte curveId = EC_Consts.getCurve(keyLength, keyClass); - return EC_Store.getInstance().getObject(EC_Curve.class, "secg", CardUtil.getCurveName(curveId)); - } else if (cfg.namedCurve != null) { - EC_Curve curve = EC_Store.getInstance().getObject(EC_Curve.class, cfg.namedCurve); - if (curve == null) { - throw new IOException("Curve could no be found."); - } - if (curve.getBits() != keyLength) { - throw new IOException("Curve bits mismatch: " + curve.getBits() + " vs " + keyLength + " entered."); - } - if (curve.getField() != keyClass) { - throw new IOException("Curve field mismatch."); - } - return curve; - } else if (cfg.curveFile != null) { - EC_Curve curve = new EC_Curve(null, keyLength, keyClass); - - FileInputStream in = new FileInputStream(cfg.curveFile); - curve.readCSV(in); - in.close(); - return curve; - } else { - return null; - } - } - - - /** - * @param keyPair which keyPair/s (local/remote) to set curve domain parameters on - * @param keyLength key length to choose - * @param keyClass key class to choose - * @return a Command to send in order to prepare the curve on the keypairs. - * @throws IOException if curve file cannot be found/opened - */ - public static Command prepareCurve(CardMngr cardManager, ECTesterReader.Config cfg, byte keyPair, short keyLength, byte keyClass) throws IOException { - if (cfg.customCurve) { - // Set custom curve (one of the SECG curves embedded applet-side) - short domainParams = keyClass == KeyPair.ALG_EC_FP ? EC_Consts.PARAMETERS_DOMAIN_FP : EC_Consts.PARAMETERS_DOMAIN_F2M; - return new Command.Set(cardManager, keyPair, EC_Consts.getCurve(keyLength, keyClass), domainParams, null); - } - - EC_Curve curve = findCurve(cfg, keyLength, keyClass); - if ((curve == null || curve.flatten() == null) && (cfg.namedCurve != null || cfg.curveFile != null)) { - if (cfg.namedCurve != null) { - throw new IOException("Couldn't read named curve data."); - } - throw new IOException("Couldn't read the curve file correctly."); - } else if (curve == null) { - return null; - } - return new Command.Set(cardManager, keyPair, EC_Consts.CURVE_external, curve.getParams(), curve.flatten()); - } - - - /** - * @param cardManager - * @param dataStore - * @param cfg - * @param keyPair which keyPair/s to set the key params on - * @param allowedParams - * @return a CommandAPDU setting params loaded on the keyPair/s - * @throws IOException if any of the key files cannot be found/opened - */ - public static Command prepareKey(CardMngr cardManager, EC_Store dataStore, ECTesterReader.Config cfg, byte keyPair, short allowedParams) throws IOException { - short params = EC_Consts.PARAMETERS_NONE; - byte[] data = null; - - if (cfg.key != null || cfg.namedKey != null) { - params |= EC_Consts.PARAMETERS_KEYPAIR; - EC_Params keypair = ECUtil.loadParams(EC_Consts.PARAMETERS_KEYPAIR, cfg.namedKey, cfg.key); - if (keypair == null) { - throw new IOException("KeyPair not found."); - } - - data = keypair.flatten(); - if (data == null) { - throw new IOException("Couldn't read the key file correctly."); - } - } - - if ((cfg.publicKey != null || cfg.namedPublicKey != null) && ((allowedParams & EC_Consts.PARAMETER_W) != 0)) { - params |= EC_Consts.PARAMETER_W; - EC_Params pub = ECUtil.loadParams(EC_Consts.PARAMETER_W, cfg.namedPublicKey, cfg.publicKey); - if (pub == null) { - throw new IOException("Public key not found."); - } - - byte[] pubkey = pub.flatten(EC_Consts.PARAMETER_W); - if (pubkey == null) { - throw new IOException("Couldn't read the public key file correctly."); - } - data = pubkey; - } - - if ((cfg.privateKey != null || cfg.namedPrivateKey != null) && ((allowedParams & EC_Consts.PARAMETER_S) != 0)) { - params |= EC_Consts.PARAMETER_S; - EC_Params priv = ECUtil.loadParams(EC_Consts.PARAMETER_S, cfg.namedPrivateKey, cfg.privateKey); - if (priv == null) { - throw new IOException("Private key not found."); - } - - byte[] privkey = priv.flatten(EC_Consts.PARAMETER_S); - if (privkey == null) { - throw new IOException("Couldn't read the private key file correctly."); - } - data = ByteUtil.concatenate(data, privkey); - } - return new Command.Set(cardManager, keyPair, EC_Consts.CURVE_external, params, data); - } - - public static long dryRunTime(CardMngr cardManager, Command cmd, int num, ResponseWriter respWriter) throws CardException { - long time = 0; - respWriter.outputResponse(new Command.SetDryRunMode(cardManager, ECTesterApplet.MODE_DRY_RUN).send()); - for (int i = 0; i < num; ++i) { - Response dry = cmd.send(); - respWriter.outputResponse(dry); - time += dry.getDuration(); - } - time /= num; - respWriter.outputResponse(new Command.SetDryRunMode(cardManager, ECTesterApplet.MODE_NORMAL).send()); - return time; - } - - /** - * - */ - 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 - */ - public 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, getDescription(), elapsed, kaType); - } - - @Override - public String getDescription() { - return String.format("Allocate KeyAgreement(%s) object", CardUtil.getKATypeString(kaType)); - } - } - - /** - * - */ - public static class AllocateSignature extends Command { - private byte sigType; - - /** - * Creates the INS_ALLOCATE_SIG instruction. - * - * @param cardManager cardManager to send APDU through - * @param sigType which type of Signature to use - */ - public AllocateSignature(CardMngr cardManager, byte sigType) { - super(cardManager); - this.sigType = sigType; - byte[] data = new byte[]{sigType}; - this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_ALLOCATE_SIG, 0x00, 0x00, data); - } - - @Override - public Response.AllocateSignature send() throws CardException { - long elapsed = -System.nanoTime(); - ResponseAPDU response = cardManager.send(cmd); - elapsed += System.nanoTime(); - return new Response.AllocateSignature(response, getDescription(), elapsed, sigType); - } - - @Override - public String getDescription() { - return String.format("Allocate Signature(%s) object", CardUtil.getSigTypeString(sigType)); - } - } - - /** - * - */ - public static class Allocate extends Command { - private byte keyPair; - private byte build; - private short keyLength; - private byte keyClass; - - /** - * Creates the INS_ALLOCATE instruction. - * - * @param cardManager cardManager to send APDU through - * @param keyPair which keyPair to use, local/remote (KEYPAIR_* | ...) - * @param build whether to use KeyBuilder or Keypair alloc - * @param keyLength key length to set - * @param keyClass key class to allocate - */ - public Allocate(CardMngr cardManager, byte keyPair, byte build, short keyLength, byte keyClass) { - super(cardManager); - this.keyPair = keyPair; - this.build = build; - this.keyLength = keyLength; - this.keyClass = keyClass; - - byte[] data = new byte[]{0, 0, keyClass}; - ByteUtil.setShort(data, 0, keyLength); - this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_ALLOCATE, keyPair, build, data); - } - - public Allocate(CardMngr cardManager, byte keyPair, short keyLength, byte keyClass) { - this(cardManager, keyPair, (byte) (ECTesterApplet.BUILD_KEYPAIR | ECTesterApplet.BUILD_KEYBUILDER), keyLength, keyClass); - } - - @Override - public Response.Allocate send() throws CardException { - long elapsed = -System.nanoTime(); - ResponseAPDU response = cardManager.send(cmd); - elapsed += System.nanoTime(); - return new Response.Allocate(response, getDescription(), elapsed, keyPair, keyLength, keyClass); - } - - @Override - public String getDescription() { - String field = keyClass == KeyPair.ALG_EC_FP ? "ALG_EC_FP" : "ALG_EC_F2M"; - String key; - if (keyPair == ECTesterApplet.KEYPAIR_BOTH) { - key = "both keypairs"; - } else { - key = ((keyPair == ECTesterApplet.KEYPAIR_LOCAL) ? "local" : "remote") + " keypair"; - } - return String.format("Allocate %s %db %s", key, keyLength, field); - } - } - - /** - * - */ - public static class Clear extends Command { - private byte keyPair; - - /** - * @param cardManager cardManager to send APDU through - * @param keyPair which keyPair clear, local/remote (KEYPAIR_* || ...) - */ - public Clear(CardMngr cardManager, byte keyPair) { - super(cardManager); - this.keyPair = keyPair; - - this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_CLEAR, keyPair, 0x00, GOD_DAMN_JAVA_BUG_6474858_AND_GOD_DAMN_JAVA_12_MODULE_SYSTEM); - } - - @Override - public Response.Clear send() throws CardException { - long elapsed = -System.nanoTime(); - ResponseAPDU response = cardManager.send(cmd); - elapsed += System.nanoTime(); - return new Response.Clear(response, getDescription(), elapsed, keyPair); - } - - @Override - public String getDescription() { - String key; - if (keyPair == ECTesterApplet.KEYPAIR_BOTH) { - key = "both keypairs"; - } else { - key = ((keyPair == ECTesterApplet.KEYPAIR_LOCAL) ? "local" : "remote") + " keypair"; - } - return String.format("Clear %s", key); - } - } - - /** - * - */ - public static class Set extends Command { - private byte keyPair; - private byte curve; - private short params; - private byte[] external; - - /** - * Creates the INS_SET instruction. - * - * @param cardManager cardManager to send APDU through - * @param keyPair which keyPair to set params on, local/remote (KEYPAIR_* || ...) - * @param curve curve to set (EC_Consts.CURVE_*) - * @param params parameters to set (EC_Consts.PARAMETER_* | ...) - * @param external external curve data, can be null - */ - public Set(CardMngr cardManager, byte keyPair, byte curve, short params, byte[] external) { - super(cardManager); - this.keyPair = keyPair; - this.curve = curve; - this.params = params; - this.external = external; - - int len = external != null ? 2 + external.length : 2; - byte[] data = new byte[len]; - ByteUtil.setShort(data, 0, params); - if (external != null) { - System.arraycopy(external, 0, data, 2, external.length); - } - - this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_SET, keyPair, curve, data); - } - - @Override - public Response.Set send() throws CardException { - long elapsed = -System.nanoTime(); - ResponseAPDU response = cardManager.send(cmd); - elapsed += System.nanoTime(); - return new Response.Set(response, getDescription(), elapsed, keyPair, curve, params); - } - - @Override - public String getDescription() { - String name = CardUtil.getCurveName(curve); - String what = CardUtil.getParameterString(params); - - String pair; - if (keyPair == ECTesterApplet.KEYPAIR_BOTH) { - pair = "both keypairs"; - } else { - pair = ((keyPair == ECTesterApplet.KEYPAIR_LOCAL) ? "local" : "remote") + " keypair"; - } - return String.format("Set %s %s parameters on %s", name, what, pair); - } - } - - /** - * - */ - public static class Transform extends Command { - private byte keyPair; - private byte key; - private short params; - private short transformation; - - /** - * @param cardManager cardManager to send APDU through - * @param keyPair which keyPair to transform, local/remote (KEYPAIR_* || ...) - * @param key key to transform (EC_Consts.KEY_* | ...) - * @param params parameters to transform (EC_Consts.PARAMETER_* | ...) - * @param transformation transformation type (EC_Consts.TRANSFORMATION_*) - */ - public Transform(CardMngr cardManager, byte keyPair, byte key, short params, short transformation) { - super(cardManager); - this.keyPair = keyPair; - this.key = key; - this.params = params; - this.transformation = transformation; - - byte[] data = new byte[4]; - ByteUtil.setShort(data, 0, params); - ByteUtil.setShort(data, 2, transformation); - - this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_TRANSFORM, keyPair, key, data); - } - - @Override - public Response.Transform send() throws CardException { - long elapsed = -System.nanoTime(); - ResponseAPDU response = cardManager.send(cmd); - elapsed += System.nanoTime(); - return new Response.Transform(response, getDescription(), elapsed, keyPair, key, params, transformation); - } - - @Override - public String getDescription() { - String stringParams = CardUtil.getParams(params); - String transform = CardUtil.getTransformation(transformation); - - String pair; - if (keyPair == ECTesterApplet.KEYPAIR_BOTH) { - pair = "both keypairs"; - } else { - pair = ((keyPair == ECTesterApplet.KEYPAIR_LOCAL) ? "local" : "remote") + " keypair"; - } - return String.format("Transform params %s of %s, %s", stringParams, pair, transform); - } - } - - /** - * - */ - public static class Generate extends Command { - private byte keyPair; - - /** - * Creates the INS_GENERATE instruction. - * - * @param cardManager cardManager to send APDU through - * @param keyPair which keyPair to generate, local/remote (KEYPAIR_* || ...) - */ - public Generate(CardMngr cardManager, byte keyPair) { - super(cardManager); - this.keyPair = keyPair; - - this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_GENERATE, keyPair, 0, GOD_DAMN_JAVA_BUG_6474858_AND_GOD_DAMN_JAVA_12_MODULE_SYSTEM); - } - - @Override - public Response.Generate send() throws CardException { - long elapsed = -System.nanoTime(); - ResponseAPDU response = cardManager.send(cmd); - elapsed += System.nanoTime(); - return new Response.Generate(response, getDescription(), elapsed, keyPair); - } - - @Override - public String getDescription() { - String key; - if (keyPair == ECTesterApplet.KEYPAIR_BOTH) { - key = "both keypairs"; - } else { - key = ((keyPair == ECTesterApplet.KEYPAIR_LOCAL) ? "local" : "remote") + " keypair"; - } - return String.format("Generate %s", key); - } - } - - /** - * - */ - public static class Export extends Command { - private byte keyPair; - private byte key; - private short params; - - /** - * Creates the INS_EXPORT instruction. - * - * @param cardManager cardManager to send APDU through - * @param keyPair keyPair to export from (KEYPAIR_* | ...) - * @param key key to export from (EC_Consts.KEY_* | ...) - * @param params params to export (EC_Consts.PARAMETER_* | ...) - */ - public Export(CardMngr cardManager, byte keyPair, byte key, short params) { - super(cardManager); - this.keyPair = keyPair; - this.key = key; - this.params = params; - - byte[] data = new byte[2]; - ByteUtil.setShort(data, 0, params); - - this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_EXPORT, keyPair, key, data); - } - - @Override - public Response.Export send() throws CardException { - long elapsed = -System.nanoTime(); - ResponseAPDU response = cardManager.send(cmd); - elapsed += System.nanoTime(); - return new Response.Export(response, getDescription(), elapsed, keyPair, key, params); - } - - @Override - public String getDescription() { - String what = CardUtil.getParameterString(params); - - String source; - if (key == EC_Consts.KEY_BOTH) { - source = "both keys"; - } else { - source = ((key == EC_Consts.KEY_PUBLIC) ? "public" : "private") + " key"; - } - String pair; - if (keyPair == ECTesterApplet.KEYPAIR_BOTH) { - pair = "both keypairs"; - } else { - pair = ((keyPair == ECTesterApplet.KEYPAIR_LOCAL) ? "local" : "remote") + " keypair"; - } - return String.format("Export %s params from %s of %s", what, source, pair); - } - } - - /** - * - */ - public static class ECDH extends Command { - private byte pubkey; - private byte privkey; - private byte export; - private short transformation; - private byte type; - - /** - * Creates the INS_ECDH instruction. - * - * @param cardManager cardManager to send APDU through - * @param pubkey keyPair to use for public key, (KEYPAIR_LOCAL || KEYPAIR_REMOTE) - * @param privkey keyPair to use for private key, (KEYPAIR_LOCAL || KEYPAIR_REMOTE) - * @param export whether to export ECDH secret - * @param transformation whether to transform the pubkey before ECDH (EC_Consts.TRANSFORMATION_* | ...) - * @param type ECDH algorithm type (EC_Consts.KA_* | ...) - */ - public ECDH(CardMngr cardManager, byte pubkey, byte privkey, byte export, short transformation, byte type) { - super(cardManager); - this.pubkey = pubkey; - this.privkey = privkey; - this.export = export; - this.transformation = transformation; - this.type = type; - - byte[] data = new byte[]{export, 0, 0, type}; - ByteUtil.setShort(data, 1, transformation); - - this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_ECDH, pubkey, privkey, data); - } - - @Override - public Response.ECDH send() throws CardException { - long elapsed = -System.nanoTime(); - ResponseAPDU response = cardManager.send(cmd); - elapsed += System.nanoTime(); - return new Response.ECDH(response, getDescription(), elapsed, pubkey, privkey, export, transformation, type); - } - - @Override - public String getDescription() { - String algo = CardUtil.getKATypeString(type); - - String pub = pubkey == ECTesterApplet.KEYPAIR_LOCAL ? "local" : "remote"; - String priv = privkey == ECTesterApplet.KEYPAIR_LOCAL ? "local" : "remote"; - - String validity; - if (transformation == EC_Consts.TRANSFORMATION_NONE) { - validity = ""; - } else { - validity = String.format("(%s point)", CardUtil.getTransformation(transformation)); - } - return String.format("%s of %s pubkey and %s privkey%s", algo, pub, priv, validity); - } - } - - /** - * - */ - public static class ECDH_direct extends Command { - private byte privkey; - private byte export; - private short transformation; - private byte type; - private byte[] pubkey; - - /** - * Creates the INS_ECDH_DIRECT instruction. - * - * @param cardManager cardManager to send APDU through - * @param privkey keyPair to use for private key, (KEYPAIR_LOCAL || KEYPAIR_REMOTE) - * @param export whether to export ECDH secret - * @param transformation whether to transform the pubkey before ECDH (EC_Consts.TRANSFORMATION_* | ...) - * @param type EC KeyAgreement type - * @param pubkey pubkey data to do ECDH with. - */ - public ECDH_direct(CardMngr cardManager, byte privkey, byte export, short transformation, byte type, byte[] pubkey) { - super(cardManager); - this.privkey = privkey; - this.export = export; - this.transformation = transformation; - this.type = type; - this.pubkey = pubkey; - - byte[] data = new byte[3 + pubkey.length]; - ByteUtil.setShort(data, 0, transformation); - data[2] = type; - System.arraycopy(pubkey, 0, data, 3, pubkey.length); - - this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_ECDH_DIRECT, privkey, export, data); - } - - @Override - public Response.ECDH send() throws CardException { - long elapsed = -System.nanoTime(); - ResponseAPDU response = cardManager.send(cmd); - elapsed += System.nanoTime(); - return new Response.ECDH(response, getDescription(), elapsed, ECTesterApplet.KEYPAIR_REMOTE, privkey, export, transformation, type); - } - - @Override - public String getDescription() { - String algo = CardUtil.getKATypeString(type); - - String priv = privkey == ECTesterApplet.KEYPAIR_LOCAL ? "local" : "remote"; - - String validity; - if (transformation == EC_Consts.TRANSFORMATION_NONE) { - validity = ""; - } else { - validity = String.format("(%s point)", CardUtil.getTransformation(transformation)); - } - return String.format("%s of external pubkey and %s privkey%s", algo, priv, validity); - } - } - - public static class ECDSA extends Command { - private byte keyPair; - private byte sigType; - private byte export; - private byte[] raw; - - /** - * Creates the INS_ECDSA instruction. - * - * @param cardManager cardManager to send APDU through - * @param keyPair keyPair to use for signing and verification (KEYPAIR_LOCAL || KEYPAIR_REMOTE) - * @param sigType Signature type to use - * @param export whether to export ECDSA signature - * @param raw data to sign, can be null, in which case random data is signed. - */ - public ECDSA(CardMngr cardManager, byte keyPair, byte sigType, byte export, byte[] raw) { - super(cardManager); - if (keyPair == ECTesterApplet.KEYPAIR_BOTH) { - throw new IllegalArgumentException(); - } - - this.keyPair = keyPair; - this.sigType = sigType; - this.export = export; - this.raw = raw; - - int len = raw != null ? raw.length : 0; - byte[] data = new byte[3 + len]; - data[0] = sigType; - ByteUtil.setShort(data, 1, (short) len); - if (raw != null) { - System.arraycopy(raw, 0, data, 3, len); - } - - this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_ECDSA, keyPair, export, data); - } - - @Override - public Response.ECDSA send() throws CardException { - long elapsed = -System.nanoTime(); - ResponseAPDU response = cardManager.send(cmd); - elapsed += System.nanoTime(); - return new Response.ECDSA(response, getDescription(), elapsed, keyPair, sigType, export, raw); - } - - @Override - public String getDescription() { - String algo = CardUtil.getSigTypeString(sigType); - String key = keyPair == ECTesterApplet.KEYPAIR_LOCAL ? "local" : "remote"; - String data = raw == null ? "random" : "provided"; - return String.format("%s with %s keypair(%s data)", algo, key, data); - } - } - - public static class ECDSA_sign extends Command { - private byte keyPair; - private byte sigType; - private byte export; - private byte[] raw; - - /** - * Creates the INS_ECDSA_SIGN instruction. - * - * @param cardManager cardManager to send APDU through - * @param keyPair keyPair to use for signing and verification (KEYPAIR_LOCAL || KEYPAIR_REMOTE) - * @param sigType Signature type to use - * @param export whether to export ECDSA signature - * @param raw data to sign, can be null, in which case random data is signed. - */ - public ECDSA_sign(CardMngr cardManager, byte keyPair, byte sigType, byte export, byte[] raw) { - super(cardManager); - if (keyPair == ECTesterApplet.KEYPAIR_BOTH) { - throw new IllegalArgumentException(); - } - - this.keyPair = keyPair; - this.sigType = sigType; - this.export = export; - this.raw = raw; - - int len = raw != null ? raw.length : 0; - byte[] data = new byte[3 + len]; - data[0] = sigType; - ByteUtil.setShort(data, 1, (short) len); - if (raw != null) { - System.arraycopy(raw, 0, data, 3, len); - } - - this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_ECDSA_SIGN, keyPair, export, data); - } - - @Override - public Response.ECDSA send() throws CardException { - long elapsed = -System.nanoTime(); - ResponseAPDU response = cardManager.send(cmd); - elapsed += System.nanoTime(); - return new Response.ECDSA(response, getDescription(), elapsed, keyPair, sigType, export, raw); - } - - @Override - public String getDescription() { - String algo = CardUtil.getSigTypeString(sigType); - String key = keyPair == ECTesterApplet.KEYPAIR_LOCAL ? "local" : "remote"; - String data = raw == null ? "random" : "provided"; - return String.format("%s signature with %s keypair(%s data)", algo, key, data); - } - } - - public static class ECDSA_verify extends Command { - private byte keyPair; - private byte sigType; - private byte[] raw; - private byte[] signature; - - /** - * Creates the INS_ECDSA_VERIFY instruction. - * - * @param cardManager cardManager to send APDU through - * @param keyPair keyPair to use for signing and verification (KEYPAIR_LOCAL || KEYPAIR_REMOTE) - * @param sigType Signature type to use - * @param raw data to sign - * @param signature signature data - */ - public ECDSA_verify(CardMngr cardManager, byte keyPair, byte sigType, byte[] raw, byte[] signature) { - super(cardManager); - if (keyPair == ECTesterApplet.KEYPAIR_BOTH) { - throw new IllegalArgumentException(); - } - if (raw == null || signature == null) { - throw new IllegalArgumentException(); - } - - this.keyPair = keyPair; - this.sigType = sigType; - this.raw = raw; - this.signature = signature; - - byte[] data = new byte[4 + raw.length + signature.length]; - ByteUtil.setShort(data, 0, (short) raw.length); - System.arraycopy(raw, 0, data, 2, raw.length); - ByteUtil.setShort(data, 2 + raw.length, (short) signature.length); - System.arraycopy(signature, 0, data, 2 + raw.length + 2, signature.length); - - this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_ECDSA_VERIFY, keyPair, sigType, data); - } - - @Override - public Response.ECDSA send() throws CardException { - long elapsed = -System.nanoTime(); - ResponseAPDU response = cardManager.send(cmd); - elapsed += System.nanoTime(); - return new Response.ECDSA(response, getDescription(), elapsed, keyPair, sigType, ECTesterApplet.EXPORT_FALSE, raw); - } - - @Override - public String getDescription() { - String algo = CardUtil.getSigTypeString(sigType); - String key = keyPair == ECTesterApplet.KEYPAIR_LOCAL ? "local" : "remote"; - String data = raw == null ? "random" : "provided"; - return String.format("%s verification with %s keypair(%s data)", algo, key, data); - } - } - - /** - * - */ - public static class Cleanup extends Command { - - /** - * @param cardManager cardManager to send APDU through - */ - public Cleanup(CardMngr cardManager) { - super(cardManager); - - this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_CLEANUP, 0, 0, GOD_DAMN_JAVA_BUG_6474858_AND_GOD_DAMN_JAVA_12_MODULE_SYSTEM); - } - - @Override - public Response.Cleanup send() throws CardException { - long elapsed = -System.nanoTime(); - ResponseAPDU response = cardManager.send(cmd); - elapsed += System.nanoTime(); - return new Response.Cleanup(response, getDescription(), elapsed); - } - - @Override - public String getDescription() { - return "Request JCSystem object deletion"; - } - } - - /** - * - */ - public static class GetInfo extends Command { - - /** - * @param cardManager cardManager to send APDU through - */ - public GetInfo(CardMngr cardManager) { - super(cardManager); - - this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_GET_INFO, 0, 0, GOD_DAMN_JAVA_BUG_6474858_AND_GOD_DAMN_JAVA_12_MODULE_SYSTEM); - } - - @Override - public Response.GetInfo send() throws CardException { - long elapsed = -System.nanoTime(); - ResponseAPDU response = cardManager.send(cmd); - elapsed += System.nanoTime(); - return new Response.GetInfo(response, getDescription(), elapsed); - } - - @Override - public String getDescription() { - return "Get applet info"; - } - } - - /** - * - */ - public static class SetDryRunMode extends Command { - private byte dryRunMode; - - /** - * @param cardManager - * @param dryRunMode - */ - public SetDryRunMode(CardMngr cardManager, byte dryRunMode) { - super(cardManager); - this.dryRunMode = dryRunMode; - - this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_SET_DRY_RUN_MODE, dryRunMode, 0, GOD_DAMN_JAVA_BUG_6474858_AND_GOD_DAMN_JAVA_12_MODULE_SYSTEM); - } - - @Override - public Response.SetDryRunMode send() throws CardException { - long elapsed = -System.nanoTime(); - ResponseAPDU response = cardManager.send(cmd); - elapsed += System.nanoTime(); - return new Response.SetDryRunMode(response, getDescription(), elapsed); - } - - @Override - public String getDescription() { - return (dryRunMode == ECTesterApplet.MODE_NORMAL ? "Disable" : "Enable") + " dry run mode"; - } - } -} - |
