Java Card Next Generation

Propaganda
: : www.mundoj.com.br : :
Igor Medeiros
([email protected]
|
@
igormedeiros): Diretor técnico da X-Card
Consulting, conhecido como o “Java
Card Man Brasileiro”, é pioneiro na
produção de literatura Java Card no
Brasil. Trabalha com Java desde 2001,
é ativo colaborador da comunidade
Java Card. Como instrutor Java Card,
treinou
diversos
desenvolvedores
em consultorias e estatais. Realizou
palestras técnicas e workshops nos
diversos congressos por todo o País e
é autor do livro “Desenvolvimento Java
Card sem mistérios” (lançamento em
breve). Fundador da ONG Alegria de
Rua (www.alegriaderua.org), atua desde
2001 no resgate de moradores de rua.
Java Card Next
Generation
Desenvolva Servlets Java Card
para Smart Cards sem APDU
Java Card é uma plataforma de software
normalmente vista em smart cards e,
considerando que os SIM cards são smart
cards, a probabilidade de você possuir uma
máquina virtual Java Card 2 no seu celular
ou carteira é próxima de 100%. Nosso
país ainda tem poucos desenvolvedores
Java Card, provavelmente porque até a
versão 2.x, a plataforma Java Card ainda
era baseada em um nicho do mercado de
segurança, autenticação, identificação
etc., mas com a grande evolução da
versão 3.x, podemos dizer que Java Card
agora se tornou um “micro JEE”, atraindo
desenvolvedores Web, já que temos
agora um container Web no smart card
com aplicações Web.
68
ma descrição simples da versão 3.x da plataforma Java
Card nos leva a pensar que se trata de mais uma daquelas tecnologias envolvendo a tecnologia Java que só
estará presente em nosso dia-a-dia na próxima década. Felizmente, a ideia de simplificar o desenvolvimento, deploy e acesso às
aplicações Java Card, digo, servlets, tornou o conceito de servidor
pessoal seguro e portável. Sendo mais claro, em breve você carregará em seu celular um servidor web vivo no SIM Card do seu
celular.
Se você já tentou aprender Java Card só para ficar por dentro e
até colocar no seu currículo e desistiu antes mesmo do HelloWorld, não se preocupe, você não é o único. Agora que temos
a versão 3.x da plataforma Java Card, posso confortá-lo ao dizer
que o aprendizado Java Card é tedioso, tanto quanto o fluxo de
desenvolvimento, mas devo também dizer que é simples! Com
Java Card 3.x, se você já escreveu um servlet, já poderá dizer que
possui um conhecimento básico de Java Card, após ler este artigo.
Java Card 2.x
Tool Kit no celular, pois, no final, toda instrução enviada ao SIM
card é um comando APDU, conforme ilustra a figura 3.
Minha paixão por Java Card já dura 9 anos. Confesso que não entendo
como tem durado tanto já que costuma ser uma grande “dor de cabeça”
para tantos colegas, principalmente quando se deparam com particularidades do universo dos cartões inteligentes, como o entendimento de
comandos e respostas APDU, trocados com o cartão inteligente. Espero
que você nunca tenha precisado debugar um applet Java Card, ainda
mais quando a resposta é 0x6700 (erro desconhecido). Deve ser por isso
que vejo tantos desenvolvedores desistindo no meio do caminho. De
fato, o processo de desenvolvimento e até mesmo o entendimento de
como um applet Java Card se comunica com um desktop ou mesmo
um celular é um tanto tedioso, visto que temos que pensar em termos
de APDU, TLVs etc., afinal, nós pensamos em termos do mundo real.
A figura 2 representa essa comunicação baseada em pacotes APDU. A
especificação Java Card 2.x descreve uma série de limitações necessárias
na linguagem e no ambiente de execução para que uma plataforma Java
“caiba” em um dispositivo com considerável limitação de processamento
e armazenamento. Entre as limitações, podemos citar:
tTVCDPOKVOUPEBMJOHVBHFN+BWBTVQPSUFEFSFDVSTPTQSFTFOUFTBUÏB
versão 1.3 do JDK);
t OÍPTVQPSUBPCKFUPT4USJOH
t OÍPTVQPSUBNÞMUJQMBTMJOIBTEFFYFDVÎÍPUISFBET
t OÍPTVQPSUBDPMFUBBVUPNÈUJDBEFMJYPHBSCBHFDPMMFDUJPO
t OÍPTVQPSUBOBUJWBNFOUFSPUJOBTEFSFEF
t OÍPTVQPSUBBSRVJWPTDMBTTÏOFDFTTÈSJPDPOWFSUFSQBSBDBQ
t OÍPTVQPSUBDBSHBEJOÉNJDBEFDMBTTFT
t OÍPTVQPSUBBSSBZTNVMUJEJNFOTJPOBJT
t OÍPTVQPSUBQSPDFTTBEPSFTEFTNBSUDBSETNBJPSFTRVFCJUT
t OÍPTVQPSUBTNBSUDBSETDPNNBJTEF,CEFNFNØSJB3".
Figura 2. Interação com smart card na plataforma Java Card 2.x via desktop.
Mesmo com essas limitações, devemos respeitar o fato de o Java Card
ser a plataforma dominante no universo dos smart cards, com bilhões de
aplicações em produção, algumas delas possivelmente na sua carteira ou
celular. A figura 1 ilustra o desenho da especificação Java Card 2.x.
Figura 3. Interação com smart card na plataforma Java Card 2.x via telefone celular.
Desafios no desenvolvimento Java Card 2.x
Figura 1. Arquitetura Java Card 2.
Interação de aplicações Java Card 2.x
Applets Java Card somente recebem comandos APDU do ambiente
de execução JCRE (Java Card Runtime Enviroment), portanto, aplicações tanto no desktop ou num celular podem apenas enviar e receber
comandos e respostas no formato APDU. Interessante é observar que
desde 2003 alguns cientistas compararam esta comunicação com o
smart card com uma comunicação HTTP, afinal de contas, o smart card
recebe um comando, processa e então devolve uma resposta. A figura
2 ilustra como é a interação de uma aplicação desktop com um smart
card Java Card. Uma aplicação Java ME, no ponto de vista do SIM
Card, se comporta da mesma maneira como outra aplicação SIM
A primeira vista, no código-fonte da Listagem 1, um “HelloWorld” Java
Card não parece difícil de se entender. Como a API é enxuta, Java Card
deve ser fácil, certo? Vejo alguns desenvolvedores que fazem meus
cursos reclamarem que já leram um livro sobre Java Card e que o livro
falava tudo sobre a API, a linguagem etc., mas não é claro quanto ao
gerenciamento das aplicações no smart card. De fato, a especificação
Java Card 2 não define um software que faça o deploy dos applets no
smart card, apenas define que um “Off-card instalation Program” proprietário deve ser utilizado para instalar applets no smart card. Outra
dificuldade que vejo (a mesma que eu tive ao iniciar com Java Card)
é entender APDUs. Não posso dizer que é algo fácil. Mesmo podendo
explicar em dois minutos, é sempre complicado quando precisamos
descrever um comando de forma “não-humana” como 0x00 84 00 00
08. Pensar em forma de APDUs é sem dúvida tedioso e pode fazer você
chegar mais tarde em casa se precisa depurar um applet apenas pelas
respostas APDU. Depurar código-fonte não é tão complicado quando
você tem a ferramenta correta. Temos algumas opções de IDEs pagas
no mercado que nem sempre estão ao alcance do desenvolvedor ou estudante que deseja apenas ingressar nesse universo. O fato de precisar
passar por burocracias internas de empresas somente para obter uma
69
: : www.mundoj.com.br : :
cópia de uma ferramenta de desenvolvimento (ou plugin) é um tanto
desestimulante.
Listagem 1. HelloWorld Java Card 2.x.
package br.com.igormedeiros;
import javacard.framework.APDU;
import javacard.framework.ISO7816;
import javacard.framework.ISOException;
public class HelloWorldJC extends javacard.framework.Applet {
public static void install(byte[] bArray, short bOffset, byte bLength) {
(new HelloWorldJC()).register(bArray, (short) (bOffset + 1),
bArray[bOffset]);
}
public void process(APDU apdu) {
finindo o AID de cada applet, bem com a correta referência no escopo
de visibilidade do jcwde. Deve-se também preparar um script de comandos APDU de acordo com os valores de cada campo do comando
APDU que você deve ter definido no código-fonte do applet. Para
executar o código-fonte em ambiente emulado, primeiro executa-se o
utilitário jcwde, parte do Kit de desenvolvimento Java Card 2.x e depois, em outra janela de prompt, executa-se o utilitário apdutool (outro
utilitário do JCDK), passando como argumento o arquivo de script
APDU, com instruções para selecionar o applet e depois se executa as
instruções específicas do applet. Não entendeu alguma coisa? Deve ser
porque você não conhece Java Card 2, ou porque ainda não cheguei
num passo primordial, que é converter o applet para o formato .cap
(Java Card não suporta .class) e fazer deploy no smart cards, testando os APDUs em ambiente de produção. A linguagem técnica muda
quando começamos a falar em servlets, especialmente quando há um
bom plugin-in numa IDE madura como NetBeans, que suporta todo
o processo de desenvolvimento, teste e deploy no smart card com um
excelente ambiente para simulação de sua nova aplicação web, rodando num smart card.
Java Card 3.x
byte[] hello = { ‘h’, ‘e’, ‘l’, ‘l’, ‘o’, ‘ ‘, ‘w’, ‘o’, ‘r’, ‘l’, ‘d’, ‘ ‘, ‘J’, ‘a’, ‘v’,
‘a’, ‘ ‘, ‘C’, ‘a’, ‘r’, ‘d’ };
apdu.setOutgoing();
short totalBytes = (short) hello.length;
apdu.setOutgoingLength(totalBytes);
apdu.sendBytesLong(hello, (short) 0, (short) hello.length);
}
}
}
Escrever este código-fonte Java Card 2.x é a parte fácil da história. A
execução é que normalmente gera “dor de cabeça” porque você deve
configurar o ambiente de execução simulado (ferramenta jcwde), de-
70
Demorou seis anos para sair uma nova versão da especificação Java
Card e de certa forma surpreendeu o mercado. Ninguém esperava que
as ideias das teses científicas saíssem do Google Scholar para contribuir
com a realidade da versão 3.0 da especificação Java Card em 2008.
Somente no ano seguinte é que o SDK foi publicado juntamente com
uma plataforma completa de desenvolvimento, incluindo um plug-in
NetBeans, que suporta todo o processo de desenvolvimento e teste, simulando a execução em smart cards simulados. A especificação 3.0 foi
dividida em duas edições para separar o legado da inovação, tornando
os smart cards com Java Card 3 compatíveis com applets feitos para
Java Card 2. A edição que vamos testar aqui é a da inovação, chamada
“connected”. A edição que suporta o legado é chamada “classic”. Java
Card 3 de fato traz uma série de inovações, mudanças significativas e a
quase que completa eliminação das limitações existentes na plataforma
Java Card 2. Entre as novidades, devemos destacar:
Java Card 2.x
Java Card 3.x
API base
Subconjunto de JDK 1.3
Baseada num subconjunto CLDC com suporte à
linguagem Java 6 (quase que total)
Anotações
Não
Sim
Tipos
boolean, byte, short (possibilade de int por meio de
configuração específica)
Todos os tipos primitivos, exceto de ponto
flutuante. Suporte a objetos java.lang.String
Múltiplas linhas de execução
(Threads)
Não
Sim
Servlets
Não
Sim
Coleta automática de lixo
(objetos não utilizados)
Não
Sim
Rede TCP/IP
Não
Sim
HTTP/HTTPS
Não
Sim
Arquivos .class
Não, é necessário converter para .cap
Sim
Sim
Arquivos de deploy .war
Não
Carga dinâmica de classes
Não
Sim
Arrays multidimensionais
Não
Sim – duas dimensões
Suporte a smart cards com
processadores de 32-bits
Não
Sim
Suporte a smart cards com
24Kb de memória RAM.
Não
Sim
Uma das primeiras coisas que nos chama atenção no desenho da
arquitetura da nova especificação Java Card 3 é a presença de um
contêiner web, conforme podemos verificar na figura 4. Os applets
ainda existem para a versão “classic” no suporte das aplicações
legadas. Agora temos aplicações web, ou simplesmente servlets.
A versão 2.4 da especificação dos servlets foi incorporada para
permitir verdadeiras aplicações web rodando diretamente do seu
novo servidor pessoal seguro e portátil, que vai onde você estiver.
ao passo da instalação dos plugins. Abra o NetBeans, acesse o
menu tools > plugins. Na caixa de diálogo “Plugins”, acesse a
aba “Available Plugins” e na caixa de texto de “search” digite
“Java Card”, como mostra a figura 6.
Figura 6. Instalando plugins Java Card na IDE NetBeans.
Figura 4. Arquitetura Java Card 3.
A forma como um servlet interage com requisições do mundo
externo não é diferente dos servlets que já conhecemos, ou seja,
via requisições HTTP/HTTPS, que são originadas de browsers de
desktop ou celulares. O servidor ficou pessoal e vai onde você
estiver, sempre ouvindo requisições HTTP, conforme ilustrado na
figura 5. Imagine o que você pode fazer com essa oportunidade
tecnológica. Acredito que você ficará ainda mais empolgado sabendo que o smart card também suporta protocolos baseados em
XML, possibilitando o uso de WebServices.
Após o download e instalação do plugin, reinicie o NetBeans.
Para criar um projeto Java Card no NetBeans, acesse o menu File
> New Projet, então selecione a categoria “Java Card” e o tipo de
projeto “Web Project”.como ilustra a figura 7.
Figura 7. Criando projeto web Java Card na IDE NetBeans.
Figura 5. Interação com smart card na plataforma Java Card 3.x “Connected” via browser do
desktop ou celular.
Seu primeiro servlet Java Card
Vamos a construção do nosso primeiro servlet Java Card 3.
Veremos passo-a-passo como desenvolver essas aplicações
ficou fácil.
Pressupondo que seu ambiente de desenvolvimento já esteja
configurado com JDK e NetBeans 7.1 ou superior, vamos direto
Os próximos passos determinam os nomes de diretório, contexto
web e o alvo para execução simulada, ou seja, o ambiente de execução e dispositivo. Neste ponto, confira se a plataforma Java Card
está configurada no NetBeans, assim como o dispositivo, senão,
clique no botão “Manage Platforms”. O diálogo “Java Platform
Manager” é exibido, oferecendo a possibilidade de adicionar o
“JAVACARD_HOME” se for necessário, como ilustra a figura 8. O
plugin Java Card 3 para a IDE NetBeans está disponível para Linux e Mac OS, mas o JCDK (Java Card Development Kit) ainda só
pode ser encontrado para Windows. Isso significa que a instalação
do plugin em ambiente Windows já realiza o download do JCDK
e configura automaticamente a plataforma JRE (vide configuração
de plataformas NetBeans) e que, por enquanto, podemos desenvolver Java Card 3 utilizando NetBeans e seu plugin somente em
ambiente Windows.
71
: : www.mundoj.com.br : :
Figura 10. Configuração geral do novo projeto web Java Card (connected).
Figura 8. JCRE (Java Card Runtime Environment) gerenciado como plataforma no NetBeans.
Você pode gerenciar um dispositivo (smart card) e até alterar sua
configuração, tal como configurar a forma como os serviços oferecidos pelo smart card simulado serão disponibilizados via HTTP.
Você pode deixar as configurações como sugerido por padrão,
conforme a ilustração da figura 9.
Listagem 2. JCServletMundoJava.
package br.com.mundojava.javacard;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class JCServletMundoJava extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse
response)
throws IOException {
response.setContentType(“text/html”);
PrintWriter out = response.getWriter();
try {
out.println(“<html><head><title>JCServletMundoJava</title>
</head>”);
out.println(“<body><h1>Boas vindas</h1>”);
out.println(“Ola “);
out.println(request.getParameter(“name”));
Figura 9. Configuração do dispositivo simulado (smart card).
Voltando ao assistente para a criação de um projeto Web Java
Card, você deve preencher apenas o nome do projeto, os outros
caminhos de diretório e contexto Web serão preenchidos automaticamente, chamaremos nosso projeto de JCServletMundoJava e
o pacote br.com.mundojava.javacard, e vamos marcá-lo também
como projeto principal do NetBeans, conforme ilustrado na figura
10.
Ao clicar no botão “Finish”, toda a estrutura de diretórios do
projeto é criada junto com o código-fonte do servlet, uma página
HTML inicial e os descritores MANIFEST.MF, web.xml e javacard.
xml. A Listagem 2 mostra o código-fonte gerado para o servlet.
72
out.println(“! Seja benvindo(a) ao seleto grupo de desenvolvedores
Java Card 3 leitores da revista MundoJava.”);
out.println(“</body></html>”);
} finally {
out.close();
}
}
}
Se você quiser adicionar outros servlets, precisa apenas descrever
o contexto web de cada um por meio dos arquivos MANIFEST.
MF, web.xml e javacard.xml. Não se esqueça de parar a execução
do dispositivo simulado antes de clicar no botão “Run” novamente. Na Listagem 3, vamos editar o arquivo index.html no diretório
“Web Pages”. Este diretório deve conter apenas os arquivos HTML
e faremos isso apenas para personalizar a página inicial.
Listagem 3. index.html..
<html>
<head>
<title>Exemplo HelloWorld Java Card 3</title>
</head>
Figura 12. Você deve parar a execução do dispositivo simulado antes de receber um novo deploy.
<body>
<div style=”text-align:center”>
<form method=”get” action=”/jcservletmundojava/jcservletmundojava”>
<table border=”0”>
<tr>
<td>Seu nome:</td>
<td><input type=”text” name=”name”></input></td>
</tr>
<tr>
<td> </td>
Para Saber Mais
Você pode saber mais sobre smart cards e APDU nos artigos
já publicados na revista MundoJ: "Explorando pequenos
grandes mundos com Java Card" (edição 12), "Trabalhando
com autenticação de usuários em Java Card" (edição 14) e
"Smart Card I/O: Terminais Desktop Java para Smart Cards
em 10 minutos" (edição 25).
<td><input type=”submit” value=”Diga Ola”></td>
</tr>
</table>
</form>
</div>
</body>
</html>
Como pode perceber, um servlet bem simples foi criado sem
precisar digitar uma linha de código-fonte. Vamos apenas alterar
um pouco o texto conforme as Listagens acima e então você já
pode clicar no botão “Run Main Project” (F) e ver seu servlet em
ação diretamente de um smart card sendo acessado por um web
browser, como ilustrado na figura 11.
Figura 11. Resultado processado pelo servlet em execução no device (smart card).
Você deve parar a execução do dispositivo virtual para que ele receba um novo deploy, ou seja, para que as alterações realizadas surtam
efeito no ambiente simulado, conforme ilustrado na figura 12.
Considerações finais
A essa altura, com um simples helloworld sendo processado de um
smart card sendo processado na carteira ou celular de alguém em
qualquer lugar por aí, você já deve estar imaginando muitas ideias
para empreender e ainda contribuir para o desenvolvimento de um
país onde a maioria dos cidadãos tem um celular GSM e que cerca de
95% deles possuem uma máquina virtual Java Card rodando. Você
ainda deve ficar empolgado ao imaginar que o Java Card 3 mira também em smart cards como carteira de identidade nacional.
Parece ser interessante dominar esta tecnologia agora porque o governo brasileiro está para levar aos seus 192 milhões de cidadãos,
um smart card que vai funcionar como um contêiner de documentos
digitais, como RG, CPF etc. Muitos desenvolvedores têm se interessado especialmente pelo RIC, o que me levou a desenvolver um treinamento somente sobre como explorar oportunidades Java Card com
o RIC. Quanto ao mercado de mobilidade GSM, ainda não temos
negociações concretas entre as operadoras para comprarem um SIM
Card Java Card 3, afinal, cada centavo poupado na unidade representa alguns milhões de reais poupados pela operadora. Os smart cards
com Java Card 3 ainda estão apenas começando no mercado mundial
e o preço ainda é maior em função da configuração de hardware ser
mais evoluída, portanto, eu recomendaria a você estudar Java Card,
desenvolver suas ideias e se preparar para um mundo de novas oporUVOJEBEFTRVFDIFHBSÈBP#SBTJMOVNGVUVSPOÍPNVJUPEJTUBOUFt
Referências
Ainda não há uma referência oficial sobre o projeto RIC, fique sempre atento ao site do
ITI (www.iti.gov.br). Não há muito material em português sobre Java Card, mas estou
reunindo material no www.igormedeiros.com.br , onde será possível baixar gratuitamente um capitulo do livro “Desenvolvimento Java Card sem mistérios”, assim que for
lançado em meados de setembro de 2010. Não deixe de conferir a fonte oficial http://
java.sun.com/javacard, onde você pode baixar as especificações, NetBeans e o JCDK.
Você também pode me seguir no www.twitter.com/igormedeiros e/ou buscar pelo
hash-tag #javacard.
73
Download