diff options
| author | J08nY | 2017-10-13 21:42:49 +0200 |
|---|---|---|
| committer | J08nY | 2017-10-13 21:42:49 +0200 |
| commit | e78bd5d010bd6ced2b71d83b88748f9cc8d98d5e (patch) | |
| tree | 4b08c9788158a1ef87d226c7b1d5b691d91a0aed /src/cz/crcs/ectester/reader/Command.java | |
| parent | d5a549b382db10c34eea35e571b1ba8056eaa5da (diff) | |
| download | ECTester-e78bd5d010bd6ced2b71d83b88748f9cc8d98d5e.tar.gz ECTester-e78bd5d010bd6ced2b71d83b88748f9cc8d98d5e.tar.zst ECTester-e78bd5d010bd6ced2b71d83b88748f9cc8d98d5e.zip | |
Reorganize reader packages.
Diffstat (limited to 'src/cz/crcs/ectester/reader/Command.java')
| -rw-r--r-- | src/cz/crcs/ectester/reader/Command.java | 588 |
1 files changed, 0 insertions, 588 deletions
diff --git a/src/cz/crcs/ectester/reader/Command.java b/src/cz/crcs/ectester/reader/Command.java deleted file mode 100644 index cf05972..0000000 --- a/src/cz/crcs/ectester/reader/Command.java +++ /dev/null @@ -1,588 +0,0 @@ -package cz.crcs.ectester.reader; - -import cz.crcs.ectester.applet.ECTesterApplet; -import cz.crcs.ectester.applet.EC_Consts; -import cz.crcs.ectester.data.EC_Store; -import cz.crcs.ectester.reader.ec.EC_Curve; -import cz.crcs.ectester.reader.ec.EC_Key; -import cz.crcs.ectester.reader.ec.EC_Keypair; -import cz.crcs.ectester.reader.ec.EC_Params; -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 { - CommandAPDU cmd; - CardMngr cardManager; - - 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; - } - - - /** - * @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, EC_Store dataStore, ECTester.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); - } else if (cfg.namedCurve != null) { - // Set a named curve. - // parse cfg.namedCurve -> cat / id | cat | id - EC_Curve curve = dataStore.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."); - } - - byte[] external = curve.flatten(); - if (external == null) { - throw new IOException("Couldn't read named curve data."); - } - return new Command.Set(cardManager, keyPair, EC_Consts.CURVE_external, curve.getParams(), external); - } else if (cfg.curveFile != null) { - // Set curve loaded from a file - EC_Curve curve = new EC_Curve(null, keyLength, keyClass); - - FileInputStream in = new FileInputStream(cfg.curveFile); - curve.readCSV(in); - in.close(); - - byte[] external = curve.flatten(); - if (external == null) { - throw new IOException("Couldn't read the curve file correctly."); - } - return new Command.Set(cardManager, keyPair, EC_Consts.CURVE_external, curve.getParams(), external); - } else { - // Set default curve - /* This command was generally causing problems for simulating on jcardsim. - * Since there, .clearKey() resets all the keys values, even the domain. - * This might break some other stuff.. But should not. - */ - //commands.add(new Command.Clear(cardManager, keyPair)); - return null; - } - } - - - /** - * @param keyPair which keyPair/s to set the key params on - * @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, ECTester.Config cfg, byte keyPair) 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; - if (cfg.key != null) { - keypair = new EC_Params(EC_Consts.PARAMETERS_KEYPAIR); - - FileInputStream in = new FileInputStream(cfg.key); - keypair.readCSV(in); - in.close(); - } else { - keypair = dataStore.getObject(EC_Keypair.class, cfg.namedKey); - } - - data = keypair.flatten(); - if (data == null) { - throw new IOException("Couldn't read the key file correctly."); - } - } - - if (cfg.publicKey != null || cfg.namedPublicKey != null) { - params |= EC_Consts.PARAMETER_W; - EC_Params pub; - if (cfg.publicKey != null) { - pub = new EC_Params(EC_Consts.PARAMETER_W); - - FileInputStream in = new FileInputStream(cfg.publicKey); - pub.readCSV(in); - in.close(); - } else { - pub = dataStore.getObject(EC_Key.Public.class, cfg.namedPublicKey); - if (pub == null) { - pub = dataStore.getObject(EC_Keypair.class, cfg.namedPublicKey); - } - } - - 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) { - params |= EC_Consts.PARAMETER_S; - EC_Params priv; - if (cfg.privateKey != null) { - priv = new EC_Params(EC_Consts.PARAMETER_S); - - FileInputStream in = new FileInputStream(cfg.privateKey); - priv.readCSV(in); - in.close(); - } else { - priv = dataStore.getObject(EC_Key.Public.class, cfg.namedPrivateKey); - if (priv == null) { - priv = dataStore.getObject(EC_Keypair.class, cfg.namedPrivateKey); - } - } - - byte[] privkey = priv.flatten(EC_Consts.PARAMETER_S); - if (privkey == null) { - throw new IOException("Couldn't read the private key file correctly."); - } - data = Util.concatenate(data, privkey); - } - return new Command.Set(cardManager, keyPair, EC_Consts.CURVE_external, params, data); - } - - - /** - * - */ - public static class Allocate extends Command { - private byte keyPair; - 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 keyLength key length to set - * @param keyClass key class to allocate - */ - protected Allocate(CardMngr cardManager, byte keyPair, short keyLength, byte keyClass) { - super(cardManager); - this.keyPair = keyPair; - this.keyLength = keyLength; - this.keyClass = keyClass; - - byte[] data = new byte[]{0, 0, keyClass}; - Util.setShort(data, 0, keyLength); - this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_ALLOCATE, keyPair, 0x00, data); - } - - @Override - public Response.Allocate send() throws CardException { - long elapsed = -System.nanoTime(); - ResponseAPDU response = cardManager.send(cmd); - elapsed += System.nanoTime(); - 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); - } - } - - /** - * - */ - public static class Clear extends Command { - private byte keyPair; - - /** - * @param cardManager cardManager to send APDU through - * @param keyPair which keyPair clear, local/remote (KEYPAIR_* || ...) - */ - protected Clear(CardMngr cardManager, byte keyPair) { - super(cardManager); - this.keyPair = keyPair; - - this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_CLEAR, keyPair, 0x00); - } - - @Override - public Response.Clear send() throws CardException { - long elapsed = -System.nanoTime(); - ResponseAPDU response = cardManager.send(cmd); - elapsed += System.nanoTime(); - return new Response.Clear(response, elapsed, keyPair); - } - } - - /** - * - */ - 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 - */ - protected 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]; - Util.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, elapsed, keyPair, curve, params); - } - } - - /** - * - */ - public static class Corrupt extends Command { - private byte keyPair; - private byte key; - private short params; - private byte corruption; - - /** - * @param cardManager cardManager to send APDU through - * @param keyPair which keyPair to corrupt, local/remote (KEYPAIR_* || ...) - * @param key key to corrupt (EC_Consts.KEY_* | ...) - * @param params parameters to corrupt (EC_Consts.PARAMETER_* | ...) - * @param corruption corruption type (EC_Consts.CORRUPTION_*) - */ - protected Corrupt(CardMngr cardManager, byte keyPair, byte key, short params, byte corruption) { - super(cardManager); - this.keyPair = keyPair; - this.key = key; - this.params = params; - this.corruption = corruption; - - byte[] data = new byte[3]; - Util.setShort(data, 0, params); - data[2] = corruption; - - this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_CORRUPT, keyPair, key, data); - } - - @Override - public Response.Corrupt send() throws CardException { - long elapsed = -System.nanoTime(); - ResponseAPDU response = cardManager.send(cmd); - elapsed += System.nanoTime(); - return new Response.Corrupt(response, elapsed, keyPair, key, params, corruption); - } - } - - /** - * - */ - 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_* || ...) - */ - protected Generate(CardMngr cardManager, byte keyPair) { - super(cardManager); - this.keyPair = keyPair; - - this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_GENERATE, keyPair, 0); - } - - @Override - public Response.Generate send() throws CardException { - long elapsed = -System.nanoTime(); - ResponseAPDU response = cardManager.send(cmd); - elapsed += System.nanoTime(); - return new Response.Generate(response, elapsed, keyPair); - } - } - - /** - * - */ - 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_* | ...) - */ - protected 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]; - Util.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, elapsed, keyPair, key, params); - } - } - - /** - * - */ - public static class ECDH extends Command { - private byte pubkey; - private byte privkey; - private byte export; - private short corruption; - 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 corruption whether to invalidate the pubkey before ECDH (EC_Consts.CORRUPTION_* | ...) - * @param type ECDH algorithm type (EC_Consts.KA_* | ...) - */ - protected ECDH(CardMngr cardManager, byte pubkey, byte privkey, byte export, short corruption, byte type) { - super(cardManager); - this.pubkey = pubkey; - this.privkey = privkey; - this.export = export; - this.corruption = corruption; - this.type = type; - - byte[] data = new byte[]{export, 0,0, type}; - Util.setShort(data, 1, corruption); - - 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, elapsed, pubkey, privkey, export, corruption, type); - } - } - - /** - * - */ - public static class ECDH_direct extends Command { - private byte privkey; - private byte export; - private short corruption; - 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 corruption whether to invalidate the pubkey before ECDH (EC_Consts.CORRUPTION_* | ...) - * @param type ECDH algorithm type (EC_Consts.KA_* | ...) - * @param pubkey pubkey data to do ECDH with. - */ - protected ECDH_direct(CardMngr cardManager, byte privkey, byte export, short corruption, byte type, byte[] pubkey) { - super(cardManager); - this.privkey = privkey; - this.export = export; - this.corruption = corruption; - this.type = type; - this.pubkey = pubkey; - - byte[] data = new byte[3 + pubkey.length]; - Util.setShort(data, 0, corruption); - 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, elapsed, ECTesterApplet.KEYPAIR_REMOTE, privkey, export, corruption, type); - } - } - - public static class ECDSA extends Command { - private byte keyPair; - 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 export whether to export ECDSA signature - * @param raw data to sign, can be null, in which case random data is signed. - */ - protected ECDSA(CardMngr cardManager, byte keyPair, byte export, byte[] raw) { - super(cardManager); - this.keyPair = keyPair; - this.export = export; - this.raw = raw; - - int len = raw != null ? raw.length : 0; - byte[] data = new byte[2 + len]; - Util.setShort(data, 0, (short) len); - if (raw != null) { - System.arraycopy(raw, 0, data, 2, 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, elapsed, keyPair, export, raw); - } - } - - /** - * - */ - public static class Cleanup extends Command { - - /** - * @param cardManager cardManager to send APDU through - */ - protected Cleanup(CardMngr cardManager) { - super(cardManager); - - this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_CLEANUP, 0, 0); - } - - @Override - public Response.Cleanup send() throws CardException { - long elapsed = -System.nanoTime(); - ResponseAPDU response = cardManager.send(cmd); - elapsed += System.nanoTime(); - return new Response.Cleanup(response, elapsed); - } - } - - /** - * - */ - public static class Support extends Command { - - /** - * @param cardManager cardManager to send APDU through - */ - protected Support(CardMngr cardManager) { - super(cardManager); - - this.cmd = new CommandAPDU(ECTesterApplet.CLA_ECTESTERAPPLET, ECTesterApplet.INS_SUPPORT, 0, 0); - } - - @Override - public Response.Support send() throws CardException { - long elapsed = -System.nanoTime(); - ResponseAPDU response = cardManager.send(cmd); - elapsed += System.nanoTime(); - return new Response.Support(response, elapsed); - } - } -} - |
