// Useful tools for decoding smart card commands
// file:
// used by:
// For comments see header of

package scpack;

public class Commands {
  // coding and description of typical smart cards commands
  static final String CMDTABLE[] = {("0x00 0x44 ACTIVATE FILE ISO/IEC 7816-9"),
                                    ("0x00 0xE2 APPEND RECORD ISO/IEC 7816-4"),
                                    ("0x80 0x1E APPLICATION BLOCK EMV"),
                                    ("0x80 0x18 APPLICATION UNBLOCK EMV"),
                                    ("0xA0 0x24 CHANGE CHV GSM 11.11"),
                                    ("0x00 0x24 CHANGE REFERENCE DATA ISO/IEC 7816-8"),
                                    ("0x00 0xE0 CREATE FILE ISO/IEC 7816-9"),
                                    ("0x00 0x04 DEACTIVATE FILE ISO/IEC 7816-9"),
                                    ("0x00 0x44 DEACTIVATE FILE ISO/IEC 7816-9"),
                                    ("0x80 0xE4 DELETE OP"),
                                    ("0x00 0xE4 DELETE FILE ISO/IEC 7816-9"),
                                    ("0xA0 0x26 DISABLE CHV GSM 11.11"),
                                    ("0x00 0x26 DISABLE VERIFICATION REQUIREMENT ISO/IEC 7816-8"),
                                    ("0xA0 0x28 ENABLE CHV GSM 11.11"),
                                    ("0x00 0x28 ENABLE VERIFICATION REQUIREMENT ISO/IEC 7816-8"),
                                    ("0x00 0xC2 ENVELOPE ISO/IEC 7816-4"),
                                    ("0x00 0x0E ERASE BINARY ISO/IEC 7816-4"),
                                    ("0x00 0x82 EXTERNAL AUTHENTICATE ISO/IEC 7816-4"),
                                    ("0x80 0xAE GENERATE AUTHORISATION CRYPTOGRAM EMV"),
                                    ("0x00 0x46 GENERATE PUBLIC KEY PAIR ISO/IEC 7816-8"),
                                    ("0x00 0x84 GET CHALLENGE ISO/IEC 7816-4"),
                                    ("0x00 0xCA GET DATA ISO/IEC 7816-4"),
                                    ("0xA0 0xC0 GET RESPONSE GSM 11.11"),
                                    ("0x00 0xC0 GET RESPONSE ISO/IEC 7816-4"),
                                    ("0x80 0xF2 GET STATUS OP"),
                                    ("0xA0 0x32 INCREASE GSM 11.11"),
                                    ("0x80 0xE6 INSTALL OP"),
                                    ("0x00 0x88 INTERNAL AUTHENTICATE ISO/IEC 7816-4"),
                                    ("0xA0 0x04 INVALIDATE GSM 11.11"),
                                    ("0x80 0x82 ISSUER AUTHENTICATE EMV"),
                                    ("0x80 0xE8 LOAD OP"),
                                    ("0x00 0x70 MANAGE CHANNEL ISO/IEC 7816-4"),
                                    ("0x00 0x22 MANAGE SECURITY ENVIRONMENT ISO/IEC 7816-8"),
                                    ("0x00 0x82 MUTUAL AUTHENTICATE ISO/IEC 7816-8"),
                                    ("0x00 0x10 PERFORM SCQL OPERATION ISO/IEC 7816-7"),
                                    ("0x00 0x2A PERFORM SECURITY OPERATION ISO/IEC 7816-8"),
                                    ("0x00 0x12 PERFORM TRANSACTION OPERATION ISO/IEC 7816-7"),
                                    ("0x00 0x14 PERFORM USER OPERATION ISO/IEC 7816-7"),
                                    ("0x00 0xDA PUT DATA ISO/IEC 7816-4"),
                                    ("0x80 0xD8 PUT KEY OP"),
                                    ("0xA0 0xB0 READ BINARY GSM 11.11"),
                                    ("0x00 0xB0 READ BINARY ISO/IEC 7816-4"),
                                    ("0xA0 0xB2 READ RECORD  GSM 11.11"),
                                    ("0x00 0xB2 READ RECORD  ISO/IEC 7816-4"),
                                    ("0xA0 0x44 REHABILITATE GSM 11.11"),
                                    ("0x00 0x2C RESET RETRY COUNTER ISO/IEC 7816-8"),
                                    ("0xA0 0x88 RUN GSM ALGORITHM GSM 11.11"),
                                    ("0x00 0xA0 SEARCH BINARY ISO/IEC 7816-9"),
                                    ("0x00 0xA2 SEARCH RECORD ISO/IEC 7816-9"),
                                    ("0xA0 0xA2 SEEK GSM 11.11"),
                                    ("0xA0 0xA4 SELECT GSM 11.11"),
                                    ("0x00 0xA4 SELECT ISO/IEC 7816-4"),
                                    ("0x80 0xF0 SET STATUS OP"),
                                    ("0xA0 0xFA SLEEP GSM 11.11"),
                                    ("0xA0 0xF2 STATUS GSM 11.11"),
                                    ("0x00 0xFE TERMINATE CARD USAGE ISO/IEC 7816-9"),
                                    ("0x00 0xE6 TERMINATE DF ISO/IEC 7816-9"),
                                    ("0x00 0xE8 TERMINATE EF ISO/IEC 7816-9"),
                                    ("0xA0 0x2C UNBLOCK CHV GSM 11.11"),
                                    ("0xA0 0xD6 UPDATE BINARY GSM 11.11"),
                                    ("0x00 0xD6 UPDATE BINARY ISO/IEC 7816-4"),
                                    ("0xA0 0xDC UPDATE RECORD GSM 11.11"),
                                    ("0x00 0xDC UPDATE RECORD ISO/IEC 7816-4"),
                                    ("0x00 0x20 VERIFY ISO/IEC 7816-4"),
                                    ("0x80 0x20 VERIFY EMV"),
                                    ("0xA0 0x20 VERIFY CHV GSM 11.11"),
                                    ("0x00 0xD0 WRITE BINARY ISO/IEC 7816-4"),
                                    ("0x00 0xD2 WRITE RECORD ISO/IEC 7816-4")};

  /** decode a smart card on the basis of class and instruction
   *  @param  cla class byte
   *  @param  ins instruction byte
   *  @return string with the decoded command
  public static String decodeCmd(int cla, int ins) {
    int i, n;
    String command = "", clains, s;

    clains = "0x" + ScanCmds.IntTo2CharHexString(cla);
    clains = clains + " 0x" + ScanCmds.IntTo2CharHexString(ins);

    for (i = 0; i < CMDTABLE.length; i++) {
      if (CMDTABLE[i].startsWith(clains) == true) command = CMDTABLE[i];
    }  // for

    return command;
  } // decodeCmd

} // class