Java Card – Wikipédia, a enciclopédia livre
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
[editar | editar código-fonte]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
[editar | editar código-fonte]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
[editar | editar código-fonte] /* * 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