I am making java app which main function is to write data on java card 36k, so I need resources ,tutorials about java cards,stuff like that.? I have no experience making java card apps, so please give me any helpful resources..
-
Questions that requesting programs or tutorials are of topic – Ebrahim Ghasemi May 24 '15 at 02:27
1 Answers
Smart card specifications:
- Global Platform Card Specification (This is v 2.2.0.7, your card may was compatible a lower version)
- ISO/IEC 7816 (Regularly you need part 3 and 4)
Java Card applet development kit (including API Specifications + RE and VM Specification):
- Java Card Development Kit 3.0.2 (Download the version that is compatible with your card)
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()) {
return;
}
byte[] buffer = apdu.getBuffer();
byte CLA = (byte) (buffer[ISO7816.OFFSET_CLA] & 0xFF);
byte INS = (byte) (buffer[ISO7816.OFFSET_INS] & 0xFF);
if (CLA != HW_CLA)
{
ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
}
switch ( INS ) {
case HW_INS:
getHelloWorld( apdu );
break;
default:
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
}
}
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++)
System.out.print((char)r[i]);
System.out.println();
// Disconnect the card
card.disconnect(false);
} 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.

- 5,850
- 10
- 52
- 113
-
1+1 for this extensive answer to a horrible question. With a bit of luck you get reversal badge for it. But please just close that kind question down instead of answering, SO doesn't want to encourage horrible questions. – Maarten Bodewes May 24 '15 at 11:22
-
1@MaartenBodewes Oops, You are right, it encourage horrible questions. I was in doubt about leaving the question unanswered or leaving an answer.Now I know I must leave them unanswered. Thank you. :) – Ebrahim Ghasemi May 24 '15 at 12:19