Iniciando em Java Card pelo HelloWorld

Iniciando em Java Card pelo HelloWorld

Iniciando em Java Card pelo HelloWorld

Há décadas, o programa-teste "Hello World" tem sido a forma de primeiro contato de um programador interessado em determinada linguagem de programação. Com o avanço das plataformas isso foi sumindo um pouco, os artigos são mais focados nos conceitos e exemplos contextualizados. Vamos aqui voltar aos velhos tempos e iniciar na plataforma passeando pelos principais conceitos envolvidos no clássico exemplo.

Iniciando em Java Card pelo HelloWorld

Introdução

Java Card é uma das menores plataformas Java, ainda menor que J2ME, aplicada a dispositivos como cartões inteligentes. Para a surpresa de muitos, Java Card também pode existir em outros dispositivos, como o Java Ring (ilustração 1).

ring

Ilustração 1 - Java Ring

Minha proposta neste artigo é dar uma rápida iniciação sobre Java Card ilustrando com um simples código, implementando um JavaCardHelloWorld.

Java Card

Java Card leva a dispositivos como cartões inteligentes, aquela frase: “Escreva uma vez, rode em qualquer lugar!”, portanto, Java Card é uma plataforma de software que garante interoperabilidade entre dispositivos que implementem uma máquina virtual Java Card.

Java Card é um subconjunto de J2SE, isso significa que recursos foram retirados de forma que seja possível utilizar os recursos limitados de cartão inteligente, algumas classes existem mas foram implementadas novamente, imagine se faz sentido ter o método System.out.println(x) num dispositivo sem display.

Por se tratar de uma plataforma Java, o programador Java pode aproveitar seu conhecimento na linguagem para escrever os pequenos aplicativos chamados de applets ou cardlets. Você pode utilizar seu editor favorito para gerar o código-fonte .java e o mesmo compilador, como o javac.

Desenvolvendo Applets Java Card

Inicialmente você vai precisar do JCDK (Java Card Development Kit) para montar o ambiente de desenvolvimento, faça download gratuitamente do kit em http://java.sun.com/products/javacard/dev_kit.html

Assim que descompatar o JCDK, adicione arquivo /lib/api.jar na variável CLASSPATH, este arquivo contém o framework Java Card e adicione o diretório bin na variável de ambiente PATH, este diretório contém os utilitários que vai precisar mais adiante.

Escreva o código-fonte, da mesma forma a listagem 1, neste momento você não precisa se preocupar em entender linha por linha, você entenderá de uma forma geral com os comentários no código-fonte.

Listagem 1: código-fonte do arquivo HelloWorldJC.java

/*

* Autor: Igor Medeiros (igor@igormedeiros.com.br)

* Pacote: br.com.igormedeiros

* Arquivo: HelloWorldJC.java

* Classe: HelloWorldJC

* Data: 08/05/2005

* Revisado: 25/02/2006

*/

package br.com.igormedeiros;

import javacard.framework.APDU;

import javacard.framework.ISO7816;

import javacard.framework.ISOException;


// Todo Applet deve extender javacard.framework.Applet

public class HelloWorldJC extends javacard.framework.Applet {

       // CLA Byte

       final static byte CLA_HELLO = (byte) 0xB0;

       // Instrução para obtem a mensagem "hello world Java Card"

       final static byte INS_HELLO = (byte) 0x20;

       // no método install você por inicializar algum atributo

       public static void install(byte[] bArray, short bOffset, byte bLength) {

               (new HelloWorldJC()).register(bArray, (short) (bOffset + 1),

                              bArray[bOffset]);

        }

        // processa o comando APDU - equivalente ao método main()

        public void process(APDU apdu) {

               byte[] buffer = apdu.getBuffer();

               // Valida o byte CLA

               if (buffer[ISO7816.OFFSET_CLA] != CLA_HELLO)

                      ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);

               // Seleciona a instrução, aqui temos somente uma

               switch (buffer[ISO7816.OFFSET_INS]) {

               case INS_HELLO:

                       getHello(apdu);

                       return;

               default:

                       ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);

               }

        }

        // envia uma mensagem ao host

        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 (Java Card Runtime Environment) que será enviada uma resposta

               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 (desktop)

               apdu.sendBytesLong(hello, (short) 0, (short) hello.length);

        }

}


Para compilar, utilize o comando javac -g HelloWorldJC.java, a opção -g fará com que sejam geradas informações de debug.

Para testar, você utilizará o JCWDE (Java Card Workstation Development Environment), um emulador de applets, disponível no JCDK. O teste consiste em duas telas de console, uma delas será o JCWDE executando num socket representando o cartão, a outra tela vai enviar os comandos APDU através de outro utilitário do JCDK, o apdutool..

Para executar o JCWDE você vai precisar passar um arquivo de configuração como parâmetro, este arquivo representa os applets instalados no JCWDE, salve o arquivo da listagem 2 no diretório raiz do exemplo hello world.

Listagem 2 - Arquivo jcwde.app

// applet                                                    AID

com.sun.javacard.installer.InstallerApplet                   0xa0:0x0:0x0:0x0:0x62:0x3:0x1:0x8:0x1

br.com.igormedeiros.HelloWorldJC                             "apphello"


Cada applet deve ter um AID (Application Identifier) único. O pacote do applet que acabamos de escrever e compilar,

deve estar na variável de ambiente CLASSPATH.

Abra uma tela de console, vá até o diretório onde está o arquivo acima e digite: jcwde jcwde.app.

Por fim, o utilitário apdutool enviará um script com comandos APDU para o JCWDE. Antes de ser executado, o applet deve ser selecionado, isso é feito por meio de seu respectivo AID, então este passa a receber os comandos, a listagem 3 apresenta estes comandos.

Listagem 3 - Arquivo script_apdu.src

powerup;

// Seleciona o applet instalador

0x00 0xA4 0x04 0x00 0x09 0xa0 0x00 0x00 0x00 0x62 0x03 0x01 0x08 0x01 0x7F;

// <= 90 00 = Sucesso


// Registra nosso applet

0x80 0xB8 0x00 0x00 0xc 0x08 "apphello" 0x7F;

// <= 90 00 = Sucesso

// seleciona noss applet

0x00 0xA4 0x04 0x00 0x08 "apphello" 0x7F;

// <= " hello world Java Card " (caracteres em hexa)

// <= 90 00 = Sucesso

powerdown;


Abra uma tela de console, vá até o diretório onde está o arquivo acima e digite:
apdutool script_apdu.src > out.txt. Após a execução deste comando, as duas telas de console se fecharão automaticamente, o comando
powerdown do script apdu causa isto. Portanto, confira no arquivo de saída (out.txt) os resultados dos comandos APDU e veja a mensagem de hello Word escrita em caracteres hexadecimais.       

Para entender mais sobre APDU, acesse www.igormedeiros.com.br/apdu


Bons códigos,
Igor Medeiros