resources to make java card application similiar like RB 5.0 [closed]

Smart card specifications:

  1. Global Platform Card Specification (This is v, your card may was compatible a lower version)
  2. ISO/IEC 7816 (Regularly you need part 3 and 4)

Java Card applet development kit (including API Specifications + RE and VM Specification):

Java application library to communicate with smart cards:

  • javax.smartcardio (As far as I know it is removed from Java Development Kit in the newer version)

A sample Java card applet: (A HelloWorld, stolen from here):

package helloWorldPackage;

import javacard.framework.APDU;
import javacard.framework.Applet;
import javacard.framework.ISO7816;
import javacard.framework.ISOException;
import javacard.framework.Util;

public class HelloWorldApplet extends Applet {
         private static final byte[] helloWorld = {(byte)'H',(byte)'e',(byte)'l',(byte)'l',(byte)'o',(byte)' ',(byte)'W',(byte)'o',(byte)'r',(byte)'l',(byte)'d',};

         private static final byte HW_CLA = (byte)0x80;
         private static final byte HW_INS = (byte)0x00;

         public static void install(byte[] bArray, short bOffset, byte bLength) {
             new HelloWorldApplet().register(bArray, (short) (bOffset + 1), bArray[bOffset]);

         public void process(APDU apdu) {

             if (selectingApplet()) {

         byte[] buffer = apdu.getBuffer();
         byte CLA = (byte) (buffer[ISO7816.OFFSET_CLA] & 0xFF);
         byte INS = (byte) (buffer[ISO7816.OFFSET_INS] & 0xFF);

         if (CLA != HW_CLA)

          switch ( INS ) {
             case HW_INS:
               getHelloWorld( apdu );

  private void getHelloWorld( APDU apdu)
      byte[] buffer = apdu.getBuffer();
      short length = (short) helloWorld.length;

      Util.arrayCopyNonAtomic(helloWorld, (short)0, buffer, (short)0, (short) length);

      apdu.setOutgoingAndSend((short)0, length);

Related Java program to work with above applet (Stolen from here and modified after that):

import java.util.List;
import javax.smartcardio.*;

public class Blog {
 public static void main(String[] args) {
  try {
   // Display the list of terminals
   TerminalFactory factory = TerminalFactory.getDefault();
   List<CardTerminal> terminals = factory.terminals().list();
   System.out.println("Terminals: " + terminals);

   // Use the first terminal
   CardTerminal terminal = terminals.get(0);

   // Connect with the card
   Card card = terminal.connect("*");
   System.out.println("card: " + card);
   CardChannel channel = card.getBasicChannel();

   // Send Select Applet command
   byte[] aid = {(byte)0xA0, 0x00, 0x00, 0x00, 0x62, 0x03, 0x01, 0x0C, 0x06, 0x01}; //Replace your Applet AID instead of this AID here.
   ResponseAPDU answer = channel.transmit(new CommandAPDU(0x00, 0xA4, 0x04, 0x00, aid));
   System.out.println("answer: " + answer.toString());

   // Send test command
   answer = channel.transmit(new CommandAPDU(0x00, 0x00, 0x00, 0x00));
   System.out.println("answer: " + answer.toString());
   byte r[] = answer.getData();
   for (int i=0; i<r.length; i++)

   // Disconnect the card
  } catch(Exception e) {
   System.out.println("Ouch: " + e.toString());

You must convert you applet from .java to .class and from .class to .cap file. the JCDK contained required tools for that. To make this process simpler you can use Eclipse-JCDE plugin in Eclipse IDE (for Java Card 2.2.2) or Netbeans IDE plugins for Java Card (That is included in newer versions by default.)

After generating the .CAP file you need to upload and install it on the card. to aim this goal you can use the great well-documented opensource tool named GlobalPlatformPro.

After installation you can use the Java program that mentioned above to communicate with your applet, or instead you can use another opensource tool named OpenSC-Tool to send APDU commands to card and receive responses.

Leave a Comment