Hello World Java Card! (Parte 3 - Compilando e Instalando)
Autor: Ricardo Massao | Publicado: 2010-12-19T10:36:00-08:00

Muito bem, finalmente chegou a hora de compilar nossa aplicação e instalar ela em um cartão Físico. Para tanto é necessário um cartão Java Card de Desenvolvimento também conhecido por Engineering Sample e um leitor de SmartCards de contato padrão PC/SC.Essa sem dúvidas será a parte mais chata de todo processo, digo isso pois existem algumas variáveis importantes a serem observadas.
É um Java Card 2.1 ou 2.1.1 ou 2.2 ou&nbsp; 2.2.1 ou 2.2.2?Lembrem-se que no artigo o qual eu instruo a configurar o ambiente, eu recomendei que fosse baixada a versão do JCDK (Java Card Development Kit) 2.2.2, pois o plug-in do Simulador para Eclipse necessita do JCDK2.2.2.Pois bem, caso você possua um cartão Java Card 2.2.1, o que for compilado com o JCDK 2.2.2 não irá funcionar nesse cartão. Ou seja você terá que baixar o JCDK2.2.1 e configurar a variável de ambiente "JC_HOME" para apontar para o JCDK221.
É um cartão GlobalPlatform 2.0.1 ou 2.1 ou 2.1.1 ou 2.2?A maioria dos cartões utilizam a especificação 2.1.1. Porém cartões da Oberthur Cosmos utilizam a especificação 2.0.1.
Qual versão de Secure Channel Protocol ele utiliza, versão 1 ou 2 ou 3?Cartões como Oberthur Cosmos e Gemxpresso utilizam a versão 1, enquanto cartões com JCOP's da NXP utilizam a versão 2. Porém isso não é uma regra.
Qual é a chave 3DES utilizada no Secure Channel Protocol?Se for um cartão Java Card de Desenvolvimento, muito provavelmente será a chave padrão Visa Open Platform que consiste de 1 a 3 chaves no seguinte padrão:0x40 0x41 0x42 0x43 0x44 0x45 0x46 0x47 0x48 0x49 0x4A 0x4B 0x4C 0x4D 0x4E 0x4F
Caso eu não saiba, como eu descubro isso?Pergunte para o fabricante do qual você comprou o cartão, ou verifique no Manual (Datasheet) do seu cartão.
Nesse tutorial eu usarei como Base o cartão JCOP 2.4.1 de 80Kb da NXP.Java Card 2.2.2
GlobalPlatform 2.1.1
Secure Channel Protocol 2
3 Chaves 3DES padrão Visa Open Platform

Ferramenta Necessária :GPShell a ultima versão (link).
Descompacte a ferramenta na raiz C: do se HD.
Compilando um .CAP
Abra seu Eclipse e carregue o Projeto do artigo anterior e vamos descobrir onde o Eclipse salva nosso projeto. Para isso vá no menu "File &gt; Switch Workspace &gt; Other..." e verifique o caminho na qual sua Aplicação se encontra.



Vá até o diretório "seu_workspace\JCApplets" e crie um arquivo "build.bat" utilizando o Bloco de Notas.



Edite o build.bat e adicione os seguintes comandos abaixo:
@ECHO OFF

if "%OS%" == "Windows_NT" setlocal

if not "%JAVA_HOME%" == "" goto check_tool
 echo Please set the JAVA_HOME environment variable.
 goto end

:check_tool
if not "%JC_HOME%" == "" goto doit
 echo Please set the JC_HOME environment variable.
 goto end

:doit

set JC_PATH=.;%CL_DIR%;%JC_HOME%\lib\api.jar
set JCFLAGS=-g -d .\bin -source 1.2 -target 1.2 -classpath "%JC_PATH%"

if exist bin del /s /q bin
if not exist bin mkdir bin
xcopy /s /y %JC_HOME%\api_export_files\*.* bin\

%JAVA_HOME%\bin\javac %JCFLAGS% src\jchellorworld\*.java

cd bin
call %JC_HOME%\bin\converter -config ..\src\jchellorworld\JCHelloWorld.opt

:end
if "%OS%" == "Windows_NT" endlocal
pause
Esse arquivo é responsável pela compilação propriamente dita, ele verifica a presença das variáveis de ambiente "JAVA_HOME" e "JC_HOME".
Após isso ele configura o classpath e os parâmetros de compilação a ser passada para o compilador javac.
Depois o diretório "bin" é previamente limpo e todos os arquivos ".exp" (Export Files) copiados para dentro da mesma. Export Files são como arquivos Headers ".h" da Linguagem C e serve para se linkar as classes e métodos utilizado da API Java Card pelo nosso Applet.
O aplicativo "converter" fornecido pelo JCDK lê o scipt contido no arquivo "JCHelloWorld.opt" e converte o arquivo compilado pelo javac para o arquivo ".cap" que será instalado no cartão.

Agora vá até o diretório "seu_workspace\JCApplets\src\jchellorworld" crie o arquivo "JCHelloWorld.opt".



E adicione os seguinte comandos abaixo:
-out EXP JCA CAP
-exportpath .
-applet  0x01:0x02:0x03:0x04:0x05:0x06:0x07:0x08:0x09:0x00:0x00 jchellorworld.JCHelloWorld
jchellorworld
0x01:0x02:0x03:0x04:0x05:0x06:0x07:0x08:0x09:0x00 1.0
Na linha 1 informamos que deverá ser gerado os arquivos ".exp", ".jca" e ".cap".
Na linha 3 definimos o AID do nosso Applet, também conhecido como "Module" no caso o mesmo que o Eclipse gerou para nós.
Na linha 4 informamos o package da nossa aplicação "jchellorworld". 
Na linha 5 definimos o RID do Package, também conhecido como "Load File".

Agora execute o "build.bat" e o resultado esperado deve ser similar a figura abaixo:


Muito bem, se chegou até aqui compilou com sucesso um ".cap" que nada mais é que o Applet que será carregado e executado no cartão.
Agora vá até o diretório "seu_workspace\JCApplets\bin\jchellorworld\javacard" e copie o arquivo "jchellorworld.cap" para dentro da pasta "C:\GPShell-X.Y.Z".
Uma rápida olhada na pasta do GPShell e podemos notar vários arquivos de texto contendo vários scripts para diversos cartões.
Crie um arquivo de nome "InstallMyHello.txt" e adicione os seguintes comandos:
mode_211
enable_trace
enable_timer
establish_context
card_connect
select -AID a000000003000000
open_sc -security 1 -keyind 0 -keyver 0 -mac_key 404142434445464748494a4b4c4d4e4f -enc_key 404142434445464748494a4b4c4d4e4f // Open secure channel
delete -AID 0102030405060708090000
delete -AID 01020304050607080900
install -file jchellorworld.cap -nvDataLimit 2000 -instParam 00 -priv 2
get_status -element 10
get_status -element 20
get_status -element 40
card_disconnect
release_context
Na linha 1 Definimos que usaremos o GlobalPlatform spec 2.1.1.
Na linha 4 Estabilizamos um contexto com a Camada PC/SC.
Na linha 5 Abrimos um canal de comunicação com o Leitor/Gravador.
Na linha 6 Selecionamos o Card Manager do Cartão.
Na linha 7 Realizamos o Mutual Authenticate (Open Secure Channel Protocol).
Nas linhas 8 e 9 Apagamos versões anteriores do Applet que estamos instalando.
Na linha 10 Instalamos e Tornamos o Applet Selecionavel.
Nas linhas 11 a 13 Listamos os Applets disponíveis como Card Manager e nosso próprio Applet.

Agora abra um Prompt de Comando e vá até o diretório do seu GPShell.
Digite o comando "GPShell &lt; InstallMyHello.txt" vários APDU's serão trocados e no final certifique-se que o Applet foi instalado corretamente conforme a figura abaixo:

 
Finalmente, execute o GPShell simplesmente digitando "GPShell" no Prompt de Comando e vamos interagir com nosso Applet no cartão digitando os Seguintes comandos:
enable_trace
establish_context
card_connect
select -AID 0102030405060708090000
send_apdu -sc 0 -APDU 00000000060A0B0C0D0E0F
Na linha 1 habilitamos o Trace de APDU.
Na linha 2 estabilizamos um contexto com a camada PC/SC do Windows.
Na linha 3 conecta-mos com o cartão na Leitora.
Na linha 4 selecionamos o nosso Applet através do AID dele.
Na linha 5 enviamos o APDU de teste que nada mais é que o mesmo que usamos no artigo anterior para testar nosso Applet no JCWDE.
Se tudo ocorrer bem você deverá ter um resultado similar ao abaixo:


Com isso concluo a série de 3 Artigos ao qual levou você desde a parte em se adquirir as ferramentas todas Open Source, configuração do ambiente de desenvolvimento, desenvolvimento e teste no Simulador e por fim a compilação, deploy e teste em um cartão Físico.
Algumas ressalvas importantes, caso tenha dúvidas em qual spec Java Card, spec Global Platform, versão do Secure Channel Protocol, chave de sessão 3DES, etc. Do cartão que você tem em mãos, não tente pois os cartões possuem dispositivos de segurança que travam o mesmo após algumas (geralmente 10) tentativas de se estabelecer um Mutual Authentication sem sucesso, e uma vez travado é irreversível.
Tentar Instalar um Applet compilado no JCDK 2.2.2 em um cartão spec Java Card 2.2.1 resultará em um erro na hora da carga do Applet para o cartão.
Sim, seu SIM Card GSM no seu Celular ou seu Cartão de Débito/Crédito Bancário provavelmente são Java Cards (mas não com certeza), porém com certeza possuem mecanismos a mais de segurança, portanto não tentem estabelecer um canal seguro com eles.
Existe um plugin para Eclipse desenvolvida inicialmente pela IBM, agora distribuída pela NXP chamada de JCOP Tools é uma excelente (e cheia de Bugs também) ferramenta pois faz tudo o que descrevi nesses 3 artigos em um ambiente amigável e integrado ao Eclipse.
Porém para adquiri-la é necessário requerê-la junto a NXP e é uma verdadeira burocracia para consegui-la.

Caso você esteja interessado em adquirir cartões de Desenvolvimento Java Card você pode tentar através dessas empresa:
http://www.vivendi.inf.br/ - (Peça por JCOP21)
http://www.sonsun.com.br/&nbsp; - (Peça por Kit Java Card)

Caso tenha tido dificuldades, baixe o projeto dos artigos por aqui.(link)

Um grande abraço a todos, até a próxima!