Java Card
Este artigo ou seção pode conter informações desatualizadas. |
Java Card é uma tecnologia que permite que pequenos aplicativos (applets) baseados na plataforma Java sejam executados com segurança em smart cards e dispositivos similares com limitações de processamento e armazenamento.
O Java Card é voltado a cartões SIM e a cartões para caixas eletrônicos. O primeiro Java Card foi apresentado em 1997 por várias empresas. Os produtos Java Card são baseados nas especificações da Plataforma Java Card desenvolvidas pela Oracle Corporation, e suas principais características são portabilidade e segurança.
Principais características
O objetivo do Java Card é definir um ambiente de computação padrão para smart cards, permitindo que o mesmo miniaplicativo Java Card seja executado em diferentes tipos de cartão, da mesma forma que um miniaplicativo Java é executado em diferentes computadores. Como em Java, isso é feito usando a combinação de uma máquina virtual (a Java Card Virtual Machine, ou JCVM) e uma biblioteca de tempo de execução bem definida, que mira abstrair as diferenças entre diferentes plataformas. A portabilidade permanece mitigada por problemas de tamanho de memória, desempenho e tempo de execução (por exemplo, para protocolos de comunicação ou algoritmos criptográficos).
Em motivo de manter a compatibilidade entre o maior número de plataformas possível, muitos recursos da linguagem Java não são suportados pelo Java Card (os tipos char, double, float e long; o qualificador transient; enums; matrizes de mais de uma dimensão; finalização; clonagem de objeto e threads). Além disso, alguns recursos comuns do Java não são fornecidos no tempo de execução por muitos cartões inteligentes reais (em particular o tipo int e coleta de lixo de objetos).
Processo de desenvolvimento
O desenvolvimento na plataforma é feito por meio do Java Card Development Kit (JCDK) e do Java Card Runtime Environment (JCRE), por meio de um conversor e simulador.
"Hello World" no Java Card
/*
* Package: org.wikipedia
* Filename: HelloWorld.java
* Class: HelloWorld
* Date: [[13 de Dezembro]] de [[2021]]
*
*/
package org.wikipedia;
import javacard.framework.*;
public class HelloWorld extends javacard.framework.Applet {
// Byte CLA
final static byte HELLO_CLA = (byte) 0xB0;
// Verificar PIN
final static byte INS_HELLO = (byte) 0x20;
public static void install(byte[] bArray, short bOffset, byte bLength) {
(new HelloWorld()).register(
bArray,
(short) (bOffset + 1),
bArray[bOffset]);
}
// Processa o comando APDU
public void process(APDU apdu) {
byte[] buffer = apdu.getBuffer();
if ((buffer[ISO7816.OFFSET_CLA] == 0)
&& (buffer[ISO7816.OFFSET_INS] == (byte) (0xA4)))
return;
// Valida o byte CLA
if (buffer[ISO7816.OFFSET_CLA] != HELLO_CLA)
ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
// Seleciona a instrução apropriada (Byte INS)
switch (buffer[ISO7816.OFFSET_INS]) {
case INS_HELLO :
getHello(apdu);
return;
default :
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
}
}
/**
* @param apdu
* @author Wikipedia
* Get user id attribute
*/
private void getHello(APDU apdu) {
// Cadeia de bytes com a mensagem: "hello world Java Card"
byte[] hello =
{
'h',
'e',
'l',
'l',
'o',
' ',
'w',
'o',
'r',
'l',
'd',
' ',
'J',
'a',
'v',
'a',
' ',
'C',
'a',
'r',
'd' };
// Informa ao JCRE que será enviado uma resposta
short le = apdu.setOutgoing();
short totalBytes = (short) hello.length;
// Informa ao JCRE o tamanho da mensagem em bytes
apdu.setOutgoingLength(totalBytes);
// Envia a mensgem para o host
apdu.sendBytesLong(hello, (short) 0, (short) hello.length);
}
}
Testando
Após enviar comando "select", envie o seguinte comando: B0 20 00 00
A saída será: 68 65 6C 6C 6F 20 77 6F 72 6C 64 20 4A 61 76 61 20 43 61 72 64 90 00