Java Card

**Java Card** merupakan teknologi yang membolehkan aplikasi berasaskan Java dijalankan dengan selamat pada kad-kad pintar dan peranti-peranti kecil yang beringatan kecil. Java Card adalah pelantar Java terkecil yang dibangunkan untuk peranti-peranti terbenam. Ia membolehkan penggunanya mengatur cara peranti-perantinya serta mengkhususkan aplikasi.

Java Card yang pertama telah diperkenalkan pada tahun 1996 oleh bahagian kad Schlumberger yang kemudiannya bergabung dengan Gemplus bagi membentuk Gemalto. Produk-produk Java Card adalah berasaskan spesifikasi yang dibangunkan oleh Sun Microsystems (yang kemudiannya menjadi anak syarikat Oracle Corporation). Kebanyakan produk-produk Java card turut bergantung kepada spesifikasi GlobalPlatform bagi pengurusan keselamatan aplikasi pada kad (muat turun, pemasangan, pemperibadian, penghapusan).

Matlamat utama reka bentuk teknologi Java Card ialah kemudahalihan dan keselamatan.

## Versi
### Java Card 2.2.2
Java Card 2.2.2 dikeluarkan pada Mac 2006. Keluaran ini menyediakan beberapa ciri-ciri baharu, antaranya:
* sokongan bagi ISO7816-4:2005 dan 20 saluran logik
* bantuan-bantuan kebolehaturcaraan applet untuk APDU panjang tambahan yang diterangkan dalam ISO 7816
* sokongan bagi algoritma cincangan untuk SHA-256, SHA-384, SHA-512.

### Java Card 3.0
Tentuan Java Card versi 3.0 (drafnya dikeluarkan pada bulan Mac 2008) dibahagikan kepada dua versi iaitu *Classic Edition* (edisi klasik) dan *Connected Edition* (edisi tersambung). 

Antara ciri baharu dalam *Connected Edition* ialah sokongan bagi servlet, sokongan bagi rentetan (*string*) dan *shareable interface object* (objek antara muka boleh kongsi, SIO).

Java Card 3.0 Classic Edition adalah serasi kebelakang dengan Java Card 2.22.

## Contoh
Berikut ialah contoh ringkas bagi aplikasi yang digunakan sebagai dompet elektronik:


```java
public class DompetApplet extends Applet {
    private final byte PENGESAHAN = (byte)0x20;
    private final byte MASUK_DUIT = (byte)0x6a;
    private final byte KELUAR_DUIT = (byte)0x6b;
    private final short MAKSIMUM_KELUAR = (short)0x0bb8; // RM300
    private short baki;
    private OwnerPIN pin;
 
    public static void install(byte[] bArray, short bOffset, byte bLength) {
        new DompetApplet(bArray, bOffset, bLength);
    }
 
    protected DompetApplet(byte[] bArray, short bOffset, byte bLength) {
        register();
        pin.update(bArray, bOffset, bLength);
        baki = (short)0;
    }
 
    @Override
    public void process(APDU apdu) {
        byte[] buffer = apdu.getBuffer();
        short lc = apdu.getIncomingLength();
        short duit;
 
        if (!selectingApplet()) {
            switch (buffer[ISO7816.OFFSET_INS]) {
                case PENGESAHAN:
                     if (pin.getTriesRemaining() != 0) {
                         pin.check(buffer, ISO7816.OFFSET_CDATA, (byte)lc);
                     }
                     break;
                case MASUK_DUIT:
                     if (pin.isValidated()) {
                         duit = Util.getShort(buffer, ISO7816.OFFSET_CDATA);
                         baki += duit;
                     }
                     break;
                case KELUAR_DUIT:
                     if (pin.isValidated()) {
                         duit = Util.getShort(buffer, ISO7816.OFFSET_CDATA);
                         if ((baki - duit) > 0 && duit <= MAKSIMUM_KELUAR) {
                             baki -= duit;
                         } else {
                             ISOException.throwIt(ISO7816.SW_WRONG_DATA);
                         }
                     }
                     break;
                default:
                     ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
            }
        }
    }
}
```


## Rujukan