: : 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>&nbsp;</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