domingo, 19 de dezembro de 2010

Hello World Java Card! (Parte 3 - Compilando e Instalando)

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  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 > Switch Workspace > 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 < 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/  - (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!

16 comentários:

  1. Olá Ricardo,

    Muito interessante o seu tutorial, porém eu não consigo me conectar ao cartão. Ao mandar um select para a aplicação card manager, surge o seguinte erro:

    mode_211
    enable_trace
    establish_context
    card_connect
    select -AID a000000003000000
    Command --> 00A4040008A000000003000000
    Wrapped command --> 00A4040008A000000003000000
    Response <-- 6A82
    select_application() returns 0x80216A82 (6A82: The application to be selected could not be found.)

    O arquivo que uso para tentar listar as aplicações do cartão é um modelo tirado dos exemplos que vem com o gpshell:

    mode_211
    enable_trace
    establish_context
    card_connect
    select -AID a000000003000000
    open_sc -security 1 -keyind 0 -keyver 0 -mac_key 404142434445464748494a4b4c4d4e4f -enc_key 404142434445464748494a4b4c4d4e4f // Open secure channel
    get_status -element 10
    card_disconnect
    release_context

    Qualquer ajuda seria bem vinda.

    Obrigado,
    Bruno Gomes

    ResponderExcluir
  2. Complementando o comentário anterior, eu uso o leitor de cartão ACS-ACR38-U e um cartão NXP JCOP 21, ambos adquiridos da empresa sonsun.

    Abs,
    Bruno

    ResponderExcluir
  3. Olá Bruno,
    Esse problema está ocorrendo pq o cartão não foi pré-personalizado adequadamente.
    Nesse caso você terá que entrar em contato com a SonSun para que eles efetuem a correta inicialização do Cartão.
    Me passa um e-mail caso tenha problemas.

    Abraços.

    ResponderExcluir
  4. Olá Ricardo,
    Estou passando pelo mesmo problemas que o Bruno,
    Não existe uma forma de eu mesmo inicializar esta pré-personalização do cartão?
    O que é necessário para este processo? algum hardware exclusivo ou coisa do tipo?

    ResponderExcluir
  5. Olá Lúcio,
    Para realizar esse processo é necessário uma chave secreta e o Manual do Chip.
    O processo de pré-personalização consiste em configurar e inicializar diversos parametros do Chip, como velocidade de transmissão, máquina virtual, chaves criptograficas, global platform, etc.
    Porem tanto a chave bem como o manual só é fornecida através de NDA (Non-Disclosure Agreements) pela fabricante do chip.
    A pré-personalização é um processo obrigatório pela empresa que o comercializa.
    Infelizmente só ela poderá lhe ajudar nesse caso.

    Abraços.

    ResponderExcluir
  6. Ola trabalho em uma Gráfica onde personalizamos cartoes para algumas empresas com bandeiras master e visa, estamos perdendo contratos pois so trabalhamos com tarja magnetica e hoje o padrao EMV esta sendo adotado, gostaria de saber como comprar o material necessario para implementaçao dessa tecnologia e os custos obrigado.

    ResponderExcluir
    Respostas
    1. Consulte com as empresas que estão migrando para o padrão EMV, sobre como se certificar na Visa/Master Card para emissão de cartões EMV.

      Excluir
  7. Ola ricardo voce possui algum software para que eu possa gravar Os dados diretamente no chip com a gemalto acr38 ... ?!

    ResponderExcluir
  8. Se for um Applet como já havia dito utilize o GPShell, ser dados a ser gravados como Numeros ou Strings, isso vai depender de cartão para Cartão, caso seja um Java Card vc mesmo deverá desenvolver um programa para ser gravado no cartão, caso seja outro tipo de cartão vc deverá estudar o protocolo utilizado pelo cartão.

    ResponderExcluir
  9. ricardo vc tem algum email para que possa te enviar o projeto que quero gravar ?!

    ResponderExcluir
  10. Um correção Ricardo,

    Só consegui testar com sucesso quando inclui o 7F também no final do comando:
    send_apdu -sc 0 -APDU 00000000060A0B0C0D0E0F7F

    ResponderExcluir
  11. Alguém conhece algum site que vende o hardware necessário para iniciar os estudos em smart car precisa ser o pacote completo, mas sim os cartões que estou com dificuldade para encontrar. Se alguém puder indicar algum site agradeço.

    ResponderExcluir
  12. Boa noite , gostaria de saber onde consigo compra o cartão com chip acho q o nome é jcop21 virgem , alguém pode me informar estou localizado no centro de são Paulo.

    ResponderExcluir
  13. Olá Ricardo! Eu preciso de um profissional que faça essa instalação de um aplicativo java card no SIM card. Você tem interesse em conhecer o projeto ou tem alguma indicação de profissional que entende bem essa tecnologia para me indicar? Eu moro em Belo Horizonte.

    ResponderExcluir
  14. thiagomaniacosccs@gmail.com quem trampa na gravaçao chama

    ResponderExcluir

Observação: somente um membro deste blog pode postar um comentário.