tag:blogger.com,1999:blog-28474385944327916582024-03-13T20:59:36.456-07:00Planet Smart CardsSeja Bem Vindo ao Planet Smart Cards.<br>
Esse Blog tem como objetivo principal fornecer
informações e tutoriais voltado aos variados
tipos de Smart Cards, como Java Card, Memory Cards,
MiFare Classic/Plus, Crypto Memory, etc.Ricardo Massaohttp://www.blogger.com/profile/13929394839245906485noreply@blogger.comBlogger18125tag:blogger.com,1999:blog-2847438594432791658.post-35470969592293681892014-03-02T07:58:00.000-08:002014-03-02T14:01:34.511-08:00<div style="font-family: Arial,Helvetica,sans-serif; text-align: center;">
<div style="color: #990000; font-family: Georgia,"Times New Roman",serif;">
<br /></div>
<div style="color: #990000; font-family: Georgia,"Times New Roman",serif;">
<br /></div>
<div style="color: #990000; font-family: Georgia,"Times New Roman",serif;">
<span style="font-size: small;"><b>Indice dos Artigos</b></span></div>
<div style="font-family: Verdana,sans-serif;">
<span style="font-size: small;"><a href="http://planetsmartcards.blogspot.com/2010/11/ola-e-seja-bem-vindo-me-chamo-ricardo-e.html">Gênesis - O Inicio do Blog</a></span><br />
<br />
<span style="font-size: small;"> <b style="color: #990000;"><span style="font-family: Georgia,"Times New Roman",serif;">Java Card </span></b></span><br />
<span style="font-size: small;"><a href="http://planetsmartcards.blogspot.com/2010/12/tecnologia-java-card.html">A Tecnologia Java Card</a></span><br />
<span style="font-size: small;"><a href="http://planetsmartcards.blogspot.com/2010/12/arquitetura-java-card.html">A Arquitetura Java Card</a></span><br />
<span style="font-size: small;"><a href="http://planetsmartcards.blogspot.com/2010/12/isoiec-7816.html">A Especificação ISO/IEC 7816</a> </span><br />
<span style="font-size: small;"><a href="http://planetsmartcards.blogspot.com/2010/12/o-global-platform.html">A Especificação GlobalPlatform</a></span><br />
<span style="font-size: small;"><a href="http://planetsmartcards.blogspot.com/2010/12/hello-world-java-card-parte-1.html">Hello World Java Card! (Parte 1 - Configurando o Ambiente)</a></span><br />
<span style="font-size: small;"><a href="http://planetsmartcards.blogspot.com/2010/12/hello-world-java-card-parte-2.html">Hello World Java Card! (Parte 2 - Desenvolvendo e Testando Applets)</a></span><br />
<span style="font-size: small;"> <a href="http://planetsmartcards.blogspot.com/2011/01/hello-world-java-card-parte-3.html">Hello World Java Card! (Parte 3 - Compilando e Instalando) </a> </span><br />
<span style="font-size: small;"><a href="http://planetsmartcards.blogspot.com/2010/12/o-modelo-de-memoria-java-card.html">O Modelo de Memória Java Card</a> </span><br />
<span style="font-size: small;"><a href="http://planetsmartcards.blogspot.com/2010/12/utilizando-pins-personal-identification.html">Utilizando PIN's (Personal Identification Number) </a> </span><br />
<span style="font-size: small;"><a href="http://planetsmartcards.blogspot.com/2010/12/atomicidade-e-transacoes.html">Atomicidade e Transações</a> </span><br />
<span style="font-size: small;"><span style="font-size: small;"><a href="http://planetsmartcards.blogspot.com.br/2014/03/introducao-ao-java-card-3.html">Introdução ao Java Card 3</a></span> </span><br />
<br />
<b style="color: #990000;"><span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;">MiFare</span></span></b><br />
<div style="font-family: Verdana,sans-serif;">
<span style="color: #990000;"><span style="font-size: small;"><a href="http://planetsmartcards.blogspot.com/2010/12/tecnologia-mifare.html">A Tecnologia MiFare</a> </span></span></div>
<b style="color: #990000;"><span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;"> </span></span></b><b style="color: #990000;"><span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;"> </span></span></b><br />
<b style="color: #990000;"><span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;">Leitores / Gravadores de Smart Cards</span></span></b><br />
<span style="font-size: small;"><a href="http://planetsmartcards.blogspot.com/2010/12/acessando-smart-cards-usando-java.html">Acessando SmartCards Usando Java SE</a></span><br />
<span style="font-size: small;"><a href="http://planetsmartcards.blogspot.com/2010/12/acessando-smartcards-usando-jaccal.html">Acessando SmartCards Usando JACCAL</a> </span><br />
<br />
<div style="color: #990000;">
<b><span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;">How Stuff Works</span></span></b></div>
<div style="color: #990000;">
<span style="font-family: Verdana,sans-serif; font-size: small;"><a href="http://planetsmartcards.blogspot.com/2010/12/certificacao-digital.html">Certificação Digital</a></span><b><span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;"></span></span></b><br />
<span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;"><a href="http://www.planetsmartcards.blogspot.com.br/2010/12/emv.html" style="font-family: Verdana,sans-serif;" target="_blank">EMV - Cartões Bancários</a></span></span><b><span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;"><br />
</span></span></b></div>
<br />
<div style="color: #990000;">
<b><span style="font-size: small;"><span style="font-family: Georgia,"Times New Roman",serif;">Mais Sobre o Autor</span></span></b></div>
<span style="font-size: small;"><a href="https://sites.google.com/site/ricardotakaqui/CurriculumRicardo.pdf"></a></span><br />
<span style="font-size: small;"><a href="http://br.linkedin.com/pub/ricardo-massao/2b/101/814">Meu Linkedin</a> </span><br />
<br />
<span style="font-size: small;"><span style="font-family: Times,"Times New Roman",serif;"><i><b> "Deleita-te também no Senhor, e te consederá os desejos do seu coração." Salmo 37.4</b></i></span></span></div>
</div>
Ricardo Massaohttp://www.blogger.com/profile/13929394839245906485noreply@blogger.comtag:blogger.com,1999:blog-2847438594432791658.post-86866417386119623982014-03-01T07:56:00.000-08:002014-03-02T13:55:00.754-08:00Introdução ao Java Card 3<div style="text-align: justify;">
Senhoras e Senhores, apresento a vocês o Java Card 3 e ele vem em 2 sabores <b>Classic</b> e <b>Connected</b> !</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Já a algum tempo os mais entusiastas no assunto me perguntam sobre ele, e o que posso dizer é relaxem, mesmo hoje (2014) ele ainda se encontra muito a frente a seu tempo e bastante prematuro (poucas implementações em Hardware disponíveis) na sua versão Connected.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Não posso começar esse artigo sem antes citar alguns números, hoje (2014) Java Cards representam cerca de 5 Bilhões de Cartões (<a href="http://www.oracle.com/technetwork/java/embedded/overview/getstarted/index.html" target="_blank">fonte Oracle</a>), considerando que hoje temos cerca de 7 bilhões de pessoas no mundo isso quer dizer que 5 em cada 7 pessoas possui um Java Card, o que indica que você leitor é um forte candidato a ter um.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Estima-se que anualmente cerca de 1 Bilhão de Java Cards são emitidos, como eu já havia dito em artigos anteriores existe uma vasta gama de aplicações que utilizam Java Cards os mais comuns SIM Cards GSM, Cartões Bancários, Cartões para Certificação Digital, SAM (Security Access Module), identificação Pessoal, etc.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Com isso em mente fica fácil pensar porque foi definida 2 especificações de Java Card, não se pode mudar o mercado da noite para o dia e impor que todo um ecossistema se atualize para outra mais cara sem a real necessidade, sendo assim a versão Classic é destinada aos dias de hoje e a Connected para um futuro próximo onde tudo será conectado via IP inclusive sua carteira.</div>
<div style="text-align: justify;">
Tive a oportunidade de por as mãos em um Java Card 3.0.4 Classic, o que me motivou a apresentar a vocês melhor esse novo carinha.</div>
<div style="text-align: justify;">
<br /></div>
<h3 style="text-align: justify;">
CLASSIC EDITION</h3>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
O que há de novo na versão Clássica?</div>
<div style="text-align: justify;">
- Nada que seja realmente relevante.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Isso mesmo, e nem deveria ser diferente, pois essa versão é muito próxima da especificação Java Card 2.2.2, e tem como missão manter o ecossistema já existente.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Foram corrigidos alguns bugs da versão anterior, adicionado suporte a alguns criptografadores, adequação a especificação ISO7816-4/2005, na API temos suporte a Objetos String (super limitado), Extended (usado para acesso a Memória externa como a da reservada a MiFare).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
O Core da versão 3 é exatamente igual a versão 2, baseado em Microcontrolador de 8/16 bits e Virtual Machine de 16 Bits, herda todas as restrições da versão anterior como ausência de Threads, Garbage Collector, API muito Limitada.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
A Versão 3 é totalmente compatível com as anteriores, o que quer dizer que basta pegar seu arquivo .CAP compilado em outras versões de instalar sem a necessidade de recompilação. </div>
<div style="text-align: justify;">
<br /></div>
<h3 style="text-align: justify;">
CONNECTED EDITION</h3>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
O que há de novo na versão Conectada?</div>
<div style="text-align: justify;">
- Tudo!</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Essa edição é realmente o Java Card 3.0, nova especificação, nova Virtual Machine, nova API, novo Hardware, etc, etc e etc.<br />
<br />
<h4>
Arquitetura</h4>
</div>
<div style="text-align: justify;">
A edição Connected provê Cartões high-end (alta tecnologia) capazes de prover conectividade e integração em qualquer Rede IP, a VM Java Card 3 é capaz de atuar como um nó seguro de rede, isso quer dizer que ela é capaz de prover serviços seguros de rede e acessar recursos de rede.<br />
<br />
Isso tudo converge em um Smart Card capaz de manipular múltiplos serviços, comunicações concorrente sobre IP, contato (ISO7816) e sem contato (ISO14443).<br />
<br />
Sua Virtual Machine é baseada na <a href="http://en.wikipedia.org/wiki/Connected_Limited_Device_Configuration" target="_blank">Connected Limited Device Configuration (CLDC)</a> padrão amplamente usado em Celulares o que aproxima bastante a VM Java Card da VM JavaME, isso prove suporte a rica característica presente na linguagem Java.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://dl.dropboxusercontent.com/u/27480572/j3carch.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://dl.dropboxusercontent.com/u/27480572/j3carch.jpg" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Arquitetura Java Card 3 Connected Edition.</td></tr>
</tbody></table>
<br /></div>
<div style="text-align: justify;">
Acima podemos ver o diagrama de blocos da Arquitetura Java Card 3, da Direita para Esquerda, o Classic Applet é a camada compatível com as especificações anteriores, por exemplo 3.0 e 2.0 Classic, porém é necessário recompilar a aplicação sem nenhuma alteração no JCDK 3.0 Connected antes de usufruir desse recurso.<br />
<br />
Extended Applet prove acesso as novas características como conectividade IP, multitheads, garbage collector, todos os tipos primitivos da linguagem Java exceto o <i>float </i>e o <i>double</i> e muito mais como veremos mais a adiante.<br />
<br />
Servlet prove um servidor HTTP bem como um container Servlet, com isso podemos desenvolver aplicações ricas baseadas em páginas web, bem como a habilidade de se conectar a recursos web externos ao cartão.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://dl.dropboxusercontent.com/u/27480572/jc3network.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://dl.dropboxusercontent.com/u/27480572/jc3network.jpg" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Java Card 3 - I/O Interfaces</td></tr>
</tbody></table>
<br />
Para conseguir isso, o Java Card 3 poderá contar de inúmeros meios de conexões físicas ou sem contatos, como USB, MMC (MultiMediaCard similar aos SD Cards), o tradicional ISO7816, o sem contato ISO14443, etc.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://dl.dropboxusercontent.com/u/27480572/jc3hardware.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://dl.dropboxusercontent.com/u/27480572/jc3hardware.jpg" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Java Card 3 - Hardware Specs</td></tr>
</tbody></table>
<br />
Acima temos a evolução de Hardware da versão Connected a esquerda e a Classic a direita, essa tabela representa apenas o target (alvo), logo podemos esperar muito mais, como processador ARM, Megas de RAM, Gigas de Flash e muito mais.<br />
<br />
<h4>
A NOVA VIRTUAL MACHINE CONNECTED.</h4>
Como já havia falado, a Virtual Machine nova se assemelha bastante com a Micro Edition, o que quer dizer que cada vez mais o Java Card se aproxima de seu irmão Java Platform SE facilitando assim o desenvolvimento de aplicações Java Card.<br />
<br />
Ela também foi concebida para rodar em processadores de arquitetura 32 bits, e agora é capaz de carregar um Class file diretamente, lembrem-se que na versão Classic utiliza-se a técnica de split VM, o que quer dizer que a VM está dividida entre o Host (Compilador) e o Cartão.<br />
<br />
Esses novos Applets devem ser carregadas como um Extended Applet no Applet Container para usufruir das novidades contidas na versão Connected. <br />
<br />
<b>Novas Características da versão Connected:</b><br />
<ul>
<li><b>Multithreading</b> - Múltiplas aplicações podem executar de forma concorrente bem como iniciar processos em background.</li>
<li><b>On-card bytecode verification</b> - Os class files da aplicação são verificados se aproveitando do mapa de atributos de informações gerados pelo Java Development Kit (JDK).</li>
<li><b>Garbage Collection</b> - Recursos temporários são automaticamente coletados e seus recursos liberados.</li>
<li><b>Data types</b> - Objetos de dados tipo Char, Long e String.</li>
<li><b>Arrays Multidimensionais.</b></li>
<li><b>Wrapper de Classes Primitivas</b> - Boolean, Integer e mais.</li>
<li><b>Classes de Manipulação String</b> - StringTokenizer, StringBuffer, StringBuilder.</li>
<li><b>Classes I/O</b> - Reader, Writer, e Stream.</li>
<li><b>Classes Network da Generic Connection Framework</b> - Connector, Connection e mais.</li>
<li><b>Classes Collection</b> - Vector, Hashtable, Stack , Iterator e mais.</li>
<li><b>Classes de Data e Tempo</b> - Calendar, Date e TimeZone.</li>
<li><b>Classes de Internacionalização e Localização</b> - Locale, ResourceBundle e mais.</li>
<li><b>Generics</b></li>
<li><b>Metadata</b></li>
<li><b>Assertions</b></li>
<li><b>Varargs</b></li>
<li><b>Static import</b></li>
<li><b>Acesso a Arquivos (Opcional). </b></li>
</ul>
Como podem ter notado o modelo de programação se aproxima bastante da experiência de se programar no tradicional Java Development Kit (JDK). <br />
<br />
<h4>
A Cereja do Bolo, Aplicações Web.</h4>
</div>
<div style="text-align: justify;">
A versão Connected suporta um subset da Java Servlet API Specification 2.4 Web application model.</div>
<div style="text-align: justify;">
Ou seja aplicações Web são aplicativos que podem interagir com Clientes Web fora do cartão, via HTTP ou HTTPS.<br />
Aqui cada serviço conhecido como Web App, deve ser carregado em um local especial chamado de Servlet Container.<br />
<br /></div>
<div style="text-align: justify;">
</div>
<iframe allowfullscreen="" frameborder="0" height="270" src="//www.youtube.com/embed/KFBH3beYq8A" width="480"></iframe>
<br />
No video acima você pode conferir um pouco mais sobre o poder da tecnologia.<br />
<br />
Bom isso foi apenas uma pequena introdução ao Java Card 3 Connected Edition, existem mais novidades porém bastante técnicas que fogem do escopo desse artigo.<br />
<br />
<b>Um grande Abraço a todos e até a Próxima!</b> <br />
<br />Ricardo Massaohttp://www.blogger.com/profile/13929394839245906485noreply@blogger.com6tag:blogger.com,1999:blog-2847438594432791658.post-28910499798939311192010-12-19T20:27:00.000-08:002012-06-13T20:31:03.840-07:00EMV<div class="separator" style="clear: both; text-align: center;">
<a href="https://dl.dropbox.com/u/27480572/EMVCo_logo.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://dl.dropbox.com/u/27480572/EMVCo_logo.gif" /></a></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Nesse Artigo</span><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"> discutirei sobre um assunto que desperta muita curiosidade nas pessoas e eu só não postei um artigo sobre EMV antes pois esse assunto tende a atrair todo tipo de pessoa mal intencionada (leia-se Estelionatários), porém pensando bem nem todos são assim e tem o direito de saber o quanto "seguro" são os cartões com chip que carregam na carteira. O</span></span><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"> sistema bancário afirma que não existe formas de fraude em cartões com chip, tanto que até se negam a reembolsar e a culpa nesses tipos de fraude recai sobre os clientes, porém não existe
sistema seguro, ainda mais o inventado por homens e o EMV não é uma
exceção ele possui falhas e brechas algumas muito burras outras nem
tanto como vocês perceberão ao longo deste polemico artigo, </span></span><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">então espero que aproveitem!</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span></div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://dl.dropbox.com/u/27480572/chip-and-pin.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://dl.dropbox.com/u/27480572/chip-and-pin.jpg" /></a></div>
<div style="text-align: justify;">
<span style="font-size: small;"><b><span style="font-family: Arial,Helvetica,sans-serif;">O que é EMV?</span></b></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Também conhecido por Chip an PIN o EMV é um consórcio criado inicialmente por 3 empresas sendo elas <b>E</b>uropay, <b>M</b>aster Card e <b>V</b>isa (Europay foi comprada pelo grupo Master Card anos mais tarde), novas empresas foram se unindo a este consórcio mais tarde como American Express, esse consórcio tem como principal função estabelecer normas e padrões que cartões com chip também conhecidos como ICC (Integrated Circuit Card), devem seguir para se adequarem ao padrão EMV, desde especificações elétricas até a regra de negócios a ser seguido. A história por traz do Smart Card vocês já conhecem se não de uma olhada no meu primeiro artigo <a href="http://planetsmartcards.blogspot.com.br/2010/11/ola-e-seja-bem-vindo-me-chamo-ricardo-e.html" target="_blank">"Gênesis"</a> o qual faço referencia a uma breve história sobre Smart Cards.</span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">A motivação por trás de sua criação era a excessiva quantidade de fraudes exercidas sobre os cartões com Tarja Magnética na década de 90, a sua criação causou uma queda significativa em 98% das fraudes. Outra razão além do expressivo ganho de segurança foi a interoperabilidade entre diversas operadoras de cartões.</span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">A especificação EMV se utiliza em grande parte das especificações contidas na ISO7816 para cartões de contato e ISO14443 para cartões de proximidade, adicionando a elas a regra de negócios e definições de segurança.</span></span><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"> Esse artigo será baseado exclusivamente no EMV voltado para Cartões de Contato, por serem os mais abundantes no mercado brasileiro na época em que esse artigo estava sendo escrito (2012).</span></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Cartões Magnéticos (Magnetic Stripe Cards)</span></span></b></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Não poderíamos falar de EMV sem antes falarmos sobre seu predecessor o cartão magnético, embora não pareça EMV possui uma grande afinidade com os cartões magnéticos inclusive em uma vulnerabilidade como será vista mais para frente nesse artigo. </span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Basicamente um cartão magnético possui uma Cinta Magnética conhecida também por Banda Magnética, e funcionam exatamente da mesma forma que as antigas Fitas K7 de áudio, vídeo ou os antigos disquetes.</span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Tanto que a cabeça de leitura de um cartão magnético é idêntica as cabeças de leitura de um gravador antigo de fitas K7, diferenciando-se apenas por possuir três pontos de leitura ao invés de uma do leitor K7.</span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">A Banda Magnética de um cartão possui três trilhas para armazenamento de dados sendo que para uso Bancário apenas as 2 primeiras são usadas efetivamente a terceira trilha pode ser ignorada.</span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Na primeira trilha geralmente podemos encontrar o PAN (Primary Account Number) ou seja o número de sua conta bancária (para cartões bancários) ou o número do seu cartão de crédito, seu Nome composto de até 26 caracteres, Data de Expiração do Cartão e o CCV (Card Verification Value) composta de uma Chave usada para autenticar seu PIN (Senha), a senha não fica gravada no cartão.</span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Na segunda trilha podemos encontrar novamente o PAN a Data de Expiração e um registro de serviço para este cartão, esse registro é responsável por definir como o cartão será tratado pelo Terminal seja ele Bancário ou pelo POS (as famosas maquininhas).</span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Dependendo desse registro a Senha deverá ou não ser requisitada, o cartão possui ou não um chip, determinada transação deverá se executada ou não via chip, o cartão é ou não internacional, o cartão é bancário ou crédito ou ambos, etc.</span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">São cartões extremamente fáceis de serem lidos e replicados, a única "barreira" seria a senha, antigamente o Terminal possuía a autoridade de autentica-la de forma off-line já hoje em dia não mais a autenticação é executada on-line, por isso os estelionatários tem tanto interesse em pega-las de você.</span></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Afinidade EMV x Trilha Magnética</span></span></b></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">A afinidade mais notável e na minha modesta opinião, a mais Burra reside no Fato que as duas trilhas magnéticas do cartão ficam gravadas em um arquivo de registro dentro do Chip, <b>exatamente </b>da mesma forma e podem ser lidas do chip sem o uso de autenticação alguma!</span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Ai você meu leitor seleto e inteligente pode estar se perguntando "<i>Será que se eu copiar as informações deste arquivo e replica-los e uma Tarja Magnética ele vai funcionar?</i>" dizem que SIM eu porém nunca testei. =)</span></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Estrutura de Arquivos e Aplicativos EMV</span></span></b></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">O EMV é organizado através de uma estrutura bem definida de Arquivos e Aplicativos de uma forma muito similar a estrutura de arquivos de um Sistema Operacional como o Windows por exemplo, e essa estrutura foi diretamente herdada da ISO7816 e levemente adaptada.</span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Aplicativos comuns EMV podem ser a do famoso Crédito e do Débito em Conta, porém o cartão pode ainda conter outros Aplicativos como um de Fidelidade, Vale Refeição, etc.</span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Cada aplicativo pode ser composto de diversos arquivos de dados, como por exemplo a da trilha 1 e 2 magnética, chaves de segurança, certificados digitais, etc.</span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Aplicativos EMV também possuem a capacidade de executar operações como validação de senhas e cálculos criptográficos.</span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://dl.dropbox.com/u/27480572/EMVFileSistem.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://dl.dropbox.com/u/27480572/EMVFileSistem.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">EMV File System</td></tr>
</tbody></table>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">A Imagem acima demonstra uma estrutura de Arquivos EMV.</span></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Directory Definition File</b>, também conhecido por Payment System Environment (PSE) o DDF é responsável por armazenar todos os aplicativos EMV disponíveis no cartão e ele pode ser acessado usando-se o comando <b><span style="font-family: "Courier New",Courier,monospace;">select</span></b> da ISO7816 pelo AID (Aplication Identifier): '<span style="font-family: "Courier New",Courier,monospace;">31 50 41 59 2E 53 59 53 2E 44 44 46 30 31</span>' (1PAY.SYS.DDF01 em caracter), após o <b><span style="font-family: "Courier New",Courier,monospace;">select</span></b> o cartão irá retornar imediatamente o File Control Information (FCI). O FCI é retornado encapsulado no formato <a href="http://en.wikipedia.org/wiki/Basic_encoding_rules" target="_blank">BER TLV (link)</a>, se acostume com o formato BER pois ele é a forma padrão do EMV retornar dados a você.</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">O FCI informa inicialmente as preferências de linguagem do Cartão, como está organizado a estrutura de arquivos se por FID (Fixed File Identification) ou SFI (Short File Identification), o primeiro (FID) é muito incomum pois obriga o Terminal a conhecer a estrutura de arquivos do cartão, já o segundo (SFI) é maneira preferencial usada pois permite ao terminal escanear e montar dinamicamente em tempo real a estrutura de arquivos do cartão.</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Logo podemos adquirir a Lista de ADF´s (Aplicativos EMV) simplesmente usando o comando <b><span style="font-family: "Courier New",Courier,monospace;">read file</span></b> da ISO7816 passando como parâmetro o SFI '<span style="font-family: "Courier New",Courier,monospace;">01 0C</span>', '<span style="font-family: "Courier New",Courier,monospace;">02 0C</span>', ... etc.</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Cada leitura de um arquivo do DDF se existir irá retornar dados no formato BER contendo encapsulado o AID da Aplicação, o nome da Aplicação, dados proprietários, seria similar ao comando '<b><span style="font-family: "Courier New",Courier,monospace;">dir</span></b>' dos DOS. Os Terminais executam essa varredura até o cartão retornar o erro 'arquivo não encontrado'. Com isso podemos montar a Lista de Aplicativos contido no Cartão.</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">O DDF com AID '1PAY.SYS.DDF01' é muito comum em cartões Visa porém nos cartões Master Card o AID pode ser diferente ou o DDF pode ser simplesmente suprimido, isso porque não é obrigatória a presença do DDF no cartão pois é possível se acessar os Aplicativos sem a necessidade dele como veremos abaixo.</span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Application Definition File</b>, também conhecido por Payment Application (PA) o ADF é o aplicativo EMV, aplicativo esse que tem a função de realizar a transação de crédito quando você realiza a compra dos seus produtos.</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Usualmente existem 1 ou 2 aplicativos destes no cartão, a de Crédito e a de Débito, porém pode haver mais aplicativos geralmente do emissor do cartão.</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Existe duas maneiras de se acessar um Aplicativo EMV, listando-o através do DDF ou acessando diretamente através do comando <b><span style="font-family: "Courier New",Courier,monospace;">select</span></b> pelo seu AID, cada Bandeira possui sua lista de Aplicativos com seus AID´s únicos, por exemplo vamos listar os das bandeiras mais comuns a Visa e a Master Card:</span></span><br />
<ul style="font-family: Arial,Helvetica,sans-serif;">
<li><span style="font-size: small;">Visa Crédito / Débito - AID : <span style="font-family: "Courier New",Courier,monospace;">A0000000031010</span></span></li>
<li><span style="font-size: small;">Visa Electron - AID : <span style="font-family: "Courier New",Courier,monospace;">A0000000032010</span></span></li>
<li><span style="font-size: small;">Master Card Crédito / Débito - AID : <span style="font-family: "Courier New",Courier,monospace;">A0000000041010</span></span></li>
<li><span style="font-size: small;">Master Card Maestro - AID : <span style="font-family: "Courier New",Courier,monospace;">A0000000043060</span></span></li>
</ul>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Então quando o Caixa lhe pergunta se é "<i>Débito ou Crédito?</i>" essa é a Aplicação EMV responsável pela autenticação de crédito das suas compras. </span></span></div>
<div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">
<span style="font-size: small;">Imediatamente após selecionar a aplicação EVM através do comando <b style="font-family: "Courier New",Courier,monospace;">select</b>, o cartão irá retornar o File Control Information (FCI) com os seguintes dados encapsulados no formato BER, o nome do aplicativo, as preferências de linguagem, opções de processamento (PDOL), etc.</span><br />
<span style="font-size: small;">Após a seleção do Aplicativo EMV, podemos listar todos os arquivos disponíveis da aplicação, executar uma requisição de PIN (senha), executar uma transação completa de crédito, etc.</span><br />
<br />
<span style="font-size: small;"><b>Application Elementary File</b>, o AEF são basicamente arquivos contendo dados EMV, existem duas formas de se acessar esses arquivos, através do Fixed File Identification (FID) forma incomum pois exige que o Terminal conheça a lista de arquivos, ou pelo Short File Identification (SFI) que podem ser listado dinamicamente em tempo real. </span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Arquivos EMV armazenam uma cópia da Trilha Magnética 1 e 2, regras de como o Terminal deve processar determinadas transações, chaves criptográficas públicas do emissor do cartão, assinatura digital dos dados do cartão, número da conta bancária / número do cartão de crédito (PAN), contadores de transação, etc.</span></span><b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"> </span></span></b><br />
<br />
<b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Comandos EMV</span></span></b><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Conforme já comentado, EMV faz uso de diversas especificações ISO7816, e para trocas de dados entre Cartão / Terminal o formato padrão seguido é o APDU formato ISO7816-4 abaixo segue os comandos de pós produção de um cartão:</span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Application Block (0x1E)</b>, invalida o Aplicativo EMV selecionado, requer um canal seguro autenticado por nível criptográfico.</span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Application Unblock (0x18)</b>, restaura um aplicativo EMV anteriormente bloqueado pelo comando Application Block, requer um canal seguro autenticado por nível criptográfico.</span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Card Block (0x16)</b>, permanentemente bloqueia todos os aplicativos EMV do cartão permanentemente, requer um canal seguro autenticado por nível criptográfico.</span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>External Authenticate (0x82),</b> autentica um criptograma enviado pelo terminal, esse comando estabelece o canal seguro.</span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Generate Application Cryptogram (0xAE),</b> esse é o comando base de uma autorização de transação de crédito, ele é dividido em 3 subcomandos, e é o principal responsável por autorizar ou não uma Transação de Crédito.</span></span><br />
<ul>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Application Authentication Cryptogram (AAC)</b>, usado para Negar uma Transação de Crédito, após o envio do ARQC para a emissora do cartão, ela calcula e valida o ARQC gerado pelo cartão e envia como resposta o <b>Authorisation Response Cryptogram</b> (ARPC) ou não, caso o ARPC seja obrigatório e não seja enviado pelo emissor ou o ARPC seja inválido, o cartão irá negar a transação gerando o AAC.</span></span></li>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Authorisation Request Cryptogram (ARQC)</b>, esse é criptograma mais importante de toda transação de crédito, ele é gerado pelo cartão e enviado para a Visa, Master Card, etc. Com o intuito de se validar a transação de crédito, percebam que alguns comprovantes de pagamento trás impresso nele o ARQC. O ARQC é gerado a partir de um processo criptográfico sobre dados e contadores internos do cartão.</span></span></li>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Transaction Certificate (TC)</b>, após o servidor enviar o ARPC (se ele for obrigatório) e ele for válido, o cartão irá gerar o ultimo criptograma de validação conhecido por Transaction Certificate, que aprova toda transação e envia ao emissor.</span></span></li>
</ul>
</div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Get Challenge (0x84)</b>, usado para requerer um criptograma de "Desafio" usado para iniciar uma autenticação de nível criptográfico entre Terminal e Cartão.<b> </b></span></span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Get Data (0xCA)</b>, usado para requisitar dados do cartão, esses dados podem ser os seguintes:</span></span></span></div>
<div style="text-align: justify;">
<ul>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Application Transaction Counter (ATC)</b>, contador de transações de créditos, esse contador é incrementado sempre que uma transação de crédito é iniciada, independente se terminada com sucesso ou não, o valor do ATC é um dos dados utilizados na geração do ARQC.</span></span></span></li>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Last Online ATC Register</b>, contador de ultima transação de créditos de forma on-line.</span></span></span></li>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>PIN Try Counter</b>, contador de tentativas de erros remanescente de senhas incorretas (quantas tentativas erradas ainda restam).</span></span></span></li>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Log Format</b>, formato em que os Logs do cartão está armazenada (incomum na maioria dos cartões).</span></span></span></li>
</ul>
</div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Get Processing Options (0xA8)</b>, o GPO é a forma de como o cartão detecta que uma transação de créditos começou, quando esse comando é invocado o contador ATC é incrementado e o comando retorna dois dados de extrema importância para o Terminal sendo eles:</span></span></span></div>
<div style="text-align: justify;">
<ul>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Application Interchange Profile (AIP)</b>, o AIP dita todas as regras de como e o que o termina deverá executar durante a Transação de Créditos, cartões sem o AIP são extremamente raros.</span></span></span></li>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Application File Locator (AFL)</b>, o AFL indica ao Terminal arquivos públicos AEF necessários para a conclusão de uma Transação de Créditos.</span></span></span></li>
</ul>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"></span></span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Internal Authenticate (0x88)</b>, assina dados enviados para o cartão tendo como referencia uma chave privada armazenada internamente pelo cartão.<b> </b></span></span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>PIN Change / Unblock (0x24)</b>, altera ou desbloqueia um PIN, a especificação EMV recomenda que esse processo seja realizada através de um canal seguro de nível criptográfico, e que o novo PIN seja transmitido criptografado, porém é aberto a Instituição Bancária o procedimento escolhido.<b> </b></span></span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Read Record (0xB2)</b>, comando usado par ler os dados contidos nos diversos arquivos EMV.<b> </b></span></span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Verify (0x20)</b>, executa uma verificação de PIN.</span></span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">A especificação EMV ainda define além desse comandos, mais um punhado de comandos específicos para a pré produção do Cartão, ou seja comandos utilizados durante a Pré Personalização, onde os diversos arquivos, chaves de criptografia, assinatura de dados são gravados no cartão, o processo de Pré Personalização está fora do escopo deste artigo e será então suprimido.</span></span></span><b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"> </span></span></span></b><br />
<br />
<b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Card Authentication Methods (CAM)</span></span></span></b></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">O CAM (Método de Autenticação do Cartão), é um grupo de diretivas utilizadas para garantir que o Cartão é realmente real, tal diretiva é retornada pelo cartão encapsulado no AIP, no momento em que uma transação EMV é iniciada através do comando Get Processing Options (GPO), o CAM define 2 diretivas sendo elas:</span></span></span></div>
<div style="text-align: justify;">
<ul>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Offline Static CAM (SDA), indica que somente o Terminal irá realizar operações de criptografia, nesse modo o Terminal irá inicialmente Ler um Certificado Digital contido em um dos arquivos EMV, e a partir de um conjunto de dados sensíveis do cartão irá realizar uma autenticação baseada em Certificação Digital, para garantir que nenhum dado do cartão foi adulterada, geralmente utilizando o algorítimo RSA. (Esse é o modo mais comum e o mais utilizado, porém falho pois não detecta uma clonagem de cartão, pois desde que copiemos todos os dados sem alterar nenhum deles a checagem da assinatura digital vai ser válida mesmo em um cartão falso).</span></span></span></li>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Offline Dinamic CAM (DDA), indica que ambos, tanto Terminal quanto Cartão realizará operações de criptografia, nesse modo a autenticação digital deve ser realizada mutualmente pelo Terminal e Cartão, ou seja o Cartão deve assinar dados dinâmicos utilizando uma chave privada interna e o Terminal validar essa assinatura através da chave pública do cartão. (Esse método em teoria é o mais seguro de todos, pois a chave privada está gravada internamente no cartão e nunca é exposta, porém é o método mais raro de todos. Porque? Porque cartões com algorítimo RSA são muito caros e raros, a grande maioria dos cartões EMV só possuem o algorítimo 3DES quando muito AES)</span></span></span></li>
</ul>
</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
<b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Cardholder Verification Methods (CVM)</span></span></span></b></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">O CVM (Método de Verificação do Titular do Cartão), é um grupo de diretivas utilizadas para garantir que o portador do cartão é realmente o verdadeiro e assim como o CAM o CVM vem encapsulado no AIP, CVM define 8 diretivas sendo elas:</span></span></span><br />
<ul>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>No CVM requires</b>, o cartão sugere ao Terminal que nenhuma verificação de PIN é necessária.</span></span></span></li>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Online Enciphered PIN Verification</b>, o cartão sugere que o Terminal faça a requisição do PIN, criptografe com um algorítimo simétrico e envie para o Emissor do Cartão para verificação.</span></span></span></li>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Offline Enciphered PIN Verification</b>, o cartão sugere que o Terminal faça a requisição do PIN, criptografe com um algorítimo simétrico e envie para o Cartão para verificação.</span></span></span></li>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Plaintext Offline PIN Verification</b>, o cartão sugere que o Terminal faça a requisição do PIN e o envie sem criptografar para validação no cartão. (Método mais comum e sem dúvidas o mais arriscado)</span></span></span></li>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Signature Verification</b>, o cartão sugere que a assinatura do cliente seja requerida e verificada com uma assinatura digitalizada de dentro do cartão.</span></span></span></li>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Plaintext Offline PIN Verification and Signature Verification</b>, junção de dos dois modos já citados acima.</span></span></span></li>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Offline Enciphered PIN Verification and Signature Verification</b>, junção de dois modos já citados acima.</span></span></span></li>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Fail CVM processing</b>, força o Terminal a finalizar a verificação do Titular do Cartão.</span></span></span></li>
</ul>
<b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Card x Terminal Flow (Fluxo entre Cartão e Terminal)</span></span></span></b></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://dl.dropbox.com/u/27480572/CardFlow.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://dl.dropbox.com/u/27480572/CardFlow.png" /></a></div>
<div style="text-align: justify;">
<br />
<b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"> EMV Flow (Fluxo EMV)</span></span></span></b></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://dl.dropbox.com/u/27480572/EMVFlow.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://dl.dropbox.com/u/27480572/EMVFlow.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">A ilustração acima demonstra um tipico fluxo de transação bancária através de um Cartão EMV onde :</span></span></span></div>
<div style="text-align: justify;">
<ul>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Point of Sale (POS)</b>, o Ponto de Venda se localiza no estabelecimento comercial e normalmente se comunica com a Aquierer através de um link ethernet, GPRS ou telefônico.</span></span></span></li>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Aquierer</b>, também conhecido como Captadora, a Aquierer fica imediatamente entre o comerciante e o Issuer, exemplos de Aquierer brasileiras se encontram a Redecard, Cielo, Cirrus, Hipercard, etc.</span></span></span></li>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Issuer</b>, também conhecida por Emissor, é responsável por autenticar o PIN caso ele seja enviado pelo POS, autenticar o montante de créditos, etc. A Issuer pode ser ainda dividido em diversos servidores, nesse grupo encontramos no topo a Visa, Master Card, Amex, etc. Logo abaixo as Instituições Financeiras (Bancos).</span></span></span></li>
</ul>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Dentro deste modelo, existem 3 formas de se autenticar uma transação de crédito.</span></span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">A mais básica de todos é a autorização offline, nesse modelo apenas o POS e o Cartão participam da autorização e nela o POS fica com a responsabilidade de checar a autenticidade do cartão, do portador e da aprovação dos créditos. (Hoje em dia um método muito incomum)</span></span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">A segunda é a autorização offline, onde o POS realiza as mesmas operações da primeira porém em um momento oportuno o POS transmitirá todas as transações de crédito para a Emissora. (Método usado em locais com ausência ou link com o servidor limitados)</span></span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">A terceira é o modo online, onde todos os elementos trabalham em conjunto como o exemplificado acima. (O modo mais utilizado atualmente)</span></span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span></span></div>
<div style="text-align: center;">
<b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Vulnerabilidades e Formas de Ataques contra o EMV</span></span></span></b></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">As Instituições Financeiras afirmam que o Chip and PIN, é inquebrável tanto que em alguns países a culpa sobre essas fraudes sempre recaem sobre os clientes.</span></span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">O EMV é de longe 100% seguro, ele é responsável por uma grande queda nos casos de fraudes no mercado financeiro e um substancial aumento das explosões a caixas eletrônicos.</span></span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Isso porque a fraude sobre esse sistema é extremamente difícil. Porém Professores e Alunos do Laboratório de Computação da Universidade de Cambridge provam o contrário.</span></span></span><br />
<br />
<b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Explorando as Brechas</span></span></span></b><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Se achou que eu iria vir com aquele papinho furado de que "<i>as informações aqui contidas são para uso educacional e bla bla bla</i>" se enganou, sim o EMV possui Brechas e se você quer se aventurar nisso, você já é bem grandinho(a) para discernir certo do errado, dito isso vamos ao que interessa. </span></span></span><b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"> </span></span></span></b><br />
<br />
<b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">A Tarja Magnética</span></span></span></b></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Reconhecidamente vulnerável, ela ainda continua lá mesmo em cartões com chip, passiveis de serem lidas e clonadas, sabe qual a única diferença da Tarja de um cartão com Chip para a de um cartão sem Chip? Apenas 1 Bit !</span></span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">E se isso não fosse o suficiente, os mesmos dados contidas nas Trilhas Magnéticas estão contidas dentro de um dos arquivos EMV dentro do Chip, exatamente como uma Imagem, caso tenham curiosidade em um dos Livros da especificação EMV que se referem a esses dados é "<i>Track 1 Discretionary Data</i>" e "<i>Track 2 Equivalent Data</i>".</span></span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">O Motivo disso? O cartão continua sendo compatível mesmo em sistemas onde não existe leitura de Chip.</span></span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span></span></div>
<div style="text-align: justify;">
<b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">A Clonagem de Cartões</span></span></span></b></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Chip an PIN são clonáveis? Seguramente que sim pois os níveis mais altos de segurança dos cartões ainda estão desativados, ai você me pergunta porque?</span></span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Porque alguns recursos não estão presentes nos cartões para diminuição de Custos, por exemplo o Recurso de DDA (Dinamic Card Authentication Method), exige que o cartão implemente RSA, o que o torna mais custoso monetariamente, e em tempo de processamento.</span></span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">O Recurso de SDA (Static Card Authentication Metethod) utiliza dados estáticos do cartão assinado digitalmente pela Emissora no ato da pré personalização, então caso você clone o cartão integralmente sem realizar alterações nos dados o Terminal nunca perceberá que se trata de um clone.</span></span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">O PIN raramente é verificado Online, então caso você sempre responda PIN OK para o Terminal ele dificilmente irá perceber que você não conhece o PIN Verdadeiro.</span></span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">O Terminal raramente criptografa o PIN ao eviar para verificação no cartão, o seja é possível capturar o PIN somente espionando o APDU <b>Verify</b>.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">O mais assustador sobre a Verificação de PIN é que ele não possui conexão alguma com a transação de créditos e também não bloqueia o uso dos outros comandos EMV, por exemplo se o Terminal realizar toda a transação de créditos sem verificar o PIN ela se completará sem problemas. </span></span></span></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">O EMV é um padrão aberto, sendo assim pode ser livremente desenvolvido para Smart Cards como por exemplo Java Card, Multos, .Net Cards, Basic Cards, etc. Inclusive é possível de se criar um Cartão perfeito desde que você tenha acesso as Chaves de Segurança Estáticas 3DES utilizadas na Pré Personalização dos Cartões, o Terminal sempre possui essa lista gravada internamente, e antigamente essas chaves eram Digitadas via Teclado durante a inicialização do Terminal!</span></span></span></div>
<div style="text-align: justify;">
<br />
<b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">YES Card Attack (Ataque por PIN OK)</span></span></span></b><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Um dos ataques mais básicos de todos, trata-se de um cartão clone, onde todos os arquivos EMV estáticos são copiados para dentro do cartão clone, cuja a única função é responder PIN OK para qualquer PIN enviado pelo Terminal.</span></span></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://dl.dropbox.com/u/27480572/YesCard.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://dl.dropbox.com/u/27480572/YesCard.png" /></a></div>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Após a cópia o cartão irá se comportar como um autentico EMV para o terminal, porém esse cartão não tem a capacidade de gerar os Criptogramas <b>ARQC</b> e <b>TC</b>.</span></span></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://dl.dropbox.com/u/27480572/YesPINAuth.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://dl.dropbox.com/u/27480572/YesPINAuth.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Em transações de créditos Offline esse método funciona, porém é facilmente detectável em autenticações Online ou através do DDA (Dinamic Authentication Method).</span></span></span><br />
<br />
<b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Relay Attack ou Man in the Middle (O Homem no Meio)</span></span></span></b><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Similar ao ataque desferido em redes TCP/IP, ou comunicação entre cartões MiFare Classic, esse ataque pode ser usado com o EMV.</span></span></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://dl.dropbox.com/u/27480572/RelayAttack.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://dl.dropbox.com/u/27480572/RelayAttack.png" /></a></div>
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">O objetivo desse ataque será fazer Alice pensar estar pagando por um prato de comida de $20, quando na verdade estará pagando por um diamante de $2000.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Alice é a vítima, Bob o criminoso que está no caixa do Restaurante com um POS falso conectado a um notebook, Carol a criminosa com um notebook em uma mochila nas costas ligado a um cartão falso com fios e Dave o vendedor da jóia.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Basicamente esse ataque conectará o cartão de Alice ao POS de Dave sem que ela saiba que está comprando uma Joia ao invés de um almoço.</span></span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Ok, ok, obviamente você rolou de rir com a fantasiosa história, porém eis aqui o Kit que faz isso:</span></span></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://dl.dropbox.com/u/27480572/RelayKit.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://dl.dropbox.com/u/27480572/RelayKit.png" /></a></div>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Ainda não acredita ser possível??? E se eu te disser que esse Golpe foi ao Ar pela BBC de Londres?</span></span></span><br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/X7pjUIxKoEc?feature=player_embedded' frameborder='0'></iframe></div>
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Formas de se defender desse tipo de ataque? Nenhum, é o unico método que põe por terra qualquer esquema de segurança hoje conhecido, também é obviamente a forma de ataque mais improvável de ser realizada.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span></span><br />
<b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Terminal Tampering Attack (Ataque por Adulteração do Terminal)</span></span></span></b><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Esse é o tipo de ataque mais invasivo e o mais fácil (e certamente realizado), pode ser realizado de duas maneiras, via software ou via hardware.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Para explicar esse ataque é importante que você saiba diferenciar os equipamentos utilizados para realizar transações de créditos. Existem 2 tipos de equipamentos, o POS (Point of Sale) e o PED (Pin Entry Devices), ambos são similares visualmente porém internamente são bastante diferentes.</span></span></span><br />
<br />
<b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">O POS</span></span></span></b><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">POS são equipamentos completos e independentes, eles possuem um MicroProcessador capaz de suportar um Sistema Operacional sobre ele, com isso aplicativos podem ser desenvolvidos para ele.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Fora isso ainda possuem todos os dispositivos necessários para realizar transações de crédito de forma independente, como impressora térmica, display colorido, slot para SIM Card GSM / GPRS, slot para SAM Card, Leitor de cartão com chip e tarja magnética, modem telefonico, interface de rede ethernet, etc. Com isso dispensam estar conectado a um Computador. </span></span></span><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://dl.dropbox.com/u/27480572/vx680.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="317" src="https://dl.dropbox.com/u/27480572/vx680.jpg" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Um Tipico POS</td></tr>
</tbody></table>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span></span><br />
<b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">O PED</span></span></span></b><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">PED também conhecido por TEF, são equipamentos mais modestos e baratos, são dotados apenas de um Microcontrolador com apenas um teclado, um display verde, leitor de cartões com chip e tarja e um cabo serial RS232 ou USB (que é na verdade uma Serial RS232).</span></span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Exigem que seja conectado a um Computador e que um Programa para computador realize a maioria do trabalho necessário para realizar a transação de crédito.</span></span></span><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://dl.dropbox.com/u/27480572/PED.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="375" src="https://dl.dropbox.com/u/27480572/PED.jpg" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Típico PED</td></tr>
</tbody></table>
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Simples Barato e Perigoso, se um dia desconfiar que seu seguríssimo cartão EMV tenha sido clonado, existe uma chance altíssima de ter sido por um desses.</span></span></span><b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"> </span></span></span></b><br />
<br />
<b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Software Attack (Ataques via Software)</span></span></span></b><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">São voltados exclusivamentes a POS, esse ataque é para um POS o que um Trojan é para o Windows, antigamente os POS eram tão inseguros que bastava desenvolver uma aplicação nociva e instalar no POS, hoje em dia pode ser mais complexo pois exige que as aplicações sejam assinadas digitalmente via Smart Card ou Online, então basta você ter um Cartão de Desenvolvimento ou um Login Mágico, conhecer um pouquinho sobre cracking e um bom amigo motoqueiro para distribuir seu POS "especial" em postos de gasolina.</span></span></span><b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"> </span></span></span></b><br />
<br />
<b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Hardware Attack (Ataques via Hardware)</span></span></span></b><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Também conhecido por Tampering, esse é sem dúvidas o ataque preferido do jeitinho brasileiro, bem mais elegante que sair por ai explodindo caixas eletrônicos é cláro.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Nesse tipo de ataque o PED é aberto e uma placa é inserida internamente, essa placa tem 2 finalidades, a primeira espionar senhas digitadas no teclado, a segunda espionar o conector de dados do chip (incomum) ou o canal TX da serial RS-232 (nice).</span></span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Hora mas porque a Serial RS-232? Simples porque nela trafega bonito e limpinho todos os arquivos EMV <span style="font-size: x-small;">inclusive o arquivo com as 2 trilhas magnéticas e demais dados</span>.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></span></span><br />
<b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Considerações Finais.</span></span></span></b><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Como podem ter visto EMV é extremamente seguro, pois põe por terra muita das tentativas de criminosos de pouca inteligencia, porém uma pequena parcela ainda consegue dar seus pulinhos, isso porque de Longe o EMV é 100% seguro. E os especialistas de plantão que vier dizendo que o POS/PED possui Tampering Protection e bla bla, um conselho seja bonzinho para Papai Noel lhe trazer presente no fim do ano.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Se possui falhas e são conhecidas porque não arruma-las? </span></span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Simples, a quantidade em dinheiro perdida em fraudes ainda é muito baixa para as Emissoras se preocuparem com isso, qualquer contra medida adicionada ou habilitada irá consumir tempo e recurso com isso a quantidade de transações de crédito por segundo diminuirá, diminuindo o lucro.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Isso tudo em comparação como era antigamente com os cartões de tarja que podia ser clonado por qualquer manézinho sem a menor instrução.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Tudo isso não teria graça se eu não lhe mostrasse como ler seu cartão EMV não é? Pois então aguarde que no próximo Artigo demonstrarei como acessar cartões EMV usando o Jaccal aguardem!</span></span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Nada do que mostrei aqui é novidade e está livremente disponível na internet, abaixo segue o link de um dos documentos que tomei como referencia desse artigo:</span></span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><a href="https://dl.dropbox.com/u/27480572/EMV_Security.pdf" target="_blank">Chip & PIN notes on a dysfunctional security system (link)</a> </span></span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">E um último Video:</span></span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><a href="http://video.google.com/videoplay?docid=7109740591622124830" target="_blank">Chip and PIN PED security vulnerabilities (link)</a></span></span></span><b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"> </span></span></span></b><br />
<br />
<b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Até a próxima, e um abraço a todos!</span></span></span></b><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: x-small;">PS. perguntas referentes a EMV serão prontamente IGNORADAS.</span></span></span></span></div>
<div style="text-align: justify;">
</div>Ricardo Massaohttp://www.blogger.com/profile/13929394839245906485noreply@blogger.com5tag:blogger.com,1999:blog-2847438594432791658.post-87793516788238135822010-12-19T18:31:00.000-08:002011-02-12T06:45:50.935-08:00Utilizando PIN's (Personal Identification Number)<div style="text-align: justify;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Hoje explicarei como utilizar o PIN Number (Personal Identification Number), trata-se da velha e conhecida Senha que inserimos ao pagar uma conta no caixa do mercado, sacar dinheiro nos caixas eletrônicos, habilitar o SIM Card em um celular, etc.</span></span></div><div style="text-align: justify;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Java Cards possuem seus próprios mecanismos para armazenar e validar PIN's, você poderá utilizar a classe <b>javacard.framework.OwnerPIN</b> para gerenciar todo processo, desde armazenamento, checagem, bloqueio e desbloqueio, ou se preferir poderá desenvolver uma classe só sua implementando a Interface <b>javacard.framework.PIN</b>.</span></span></div><div style="text-align: justify;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Vamos ao Código: </span></span></div><pre class="java" name="code">package pin_test;
import javacard.framework.*;
public class PinTest extends Applet {
/** Número de Tentativas antes do Bloqueio */
static private final byte TRY_LIMIT = 0x03;
/** Tamanho Máximo do PIN (16 Caracteres) */
static private final byte MAX_PIN_SIZE = 0x10;
/** Instrução para Definição do PIN */
static private final byte INS_UPDATE_PIN = (byte)0x02;
/** Instrução para Validação do PIN */
static private final byte INS_CHECK_PIN = (byte)0x04;
/** Instrução que Verifica o PIN foi autenticado */
static private final byte INS_IS_VALIDATE = (byte)0x06;
/** Instrução que Reseta uma Autenticação */
static private final byte INS_RESET_PIN = (byte)0x08;
/** Instrução para Desbloqueio do PIN */
static private final byte INS_UNLOCK_PIN = (byte)0x0A;
/** Instrução que retorna quantidades de Tentativas */
static private final byte INS_GET_REMAIN = (byte)0x0C;
/** PIN Number */
private OwnerPIN pin;
/**
* Construtor
*/
private PinTest() {
//Objeto Persistente
this.pin = new OwnerPIN( TRY_LIMIT, MAX_PIN_SIZE );
}
/**
* Installer
* @param bArray
* @param bOffset
* @param bLength
* @throws ISOException
*/
public static void install
(byte bArray[], short bOffset, byte bLength)
throws ISOException{
new PinTest().register();
}
/**
* Processa APDU
*/
public void process(APDU apdu){
//Acquire Reference IN/OUT
byte buffer[] = apdu.getBuffer();
//On Select
if (selectingApplet())
ISOException.throwIt(ISO7816.SW_NO_ERROR);
switch ( buffer[ISO7816.OFFSET_INS] ){
//Define um PIN Number
case INS_UPDATE_PIN :
{
//Adquire tamanho do novo PIN
byte pinLen = (byte)apdu.setIncomingAndReceive();
if ( pinLen < (byte)1 || pinLen > MAX_PIN_SIZE )
ISOException.throwIt(ISO7816.SW_DATA_INVALID);
//Redefine PIN
pin.update(buffer, ISO7816.OFFSET_CDATA, pinLen);
ISOException.throwIt(ISO7816.SW_NO_ERROR);
}
//Autentica um PIN
case INS_CHECK_PIN :
{
//Adquire tamanho do PIN
byte pinLen = (byte)apdu.setIncomingAndReceive();
if ( pinLen < (byte)1 )
ISOException.throwIt(ISO7816.SW_DATA_INVALID);
//Checa PIN
if ( !pin.check(buffer, ISO7816.OFFSET_CDATA, pinLen) )
ISOException.throwIt(ISO7816.SW_CONDITIONS_NOT_SATISFIED);
ISOException.throwIt(ISO7816.SW_NO_ERROR);
}
//Verifica se Autenticado
case INS_IS_VALIDATE :
{
//Verifica Validade do PIN
if ( pin.isValidated() )
ISOException.throwIt(ISO7816.SW_NO_ERROR);
else
ISOException.throwIt(ISO7816.SW_CONDITIONS_NOT_SATISFIED);
}
//Reseta Autenticação
case INS_RESET_PIN :
{
pin.reset();
ISOException.throwIt(ISO7816.SW_NO_ERROR);
}
//Desbloqueia um PIN
case INS_UNLOCK_PIN :
{
pin.resetAndUnblock();
ISOException.throwIt(ISO7816.SW_NO_ERROR);
}
//Adquire Quantidades de Erros Remanescentes
case INS_GET_REMAIN :
{
buffer[0] = pin.getTriesRemaining();
apdu.setOutgoing();
apdu.setOutgoingLength((short)1);
apdu.sendBytes((short)0, (short)1);
ISOException.throwIt(ISO7816.SW_NO_ERROR);
}
}//switch end
//Instrução Desconhecida
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
}
}
</pre><div style="text-align: justify;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Na Linha 62, iniciamos ou definimos um PIN number, o método <b>update</b> também reseta a quantidade de tentativas do PIN, você pode testar isso com o seguinte APDU:</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;">0x00 0x02 0x00 0x00 0x05 0x01 0x02 0x03 0x04 0x05</span> (<span style="font-family: "Courier New",Courier,monospace;">0x7F</span> - Caso esteja no <b>JCWDE</b>).</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Esse APDU cria um PIN de 5 números "12345".</span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Na Linha 76 validamos um PIN, esse procedimento também é conhecido como "<i>Match on Card</i>", pois uma vez definido o PIN ele nunca é exposto e a validação é realizada internamente pelo cartão, utilize o seguinte APDU para testar:</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;">0x00 0x04 0x00 0x00 0x05 0x01 0x02 0x03 0x04 0x05</span> (<span style="font-family: "Courier New",Courier,monospace;">0x7F</span> - Caso esteja no <b>JCWDE</b>).</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Esse APDU requisita a validação de um PIN de 5 números "12345", caso o PIN seja validado com sucesso <span style="font-family: "Courier New",Courier,monospace;">0x9000</span> será retornado pelo cartão, do contrário <span style="font-family: "Courier New",Courier,monospace;">0x6985</span> será retornado e o número de tentativas será decrementada em 1.</span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Na Linha 91 verificamos seu o PIN já foi validado no sistema, utilize o seguinte APDU para testar:</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;">0x00 0x06 0x00 0x00 0x00</span> (<span style="font-family: "Courier New",Courier,monospace;">0x7F</span> - Caso esteja no <b>JCWDE</b>).</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Caso o PIN já esteja validado o cartão retornará <span style="font-family: "Courier New",Courier,monospace;">0x9000</span>, caso contrário <span style="font-family: "Courier New",Courier,monospace;">0x6985</span>.</span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Na Linha 100 resetamos a validação do PIN, utilize o seguinte APDU para testar:</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;">0x00 0x08 0x00 0x00 0x00</span> (<span style="font-family: "Courier New",Courier,monospace;">0x7F</span> - Caso esteja no <b>JCWDE</b>).</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Esse comando sempre retornará <span style="font-family: "Courier New",Courier,monospace;">0x9000</span>. </span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Na Linha 106 desbloqueamos um PIN, isso reseta o contador de tentativas, geralmente utilizamos esse comando após o usuário efetuar uma validação de <b>PUK</b> (<i>Personal Unlock Key</i>), como nos SIM Cards GSM ou Cartões com Certificados Digitais, utilize o seguinte APDU para testar:</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;">0x00 0x0A 0x00 0x00 0x00</span> (<span style="font-family: "Courier New",Courier,monospace;">0x7F</span> - Caso esteja no <b>JCWDE</b>).</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Esse comando sempre retornará <span style="font-family: "Courier New",Courier,monospace;">0x9000</span>.</span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Na Linha 112 adquirimos a quantidade de tentativas restantes antes do bloqueio do PIN, utilize o seguinte APDU para testar:</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;">0x00 0x0C 0x00 0x00 0x00</span> (<span style="font-family: "Courier New",Courier,monospace;">0x7F</span> - Caso esteja no <b>JCWDE</b>).</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Esse comando retornará a quantidade de tentativas restantes seguido do <span style="font-family: "Courier New",Courier,monospace;">0x9000</span>, por exemplo <span style="font-family: "Courier New",Courier,monospace;">0x03 0x90 0x00</span> (3 tentativas restantes).</span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Caso esteja testando no <b>JCWDE</b>, os recursos de persistencia não funcionarão, no caso você não conseguirá testar o recurso de contador de tentativas antes de bloqueio, armanzenamento do número PIN caso feche a aplicação <b>APDU Tool</b> ou resete a simulação. Mais uma vez um cartão Físico ajuda bastante nos teste.</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"> </span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Isso foi um artigo curto de como utilizar com eficiencia o recurso de PIN's em suas aplicações Java Card caso esteja se perguntando onde o <b>PUK</b> entra na história:</span></span><br />
<pre class="java" name="code">/** Offset do PUK */
static private final byte PUK_OFFSET = 0x00;
/** Offset do PIN */
static private final byte PIN_OFFSET = 0x01;
/** PIN Number */
private OwnerPIN pins[];
//No Construtor
this.pins = new OwnerPIN[2];
this.pins[PUK_OFFSET] =
new OwnerPIN( TRY_LIMIT, MAX_PIN_SIZE );
this.pins[PIN_OFFSET] =
new OwnerPIN( TRY_LIMIT, MAX_PIN_SIZE );
</pre><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Um Grande Abraço, e até a Próxima!</b></span></span><br />
<br />
</div><div style="text-align: justify;"></div>Ricardo Massaohttp://www.blogger.com/profile/13929394839245906485noreply@blogger.com2tag:blogger.com,1999:blog-2847438594432791658.post-71985332575137251742010-12-19T18:16:00.000-08:002011-03-12T13:44:44.970-08:00Acessando Smart Cards Usando Java<div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"></span><span style="font-family: Arial,Helvetica,sans-serif;">Nesse artigo demonstrarei o quanto é simples acessar Smart Cards utilizando o Java SE.</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">O material necessário:</span></div><ul><li><span style="font-family: Arial,Helvetica,sans-serif;">Cartão Java Card de Desenvolvimento.</span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;">Leitor/Gravador padrão PC/SC ISO7816.</span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;">IDE Netbeans / Eclipse.</span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;">Ter completado com sucesso os 3 Artigos Hello World Java Card. </span></li>
</ul><span style="font-family: Arial,Helvetica,sans-serif;">Como já havia dito tenho uma preferência pelo IDE Netbeans, mas você poderá utilizar tranquilamente o Eclipse se desejar.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Sem muitos rodeios vamos ao que interessa o Código:</span><br />
<pre class="java" name="code">import java.util.List;
import javax.smartcardio.*;
public class SmartCardTest {
/**
* @param args
*/
public static void main(String[] args) {
//"Fabrica" de Terminais PC/SC
TerminalFactory factory;
//Lista de Leitores PC/SC
List terminals;
//Terminal PC/SC
CardTerminal terminal;
//Smart Card
Card card;
//Smart Card ATR
ATR cardATR;
//Canal de Comunicação com o Smart Card
CardChannel cardChannel;
//APDU de Comando
CommandAPDU commandAPDU;
//APDU de Resposta
ResponseAPDU responseAPDU;
//Buffer de Auxilio
byte[] buffer;
try {
//Adquire Fabrica de Leitores
factory = TerminalFactory.getDefault();
//Adquire Lista de Leitores PC/SC no Sistema
terminals = factory.terminals().list();
System.out.println("Lista : " + terminals);
//Adquire Primeiro Terminal da Lista
terminal = (CardTerminal)terminals.get(0);
System.out.println("Terminal Selecionado: "
+ terminal.getName());
//Estabelece Conexão com o Cartão na Leitora
card = terminal.connect("*");
System.out.println("card: " + card);
//Adquire ATR do Cartão
cardATR = card.getATR();
buffer = cardATR.getBytes();
System.out.println("ATR : "
+ formatBuffer(buffer, buffer.length));
//Adquire Canal de Comunicação
cardChannel = card.getBasicChannel();
//AID do HelloWorld
buffer = new byte[]{0x01, 0x02, 0x03, 0x04,
0x05, 0x06, 0x07, 0x08,
0x09, 0x00, 0x00};
//Monta APDU de Envio
commandAPDU = new CommandAPDU(
0x00, //CLA
0xA4, //INS - SELECT
0x04, //P1
0x00, //P2
buffer); //AID
//Imprime Comando
System.out.println("\n[SELECT COMMAND]");
System.out.println("=> " + formatBuffer(
commandAPDU.getBytes(),
commandAPDU.getBytes().length));
//Trasnmite e Recebe
responseAPDU = cardChannel.transmit(commandAPDU);
//Verifica Resposta
if (responseAPDU.getSW() != 0x9000) {
throw new Exception("Falha ao Selecionar : "
+ String.format("0x%04X",
responseAPDU.getSW()));
}
//Imprime Resposta
System.out.println("<= " + formatBuffer(
responseAPDU.getBytes(),
responseAPDU.getBytes().length));
//Bytes de Testes
buffer =
new byte[]{0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F};
//Monta APDU de Envio
commandAPDU = new CommandAPDU(
0x00, //CLA
0x00, //INS
0x00, //P1
0x00, //P2
buffer); //Teste
//Imprime Comando
System.out.println("\n[TESTE BYTES]");
System.out.println("=> " + formatBuffer(
commandAPDU.getBytes(),
commandAPDU.getBytes().length));
//Trasnmite e Recebe
responseAPDU = cardChannel.transmit(commandAPDU);
//Verifica Resposta
if (responseAPDU.getSW() != 0x9000) {
throw new Exception("Falha ao Selecionar : "
+ String.format("0x%04X",
responseAPDU.getSW()));
}
//Imprime Resposta
System.out.println("<= " + formatBuffer(
responseAPDU.getBytes(),
responseAPDU.getBytes().length));
} catch (Exception e) {
e.printStackTrace(System.out);
}
}
/**
* Converte Buffer bytes para String
* @param buffer
* @param length
* @return String
*/
public static String formatBuffer(byte[] buffer,int length)
{
StringBuilder strBuff = new StringBuilder("");
for (int i = 0; i < length; i++) {
strBuff.append(String.format("%02X", buffer[i]));
}
return strBuff.toString();
}
}</pre><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">O Resultado ao executar deve ser similar a isso:</span></div><div style="text-align: justify;"><pre class="java" name="code">Lista : [PC/SC terminal ACS ACR38U 0]
Terminal Selecionado: ACS ACR38U 0
card: PC/SC card in ACS ACR38U 0, protocol T=1, state OK
ATR : 3BF81300008131FE454A434F5076323431B7
[SELECT COMMAND]
=> 00A404000B0102030405060708090000
<= 9000
[TESTE BYTES]
=> 00000000060A0B0C0D0E0F
<= 00000000060A0B0C0D0E0F9000</pre><b><span style="font-family: Arial,Helvetica,sans-serif;">Vamos a analise do código: </span></b><br />
<span style="font-family: Arial,Helvetica,sans-serif;">A partir do Java 6, a Sun disponibilizou uma API intitulada "<b>Java Smart Card I/O</b>" que tem como finalidade prover acesso a Smart Cards.</span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Na linha 11 criamos uma variável <b><span style="font-family: "Courier New",Courier,monospace;">factory</span></b> que instância um objeto <b><span style="font-family: "Courier New",Courier,monospace;">TerminalFactory</span></b>, esse objeto implementa uma pilha de leitores que pode variar conforme a implementação, no nosso caso usaremos o padrão <b style="color: blue;"><span style="font-family: "Courier New",Courier,monospace;">getDefault()</span></b> que implementa leitores PC/SC, lembrem-se existem diversos leitores com diversos tipos de padrões.</span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Na linha 13 criamos uma lista <b><span style="font-family: "Courier New",Courier,monospace;">terminals</span></b> que armazena um ou mais terminais (leitor PC/SC) plugados no sistema, que é retornado pelo <b style="font-family: "Courier New",Courier,monospace;">factory</b>, caso não exista nenhum leitor plugado <b><span style="font-family: "Courier New",Courier,monospace;">factory</span></b> retornará uma exceção.</span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Na linha 15 criamos uma variável <b><span style="font-family: "Courier New",Courier,monospace;">terminal</span></b> que instância um objeto <b><span style="font-family: "Courier New",Courier,monospace;">CardTerminal</span></b>, esse objeto representa um terminal (leitor PC/SC).</span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Na linha 17 criamos uma variável <b><span style="font-family: "Courier New",Courier,monospace;">card</span></b> que instância um objeto <b><span style="font-family: "Courier New",Courier,monospace;">Card</span></b>, esse objeto representa o cartão que se encontra inserido no Leitor representado por <b><span style="font-family: "Courier New",Courier,monospace;">terminal</span></b>.</span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Na linha 19 criamos uma variável <b><span style="font-family: "Courier New",Courier,monospace;">cardATR</span></b> que instância um objeto <b><span style="font-family: "Courier New",Courier,monospace;">ATR</span></b>, esse objeto representa o ATR (Answer to Reset) retornado pelo cartão representado por <b><span style="font-family: "Courier New",Courier,monospace;">card</span></b>.<span style="font-family: Arial,Helvetica,sans-serif;"> </span></span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Na linha 21 criamos uma variável <b><span style="font-family: "Courier New",Courier,monospace;">cardChannel</span></b> que instância um objeto <b><span style="font-family: "Courier New",Courier,monospace;">CardChannel</span></b>, esse objeto provê o canal de comunicação que nossa aplicação utilizará para trocar <b>APDUs </b>com o cartão, esse canal é retornado pelo cartão representado por <b style="font-family: "Courier New",Courier,monospace;">card</b>.<span style="font-family: Arial,Helvetica,sans-serif;"> </span></span></span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Na linha 23 criamos uma variável <b style="font-family: "Courier New",Courier,monospace;">commandAPDU</b> que instância um objeto <b style="font-family: "Courier New",Courier,monospace;">CommandAPDU</b>, esse objeto representa um <b>APDU</b> de envio do host para o cartão através do canal de comunicação representado por <b style="font-family: "Courier New",Courier,monospace;">cardChannel</b>.</span></span></span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Na linha 25 criamos uma variável <b style="font-family: "Courier New",Courier,monospace;">responseAPDU</b> que instância um objeto <b style="font-family: "Courier New",Courier,monospace;">ResponseAPDU</b>, esse objeto representa um <b>APDU</b> de resposta do cartão para o host e é retornado através do canal de comunicação representado por <b style="font-family: "Courier New",Courier,monospace;">cardChannel</b>.</span></span></span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Na linha 31 iniciamos <b style="font-family: "Courier New",Courier,monospace;">factory</b> com uma "Fábrica de Terminais" padrão que no caso é o PC/SC.</span></span></span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Na linha 34 preenchemos a lista <b style="font-family: "Courier New",Courier,monospace;">terminals</b> com terminais "fabricado" por <b style="font-family: "Courier New",Courier,monospace;">factory</b>, caso não exista nenhum leitor PC/SC plugado no sistema ou ocorra um erro <b style="font-family: "Courier New",Courier,monospace;">factory</b> lançará uma exceção, do contrario a lista possuirá ao menos um leitor.</span></span></span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Na linha 38 iniciamos <b style="font-family: "Courier New",Courier,monospace;">terminal</b> instanciando o primeiro leitor contido na lista <b style="font-family: "Courier New",Courier,monospace;">terminals</b>.</span></span></span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Na linha 43 estabelecemos conexão com o cartão presente na leitora através do comando <b><span style="font-family: "Courier New",Courier,monospace;">terminal.connect("*")</span></b> o parâmetro <b>*</b> informa para auto detectar o protocolo do cartão esse parâmetro também pode ser explicitamente informado como "<b>T=0</b>", "<b>T=1</b>" ou "<b>T=CL</b>", em caso de sucesso um objeto <b><span style="font-family: "Courier New",Courier,monospace;">Card</span></b> é retornado e <b style="font-family: "Courier New",Courier,monospace;">card</b> representará o cartão conectado na leitora, caso contrário <b><span style="font-family: "Courier New",Courier,monospace;">terminal</span></b> lançará uma exceção.</span></span></span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Na linha 47 requisitamos o<b> ATR</b> (Answer To Reset)</span> que se trata de um objeto <b><span style="font-family: "Courier New",Courier,monospace;">ATR</span></b> retornado pelo método <b><span style="color: blue; font-family: "Courier New",Courier,monospace;">getATR</span></b> da instância <b><span style="font-family: "Courier New",Courier,monospace;">card</span></b>.</span></span></span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Na linha 53 abrimos um canal de comunicação entre Host e Cartão, através da instância <b><span style="font-family: "Courier New",Courier,monospace;">cardChannel</span></b> retornado pelo método <b style="color: blue;"><span style="font-family: "Courier New",Courier,monospace;">getBasicChannel</span></b> de <b><span style="font-family: "Courier New",Courier,monospace;">card</span></b>.</span></span></span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Na linha 61 criamos um <b>APDU</b> a ser enviado para o cartão através do objeto <b><span style="font-family: "Courier New",Courier,monospace;">CommandAPDU</span></b>, esse <b>APDU</b> trata-se do comando de <i>select</i> padrão <b>ISO7816</b> do nosso applet hello world instalado no cartão.</span></span></span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Na linha 75 transmitimos o <b>APDU</b> para o cartão através do método <b style="color: blue;"><span style="font-family: "Courier New",Courier,monospace;">transmit</span></b> de <b><span style="font-family: "Courier New",Courier,monospace;">cardChannel</span></b>, esse método sempre retorna um objeto <b><span style="font-family: "Courier New",Courier,monospace;">ResponseAPDU</span></b>, que sempre possui a resposta (Status World) da operação do comando enviado e ocasionalmente dados retornados pelo cartão, em caso de erros durante a transmissão o método lançará uma exceção.</span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><br />
Na linha 94 transmitimos o <b>APDU</b> de teste para o Applet do cartão o qual responde uma cópia exata do <b>APDU</b> de envio seguido do Status World 0x9000(OK).</span></span></span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Bem como podem ver é extremamente simples acessar Smart Cards utilizando a tecnologia Java SE.</span></span></span><br />
<span style="font-family: Arial;">Coloco a disposição para download o projeto escrito no NetBeans, que pode ser tranquilamente compilado em outras IDE's como Eclipse e até no Prompt de Comando (DOS) pois o exemplo é Pure Java não dependendo de bibliotecas externas:</span><br />
<br />
<a href="https://sites.google.com/site/ricardotakaqui/JSmartCardTest.rar"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Smart Card Test (Link)</b></span></a><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Caso queira se aprofundar mais na API Java Smart Card IO segue o link para estudos:</span><br />
<br />
<a href="http://download.oracle.com/javase/6/docs/jre/api/security/smartcardio/spec/"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Java Smart Card IO API (Link)</b></span></a><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Em artigos futuros, postarei um artigo idêntico porém escrito em C/C++, nesse caso não é tão simples como no caso do Java porém ainda assim é muito similar.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"> </span><br />
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;"><b>Um grande abraço a todos e até a próxima!</b></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><b> </b></span></span><br />
<b><span style="font-family: Arial,Helvetica,sans-serif;"></span></b></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"></span></div>Ricardo Massaohttp://www.blogger.com/profile/13929394839245906485noreply@blogger.com10tag:blogger.com,1999:blog-2847438594432791658.post-51231431785638607512010-12-19T15:47:00.000-08:002011-03-16T13:06:08.063-07:00A Tecnologia MiFare<div style="text-align: justify;"><div class="separator" style="clear: both; text-align: center;"><a href="https://lh5.googleusercontent.com/-EnASIi7KUzY/TX0dIYIeCYI/AAAAAAAAAC8/6JJgI-Dsafw/s1600/mifare-pic.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="115" src="https://lh5.googleusercontent.com/-EnASIi7KUzY/TX0dIYIeCYI/AAAAAAAAAC8/6JJgI-Dsafw/s200/mifare-pic.jpg" width="200" /></a></div><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Nesse artigo, contarei a historia de uma das mais bem sucedidas famílias de Smart Cards já criadas, trata-se do MiFare.</span></span></span></div><div style="text-align: justify;"><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">O maior diferencial desse tipo de Smart Card é que ele se comunica de maneira sem contato (contactless), graças a uma tecnologia conhecida por <b>RFID </b>( Radio Frequency IDentification). </span></span></span></div><div style="text-align: justify;"><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">O grande atrativo nessa tecnologia foi que ela dispensava contatos mecânicos o que causa um grande aumento na vida útil tanto do cartão como o da leitora, não obriga o Smart Card a ter uma fonte de alimentação como baterias e fora isso eram e são muito baratos de serem produzidos.</span></span></span></div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><b><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">A Tecnologia RFID</span></span></span></b><br />
<i><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Definição de um <b>Transponder</b> : Repetidor de Radiofrequência.</span></span></span></i><b><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"> </span></span></span></b></div><div style="text-align: justify;"><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Como a maioria das tecnologias que tanto nos beneficia atualmente, a do RFID também é oriunda da época da Gerra, mais especificamente da Segunda Grande Guerra.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Em 1945 o russo <b>Léon Theremin</b>, inventou uma ferramenta de espionagem para a União Soviética, tal ferramenta transmitia incidentes com informações de áudio via ondas de rádio.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Do outro lado um ressonador modulavam a frequência de rádio refletido e vibravam um diafragma ligeiramente alterado reproduzindo o áudio.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">A grande sacada é que o lado que reproduzia o áudio não era alimentado elétricamente por fontes externas, o ressonador utilizava-se das próprias ondas de rádio como forma de alimentação para reprodução do áudio.</span></span></span> </div><div style="text-align: justify;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Uma tecnologia similar foi desenvolvida no Reino Unido chamada de </span><b style="font-family: Arial,Helvetica,sans-serif;">IFF Transponder</b></span><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"> (Identification Friend or Foe - Identificador de Amigo ou Inimigo) e foi utilizada durante a Segunda Guerra para identificar aeronaves amigas ou inimigas e é inclusive utilizada até hoje, com a finalidade de identificar não somente aeronaves como veículos, navios, infantarias, etc.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Somente em 1973 o inventor Mario Cardullo criou o primeiro Transponder passivo dotada com uma memória, que se tratava de um circuito integrado de apenas 16 bits de memória que era retroalimentado utilizando apenas a captação das ondas de rádio por uma antena e retransmitia por rádiofrequencia pela mesma antena os 16 bits da memória.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">A invenção foi patenteada como <b>RFID</b> e também é conhecida pelo nome de <b>TAG RFID</b> (Etiqueta IDentificadora por Rádio Frequência), atualmente é largamente utilizada pela industria e por você também, as Tags RFID hoje identificam veículos como o caso do <a href="http://www.viafacil.com.br/sp/">Sem Parar(link)</a>, em super mercados e lojas de departamentos para se evitar furtos de produtos, para se controlar um estoque por exemplo por via dessas tags é possível de se contabilizar um estoque inteiro em tempo real, identificar e armazenar dados inerentes a animais em um pasto como gado e ovelhas, identificar animais domésticos, identificar em tempo real toda a compra realizada por um cliente somente realizando a leitura de todas as Tags coladas nos produtos dentro do carrinho de compras, com a miniaturização da tecnologia já é possível até inserir Tags RFID em papel tão fino como uma folha de Sulfite ou cédula de dinheiro.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Enfim como pode ser visto é uma maneira eficiente e barata de se identificar qualquer coisa que se queira e se possa imaginar (inclusive humanos).</span></span></span><br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Abaixo algumas imagens de Tags RFID:</span></span></span><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://lh3.googleusercontent.com/-_Fb5DRF-CAU/TX0mf7nS8VI/AAAAAAAAADA/d7AMkdosljk/s1600/rfid-technology.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="240" src="https://lh3.googleusercontent.com/-_Fb5DRF-CAU/TX0mf7nS8VI/AAAAAAAAADA/d7AMkdosljk/s320/rfid-technology.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Uma Típica Etiqueta Adesiva com o RFID</td><td class="tr-caption" style="text-align: center;"><br />
</td></tr>
</tbody></table><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://lh4.googleusercontent.com/-ZSrNp6GzL7s/TX0nFUChmII/AAAAAAAAADE/5Zo-sE210FQ/s1600/9108_RFID.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="200" src="https://lh4.googleusercontent.com/-ZSrNp6GzL7s/TX0nFUChmII/AAAAAAAAADE/5Zo-sE210FQ/s200/9108_RFID.jpg" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Uma Ampola RFID que pode ser cirurgicamente implantada no corpo de "Animais"</td></tr>
</tbody></table><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://lh3.googleusercontent.com/-5Wkx2UG4sPk/TX0ozaRMrOI/AAAAAAAAADI/GpEv2a-v7bc/s1600/RFID_Key_Tag_RFID_card_key_tag.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://lh3.googleusercontent.com/-5Wkx2UG4sPk/TX0ozaRMrOI/AAAAAAAAADI/GpEv2a-v7bc/s320/RFID_Key_Tag_RFID_card_key_tag.jpg" width="275" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Chaveiros RFID para portões Automáticos</td></tr>
</tbody></table><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://lh3.googleusercontent.com/-7eiPaVdhfSk/TX0pgX-MQYI/AAAAAAAAADM/GYWebMUpAa8/s1600/animal-rfid-tag.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="225" src="https://lh3.googleusercontent.com/-7eiPaVdhfSk/TX0pgX-MQYI/AAAAAAAAADM/GYWebMUpAa8/s320/animal-rfid-tag.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Tags RFID utilizada na Agropecuária</td></tr>
</tbody></table><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://lh4.googleusercontent.com/-tOYmzE25xgo/TX0qoZvBf8I/AAAAAAAAADQ/nLwQFqObgDE/s1600/FasTrak_transponder.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="212" src="https://lh4.googleusercontent.com/-tOYmzE25xgo/TX0qoZvBf8I/AAAAAAAAADQ/nLwQFqObgDE/s320/FasTrak_transponder.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Tag RFID utilizada para identificar Veículos, utilizado por pedágios e estacionamentos</td></tr>
</tbody></table><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>O MiFare </b></span></span></span></div><div style="text-align: justify;"><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Em 1994, utilizando-se da tecnologia RFID surge o MiFare Classic de 1Kb de memória. </span></span></span><br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">A empresa responsável pela sua concepção foi a Philips, atualmente a marca MiFare como sua tecnologia pertencem a <a href="http://www.nxp.com/">NXP Semiconductors(link)</a> uma empresa fundada pela própria Philips em meados de 2006.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">MiFare é uma comprovada, "confiável"</span> e robusta tecnologia de cartões sem contato, desde de seu lançamento em 1995 foram produzidos mais de 3,5 Bilhões de cartões e foram instaladas cerca de 40 Milhões de Terminais Leitores/Gravadores ao redor do mundo.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Aqui um fato curioso ocorreu, o ID (Número Único) que todo MiFare possui é composto por 4 bytes, o que nos dá no máximo 4.294.967.295 (pouco mais de 4 Bilhões) de ID's únicos disponíveis, logo em meados de 2009 ~ 2010, as fabricantes de MiFare estavam ficando sem ID's disponíveis para fabricar seu produtos, a solução então foi aumentar esse ID de 4 bytes para 7 bytes o que elevou para 72 Quatrilhões de ID's disponíveis, um número razoável se comparado os 15 anos que se levou para exaurir os 4 Bilhões de IDs disponíveis.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Esquema de funcionamento:</span></span></span><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://lh4.googleusercontent.com/-bAk-3FINLhU/TX4xSezsACI/AAAAAAAAADU/1NSLhc3pYZk/s1600/mifare1KB_diagram.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://lh4.googleusercontent.com/-bAk-3FINLhU/TX4xSezsACI/AAAAAAAAADU/1NSLhc3pYZk/s1600/mifare1KB_diagram.jpg" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Modelo de Comunicação</td><td class="tr-caption" style="text-align: center;"><br />
</td></tr>
</tbody></table><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Como podem ver a comunicação é muito simples, inicialmente o leitor envia ondas de rádio a fim de se energizar o cartão próximo, que através do fenómeno elétromagnético chamado de indutância, carrega capacitores responsáveis pela alimentação do cartão durante o período de troca de informações, pois conforme já dito anteriormente o cartão MiFare é passivo e não depende de meios externos de alimentação como baterias no caso.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">A estrutura interna do cartão é similar a figura abaixo:</span></span></span><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://lh5.googleusercontent.com/-dhslXq69bQs/TX5cZpGwQJI/AAAAAAAAADY/skWOPcMMsaU/s1600/mifare.160101603.gif" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://lh5.googleusercontent.com/-dhslXq69bQs/TX5cZpGwQJI/AAAAAAAAADY/skWOPcMMsaU/s1600/mifare.160101603.gif" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">MiFare em Camadas</td></tr>
</tbody></table><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">O cartão nada mais é que duas folhas geralmente de PVC e internamente um microchip e uma antena em formato de bobina de cobre. Não entrarei no mérito de como a comunicação funciona pois isso já estaria fora do foco desse artigo.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Abaixo a figura do diagrama de Blocos de um MiFare:</span></span></span><br />
<div class="separator" style="clear: both; text-align: center;"></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://lh6.googleusercontent.com/-3LOUmEc-bcY/TX5qjPI7dOI/AAAAAAAAADg/RyYZl_TC6mc/s1600/MFClassicBlock.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="191" src="https://lh6.googleusercontent.com/-3LOUmEc-bcY/TX5qjPI7dOI/AAAAAAAAADg/RyYZl_TC6mc/s400/MFClassicBlock.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">MiFare Diagrama de Blocos</td></tr>
</tbody></table><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"> A antena na figura trata-se da bobina de cobre externa ao chip.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>RF-Interface</b> fica todo o bloco inerente ao gerenciador de alimentação, gerenciador de modulação de rádio frequência de envio e recebimento de dados e Clock Regenerator.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Anticollision</b> é o bloco que garante que o leitor/gravador apenas se comunique com um cartão por vez, pois nesse caso de cartões sem contato é possível de se ter mais de um cartão no campo eletromagnético do leitor.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Authentication</b> é o bloco responsável pela autenticação utilizando-se uma de duas chaves possíveis em um Setor de memória especifico.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Control & ALU</b> (Arithmetic Logic Unit) é o bloco responsável pelas operações simples aritméticas que um MiFare é capaz de realizar utilizando valores gravados na memória, como incremento, decremento e redundância.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Crypto</b> é o bloco responsável pela criptografia do canal de comunicação entre o Cartão e o Leitor, o algoritimo é conhecido por <b>Crypto-1</b> e é proprietário da NXP, curiosamente é o maior calcanhar de Aquiles do MiFare pois esse algorítmo já foi quebrado.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>EEPROM-Interface</b> é responsável pela escrita e leitura de <b>EEPROM</b>. </span></span></span><br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>EEPROM</b> é bloco de memória propriamente dito, essa memória (no caso do MiFare 1Kb) é organizada em 16 setores contendo 4 blocos e cada bloco possui 16 bytes de memória.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Um Setor pode ser representado da seguinte maneira:</span></span></span><b><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"> </span></span></span></b><br />
<br />
<b><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Sector ( 0 ~ 15 )</span></span></span></b><br />
<b><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">{ </span></span></span></b><br />
<ul><li><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Block 0</b> - 16 bytes de memória - Livre para Uso</span></span></span></li>
<li><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Block 1</b> - 16 bytes de memória - Livre para Uso</span></span></span></li>
<li><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Block 2</b> - 16 bytes de memória - Livre para Uso</span></span></span></li>
<li><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Block 3</b> - 16 bytes de memória - Sector Trailer</span></span></span></li>
</ul><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>}</b></span></span><span style="font-family: Arial,Helvetica,sans-serif;"> </span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">O Bloco 3 de cada Setor é especial e reservado, nesse bloco ficam gravados duas chaves de 48 bits conhecidas por <b>KEY A</b> e <b>KEY B</b>, onde geralmente a Key A possui mais privilégios que a Key B, nesse bloco ficam ainda gravados uma <b>Access Condition</b>(Condição de Acesso) composta por 4 bytes, que define a condição de acesso para cada bloco do setor, como apenas leitura, apenas decremento, escrita e leitura apenas pela Chave A, etc.</span></span></div><div style="text-align: justify;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Uma única ressalva fica por conta do Bloco 0 do Setor 0, esse bloco em especial é reservado não podendo ser reescrito, nesse bloco encontra-se o ID único do MiFare bem como informações industriais inerente a cada fabricante. </span></span><br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Como podem ter notado, o MiFare é fundameltamente um cartão de memória, onde essa memória se encontra dividia entre blocos dentro de setores, porém como podemos contabilizar são 16 Setores X 4 Blocos de 16 bytes = 1024 bytes, descontando o Bloco 0 do Setor 0 e os 16 Blocos Sector Trailer ficamos com 752 bytes disponíveis para uso.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Por fim o MiFare utiliza-se de vários padrões definidos pela <b>ISO/IEC 14443A</b>, como por exemplo o protocolo de comunicação definida pela <b>ISO 14443A-4</b>.</span></span></span><b><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"> </span></span></span></b><br />
<br />
<b><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Os Modelos de MiFare</span></span></span></b><br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Abaixo segue uma pequena Linha do Tempo dos diversos MiFare existentes hoje no mercado:</span></span></span><br />
<ul><li><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">1994 - <b>MiFare Classic</b>, de 1Kb de Memória.</span></span></span></li>
<li><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">1997 - <b>MiFare Pro</b>, primeiro com co-processador 3DES.</span></span></span></li>
<li><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">1999 - <b>MiFare Prox</b> / <b>SmartMX</b>, com co-processador PKI (Public Key Infraestruture), era oferecido também em dual interface (contato / sem contato) e alguns poderiam inclusive incluir o <i>Java Card Open Platform</i>.</span></span></span></li>
<li><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">2001 - <b>MiFare Ultralight</b>, como próprio nome diz um MiFare de 192 bytes de Memória.</span></span></span></li>
<li><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">2002 - <b>MiFare Classic</b>, de 4Kb de Memória. </span></span></span></li>
<li><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">2002 - <b>MiFare DESFire</b>, com microprocessador e avançado esquema de segurança baseado em 3DES, suportando inclusive APDU's ISO7816-4, porém seu preço é proibitivo se comparado a versão Classic.</span></span></span></li>
<li><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">2006 - <b>MiFare DESFire EV1</b>, com suporte ao AES de 128bits, porém ainda caro.</span></span></span></li>
<li><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">2008 - <b>MiFare Plus</b>, concebido para substituir seus antecessores DESFire e Classic a um preço atrativo, é um chip dotado de um forte e complexo esquema de segurança baseada em AES 128 bits.</span></span></span></li>
<li><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">2008 - <b>MiFare Ultralight C</b>, graças a um grupo russo que conseguiu quebrar a versão anterior, essa versão C traz um complexo esquema de segurança utilizando autenticação 3DES.</span></span></span></li>
</ul><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Utilizações bem sucedidas:</span></span></span></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://lh3.googleusercontent.com/-fk4bFN9LKY8/TYEOm8D-5LI/AAAAAAAAAD0/T1wGmSuUYHg/s1600/bilhete-unico.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://lh3.googleusercontent.com/-fk4bFN9LKY8/TYEOm8D-5LI/AAAAAAAAAD0/T1wGmSuUYHg/s1600/bilhete-unico.jpg" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">MiFare Utilizado no Sistema de Transporte Público de São Paulo</td></tr>
</tbody></table><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://lh6.googleusercontent.com/-aDJCSYARXOE/TYEO_Y3nBqI/AAAAAAAAAD4/f-WobhQU05g/s1600/23_MHG_rio_cartao.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="204" src="https://lh6.googleusercontent.com/-aDJCSYARXOE/TYEO_Y3nBqI/AAAAAAAAAD4/f-WobhQU05g/s320/23_MHG_rio_cartao.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">MiFare utilizado no Sistem de Transporte do Rio de Janeiro</td></tr>
</tbody></table><div style="text-align: justify;"><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"> E em outras milhares de aplicações, como carteira de estudante, bilhete em estádios de futebol, cartões fidelidade, comandas para restaurantes e casas noturnas, etc.</span></span></span></div><div style="text-align: justify;"><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span></span></span><b><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Segurança</span></span></span></b></div><div style="text-align: justify;"><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Ter optado por utilizar-se de um algorítmo criptográfico proprietário como no caso do <b>Crypto-1</b> talvez tenha sido uma das maiores falha no projeto MiFare Classic(<i>ou não</i>).</span></span></span><br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Em meados de 2008 foram apresentadas formas de ataques e a engenharia reversa parcial do algoritimo de criptografia do MiFare Classic.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Tal engenharia reversa utilizou-se de raspagem e análize dos blocos lógicos no substrato de silício do microchip, utilizando para isso um potente microscópio eletrônico.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Essa descoberta abriu inumeras formas de ataques inclusive a possibilidade de clonagem do cartão.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Os chineses cláro se aproveitando da brecha, criaram um leitor NFC (Near Field Communication), similar a um Pendrive USB que se destina a ser um simples leitor RF, porém esse inocente leitor, funciona também como MiFare Classic, ou seja aproximando esse leitor de um terminal, o terminal o reconhece como sendo um MiFare.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Não contentes com isso os Chineses também comercializam cartões MiFare Classic que muito provavelmente utiliza-se de um ID que já existe no mercado, ou pior o ID desse cartão pode ser atribuido livremente por quem o compra.</span></span></span></div><div style="text-align: justify;"><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://lh4.googleusercontent.com/-r1pMe8DuG9g/TYDSoPP3hiI/AAAAAAAAADk/Ptr0bIie74g/s1600/CloneAtack.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://lh4.googleusercontent.com/-r1pMe8DuG9g/TYDSoPP3hiI/AAAAAAAAADk/Ptr0bIie74g/s1600/CloneAtack.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Ataque utilizando Leitor NFC com MiFare Classic Clonado</td></tr>
</tbody></table><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">O Clone do cartão é realizada através de uma técnica conhecida por <b>Eavesdropping</b> (Espionagem).</span></span></span><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://lh4.googleusercontent.com/-76EAhjGesp8/TYDU5tAF1KI/AAAAAAAAADo/QgP1xs9YM3Q/s1600/Eavesdropping.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://lh4.googleusercontent.com/-76EAhjGesp8/TYDU5tAF1KI/AAAAAAAAADo/QgP1xs9YM3Q/s1600/Eavesdropping.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Clone por Eavesdropping</td></tr>
</tbody></table><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Atualmente, muitos celulares e smart phones possuem nativamente um leitor/gravador NFC, o que possibilita a espionagem e clone do cartão copiando todo conteúdo da comunicação entre o MiFare Classic e o Terminal e posteriormente decifrando os dados.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Esse é um dos ataques mais perigoso sobre o MiFare Classic, pois mesmo que o Terminal esteja equipado com um forte esquema de segurança utilizando <b>SAM Cards</b> (Secure Access Modules), ainda sim é possível realizar um ataque conhecido por <b>Replay Attack</b>.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Imaginem o seguinte cenário onde recarregamos o cartão de vale transporte em um terminal ordinário de recarga em um terminal rodoviário.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Ao carregar o MiFare Classic, copiamos todo conteúdo da transação com um Celular NFC, então utilizamos e exaurimos todos os créditos do cartão, então realizamos uma recarga desse cartão utilizando os dados decifrados da comunicação anteriormente gravada.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">A empresa só detectará o problema tarde demais ao levantar o balanço monetário.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Existe um outro ataque muito conhecido em redes TCP/IP chamado de <b>Men in the middle</b> (Homem no Meio). </span></span></span><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://lh6.googleusercontent.com/-TkYmpNKlJ3Q/TYDxbiqn2SI/AAAAAAAAADw/WsnTJQ-1ggk/s1600/meninthemiddle.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://lh6.googleusercontent.com/-TkYmpNKlJ3Q/TYDxbiqn2SI/AAAAAAAAADw/WsnTJQ-1ggk/s1600/meninthemiddle.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Ataque Men in the Middle</td></tr>
</tbody></table><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Imaginem que o portador do MiFare Classic (Vítima) é um funcionário de uma Empresa o qual tem sua portaria controlada perante a apresentação do MiFare ao Terminal.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">E que esse funcionário esteja feliz embreagando-se com amigos em um barzinho a kilometros de distancia da empresa, com sua carteira contendo o MiFare sobre o balcão,.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Apenas posicionando o Celular NFC B do lado dessa carteira é possível estabelecer uma comunicação entre esse cartão e o Celular NFC A que se passará pelo cartão original e será aceito pelo Terminal da Portaria como sendo autentico.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Pôr mais fantasioso que essa estória possa parecer, ela me foi demonstrada pela própria NXP em seus escritórios em São Paulo, quando eu tive o privilégio de ver a apresentação do seu novo produto o então MiFare Plus.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Como podem ver levou quase 15 Anos para a tecnologia ser quebrada, o que é um tempo notável, porém conforme dito antes existem mais de 3,5 Bilhões de cartões MiFare Classic no mundo passiveis de serem hackeados, fora as outras centenas de milhões de MiFare Classic Chineses apelidados de Xing Ling's.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Atualmente a NXP trabalha com a Linha Conhecida como MiFare Plus, extremamente seguro e utilizando o Algoritimo AES 128 bits para tudo, desde a autenticação por diversificação de Chaves, proteção do Canal de comunicação RF, cifragem/decifragem dos Dados e cálculo de <b>MAC </b>(Message Authentication Code). </span></span></span><br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">O AES por ser um Algoritimo Criptográfico aberto e conhecido não desperta a curiosidade de alguns hackers em raspar o substrato de silício e observa-los sobre um microscópio eletrônico.</span></span></span><br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">O MiFare Plus também possui de 2 a 3 níveis de operação sendo que o primeiro deles é totalmente compatível com o MiFare Classic (inclusive na vulnerabilidade), porém no último nível se torna uma peça realmente dificil de ser quebrada, nesse nível até o ataque de <i>Men in the middle</i> é impossivel de ser realizado pois o chip matém um rigoroso controle de Timming entre envio e resposta de dados para o Leitor.</span></span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">O MiFare Plus é com certeza um dos cartões mais impressionantes o qual eu tive o privilégio de trabalhar, arrisco-me a dizer que é tão complexo de se trabalhar quanto é o Java Card. Porém se o seu projeto não necessita de tanta segurança assim, continue usando a versão básica e barata Classic, se precisa de segurança, considere o MiFare Plus.</span></span></span></div><div style="text-align: justify;"><b><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span></span></span></b><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Um Grande Abraço e até a Próxima!</b></span></span></span><br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span></span></span></div>Ricardo Massaohttp://www.blogger.com/profile/13929394839245906485noreply@blogger.com30tag:blogger.com,1999:blog-2847438594432791658.post-17564453098435089812010-12-19T11:41:00.000-08:002011-08-25T12:29:15.035-07:00Certificação Digital<div style="text-align: justify;"><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><b>1ª Premissa : </b>"</span><span style="font-size: small;"><span style="color: black; font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; font-style: italic;">O </span><span style="color: black; font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; font-style: italic;">Nível</span><span style="color: black; font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; font-style: italic;"> de </span><span style="color: black; font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; font-style: italic;">Segurança</span><span style="color: black; font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; font-style: italic;"> é </span><span style="color: black; font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; font-style: italic;">aceitável</span><span style="color: black; font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; font-style: italic;"> </span><span style="color: black; font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; font-style: italic;">quando</span><span style="color: black; font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; font-style: italic;"> </span><span style="color: black; font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; font-style: italic;">os</span><span style="color: black; font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; font-style: italic;"> </span><span style="color: black; font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; font-style: italic;">custos</span><span style="color: black; font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; font-style: italic;"> de um </span><span style="color: black; font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; font-style: italic;">ataque</span><span style="color: black; font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; font-style: italic;"> </span><span style="color: black; font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; font-style: italic;">bem</span><span style="color: black; font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; font-style: italic;"> </span><span style="color: black; font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; font-style: italic;">sucedido</span><span style="color: black; font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; font-style: italic;">, é de </span><span style="color: black; font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; font-style: italic;">uma</span><span style="color: black; font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; font-style: italic;"> </span><span style="color: black; font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; font-style: italic;">ordem</span><span style="color: black; font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; font-style: italic;"> de </span><span style="color: black; font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; font-style: italic;">grandeza</span><span style="color: black; font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; font-style: italic;"> </span><span style="color: black; font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; font-style: italic;">maior</span><span style="color: black; font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; font-style: italic;"> </span><span style="color: black; font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; font-style: italic;">que</span><span style="color: black; font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; font-style: italic;"> o </span><span style="color: black; font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; font-style: italic;">lucro</span><span style="color: black; font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; font-style: italic;"> </span><span style="color: black; font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; font-style: italic;">em</span><span style="color: black; font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; font-style: italic;"> </span><span style="color: black; font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; font-style: italic;">potencial</span><span style="color: black; font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; font-style: italic;">.</span><span style="color: black;">"</span></span></div><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><b>2ª Premissa : </b><i>"<span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;">Com tempo, esforço e dinheiro, qualquer solução de segurança pode ser comprometida.</span>"</i></span></span><span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; font-size: small;"><span style="color: black;"> </span></span><br />
<span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif; font-size: small;"><span style="color: black;"> </span></span><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"> </span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Nesse Artigo discutirei sobre Certificação Digital e onde os Smart Cards entram nessa história.</span></span></div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Já há algum tempo tenho ouvido um barulho envolta desse assunto falando-se bastante sobre segurança digital, sobre o quão incrível é, sobre RIC (Registro de Identidade Civil), sobre NF-e (Nota Fiscal Eletrônica), e-CNPJ / e-CPF, etc.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Hoje compartilharei com vocês um pouquinho da minha experiência no assunto e o caminho das pedras a ser percorrido para implementação da tal Certificação Digital.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></span></div><div style="text-align: justify;"><b><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Certificação Digital é atualmente (2011) RSA e SHA</span></span></b></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Pois bem essas duas siglas são a base da Certificação Digital. Sim só elas duas e mais ninguém e como sempre digo "é simples assim".</span></span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">O <b>RSA</b> trata-se de um algoritmo criptográfico assimétrico criado por Ronald <b>R</b>ivest, Adi <b>S</b>hamir e Leonard <b>A</b>dleman e é sem dúvida nenhuma um dos algoritmos de criptografia mais bem sucedidos pois chaves acima de 1024 bits tem se mantido inquebrável até o momento em que este artigo estava sendo escrito (2011).</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">A ultima chave RSA fatorada (decomposta ou quebrada), tinha 768 bits e ocorreu em Dezembro de 2009, esse feito foi realizado por 6 institutos de pesquisa ao redor do mundo Suíça, Japão, Alemanha, França, Estados Unidos e Holanda.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Levou 6 Meses para se selecionar os Polinômios em um cluster de 80 Processadores e a fatoração levou 2 anos utilizando centenas de processadores.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Só a seleção de Polinômios em uma máquina com um Processador Opteron de 2.2GHz e 2 GB de RAM levaria cerca de 1.500 anos.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Os resultados podem ser vistos aqui : <a href="http://eprint.iacr.org/2010/006.pdf">http://eprint.iacr.org/2010/006.pdf</a></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span id="goog_1035431671"></span><span id="goog_1035431672"></span>Estima-se que a próxima Chave RSA de 1024 bits será quebrada em meados do ano 2014 apenas.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">O funcionamento do RSA é muito simples, não entrarei em detalhes de como o algoritmo é implementado ou como se gera os pares de chaves pois isso é de livre acesso na Internet e está fora do escopo desse artigo.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Por se tratar de um algoritmo de criptografia assimétrico isso implica em 2 chaves distintas mas que possuem uma afinidade matemática, ambas são geradas a partir de 2 números Primos grandes e aleatórios.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">A isso se dá o nome de Pares de Chaves, consistindo de uma Chave Privada e uma Chave Pública, obviamente a chave privada nunca deve ser exposta enquanto a chave pública pode ser distribuída e embora haja uma afinidade entre elas é impossível matematicamente se calcular a chave privada a partir da chave pública.</span></span></div><div class="separator" style="clear: both; text-align: center;"><a href="http://3.bp.blogspot.com/-5wigr_w_bjg/Tjm-cs6BEpI/AAAAAAAAAEg/7RBRfrpcAPs/s1600/genkeypair.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-5wigr_w_bjg/Tjm-cs6BEpI/AAAAAAAAAEg/7RBRfrpcAPs/s1600/genkeypair.png" /></a></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Então uma vez gerada o Par de Chaves, basta distribuir a Chave Pública entre as pessoas interessadas em decifrar suas mensagens.</span></span></div><div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><a href="http://3.bp.blogspot.com/-TwTwsZpTeX0/TjnBbkBzVXI/AAAAAAAAAEo/JxzllgBHkWc/s1600/rsawork.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-TwTwsZpTeX0/TjnBbkBzVXI/AAAAAAAAAEo/JxzllgBHkWc/s1600/rsawork.png" /></a></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">O contrario também é possível, por exemplo o portador da Chave Pública pode usa-la para cifrar uma mensagem, nesse caso somente o que tem a posse da Chave Privada pode decifrar e ler a mensagem.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">O <b>SHA</b> trata-se de uma família de algoritmos criptográficos de resumo (hash), foi criado pela NSA (National Security Agency) e é recomendada pela FIPS 180-2.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">A versão utilizada geralmente pela Certificação Digital é o SHA-1, que é baseado nos princípios de outro conhecido algoritmo de resumo o MD4 e MD5 esses 2 últimos criados por Ronald Rivest (sim o R do RSA).</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">A principal função desse algoritmo conforme dito é resumir. Lembra-se das aulas de português onde você tinha que ler aquele livro "Grande Sertão : Veredas" de Guimarães Rosa e tinha que entregar um resumo dele? Pois é exatamente isso que o SHA-1 faz de maneira digital.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">O SHA-1 sempre entrega um resumo de 160 bits (20 bytes), independente da quantidade de bytes de dados que se deseja resumir.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">A vantagem desse algoritmo é que se ao menos 1 bit for alterado nos dados, um resumo completamente diferente é entregue quando recalculado.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Além da Certificação Digital os algoritmos de resumo são amplamente usados em programas P2P, senhas de logins, calculo de imagens ISO disponibilizadas em sites e FTP´s, etc.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Algoritmos de resumo são capazes de resumir desde 1 Byte até Infinito. Embora o SHA-1 seja reconhecido como seguro segundo a FIPS, ele já sofreu ataques e já se discute a criação de um novo algoritmo em substituição ao SHA.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Funcionamento do SHA-1:</span></span></div><div class="separator" style="clear: both; text-align: center;"><a href="http://2.bp.blogspot.com/-7-Ng1vW-X7s/TjnFg4DmjyI/AAAAAAAAAEs/NBCGLBuHjfE/s1600/sha1work.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-7-Ng1vW-X7s/TjnFg4DmjyI/AAAAAAAAAEs/NBCGLBuHjfE/s1600/sha1work.png" /></a></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Exemplos de Resumo usando o SHA-1:</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Dado : 0x00</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Resumo (hash): 0x5BA93C9DB0CFF93F52B521D7420E43F6EDA2784F</span></span></div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Dado : 0x01</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Resumo (hash): 0xBF8B4530D8D246DD74AC53A13471BBA17941DFF7</span></span></div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Caso queira brincar com algoritmos de resumo você pode baixar um gratuito aqui:</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><a href="http://www.slavasoft.com/hashcalc/index.htm">http://www.slavasoft.com/hashcalc/index.htm</a></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Ok, assumo que você entendeu bem o funcionamento dos algoritmos RSA e SHA-1 e com isso já podemos assinar conceitualmente um documento, veja como:</span></span></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-1Gt1c-tLOK4/TjnMhHZEPHI/AAAAAAAAAEw/8MLNEYOYGis/s1600/sign.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="http://4.bp.blogspot.com/-1Gt1c-tLOK4/TjnMhHZEPHI/AAAAAAAAAEw/8MLNEYOYGis/s1600/sign.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Assinando uma Mensagem</td></tr>
</tbody></table><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">O Processo de Assinatura é extremamente simples, digito meu testamento onde deixo minha coleção de Java Cards para meu amigo.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Aplico o algoritmo de resumo SHA-1, que me produz um hash de 20 bytes.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Aplico nesse hash o algoritmo de criptografia RSA em modo cifragem usando minha chave Privada, que me produz um conjunto de bytes que se pode chamar de Assinatura Digital.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Monto um pacote de Dados contendo a mensagem mais a assinatura digital e envio isso tudo via Internet para o cartório.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Com isso o cartório com posse da minha Chave Pública pode então realizar a verificação da minha Assinatura Digital:</span></span></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://2.bp.blogspot.com/-VOaVK-_zyS0/TjnS5RUlY-I/AAAAAAAAAE0/y02GduCd2WI/s1600/verify.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="http://2.bp.blogspot.com/-VOaVK-_zyS0/TjnS5RUlY-I/AAAAAAAAAE0/y02GduCd2WI/s1600/verify.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Verificando uma Mensagem Assinada</td></tr>
</tbody></table><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Assim que o cartório recebe o pacote de dados ele separa a mensagem e a assinatura digital.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Aplica-se sobre os dados da assinatura digital o algoritmo RSA em modo decifragem usando-se a Chave Pública, com isso o Hash gerado anteriormente pelo emissor é recuperado.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Aplica-se o algoritmo SHA-1 na mensagem produzindo o resumo (hash) da mensagem.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Compara-se os dois hash e se ambos forem idênticos a mensagem está integra.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Suponha que o corpo da mensagem tenha sido violada no meio do caminho, nesse caso o hash gerado pelo cartório se diferirá do criptografado com a chave privada.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Caso a assinatura digital seja violada o algoritmo RSA não conseguirá decifrar a assinatura usando a chave Pública, para gerar uma nova assinatura válida é necessária a chave Privada que já sabemos desde que seja bem guardada é impossível de ser quebrada.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Isso é a pedra fundamental de toda Certificação Digital, absolutamente tudo que se utilize de Certificados Digitais usa essa mesma regra seja assinando uma NF-e, um documento bancário, um contrato imobiliário, uma ação judicial, uma declaração de imposto de renda, um e-mail, uma imagem de um documento escaneado, etc, etc, etc.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">A seguir é adicionado sobre isso meios para tornar isso tudo ainda mais seguro, por exemplo como garantir que a Chave Pública é realmente Par de quem se diz ser? Como proteger de maneira eficiente e segura a Chave Privada?</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Para se tratar dessas questões foram criadas o PKI, Tokens, Módulos HSM e padrões conhecidas por PKCS.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><b>Public Key Infrastructure (PKI)</b></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">O PKI ou <b>Infraestrutura de Chave Públicas</b> é um conjunto que une Hardware, Software, pessoas, procedimentos e politicas que venham garantir que uma Chave Pública pertença a um individuo e que esse tenha posse do consecutivo Par de Chave Privado.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Como você já deve ter imaginado uma maneira eficiente de se fazer isso é Assinando Digitalmente a Chave Pública do indivíduo.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Existe um órgão responsável por esse procedimento chamada de <b>Autoridade Certificadora</b> (<b>AC</b>), exemplos de AC Brasileiras são a Receita Federal, Casa da Moeda, Caixa Econômica Federal, Serasa Experian, Certisign e outras mais.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Assinando uma Chave Pública:</span></span></div><div class="separator" style="clear: both; text-align: center;"></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-Ozb4BX7mN3c/TjoaThxdiNI/AAAAAAAAAE8/MGzzfVUuLS8/s1600/signpublic.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="http://4.bp.blogspot.com/-Ozb4BX7mN3c/TjoaThxdiNI/AAAAAAAAAE8/MGzzfVUuLS8/s1600/signpublic.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Gerando um Certificado Digital</td><td class="tr-caption" style="text-align: center;"><br />
</td></tr>
</tbody></table><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Após a Chave Pública ser assinada pela Chave Privada da AC, é criado um <b>Certificado Digital</b> para a Chave Pública do Indivíduo.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">O Certificado Digital é um arquivo binário que possui diversas informações embutidas como nome do individuo, e-mail, endereço, uma cópia da própria Chave Pública assinada, etc.</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">É dever da AC certificar-se que o indivíduo requerente é quem se diz ser através da verificação de seus documentos legais e até características biométricas. </span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">O Certificado também possui dados relacionados à AC como versão do certificado, algoritmos utilizados, validade do certificado, caminho de autenticação (lista todas as AC´s envolvidas no processo até a AC Raiz), uma cópia do Certificado Digital da AC, etc.</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Além de certificar Chaves Públicas uma AC também tem a responsabilidade de manter um diretório público com uma listagem de estado de cada certificado emitido, pois cada certificado pode se encontrar revogado, vencido ou válido somando se a isso ainda alguns detalhes de como cada certificado foi emitido.</span></span><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"> </span></span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Exemplo dos Detalhes de um Certificado:</span></span><br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://1.bp.blogspot.com/-CkomLxZJGNc/Tjq2ur_cUHI/AAAAAAAAAFA/tuVfA-fiyKw/s1600/CertificadoDetalhes.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-CkomLxZJGNc/Tjq2ur_cUHI/AAAAAAAAAFA/tuVfA-fiyKw/s1600/CertificadoDetalhes.png" /></a></div><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Da mesma forma que um individuo tem sua Chave Pública Certificada por uma AC, uma AC também deve ter sua Chave Pública assinada por uma outra AC de nível superior a dela até chegar ao topo ocupada pela Autoridade Certificadora Raiz, a isso se dá o nome de <b>Caminho de Certificação</b> ou <b>Cadeia de Certificação</b>.</span></span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Exemplo de um Caminho da Certificação:</span></span><br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://2.bp.blogspot.com/-TqfnBwxO4-Y/Tjq2wYn34UI/AAAAAAAAAFE/ARiJDju_UjY/s1600/CertificadoPath.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-TqfnBwxO4-Y/Tjq2wYn34UI/AAAAAAAAAFE/ARiJDju_UjY/s1600/CertificadoPath.png" /></a></div><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">As AC´s são dividas e níveis similares a um sistema em árvore conforme a figura abaixo:</span></span><br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://3.bp.blogspot.com/-aJ9Hk632UMM/TjwtaRQsr0I/AAAAAAAAAFI/wzkw6LL6gZM/s1600/actree.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-aJ9Hk632UMM/TjwtaRQsr0I/AAAAAAAAAFI/wzkw6LL6gZM/s1600/actree.png" /></a></div><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">No topo da árvore fica a AC Raiz, cabe a ela emitir, expedir, distribuir, revogar e gerenciar os certificados das AC´s de 1º Nível, ela também é responsável por fiscalizar e auditar as AC´s imediatamente subsequentes a ela.</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">No Brasil a Autoridade Certificadora Raiz é conhecida por <b>ICP-Brasil</b> (Infraestrutura de Chaves Públicas Brasileira), que é mantida pelo <b>ITI</b> (Instituto Nacional de Tecnologia da Informação), órgão diretamente ligada a Presidência da República. </span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">A ICP-Brasil possui um par de Chaves RSA de 2048 bits e a sua Chave Pública é auto-assinada pelo Par Privado, gerando assim o Certificado Digital com validade até 2021.</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Logo abaixo da AC Raiz se encontram as AC´s de 1º Nível, cada uma delas com seu referente par de chaves e certificado digital expedido pela AC Raiz.</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Uma AC de 1º Nível pode ter zero ou diversas AC´s de 2º Nível subsequente a ela, cada AC de 2º Nível possui o referente par de chaves e certificado digital expedido pela AC de 1º Nível a qual pertence.</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Uma AC de 2º Nível pode ter zero ou diversas AR´s (Autoridade Registradora), diferente de uma AC a AR não possui um Par de Chaves Criptográficos nem um Certificado Digital, ela é responsável por emitir Certificados Digitais seguindo as politicas e recursos tecnológicos providos pela AC a qual pertence, também possuem a responsabilidade de validar o indivíduo requerente do Certificado através dos documentos legais (RG, CPF, Comprovante de Residência, etc) e até características biométricas (Impressão Digital, Escaneamento de Retina, etc ).</span></span><b><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"> </span></span></b><br />
<br />
<b><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Protegendo a Chave Privada</span></span></b><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><i style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;"><b>"Software Cannot Protect Software"</b></i><span style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;"> </span><i style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;">(Software não pode proteger Software).</i> </span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Não existe uma frase que melhor expresse as necessidades de se proteger uma Chave Privada pois a mesma se trata de algumas centena de bytes e é consequentemente Software.</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Cabe ao <b>ITI</b> (Institudo Nacional de Tecnologia da Informação), definir todas as normas e obrigações que a AC Raiz, AC´s e AR´s devem obedecer para que o PKI Brasileiro funcione.</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">O Par de Chaves de uma AC é obrigatoriamente gerada em um <b>HSM</b> (Hardware Security Module), sem contato humano e a chave Privada nunca é exposta todas as operações de criptografia são realizadas pelo HSM apenas apresentando os dados a ser cifrado/decifrado.</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">O Dispositivo possui diversos sensores em hardware e software, que ao menor sinal de tentativa de violação o par de chaves é destruído.</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Muitas das funções do HSM (nem todas), trabalham fora de um padrão ou norma evitando assim tentativas de ataques aos padrões conhecidos. </span></span><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://1.bp.blogspot.com/-yayDwAYcQv4/TjxaNqxoXOI/AAAAAAAAAFU/3cpwIt18BSg/s1600/PrivateServer.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="206" src="http://1.bp.blogspot.com/-yayDwAYcQv4/TjxaNqxoXOI/AAAAAAAAAFU/3cpwIt18BSg/s400/PrivateServer.jpg" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Aparência de um HSM</td></tr>
</tbody></table><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">O HSM deve ser armazenado em uma sala cofre climatizada e protegida por escolta armada constante.</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Uma AC deve ser dividida em níveis de acesso pessoal, para cada nível a segurança é aumentada e restrita, por exemplo a partir de certo nível é proibido um indivíduo transitar sozinho.</span></span><b><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"> </span></span></b><br />
<br />
<b><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Smart Cards e Tokens o "HSM" Popular</span></span></b><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Obviamente nem eu nem você possui recursos para se ter um HSM pessoal, aqui entra os Smart Cards e os Tokens que praticamente realiza as mesmas funções de um HSM e são soluções de bolso.</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Uma boa fatia do mercado de certificação digital pertencem aos Java Cards graças a interoperabilidade que eles provêm, pois uma vez desenvolvido a Applet PKI ela é compatível com uma grande variedade de cartões.</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Existem também os Smart Cards puramente PKI desenvolvido unicamente para esse segmento de mercado e os Tokens criptográficos.</span></span><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://2.bp.blogspot.com/-VxPrxL0cUG8/Tj_5SF7GX2I/AAAAAAAAAFg/XMHLhNbbVvY/s1600/tokencard.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="http://2.bp.blogspot.com/-VxPrxL0cUG8/Tj_5SF7GX2I/AAAAAAAAAFg/XMHLhNbbVvY/s1600/tokencard.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Token / Cartão</td></tr>
</tbody></table><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Basicamente, o Par de Chaves é gerada internamente pelo dispositivo e a Chave Privada nunca é exposta / extraída.</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">A Chave Pública deve ser assinada pela AC e o Certificado Digital produzido deve ser armazenada pelo dispositivo.</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">A operação de assinatura digital é realizada internamente pelo dispositivo seguindo algumas normas <b>PKCS</b> (Public-Key Cryptography Standards).</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Clonar um desses dispositivos é tão custoso que não vale a pena de ser feito e uma vez roubado o Certificado Digital pode ser revogado pelo titular. </span></span><b><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"> </span></span></b><br />
<br />
<b><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">A Public Key Cryptography Standards (PKCS)</span></span></b><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Para quem almeja trabalhar ou já trabalha como Certificação Digital, certamente irá ou já se deparou com a sopa de letrinhas do PKCS#X.</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">O PKCS são várias especificações desenvolvidas pela RSA Laboratories (sim eles de novo), em conjunto com diversos desenvolvedores de sistemas de segurança, visando padronizar a utilização e desenvolvimento de algoritmos com Chaves Públicas para garantir a troca segura de informações entre sistemas não padronizados de maneira acelerada.</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">O PKCS está divido em diversos # (Números) sendo que cada # define um padrão, atualmente (2011) 15 padrões estão definidos, não entrarei em detalhes de todos eles e farei um breve comentário sobre os mais importantes dentro do escopo desse artigo.</span></span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">O <b>PKCS#1 - RSA Cryptography Standard</b> - Define os padrões acerca do algoritmo de criptografia RSA como propriedades matemáticas, codificação de Chaves, esquemas de codificação de dados antes/depois de uma operação criptográfica e produção/verificação de assinaturas.</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">O <b>PKCS#7 - Cryptographic Message Syntax Standard</b> - Define os padrões de como se "envelopar" dados/mensagem cifrados ou não, basicamente esse padrão trata de como os dados são dispostos dentro de um arquivo, imaginem um envelope de carta contendo dentro dele uma carta assinada e com firma reconhecida em cartório, o PKCS#7 é a versão digital disso tudo.</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">O <b>PKCS#10 - Certification Request Standard</b> - Define os padrões de como uma requisição de Certificado Digital deve ser composta antes ser enviada a uma Autoridade Certificadora.</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Imaginem um Applet Java Card PKI, esse applet gera internamente um Par de Chaves RSA, para requisitar-mos um Certificado Digital à AC primeiro precisamos auto-assinar a Chave Pública utilizando o Par de Chave Privado, o pacote de dados produzidos por essa operação é codificada seguindo o padrão PKCS#10 e é enviado para AC, que assina a chave Publica e gera o Certificado Digital..</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">O <b>PKCS#11 - Cryptographic Token Interface</b> - Define uma API abstrata também conhecida como "<b>Cryptoki</b>", trata-se de arquivos texto mais precisamente cabeçalhos em Liguagem C (cryptoki.h, pkcs11.h, pkcs11f.h e pkcs11t.h), esses arquivos definem protótipos de funções a serem implementadas para dar suporte a um determinado Sistema Operacional, um tipo especifico de Token ou Smart Card PKI.</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Suponha que você desenvolva um Applet PKI Java Card, você deve implementar uma biblioteca que prove acesso a esse seu applet (.dll em sistemas MS, .lib em sistemas *nix), escritas e compiladas em C/C++.</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">O <b>PKCS#12 - Personal Information Exchange Syntax Standard</b> - Define os padrões de como um ou mais Pares de Chaves e seus respectivos Certificados Digitais são armazenados em um arquivo criptografado (algoritimo simetrico) e protegido por uma senha.</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Um arquivo PKCS#12 pode ou não conter chaves privadas, vários aplicativos são compatíveis com arquivos PKCS#12 como o Internet Explorer, Mozilla Firefox, Java Keystore, etc.</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Esse arquivo serve para realizar Backups de Pares de Chaves e Certificados para transporte, quando um certificado digital é requerido a uma AC a mesma retorna um arquivo PKCS#12 contendo o Certificado Digital e a Cadeia de Certificação.</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">O <b>PKCS#15 - Cryptographic Token Information Format Standard</b> - Define os padrões de como implementar a aplicação PKI em Tokens e Smart Cards.</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Basicamente é o padrão a ser seguido quando se for desenvolver um Applet Java Card PKI.</span></span><b><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"> </span></span></b><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><b>Cryptographic Application Programming Interface</b> </span></span><b><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">(CAPI)</span></span></b><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Também conhecida como <b>CryptoAPI</b>, <b>Microsoft Cryptography API</b> ou <b>MS-CAPI</b> é uma Interface Criptografica que os produtos Microsoft como o Internet Explorer, Outlook, Office, Windows Live, etc, utilizam para realizar operações criptográficas como cifragem, decifragem, assinaturas e verificações.</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Outros aplicativos podem utilizar a MS-CAPI, um exemplo é o Adobe Acrobat Reader que acessa o Key Store do Windows para assinatura de pdf´s. </span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Basicamente para um Token ou Smart Card de certificação digital funcionar com produtos Microsoft é necessário implementar as funções contidas na interface da MS-CAPI, trata-se de uma biblioteca dinâmica (DLL), que irá se linkar com a DLL PKCS#11 do Token / Smart.</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Esse link é definido através de uma entrada no registro do Windows que linka a implementação da DLL MS-CAPI com o Token / Smart Card, e um Certificado Digital do Key Store do Windows linkado com a DLL MS-CAPI.</span></span><br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://4.bp.blogspot.com/-6O3NQK7Pm9Y/TkSoGgC_YII/AAAAAAAAAFk/5nZr6NQB62k/s1600/mscapi.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-6O3NQK7Pm9Y/TkSoGgC_YII/AAAAAAAAAFk/5nZr6NQB62k/s1600/mscapi.png" /></a></div><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Como podem ver na figura acima, existem duas maneiras de se utilizar Certificação Digital em ambientes MS, uma é utilizar a MS-CAPI e acessar certificados digitais a partir do Key Store do Windows e outra é acessar diretamente o serviço através do PKCS#11 como o Firefox e a API JCE IAIK fazem.</span></span><b><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"> </span></span></b><br />
<br />
<b><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">O Card / Token Manager</span></span></b><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Trata-se do aplicativo responsável pelo gerenciamento de todas essas especificações citadas acima como instalação de applets no cartão, disparo de geração de chaves, requisição de certificados, instalação de certificados no cartão e no Key Store do Sistema Operacional, assinatura e verificação, etc.</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Um dos aplicativos mais usados e completo é o <a href="http://www.aeteurope.com/aet/aet-europe/_www/en/pub/products/safesign.cfm">"SafeSign Identity Client (link)"</a> inclusive um dos mais adotados pelas AC´s brasileiras que pode ser obtido gratuitamente via download. Outra Solução é a da <a href="http://www.charismathics.com/products/middleware-smart-security-interface/cssi-product-overview">"Charismathics (link)"</a>.</span></span><b><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"> </span></span></b><br />
<br />
<b><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">PIN e PUK</span></span></b><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"> </span></span><br />
<b><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"></span></span></b></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">O PIN (Personal Identification Number) é a senha que identifica o dono do Cartão/Token e é requerida antes de uma operação criptográfica ser realizada como geração de chaves, assinatura e cifragem.</span></span><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">O PUK (Personal Unblock Key) é a senha utilizada para desbloqueio do PIN em caso de bloqueio por tentativas de entradas incorretas.</span></span><b><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"> </span></span></b><br />
<br />
<b><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">O Caminho das Pedras</span></span></b><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Existem dois caminhos bem distintos a serem percorridos pelos profissionais que almejam trabalhar com Certificação Digital.</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">O Primeiro Caminho e mais complexo é desenvolver tudo do Zero nesse caso:</span></span><br />
<ul><li><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Desenvolver uma Aplicação PKCS#15 para Smart Cards (Ex. Applet Java Card), ou utilizar um Smart Card / Token com PKCS#15 nativo (Ex. Cartão StarCos da GD Burti, token HASP).</span></span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Desenvolver uma biblioteca de link dinâmico que implemente a especificação PKCS#11 (Ex. DLL para MS-Win).</span></span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Para Ambientes Microsoft, desenvolver uma biblioteca de link dinâmico que implemente a especificação CryptoAPI e que implicitamente se link com a biblioteca PKCS#11. Essa DLL (CryptoAPI), deve ser Assinada Digitalmente pela Microsoft para que ela possa ser devidamente utilizada em ambientes Windows.</span></span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Desenvolver um Card Manager com a função de Iniciar o Cartão (instalar o aplicativo se necessário, definir PIN e PUK, etc). Prover suporte aos padrões PKCS#1,7,10,11 e 12. Prover suporte ao Padrão MS-CAPI (se usada em ambientes Microsoft). </span></span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Desenvolver uma aplicação que utilize a certificação digital como um assinador de Nota Fiscal (NFe), documentos, etc. Utilizando a biblioteca PKCS#11 ou MS-CAPI em ambientes Windows. </span></span></li>
</ul><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">O Segundo Caminho e mais tranquilo é utilizar uma solução pronta como o SafeSign, Charismatics, Cryptomate da ACR, etc.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Nesse caso você utilizará SDK´s (Software Development Kit), providas por elas como Applet PCKS#15, Biblioteca PKCS#11, Biblioteca MS-CAPI, etc. E obviamente estará sujeito a pagamento das devidas licenças de uso e distribuição.</span></span></div><div style="text-align: justify;"><i><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">1ª Curiosidade : Conheço uma empresa Brasileira que roubou os códigos fontes do Card Manager da Charismatics e não contente com isso ainda utiliza implementações Open-Source do PKCS#11 e 15. Essa empresa já ganhou pelo menos duas licitações uma para o Governo Paulista e uma para a área Militar, e se apresenta anualmente no Evento Cards em SP e tem parceria com uma grande fabricante de cartões brasileira. Sim a Pirataria existe até no mundo da Certificação Digital Acreditem. =^D</span></span></i><br />
<i><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">2ª Curiosidade : Eu primeiro implementei um Card Manager usando Java IAIK-JCE sobre o SafeSign e depois com mais coragem e experiência implementei tudo do Zero. ;^)</span></span></i><b><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"> </span></span></b><br />
<br />
<b><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Amparos Legais</span></span></b><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Medida Provisória 2.200-2, institui o Comitê Gestor da ICP-Brasil e apartir dessa MP diversos decretos, resoluções, instruções normativas, portarias e burocracias foram instituídas.</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Uma das mais interessantes é que a Certificação Digital garante a <b>autenticidade</b> e <b>integridade</b> de um documento, logo é uma prova de <b>não repúdio</b> ou <b>irretratabilidade</b> (você não pode negar que foi você que o fez), em poucas palavras um documento assinado digitalmente tem o mesmo valor legal de um documento assinado pelo seu próprio punho.</span></span><br />
<br />
<b><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">O que vem por ai </span></span></b><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">No mundo da Certificação Digital já se estuda a mudança do algoritmo de Criptografia RSA pelo ECC (Elliptic Curve Cryptography), pois possue o mesmo nível de segurança do RSA e é baseado em polinômios de adição, enquanto o RSA é baseado em módulo. Com isso o ECC é um algorítmo mais eficiente que o RSA.</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Outra grande vantagem é que as Chaves ECC são menores que a do RSA, por exemplo uma Chave Pública ECC de 512 bits equivale a uma Chave Pública RSA de 15360 bits.</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">O Algoritmo de Resumo também será substituido talvez pelo SHA-512 ou quem sabe até por um outro modelo que seja desenvolvido posteriormente.</span></span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><b>Considerações Finais </b></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Isso foi um resumo rápido sobre Certificação Digital, obviamente a coisa é bem mais complicada que isso, porém um campo muito pouco explorado e compreendido, prova disso é que certa vez no evento CertiForum em SP assisti a uma palestra do então responsável pela área de TI da Petrobrás o qual implementou todos os processos relacionados a Certificação Digital, desde a Autoridade Certificadora Petrobrás até o Smart Card / Token do usuário. E após anos de trabalho e muito dinheiro investido apresentou o Smart Card / Token para a alta cúpula da Empresa o qual lançou a questão "<i>Afinal pra que serve isso?</i>" uma simples pergunta que nem ele (o responsável por tudo) e nem a alta cúpula sabiam responder na época. Sim Petrobás. ;^)</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Hoje alguns Fóruns Judiciais assinam e armazenam digitalmente processos, advogados assinam documentos com seus Smart Cards com o Selo OAB, contratos imobiliários são fechados com assinatura digital, malotes bancários são assinados e enviados eletronicamente para as agencias, notas fiscais e declaração de Imposto de Renda são assinadas digitalmente, logins em sistemas operacionais como MS-Windows e *nix, etc, etc, etc.</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Os campos a serem explorado, acesso seguro à agencias bancárias via internet, receitas e prontuários médicos podem ser assinado digitalmente, empresas podem internamente assinar documentos de texto ou pdf´s em cascata, faculdades e estudantes podem assinar avaliações ou garantir a presença do aluno em sala de aula, consultas on-line podem ser garantidas apenas as pessoas que possuem o certificado digital, enfim imagine que tudo que um individuo assina de próprio pulso ou exija uma confirmação pessoal pode ser substituido pela Certificação Digital gerando uma enorme economia com gasto de papeis e tinta para canetas e impressões.</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Porém nem tudo são flores, o sistema possui falhas sim, que podem ser exploradas, embora seja virtualmente impossivel se clonar um Smart Card de Certificação é possivel de se roubar o cartão e o número PIN e assinar documentos, ou mesmo através de software mal intencionado roubar o PIN e mesmo fazer o cartão assinar documentos sem o conhecimento do seu dono. É como eu disse no inicio do artigo com tempo, esforço e dinheiro qualquer solução pode ser comprometida, infelizmente qualquer solução de segurança possui "algumas" pontas soltas.</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">E acreditem já tive o privilégio de ver tais pontas soltas em um mega ERP como o daquela empresa em que a Marília Gabriela faz comercial, pontas que expõe o punho do dono da empresa à assinaturas não autorizadas. ;^D</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Espero que tenha gostado dessa pequena introdução ao mundo da Certificação Digital.</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><b>Um Abraço e Até a Próxima!</b></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><br />
</span></span></div>Ricardo Massaohttp://www.blogger.com/profile/13929394839245906485noreply@blogger.com6tag:blogger.com,1999:blog-2847438594432791658.post-72942581317581154662010-12-19T10:36:00.000-08:002011-09-09T08:09:16.670-07:00Hello World Java Card! (Parte 3 - Compilando e Instalando)<div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">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 <i>Engineering Sample</i> e um leitor de SmartCards de contato padrão PC/SC.</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">Essa sem dúvidas será a parte mais chata de todo processo, digo isso pois existem algumas variáveis importantes a serem observadas.</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"></span></div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">É um Java Card 2.1 ou 2.1.1 ou 2.2 ou 2.2.1 ou 2.2.2?</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">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.</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">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 "<b>JC_HOME</b>" para apontar para o JCDK221.</span></div><div style="text-align: justify;"><br />
<span style="font-family: Arial,Helvetica,sans-serif;">É um cartão GlobalPlatform 2.0.1 ou 2.1 ou 2.1.1 ou 2.2?</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">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.</span></div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">Qual versão de Secure Channel Protocol ele utiliza, versão 1 ou 2 ou 3?</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">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.</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">Qual é a chave 3DES utilizada no Secure Channel Protocol?</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">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:</span></div><div style="text-align: justify;"><span style="font-family: "Courier New",Courier,monospace;">0x40 0x41 0x42 0x43 0x44 0x45 0x46 0x47 0x48 0x49 0x4A 0x4B 0x4C 0x4D 0x4E 0x4F</span></div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">Caso eu não saiba, como eu descubro isso?</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">Pergunte para o fabricante do qual você comprou o cartão, ou verifique no Manual (Datasheet) do seu cartão.</span></div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">Nesse tutorial eu usarei como Base o cartão JCOP 2.4.1 de 80Kb da NXP.</span></div><ul style="text-align: justify;"><li><span style="font-family: Arial,Helvetica,sans-serif;">Java Card 2.2.2</span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;">GlobalPlatform 2.1.1</span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;">Secure Channel Protocol 2</span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;">3 Chaves 3DES padrão Visa Open Platform</span></li>
</ul><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Ferramenta Necessária</b> :</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><a href="http://sourceforge.net/projects/globalplatform/files/GPShell/">GPShell a ultima versão (link).</a></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Descompacte a ferramenta na raiz C: do se HD.</span></div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Compilando um .CAP</b></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Abra seu Eclipse e carregue o Projeto do artigo anterior e vamos descobrir onde o Eclipse salva nosso projeto. Para isso vá no menu "<b>File > Switch Workspace > Other...</b>" e verifique o caminho na qual sua Aplicação se encontra.</span><br />
<br />
<div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><a href="http://1.bp.blogspot.com/_fiEOBlE4kKQ/TTIOpQokQJI/AAAAAAAAACY/UXnzkoUMCEE/s1600/EclipseWorkspace.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/_fiEOBlE4kKQ/TTIOpQokQJI/AAAAAAAAACY/UXnzkoUMCEE/s1600/EclipseWorkspace.png" /></a></div><span style="font-family: Arial,Helvetica,sans-serif;"></span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Vá até o diretório "<b>seu_workspace\JCApplets</b>" e crie um arquivo "<b>build.bat</b>" utilizando o Bloco de Notas.</span><br />
<br />
<div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><a href="http://4.bp.blogspot.com/_fiEOBlE4kKQ/TTIR5dTkibI/AAAAAAAAACg/ocN_a6JJGZI/s1600/pathbuild.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/_fiEOBlE4kKQ/TTIR5dTkibI/AAAAAAAAACg/ocN_a6JJGZI/s1600/pathbuild.png" /></a></div><span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Edite o build.bat e adicione os seguintes comandos abaixo:</span><br />
<pre class="java" name="code">@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
</pre><span style="font-family: Arial,Helvetica,sans-serif;">Esse arquivo é responsável pela compilação propriamente dita, ele verifica a presença das variáveis de ambiente "<b>JAVA_HOME</b>" e "<b>JC_HOME</b>".</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Após isso ele configura o classpath e os parâmetros de compilação a ser passada para o compilador <i>javac</i>.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Depois o diretório "<b>bin</b>" é previamente limpo e todos os arquivos "<b>.exp</b>" (Export Files) copiados para dentro da mesma. Export Files são como arquivos Headers "<i>.h</i>" da Linguagem C e serve para se linkar as classes e métodos utilizado da API Java Card pelo nosso Applet.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">O aplicativo "<b>converter</b>" fornecido pelo JCDK lê o scipt contido no arquivo "JCHelloWorld.opt" e converte o arquivo compilado pelo <i>javac </i>para o arquivo "<b>.cap</b>" que será instalado no cartão.</span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Agora vá até o diretório "<b>seu_workspace\JCApplets\src\jchellorworld</b>" crie o arquivo "<b>JCHelloWorld.opt</b>".</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://3.bp.blogspot.com/_fiEOBlE4kKQ/TTIZjpwT9pI/AAAAAAAAACk/jq8Cuw9dIXk/s1600/pathopt.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/_fiEOBlE4kKQ/TTIZjpwT9pI/AAAAAAAAACk/jq8Cuw9dIXk/s1600/pathopt.png" /></a></div><br />
<span style="font-family: Arial,Helvetica,sans-serif;"></span><span style="font-family: Arial,Helvetica,sans-serif;">E adicione os seguinte comandos abaixo:</span><br />
<pre class="java" name="code">-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
</pre><span style="font-family: Arial,Helvetica,sans-serif;">Na linha 1 informamos que deverá ser gerado os arquivos "<b>.exp</b>", "<b>.jca</b>" e "<b>.cap</b>".</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Na linha 3 definimos o AID do nosso Applet, também conhecido como "<b>Module</b>" no caso o mesmo que o Eclipse gerou para nós.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Na linha 4 informamos o package da nossa aplicação "<b>jchellorworld</b>". </span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Na linha 5 definimos o RID do Package, também conhecido como "<b>Load File</b>".</span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Agora execute o "build.bat" e o resultado esperado deve ser similar a figura abaixo:</span><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://4.bp.blogspot.com/_fiEOBlE4kKQ/TTIhr1sgyII/AAAAAAAAACo/IO0HgcSNx-s/s1600/build_bat.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/_fiEOBlE4kKQ/TTIhr1sgyII/AAAAAAAAACo/IO0HgcSNx-s/s1600/build_bat.png" /></a></div><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Muito bem, se chegou até aqui compilou com sucesso um "<b>.cap</b>" que nada mais é que o Applet que será carregado e executado no cartão.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Agora vá até o diretório "<b>seu_workspace\JCApplets\bin\jchellorworld\javacard</b>" e copie o arquivo "<b>jchellorworld.cap</b>" para dentro da pasta "<b>C:\GPShell-X.Y.Z</b>".</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Uma rápida olhada na pasta do GPShell e podemos notar vários arquivos de texto contendo vários scripts para diversos cartões.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Crie um arquivo de nome "<b>InstallMyHello.txt</b>" e adicione os seguintes comandos:</span><br />
<pre class="java" name="code">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
</pre><span style="font-family: Arial,Helvetica,sans-serif;">Na linha 1 Definimos que usaremos o GlobalPlatform spec 2.1.1.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Na linha 4 Estabilizamos um contexto com a Camada PC/SC.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Na linha 5 Abrimos um canal de comunicação com o Leitor/Gravador.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Na linha 6 Selecionamos o Card Manager do Cartão.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Na linha 7 Realizamos o Mutual Authenticate (Open Secure Channel Protocol).</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Nas linhas 8 e 9 Apagamos versões anteriores do Applet que estamos instalando.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Na linha 10 Instalamos e Tornamos o Applet Selecionavel.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Nas linhas 11 a 13 Listamos os Applets disponíveis como Card Manager e nosso próprio Applet.</span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Agora abra um Prompt de Comando e vá até o diretório do seu GPShell.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Digite o comando "<b>GPShell < InstallMyHello.txt</b>" vários APDU's serão trocados e no final certifique-se que o Applet foi instalado corretamente conforme a figura abaixo:</span><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://1.bp.blogspot.com/_fiEOBlE4kKQ/TTJlAvET05I/AAAAAAAAACs/yhxa_5wFj1w/s1600/gpshellinstall.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/_fiEOBlE4kKQ/TTJlAvET05I/AAAAAAAAACs/yhxa_5wFj1w/s1600/gpshellinstall.png" /></a></div><span style="font-family: Arial,Helvetica,sans-serif;"> </span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Finalmente, execute o GPShell simplesmente digitando "<b>GPShell</b>" no Prompt de Comando e vamos interagir com nosso Applet no cartão digitando os Seguintes comandos:</span><br />
<pre class="java" name="code">enable_trace
establish_context
card_connect
select -AID 0102030405060708090000
send_apdu -sc 0 -APDU 00000000060A0B0C0D0E0F
</pre><span style="font-family: Arial,Helvetica,sans-serif;">Na linha 1 habilitamos o Trace de APDU.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Na linha 2 estabilizamos um contexto com a camada PC/SC do Windows.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Na linha 3 conecta-mos com o cartão na Leitora.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Na linha 4 selecionamos o nosso Applet através do AID dele.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">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.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Se tudo ocorrer bem você deverá ter um resultado similar ao abaixo:</span><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://2.bp.blogspot.com/_fiEOBlE4kKQ/TTJqHw7KxYI/AAAAAAAAACw/je_oLQcuxLU/s1600/gpshelltestapplet.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/_fiEOBlE4kKQ/TTJqHw7KxYI/AAAAAAAAACw/je_oLQcuxLU/s1600/gpshelltestapplet.png" /></a></div><br />
<span style="font-family: Arial,Helvetica,sans-serif;">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.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">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.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">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.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">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 <b>não tentem</b> estabelecer um canal seguro com eles.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Existe um plugin para Eclipse desenvolvida inicialmente pela IBM, agora distribuída pela NXP chamada de <b>JCOP Tools</b> é 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.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Porém para adquiri-la é necessário requerê-la junto a NXP e é uma verdadeira burocracia para consegui-la.</span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">Caso você esteja interessado em adquirir cartões de Desenvolvimento Java Card você pode tentar através dessas empresa:</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><a href="http://www.vivendi.inf.br/">http://www.vivendi.inf.br/</a> - (Peça por JCOP21)</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><a href="http://www.sonsun.com.br/">http://www.sonsun.com.br/</a> - (Peça por Kit Java Card)</span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><a href="http://dl.dropbox.com/u/27480572/JCHelloWorld.rar">Caso tenha tido dificuldades, baixe o projeto dos artigos por aqui.(link)</a></span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><b>Um grande abraço a todos, até a próxima!</b><br />
</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"> </span></div>Ricardo Massaohttp://www.blogger.com/profile/13929394839245906485noreply@blogger.com16tag:blogger.com,1999:blog-2847438594432791658.post-85792976108306136542010-12-19T06:42:00.000-08:002011-09-09T11:32:16.567-07:00Acessando SmartCards usando Jaccal<div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">O que é Jaccal?</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">Jaccal (Java Card Communication Access Layer) é uma antiga API de comunicação Smart Card para aplicações Java e desde de 2006 não recebe atualizações, provavelmente por conta da introdução da API Java Smart Card I/O no Java 6.</span></div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">Porque Jaccal?</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">Ele é uma ótima ferramenta para se testar rapidamente aplicações Smart Card de maneira fácil e descomplicada, graças a uma poderosa e simples Interface Gráfica de Scripts. Porém você não utilizará a API Jaccal para desenvolver suas aplicações Java, considere nesse caso utilizar a API Java Smart Card I/O.</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">O Material Necessário:</span></div><ul><li><span style="font-family: Arial,Helvetica,sans-serif;">Cartão Java Card de Desenvolvimento com o Applet Hello World instalado.</span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;">Leitor / Gravador padrão PC/SC ISO7816.</span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;">Jaccal Instalado na máquina.</span></li>
</ul><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">O Jaccal pode ser baixado gratuitamente no seguinte endereço: </span></div><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><a href="http://jaccal.sourceforge.net/">http://jaccal.sourceforge.net/</a> </span><br />
<br />
<div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">Após baixar o Jaccal, instale-o no lugar de sua preferência, eu aconselho ser na raiz C: para ser de fácil acesso.</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">Por ser desenvolvido em Java, o Jaccal necessita de ao menos uma JRE instalada na máquina.</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">Após instalado, vá ao diretório de instalação e você verá dois executáveis o "<b>jaccal.exe</b>" e "<b>anubis.exe</b>", execute então a aplicação anubis.exe.</span></div><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://1.bp.blogspot.com/-0eqpNdRM3zc/Tmohx6nbdpI/AAAAAAAAAFs/wSFLM5IR4hY/s1600/Anubis.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="383" src="http://1.bp.blogspot.com/-0eqpNdRM3zc/Tmohx6nbdpI/AAAAAAAAAFs/wSFLM5IR4hY/s400/Anubis.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Editor de Scripts Anubis</td><td class="tr-caption" style="text-align: center;"><br />
</td></tr>
</tbody></table><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">Ok, não parece ser grande coisa a primeira vista, mas ele é exatamente do jeito que eu gosto, simples, rústico, fácil de usar e por consequencia eficiente.</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">O Programa possui apenas quatro botões com as seguintes funções (da esquerda para a direita), <b>Open</b> (Carrega um Script), <b>Save</b> (Salva um Script), <b>Run</b> (Executa um Script) e <b>Reset</b> (Reseta a camada PC/SC).</span></div><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Escrevendo o Script :</span><br />
<pre class="java" name="code">atr = open();
prints(atr);
prints("Select Application");
cmd = new ApduCmd("00A404000B0102030405060708090000");
prints(cmd);
card_response = execute(cmd);
prints(card_response);
prints("Teste Bytes");
cmd = new ApduCmd("00000000060A0B0C0D0E0F");
prints(cmd);
card_response = execute(cmd);
prints(card_response);
close();
</pre><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">Como pode ter notado é um script extremamente simples, vamos então analisar algumas linhas chaves neste script:</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">Na linha 1, o comando<span style="font-family: "Courier New",Courier,monospace;"> open()</span> realiza toda a função de se conectar ao cartão na leitora, esse comando retorna o <span style="font-family: "Courier New",Courier,monospace;">atr</span> do cartão que na linha 2 é impresso pelo comando <span style="font-family: "Courier New",Courier,monospace;">prints(atr)</span>.</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">Na linha 5, o comando <span style="font-family: "Courier New",Courier,monospace;">new ApduCmd("00A4...")</span> cria um <span style="font-family: "Courier New",Courier,monospace;">cmd</span> que nada mais é que um APDU de envio para o cartão que é também impresso pelo comando da linha 6 <span style="font-family: "Courier New",Courier,monospace;">prints(cmd)</span>.</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">Na linha 7 o APDU <span style="font-family: "Courier New",Courier,monospace;">cmd</span> criado na linha 5 é transferido para o cartão através do comando <span style="font-family: "Courier New",Courier,monospace;">execute(cmd)</span> que retorna a resposta do cartão em <span style="font-family: "Courier New",Courier,monospace;">card_response</span>, impresso na linha 8 pelo comando <span style="font-family: "Courier New",Courier,monospace;">prints(card_response)</span>. No caso <span style="font-family: "Courier New",Courier,monospace;">card_response</span> pode ou não conter dados mas ele sempre conterá o Status Word <span style="font-family: "Courier New",Courier,monospace;">SW1</span> e <span style="font-family: "Courier New",Courier,monospace;">SW2</span>.</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">Por fim na Linha 16 o comando <span style="font-family: "Courier New",Courier,monospace;">close()</span> finaliza a comunicação com o cartão, é sempre importante que seus scripts contenham o comando <span style="font-family: "Courier New",Courier,monospace;">close()</span> no final pois se não o canal de comunicação ficará aberto e futuras tentativas de comunicação com o cartão terminará em erros. Caso esqueça do <span style="font-family: "Courier New",Courier,monospace;">close()</span> você poderá forçar esse comando através do botão Reset do Anubis.</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">Execute o Script clicando no botão Run.</span></div><div style="text-align: justify;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="http://3.bp.blogspot.com/-N5JV2aH6TO8/TmpUETpwpyI/AAAAAAAAAFw/dHWmoK8Xwv8/s1600/Anubis1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="383" src="http://3.bp.blogspot.com/-N5JV2aH6TO8/TmpUETpwpyI/AAAAAAAAAFw/dHWmoK8Xwv8/s400/Anubis1.png" width="400" /></a></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">Uma segunda aba é criada e preenchida com os testes do script.</span></div><div style="text-align: justify;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="http://1.bp.blogspot.com/-4Z-twh4aoo0/TmpV6AlfApI/AAAAAAAAAF0/DpF1wpX4PfI/s1600/Anubis2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="382" src="http://1.bp.blogspot.com/-4Z-twh4aoo0/TmpV6AlfApI/AAAAAAAAAF0/DpF1wpX4PfI/s400/Anubis2.png" width="400" /></a></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">Para interpretar o resultado dos testes é igualmente simples, como pode ver existe uma Tag seguido pelos bytes de teste onde <b>[ATR]</b> é o Answer To Reset do cartão, <b>[S]</b> indica um APDU de envio (Send), <b>[R]</b> indica um APDU de resposta (Receive) e <b>[SW]</b> o Status Word (SW1 e SW2).</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">O Jaccal possui alguns módulos internos como GSM, serviços de criptografia SAM (Security Authentication Module), Global Platform e funções para cartões MULTOS.</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">Porém esses módulos são muito mau documentados e pode acabar sendo um bom desafio coloca-los para funcionar.</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">Espero que tenha gostado de aprender sobre esse excelente e simples software para Smart Cards.</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Um Abraço, e até a Próxima!</b></span></div><span style="font-family: Arial,Helvetica,sans-serif;"> </span>Ricardo Massaohttp://www.blogger.com/profile/13929394839245906485noreply@blogger.com4tag:blogger.com,1999:blog-2847438594432791658.post-8000344765332722892010-12-19T04:50:00.000-08:002010-12-19T04:50:49.918-08:00Hello World Java Card! (Parte 1 - Configurando o Ambiente)<div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Bom, chegou a hora de escrever-mos nossa primeira aplicação Java Card, de inicio utilizaremos o <b>JCWDE </b>(Java Card Workstation Development Environment) ou o <b>CREF</b>( C Reference Implementation of Java Card), mais conhecidos como Simuladores Java Card.</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">O Simulador não é ruim porém não é completo como um Java Card físico, possui diversas limitações como ausência ou implementação parcial de alguns motores criptograficos, vários esquemas de *<i>padding</i> estão ausentes, o tamanho máximo de uma chave RSA é de 512 bits, sendo que a maioria dos Java Cards suportam 2048 bits alguns até 4096 bits, implementação parcial do GlobalPlatform e somente o CREF pode salvar o estado do Applet porém não aceita debugging.</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Então se puder consiga um cartão Java Card que será muito mais proveitoso e divertido também.<b> </b></span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;"><b>*</b><b>padding </b>- <i>Algoritimos Criptograficos cifram blocos de dados com tamanhos fixos ou múltiplos, por exemplo o TripleDES somente cifra blocos múltiplos de 8 bytes, caso o bloco de dados não seja múltiplo é necessário complementar o bloco para torna-lo múltiplo de 8.</i></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif; font-size: small;"><i>Por exemplo imagine que precisamos cifrar o seguinte bloco de dados :</i></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif; font-size: small;"><i>[0x01 0x02 0x03 0x04] - 4 bytes, se enviar-mos para o motor 3DES receberemos uma exceção, logo seguindo a especificação <b>ISO9797-1</b> aplicaremos o seguinte padding:</i></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif; font-size: small;"><i>[0x01 0x02 0x03 0x04 0x80 0x00 0x00 0x00] - 8 bytes.</i><b> </b></span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;"><b>Ferramentas Necessárias :</b></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif; font-size: small;"><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">JDK - Java Development Kit (link).</a></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif; font-size: small;"><a href="http://www.oracle.com/technetwork/java/javacard/overview/index.html">JCDK - Java Card Classic Development Kit 2.2.2 (link).</a></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif; font-size: small;"><a href="http://www.eclipse.org/downloads/">Eclipse versão Classic (link).</a></span></div><div style="text-align: justify;"><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><a href="http://sourceforge.net/projects/eclipse-jcde/">Plug-In Java Card para o Eclipse (link).</a> </span></div><div style="font-family: Arial,Helvetica,sans-serif;"><br />
</div><span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Observação, baixe o JCDK versão 2.2.2 se está se perguntando porque veja <a href="http://planetsmartcards.blogspot.com/2010/12/tecnologia-java-card.html">aqui</a> o porque focinho de porco não é tomada.<b> </b></span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;"><b>Configurando o Ambiente de Desenvolvimento.</b></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Instale o JDK com as configurações padrões.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Descompacte o arquivo "<b>java_card_kit-2_2_2-windows.zip</b>" em um local temporário, descompacte o conteúdo do arquivo "<b>java_card_kit-2_2_2-rr-bin-windows-do.zip</b>" que está localizado dentro da pasta "<b>java_card_kit-2_2_2</b>", para uma pasta com o nome de "<b>JCDK222</b>" na raiz C: do seu HD.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Deixe a estrutura de Diretórios exatamente como na figura abaixo, isso facilitará bastante sua vida no decorrer dos tutoriais :</span><br />
<span style="font-size: small;"></span><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><span style="font-size: small;"><a href="https://sites.google.com/site/ricardotakaqui/JCDKDiretorio.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://sites.google.com/site/ricardotakaqui/JCDKDiretorio.png" /></a></span></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-size: small;">Estrutura de Diretório do JCDK.</span></td><td class="tr-caption" style="text-align: center;"><span style="font-size: small;"><br />
</span></td></tr>
</tbody></table><span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Agora iremos configurar as variáveis de Ambiente do Windows.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Clique em "<b>Iniciar->Painel de Controle -> Sistema</b>" e acesse a seguinte janela :</span><br />
<span style="font-size: small;"></span><br />
<div class="separator" style="clear: both; text-align: center;"><span style="font-size: small;"><a href="https://sites.google.com/site/ricardotakaqui/PropSys.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://sites.google.com/site/ricardotakaqui/PropSys.png" width="325" /></a></span></div><span style="font-family: Arial,Helvetica,sans-serif; font-size: small;"> </span><br />
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Vá até a Aba "<b>Avançado</b>" e clique no botão "<b>Variáveis de Ambiente</b>".</span><br />
<span style="font-size: small;"></span><br />
<div class="separator" style="clear: both; text-align: center;"><span style="font-size: small;"><a href="https://sites.google.com/site/ricardotakaqui/VarEnv.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://sites.google.com/site/ricardotakaqui/VarEnv.png" width="288" /></a></span></div><span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Verifique na Lista "<b>Variáveis do Sistema</b>" na coluna "Variável" se não existe uma entrada chamada "<b>JAVA_HOME</b>", se não existir clique no botão "<b>Novo...</b>".</span><br />
<span style="font-size: small;"></span><br />
<div class="separator" style="clear: both; text-align: center;"><span style="font-size: small;"><a href="https://sites.google.com/site/ricardotakaqui/JavaHomeVar.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://sites.google.com/site/ricardotakaqui/JavaHomeVar.png" /></a></span></div><span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Crie a seguinte entrada seguindo a imagem acima, vai uma dica valiosa aqui, notaram que coloquei "<b>C:\Arquiv~1\...</b>" isso porque em alguns prompt de comando do windows o espaço contido em "Arquivo de Programas" gera um Erro na hora de localizar os executáveis do JDK. Quem usou Windows 95 deve saber do que estou falando. No Windows 7 ou Windows Vista isso pode mudar por exemplo no meu Windows 7 64bits o JDK se instalou em "C:\Program Files (x86)\Java\jdk1.6.0_20", porem o path no prompt de comando correto é "</span><span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">C:\Progra~2\Java\jdk1.6.0_20</span><span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">". Aqui você terá que dar seus pulinhos para configurar corretamente seu ambiente. </span><br />
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Algumas pessoas dirão : <i>Ahh! mas é só colocar entre aspas dupas! "C:\</i></span><span style="font-size: small;"><i><span style="font-family: Arial,Helvetica,sans-serif;">Arquivo de Programas\Java\jdk1.6.0_20".</span></i></span><br />
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">O que posso dizer para essas pessoas é "<i>sim pode</i>"... Mas se não conseguirem compilar depois seus Applets tentem usando a dica do Arquiv~1.</span><br />
<div class="separator" style="clear: both; text-align: center;"><span style="font-size: small;"><a href="https://sites.google.com/site/ricardotakaqui/classpath.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://sites.google.com/site/ricardotakaqui/classpath.png" /></a></span></div><span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Caso você não tenha o Classpath na lista de variáveis crie uma entrada para ele também conforme a figura acima.</span><br />
<div class="separator" style="clear: both; text-align: center;"><span style="font-size: small;"><a href="https://sites.google.com/site/ricardotakaqui/JavaCardHomeVar.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://sites.google.com/site/ricardotakaqui/JavaCardHomeVar.png" /></a></span></div><span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Por ultimo crie a entrada do JCDK conforme a figura acima.</span><br />
<div class="separator" style="clear: both; text-align: center;"><span style="font-size: small;"><a href="https://sites.google.com/site/ricardotakaqui/TestEnv.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://sites.google.com/site/ricardotakaqui/TestEnv.png" /></a></span></div><span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Agora abra um prompt de comando e teste se o ambiente foi configurado corretamente digitando:</span><br />
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;"><b>%JAVA_HOME%\bin\javac -version</b></span><br />
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;"><b>%JC_HOME%\bin\verifycap -version</b></span><br />
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">O resultado deve ser similar a imagem acima, se for parabéns você configurou seu ambiente para desenvolvimento Java Card com sucesso!</span><br />
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Agora descompacte o Eclipse em um local de sua escolha no meu caso eu o coloquei na raiz C: do HD, aliás é onde o pessoal do Eclipse recomenda colocar para evitar problemas.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Descompacte o Plug-In Java Card e copie a pasta "<b>plugins</b>" para a raiz do seu Eclipse, no meu caso "C:\Eclipse".</span><br />
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Execute o Eclipse e se tudo estiver correto você verá três itens de menu novo, "<b>CREF</b>", "<b>Java Card</b>"e "<b>JCWDE</b>", conforme a figura abaixo : </span><br />
<div class="separator" style="clear: both; text-align: center;"><span style="font-size: small;"><a href="https://sites.google.com/site/ricardotakaqui/EclipseJCMenu.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://sites.google.com/site/ricardotakaqui/EclipseJCMenu.png" /></a></span></div><span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Finalmente clique em "<b>Java Card -> Preferences</b>" e configure o local do JCDK, conforme a figura abaixo:</span><br />
<div class="separator" style="clear: both; text-align: center;"><span style="font-size: small;"><a href="https://sites.google.com/site/ricardotakaqui/EclipseJCDKPath.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://sites.google.com/site/ricardotakaqui/EclipseJCDKPath.png" /></a></span></div><span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Bem felizmente essa foi de longe a parte mais difícil de todo processo, agora vem a parte mais fácil de todas que é programar em Java Card.</span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Particularmente eu prefiro utilizar o Netbeans para desenvolvimento Java, inclusive para Java Card porém como o Netbeans traz nativamente o Java Card Dev Kit 3.0(Dependendo da Distro que você baixar), e esses cartões ainda são raros no mercado, resolvi utilizar o Eclipse pois utiliza o JCDK 2.2.2 e esses cartões são facilmente encontrados no mercado inclusive brasileiro, as chances de você conseguir um é infinitamente maior do que conseguir um JC 3 e relembrando o JC 3 é a evolução direta do JC2.2.2.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;"><br />
</span><br />
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Bom, na Parte do 2 do Artigo finalmente vocês Desenvolverão um Applet Java Card e o executará no Simulador JCWDE.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;"><br />
</span><br />
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;"><b>Até a Próxima, Abraços a Todos!</b></span></div>Ricardo Massaohttp://www.blogger.com/profile/13929394839245906485noreply@blogger.com8tag:blogger.com,1999:blog-2847438594432791658.post-51078701382666545902010-12-19T03:21:00.000-08:002011-03-28T07:01:22.716-07:00O Modelo de Memória Java Card<div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Nesse Artigo, veremos como é dividida a estrutura de memória de um Java Card, é muito importante aprender bem este conceito, pois lembre-se Smart Cards são as menores plataformas computacionais e com recursos de processamento e memória por enquanto limitadissimos e embora seja Java os riscos de "<i>memory leaks</i>"(vazamento de memória) são reais, isso em um PC teria pouco impacto pois um simples Reset na máquina e sua memória estaria livre novamente, bem em Java Cards esse reset não existe, por sorte "alguns" cartões implementam o Garbage Collector.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Por conta disso sua aplicação deverá ser escrita de maneira extremamente otimizada e cuidadosa sempre economizando recursos de memória e de processamento.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Java Cards suportam ambos tipos de Objetos, persistent e transient (temporário) porém a mecânica difere da versão Java para PCs.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Um Java Card possui três tipos de Memórias : <b>ROM</b> (Read Only Memory), <b>RAM</b> (Random Access Memory) e <b>EEPROM</b> (Electrically Erasable Programmable Read Only Memory).</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Embora a ROM seja uma memória apenas de Leitura é a de menor custo entre as três e tem o papel de armazenar a API Java Card, API Especiais do Fabricante, dados de configuração do chip e se você tiver muito dinheiro poderá também pedir para incluir uma API só sua nessa área de memória junto ao Fabricante do Chip, ou seja essa memória é gravada no ato da fabricação do Chip e não poderá ser alterada depois.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">A RAM e a EEPROM, podem ser escritas e lidas porém possuem diferenças elétricas entre si, no caso de perda de energia todo conteúdo da RAM será perdida enquanto o da EEPROM será preservada.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Ora porque não utilizar somente EEPROM? Você deve se estar perguntando, porque a escrita na EEPROM leva cerca de 1000 vezes mais tempo que a escrita em memória RAM e a escrita nessas memórias possui também um limite de vezes entre 100000 ~ 500000 ciclos de escrita.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Em contra partida o circuito elétrico de uma memória RAM costuma ser 4 vezes maior que o da memória EEPROM. Aqui se faz valer aquele velho ditado "<i>does not exist a free lunch</i>".</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">A memória pode variar bastante de Fabricante para Fabricante, eu tenho em mãos cartões com (36,72,80)Kb EEPROM / 3,3Kb RAM. Porém acredito que isso deva mudar bastante com os Java Card 3 que vem por ai, basta observar que atualmente uma simples memória SD do tamanho de uma unha alcançam notáveis 16GB ou mais de memória.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Bom após toda essa explicação acredito que tenha ficado claro que Objetos Persistentes ficam na EEPROM, enquanto os Temporários (Transient) ficam na RAM.</span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">E você já deve ter notado o quanto criterioso e cuidadoso você terá que ser enquanto programa para Java Cards.</span></span></div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><b>Objetos Persistentes</b></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Como já foi dito, Objetos Persistentes mantém seus dados integros mesmo após o final de uma sessão ou perda de energia. Esses objetos possuem as seguinte propriedades :</span></span></div><ul><li style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><b> </b>Objetos Peristentes são criados pelo operador <b><span style="font-family: "Courier New",Courier,monospace;">new</span></b>,</span></span></li>
<li style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Guarda seus dados e valores entre sessões.</span></span></li>
<li style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Qualquer alteração de dados ocorre de maneira <b>atomic</b>, ou seja no caso de se haver perda de alimentaçãou ou falha durante a atualização, os dados anteriores serão restaurados.</span></span></li>
<li style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Um objeto persistente pode referenciar um campo em um objeto transiente.</span></span></li>
<li style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Um campo em um objeto persistente pode referenciar um objeto transiente.</span></span></li>
<li style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Se um objeto persistente não for referenciado por outros objetos, ele se torna permanentemente perdido e a área de memória só poderá ser recuperada através do Garbage Collector.</span></span></li>
</ul><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Quando um applet é instanciado, como qualquer outro objeto persistente, os dados e recursos alocados persistem indefinidamente através das sessões seguintes.</span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br />
<b>Objeto Transiente (Temporário)</b></span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Objetos Transientes</span> possuem uma natureza temporária, ou seja dependendo de como for configurado esse objeto tem seus dados destruidos quando outra aplicação for selecionada, ou quando a sessão terminar ou quando houver perda de energia. Assim como os objetos persistentes os recursos alocados pelos objetos transientes não podem ser recuperados sem o auxilio do Garbage Collector.</span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Seu Applet deverá criar objetos transientes apenas uma vez, ou seja uma referencia a esse objeto deverá ser criada e colocada na área persistente e essa mesma referencia deverá ser usada durante as sessões posteriores, a figura abaixo demonstra como objeto transientes são alocadas na memória.</span></span></span></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://4.bp.blogspot.com/_fiEOBlE4kKQ/TT7PssnYNJI/AAAAAAAAAC0/p3QrRT8DuHA/s1600/transientmodel.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/_fiEOBlE4kKQ/TT7PssnYNJI/AAAAAAAAAC0/p3QrRT8DuHA/s1600/transientmodel.PNG" /></a></div><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Apenas <b>arrays </b>de tipos primitivos (<span style="font-family: "Courier New",Courier,monospace;">byte</span>, <span style="font-family: "Courier New",Courier,monospace;">short </span>e <span style="font-family: "Courier New",Courier,monospace;">boolean</span>) e objetos (<span style="font-family: "Courier New",Courier,monospace;">Object</span>) podem ser declarados como transiente. Os objetos transientes possuem as seguintes propriedades :</span></span></span></span><br />
<ul><li><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">São criados invocando-se a API Java Card.</span></span></span></span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Não guarda seus valores entre sessões, os dados serão limpos para valores padrões (<span style="font-family: "Courier New",Courier,monospace;">zero</span>, <span style="font-family: "Courier New",Courier,monospace;">false</span> ou <span style="font-family: "Courier New",Courier,monospace;">null</span>) dependendo da ocorrencia de certos eventos.</span></span></span></span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Qualquer alteração de dados não ocorre de modo <b>atomic</b>, ou seja no caso de se haver perda de energia ou falha durante a atualização, o campo não será restaurado para valores padrões.</span></span></span></span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Um objeto transiente pode referenciar um campo em um objeto persistente.</span></span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Um campo em um objeto transiente pode referenciar um objeto persistente.</span></span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Se um objeto transiente não for refenciado por outro objetos, ele se torna permanentemente perdido e a área de memória só poderá ser recuperada através do Garbage Collector.</span></span><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"></span></span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">A escrita em objetos transientes costuma ser 1000x mais rápida pois os dados são escritos na Memória RAM.</span></span></li>
</ul><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Objetos transientes devem ser usados como pequenas áreas temporárias pelo Applet, em que dados são frequentemente modificados e não necessitam ser persistentes.</span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Utilizando objetos transiente também reduz a escrita na EEPROM aumentando o tempo de vida útil da mesma, a performance e a segurança sobre dados sensíveis como chaves criptográficas de sessão.</span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Em contra partida use com moderação pois a memória RAM é pequena em capacidade cerca de 20x menos que a EEPROM.</span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">Existem dois tipos de Objetos Transientes <span style="font-family: "Courier New",Courier,monospace;">CLEAR_ON_RESET</span> e <span style="font-family: "Courier New",Courier,monospace;">CLEAR_ON_DESELECT</span>, que basicamente associa o evento em que o JCRE irá limpar os campos do objeto.</span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;">CLEAR_ON_RESET</span>, esse tipo de Objeto mantém seus dados íntegros durante a seleção de outros Applets, é usado geralmente nos casos em que Applets compartilham ou trabalham em conjunto ou mesmo para aplicações que trabalhem com diversos Applets em uma mesma sessão, ou seja os dados são perdidos em caso de reset ou perda de Energia.</span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;">CLEAR_ON_DESELECT</span>, esse tipo de Objeto mantém seus dados integros enquanto um Applet permanecer Selecionado, ou seja os dados são perdidos se outro Applet for selecionado, em caso de reset ou perda de Energia.</span></span></span><br />
<br />
<b><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Criando Objetos Transientes</span></span></span></b><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Conforme dito acima Objetos Transientes são criados através de uma chamada à API Java Card <span style="font-family: "Courier New",Courier,monospace;">JCSystem</span>.</span></span></span><br />
<pre class="java" name="code">/**
* Cria um Array Transiente boolean
* @param length - Tamanho do Array Transiente
* @param event - CLEAR_ON_RESET ou CLEAR_ON_DESELECT
* @return - Array
*/
public static boolean[]
makeTransientBooleanArray(short length, byte event)
/**
* Cria um Array Transiente byte
* @param length - Tamanho do Array Transiente
* @param event - CLEAR_ON_RESET ou CLEAR_ON_DESELECT
* @return - Array
*/
public static byte[]
makeTransientByteArray(short length, byte event)
/**
* Cria um Array Transiente short
* @param length - Tamanho do Array Transiente
* @param event - CLEAR_ON_RESET ou CLEAR_ON_DESELECT
* @return - Array
*/
public static short[]
makeTransientShortArray(short length, byte event)
/**
* Cria um Array Transiente Object
* @param length - Tamanho do Array Transiente
* @param event - CLEAR_ON_RESET ou CLEAR_ON_DESELECT
* @return - Array
*/
public static Object[]
makeTransientObjectArray(short length, byte event)
</pre><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">O Seguinte Fragmento de Código demonstra como é criado um objeto transiente:</span><br />
<pre class="java" name="code">//Cria um Buffer de 10 Elementos Limpos on reset
byte[] buffer =
JCSystem.makeTransientByteArray(10,JCSystem.CLEAR_ON_RESET);
</pre><span style="font-family: Arial,Helvetica,sans-serif;"></span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Verificando por objetos transientes</b> </span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Quando um Applet necessita acessar objetos criados por outros Applets, a classe <span style="font-family: "Courier New",Courier,monospace;">JCSystem</span> oferece um método para verificar o tipo de objeto através do seguinte método:</span></span></span></span><br />
<pre class="java" name="code">public static byte isTransient(Object theObject)
</pre><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"> </span>O Método <span style="font-family: "Courier New",Courier,monospace;">isTransient</span> retorna um dos tipos (<span style="font-family: "Courier New",Courier,monospace;">CLEAR_ON_RESET</span> ou <span style="font-family: "Courier New",Courier,monospace;">CLEAR_ON_DESELECT</span>) ou uma constante <span style="font-family: "Courier New",Courier,monospace;">JCSystem.NOT_A_TRANSIENT_OBJECT</span> para indicar se um Objeto é null ou persistente.</span></span></span><br />
<br />
<b><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Memory Leak um risco real</span></span></span></b><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"> Sempre que um Applet é Apagado ou De-Instanciado, todos os recursos alocados serão liberados automaticamente pelo JCRE, porém existe riscos de vazamento de memória, e no Java Card caso não tenha um Garbage Collector implementado a memória é perdida permanentemente.</span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Considere o seguinte exemplo:</span></span></span><br />
<pre class="java" name="code">public class MyApplet extends Applet {
//Buffer de teste
private byte[] buffer;
//Construtor
public MyApplet(){
//Cria um Objeto Persistente de 10 Bytes
buffer = new byte[10];
register();
}
//Um Metodo que causa Memory Leak
public void MyMethod() {
//Realoca buffer com mais 20 bytes.
buffer = new byte[20];
...
}
}
</pre><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Na linha 10 criamos um array de 10 bytes persistente no construtor.</span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Na linha 19 um método aloca 20 bytes, porém nesse momento os 10 bytes alocados no construtor serão permanentemente pedidos caso não exista Garbage Collector implementado.</span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">E vale lembrar que nem todos os cartões possuem o GC implementado, logo muitíssimo cuidado ao trabalhar com a Memória de um Java Card.</span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">No exemplo acima, o correto seria na linha 10 criarmos um array de 20 bytes e eliminar a linha 19, com isso no momento de exclusão ou de-instanciamento do Applet os 20 bytes serão liberados automaticamente pelo JCRE.</span></span></span><b><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"> </span></span></span></b><br />
<br />
<b><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Colocando para funcionar</span></span></span></b><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Ok, após toda essa extensa explicação chegou a hora de testar-mos tudo o que vimos até agora.</span></span></span><br />
<pre class="java" name="code">import javacard.framework.*;
public class MemoryTest extends Applet {
/** Instrução Read Memory */
private static final byte INS_READ_MEMORY = 0x02;
/** Instrução de Estrita na EEPROM */
private static final byte INS_WRITE_EEPROM = 0x04;
/** Instrução de Estrita na RAM */
private static final byte INS_WRITE_RAM = 0x06;
/** Tamanho do Objeto */
private static final short ARRAY_SIZE = 10;
/** Objeto Persistente */
byte[] eeprom_ba;
/** Objeto Transiente */
byte[] ram_ba;
/**
* Construtor
*/
private MemoryTest() {
//Persistent, Objeto e Dados gravados na EEPROM
this.eeprom_ba = new byte[ARRAY_SIZE];
//Transient, Objeto na EEPROM e Dados na RAM
this.ram_ba = JCSystem.makeTransientByteArray(
ARRAY_SIZE, JCSystem.CLEAR_ON_DESELECT);
}
/**
* Installer
* @param bArray
* @param bOffset
* @param bLength
* @throws ISOException
*/
public static void install(
byte bArray[], short bOffset, byte bLength)
throws ISOException
{
new MemoryTest().register();
}
/**
* Processa APDU's
*/
public void process(APDU apdu){
//Adquire Referencia do buffer de entrada e saida
byte buffer[] = apdu.getBuffer();
//Boa Prática: Retorna 9000 no SELECT
if (selectingApplet())
ISOException.throwIt(ISO7816.SW_NO_ERROR);
//Verifica Instrução enviada pelo Host
switch ( buffer[ISO7816.OFFSET_INS] ){
//Instrução de leitura de Memória
case INS_READ_MEMORY :
{
short i;
//Copia os 10 bytes do Objeto Persistente
//seguido dos 10 bytes do Objeto Transiente
for ( i = 0 ; i < ARRAY_SIZE ; i++ ){
buffer[i] = eeprom_ba[i];
buffer[i + ARRAY_SIZE] = ram_ba[i];
}
//Sinaliza JCRE que retornará dados
apdu.setOutgoingAndSend(
(short) 0, (short)(ARRAY_SIZE * (short) 2));
//Rertorna dados e 0x9000
ISOException.throwIt(ISO7816.SW_NO_ERROR);
}
//Instrução de Escrita na EEPROM
case INS_WRITE_EEPROM :
{
//Adquire Quantidade de dados Recebidos
short count = apdu.setIncomingAndReceive();
//Se Quantidade de Dados Recebidos Incorreto
if ( count != ARRAY_SIZE )
ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);
//Copia dados Recebidos para o objeto Persistente
Util.arrayCopy(
buffer, ISO7816.OFFSET_CDATA, eeprom_ba, (short) 0, count);
//Rertorna 0x9000
ISOException.throwIt(ISO7816.SW_NO_ERROR);
}
//Instrução de Escrita na RAM
case INS_WRITE_RAM :
{
//Adquire Quantidade de dados Recebidos
short count = apdu.setIncomingAndReceive();
//Se Quantidade de Dados Recebidos Incorreto
if ( count != ARRAY_SIZE )
ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);
//Copia dados Recebidos para o objeto Transiente
Util.arrayCopy(
buffer, ISO7816.OFFSET_CDATA, ram_ba, (short) 0, count);
//Rertorna 0x9000
ISOException.throwIt(ISO7816.SW_NO_ERROR);
}
}//Switch END
//Boa practica: Se não conhece a Instrução apenas diga:
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
}
}
</pre><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Infelizmente para testar com eficiência esse código é necessário um cartão Java Card real ou simula-lo no <b>CREF(C Reference Implementation Simulator)</b>, porém o CREF é de difícil configuração e seu Applet deve ser instalado da mesma forma como se instala em um cartão físico, e a memória EEPROM deve ser gravada em um arquivo no HD para se simular a persistencia, porém lidar com todas essas variáveis do CREF está fora do Escopo desse Artigo.</span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Na linha 23 criamos um Objeto Persistente que se trata de um array de 10 bytes que será armazenado na EEPROM tanto a referência como o campo de dados.</span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Na linha 26 criamos um Objeto Transiente utilizando a API Java Card que se trata de um array de 10 bytes que será armazenado na EEPROM apenas a referencia desse objeto, enquanto o campo de dados será aramazenada na RAM.</span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Da linha 60 a 77 fica a porção de código responsável pela leitura dos dados dos Objetos.</span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Da linha 80 a 95 fica a porção de código que irá gravar os dados contidos na área de Dados do APDU no objeto persistente.</span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">E finalmente da linha 98 a 113 fica a porção de código que irá gravar os dados contidos na área de Dados do APDU no objeto transiente.</span></span></span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Para ler a memória basta enviar o seguinte APDU:</span></span></span><br />
<div style="font-family: "Courier New",Courier,monospace;"><span style="font-size: small;">0x00 0x02 0x00 0x00 0x00</span></div><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Para Escrever 10 FF's na EEPROM :</span></span></span><br />
<div style="font-family: "Courier New",Courier,monospace;"><span style="font-size: small;">0x00 0x04 0x00 0x00 0x0A 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF</span></div><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Para Escrever 10 AA's na RAM :</span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;">0x00 0x06 0x00 0x00 0x0A 0xAA 0xAA 0xAA 0xAA 0xAA 0xAA 0xAA 0xAA 0xAA 0xAA</span><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"> </span></span></span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Com isso vocês poderão testar a natureza de Objetos Persistent e Transient do Java Card.</span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Existe ainda 2 tópicos relacionados a Memória a <b>Atomicidade</b> e a <b>Transação</b>, o qual abordarei ainda em artigos futuros aguardem.</span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Um Grande Abraços a todos!</b><br />
</span></span></span></div>Ricardo Massaohttp://www.blogger.com/profile/13929394839245906485noreply@blogger.com3tag:blogger.com,1999:blog-2847438594432791658.post-86079119233026464572010-12-19T01:50:00.000-08:002011-02-20T04:31:12.538-08:00Atomicidade e Transações<div style="text-align: justify;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"></span></span></div><div style="text-align: justify;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Smart Cards diariamente tem se tornado um micro-dispositivo preferido para armazenar dados sigilosos, identificar pessoas, realizar operações de autenticação, etc.</span></span></div><div style="text-align: justify;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Entretanto quando se usa Smart Cards existem riscos de ocorrerem falhas durante a execução a qualquer momento.</span></span></div><div style="text-align: justify;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Falhas podem ocorrer por erros computacionais, remoção do Smart Card do Leitor, corte na alimentação de energia da CPU do cartão, etc.</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">No entanto o JCRE provê um robusto mecanismo que garante operações atômicas, esse mecanismo suporta 2 níveis.</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Primeiro, a plataforma Java Card garante que qualquer atualização em um simples campo de um objeto persistente ou um campo simples em uma classe é atômica.</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Segundo, a plataforma Java Card suporta um modelo de transação, o qual um applet pode agrupar uma série de atualizações, nesse modelo toda atualização é assegurada atômicamente.</span></span><br />
<br />
<b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Atomicidade (Atomicity).</span></span></b><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Atomicity em Java Card quer dizer que qualquer atualização a um campo simples de um objeto persistente inclusive arrays, ou um campo de uma classe é totalmente garantida, caso contrário os dados anteriores serão restaurados. Por exemplo, um campo em um objeto armazena um valor 1 e começa a ser atualizado para o valor 2, nesse exato momento o cartão é removido do leitor, na próxima vez em que o cartão for alimentado o valor desse campo é restaurado para 1 novamente.</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Este conceito de Atomicidade somente é aplicado sobre o armazenamento persistente, no caso de armazenamento de natureza transiente, os dados não serão restaurados em caso de perda de energia ou falhas serão iniciados com os valores padrões (<span style="font-family: "Courier New",Courier,monospace;">zero</span>, <span style="font-family: "Courier New",Courier,monospace;">false</span> ou <span style="font-family: "Courier New",Courier,monospace;">null</span>).</span></span><b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"> </span></span></b><br />
<br />
<b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Atualizações de um Array.</span></span></b><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">A classe <b>javacard.framework.Util</b> provê o método <b>arrayCopy</b> que garante a Atomicidade durante a atualização de um bloco de dados em arrays.</span></span><br />
<pre class="java" name="code">public static short arrayCopy(
byte[] src,short srcOff,byte[] dest,short desOff,short length )
</pre><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">O método <b>Util.arrayCopy</b> garante que cada byte será corretamente copiado, ou o destino é restaurado para os valores anteriores, porém caso o destino seja um objeto transiente seus dados não serão preservados.</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Entretanto para garantir a Atomicidade <b>arrayCopy</b> necessita de mais ciclos de escrita em <b>EEPROM</b>, e isso tende a ser lento. Caso seu Applet não precise de atomicidade durante atualizações de arrays considere o uso do método <b>Util.arrayCopyNonAtomic</b>.</span></span><br />
<pre class="java" name="code">public static short arrayCopyNonAtomic(
byte[] src,short srcOff,byte[] dest,short desOff,short length )
</pre><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Ao contrário do <b>arrayCopy</b>, o método <b>arrayCopyNonAtomic</b> não utiliza a atomicidade durante a cópia, mesmo que uma operação de Transação esteja em progresso no momento.</span></span><br />
<br />
<b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Transações (Transactions)</span></span></b><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Transações são geralmente utilizadas quando um Applet necessitar que vários campos e objetos diferentes devem ser atualizados de maneira atômica por exemplo um Applet Moedeiro deve realizar as seguintes operações:</span></span><br />
<ul><li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Incrementar o número de transações.</span></span></li>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Creditar ou Debitar o montante de Crédito.</span></span></li>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Gravar um Log contento terminal, data, hora, etc.</span></span></li>
</ul><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Para esse caso em particular, notem que diversos campos são manipulados em sequência, agora imaginem que o número de transação foi incrementado, porém no momento em que o montante de crédito está sendo atualizado, ocorre uma das falhas já descritas.</span></span></div><div style="text-align: justify;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Mesmo com a atomicidade garantindo que valores sejam restaurados, o número de transação se torna incoerente pois já foi incrementado antes da falha ocorrer, com isso temos um corrompimento na estrutura de dados do cartão.</span></span></div><div style="text-align: justify;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Com isso você pode facilmente imaginar um corrompimento mais severo, como por exemplo o número de transação e o valor do crédito ser atualizado, porém no momento em que um dos elementos do Log estiver sendo atualizado uma falha ocorrer.</span></span></div><div style="text-align: justify;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"></span></span></div><div style="text-align: justify;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Para casos críticos como este em que se é vital que dados distintos mantenham uma sincronia coerente a tecnologia Java Card provê um mecanismo similar ao usados em banco de dados relacionais (RDBMS) baseado no conceito <i>begin</i>, <i>commit</i> e <i>rollback</i>.</span></span><b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"> </span></span></b><br />
<br />
<b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Commit Transaction</span></span></b></div><div style="text-align: justify;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Uma transação é iniciada invocando-se o método <b>JCSystem.beginTransaction</b> e termina ao se usar o método <b>JCSystem.commitTransaction</b>.</span></span></div><div style="text-align: justify;"><pre class="java" name="code">//Inicia Transação
JCSystem.beginTransaction();
//Operações
...
//Finaliza Transação
JCSystem.commitTransaction();
</pre><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Todas as operações de atualizações de campos e objetos persistentes, tem a natureza temporária e em caso de falhas os dados anteriores não serão perdidos, todas as atualizações serão gravadas e garantidas após a invocação do método <b>commitTransaction</b>.</span></span><b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"> </span></span></b><br />
<br />
<b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Abort Transaction</span></span></b><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Transações podem ser abortadas tanto pelo Applet quanto pelo JCRE. Para o caso de o Applet encontrar uma falha interna seja qual for a natureza, ele pode expressamente cancelar toda a transação invocando o método <b>JCSystem.abortTransaction</b>, todas as alterações serão descartadas, isso é similar ao <i>rollback</i> dos RDBMS.</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Caso esse método seja invocado fora de uma transação o JCRE lançará uma exceção <span style="font-family: "Courier New",Courier,monospace;">TransactionException</span>.</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Caso uma transação não seja explicitamente terminada pelo <b>commitTransaction</b> o JCRE automaticamente invocará o método <b>abortTransaction</b>.</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Caso ocorra uma das falha de perda de alimentação, erro computacional, reset de cartão, etc. Enquanto uma transação está ocorrendo, na próxima vez em que o cartão for alimentado o JCRE automaticamente utilizará um <i>rollback</i> especial restaurando todos os dados anteriores dos campos e objetos envolvidos durante a transação e toda a memória temporária utilizada será liberada, evitando assim o Memory<i> Leak</i>.</span></span><b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"> </span></span></b><br />
<br />
<b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Transações Aninhadas</span></span></b><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Java Cards não suportam transações aninhadas, isso que dizer caso uma Classe tenha invocado o <b>beginTransaction</b> e durante esse processo, uma outra Classe envolvida também invocar o <b>beginTransaction</b> o JCRE lançará uma exceção <span style="font-family: "Courier New",Courier,monospace;">TransactionException</span>.</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Uma Classe pode descobrir se uma transação está em execução invocando o método <b>JCSystem.transactionDepth</b>, esse método retornará 1 caso uma transação estiver em progresso e 0 caso contrário.</span></span><b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"> </span></span></b><br />
<br />
<b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Capacidade de uma Transação</span></span></b><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Para suportar o rollback de transações não cometidas o JCRE mantém um <i>commit buffer</i> onde o conteúdo original dos campos são armazenados antes do <i>commit</i>.</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Obviamente quanto maior as operações contidas no bloco de transação, maior será o consumo do <i>commit buffer</i>.</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Porém o tamanho desse buffer varia de uma implementação para outra, dependem também da quantidade de memória disponível no cartão. No geral, o <i>commit buffer</i> alocado pela implementação do JCRE é grande o suficiente para atender a necessidade da maioria dos Applets, <i>commit buffers</i> costumam não excedem algumas dezenas de bytes.</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Como você já deve estar acostumado com as limitações de um Java Card, já deve ter percebido o quão criterioso deverá ser ao usar esse recurso, apenas em blocos de dados críticos e o menor possível.</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Felizmente o <b>JCSystem</b> fornece dois métodos que ajudam o Applet a determinar qual a capacidade do <i>commit buffer</i> disponível em determinada implementação do JCRE. Isso quer dizer que cabe a você calcular a quantidade de dados que um bloco de transação utilizará e testar se o <i>commit buffer</i> o atenderá em determinado cartão. </span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">O seguinte método <b>JCSystem.getMaxCommitCapacity</b> retorna o número total de bytes contido no <i>commit buffer</i>.</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">E o método <b>JCSystem.getUnusedCommitCapacity</b> retorna o número de bytes disponíveis para uso no <i>commit buffer</i>.</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Adicionalmente ainda temos o overhead causado pelas operações dentro do bloco de transações, imaginem o seguinte cenário:</span></span><br />
<ul><li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Variavel Persistente A possui o valor 1</span></span></li>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Variavel Persistente B possui o valor 1 </span></span></li>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Applet Invoca beginTransaction</span></span></li>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">A = 2 ( Valor 1 é armazenado no commit buffer)</span></span></li>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">B = 2 ( Valor 1 é armazenado no commit buffer)</span></span></li>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">A = A + B (Valor 2 da variavel A é armazenado no commit buffer)</span></span></li>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Applet Invoca commitTransaction </span></span></li>
</ul><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Observem que quando somamos A + B e armazenamos em A causamos o overhead, pois A ainda possui o valor temporário e foi utilizado em uma operação dentro do bloco de transação, pode parecer estranho isso, mas lembre-se que A e B são variáveis persistentes e qualquer alteração dupla mesmo dentro do bloco de transação causa o efeito atômico.</span></span><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"> </span></span></div><div style="text-align: justify;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Por fim caso o espaço do <i>commit buffer</i> termine durante um processo de Transação o JCRE lançará um <span style="font-family: "Courier New",Courier,monospace;">TransactionException</span>.</span></span><b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"> </span></span></b></div><div style="text-align: justify;"></div><div style="text-align: justify;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"></span></span></div><div style="text-align: justify;"><b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">TransactionException</span></span></b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"> </span></span></div><div style="text-align: justify;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">O JCRE lançará essa exceção quando certos tipos distindo de problemas ocorrerem, TransactionException é uma subclasse de RuntimeException, sendo assim ele provê uma das razões que provocou o lançamento da exceção, são elas:</span></span><br />
<ul><li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;">IN_PROGRESS</span> - beginTransaction invocado quando uma operação de Transação já esta em progresso.</span></span></li>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;">NOT_IN_PROGRESS</span> - commitTransaction ou abortTransaction invocado sem que uma Transação esteja em progresso.</span></span></li>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;">BUFFER_FULL</span> - commit buffer sem espaço suficiente para realizar operação.</span></span></li>
<li><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;">INTERNAL_FAILURE</span> - Erro interno do mecanismo de transação.</span></span></li>
</ul><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Caso seu Applet capture a exceção ele deve tratar o erro com base na causa e remediar a situação, caso contrário o JCRE automaticamente usará o <i>rollback</i>.</span></span></div><div style="text-align: justify;"></div><div style="text-align: justify;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Bem, isso foi uma explicação detalhada dos funcionamentos da Atomicidade e Transação, características poderosas do Java Card, não escreverei um programa de testes, pois não existe maneira eficiente de testar esses mecanismos, pois julgo impossível saber quando o cartão está escrevendo o campo ou os campos em uma transação e nesse exato momento retirar o cartão da leitora. A mim e a você resta apenas saber que esses mecanismos existem e em caso de falhas feche seu olhos e acredite que eles irão funcionar.</span></span><b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"> </span></span></b><br />
<br />
<b><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Um Grande Abraço a Todos e Até a Próxima! </span></span></b><br />
<br />
</div><div style="text-align: justify;"></div>Ricardo Massaohttp://www.blogger.com/profile/13929394839245906485noreply@blogger.com0tag:blogger.com,1999:blog-2847438594432791658.post-1960626457385265962010-12-19T01:49:00.000-08:002011-01-08T10:13:43.593-08:00Hello World Java Card! (Parte 2 - Desenvolvendo e Testando Applets)<div style="text-align: justify;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Chegou a hora de criarmos nossa primeira Aplicação e testa-la com o Simulador <b>JCWDE</b>.</span></span></div><div style="text-align: justify;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Tenha certeza de ter configurado com sucesso o seu ambiente de desenvolvimento antes de começar, se ainda não o fez <a href="http://planetsmartcards.blogspot.com/2010/12/hello-world-java-card-parte-1.html">clique aqui</a>.</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Abra o Eclipse e vá no menu "<b>File > New > Other...</b>" e escolha "<b>Java Card Project</b>".</span></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://2.bp.blogspot.com/_fiEOBlE4kKQ/TSZp-QUr4MI/AAAAAAAAAA8/f3PL1h_7MbU/s1600/jcnewproject.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="380" src="http://2.bp.blogspot.com/_fiEOBlE4kKQ/TSZp-QUr4MI/AAAAAAAAAA8/f3PL1h_7MbU/s400/jcnewproject.png" width="400" /></a></div><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"> </span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Pressione "Next" e digite "<b>JCApplets</b>" no campo "<i>Project name</i>" depois "<i>Next</i>" e "<i>Finish</i>".</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Repita o processo novamente só que escolhendo "<b>Java Card Applet</b>".</span></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://4.bp.blogspot.com/_fiEOBlE4kKQ/TSZwg1cYOSI/AAAAAAAAABA/rtqVGkMTmh0/s1600/jcapplet.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="http://4.bp.blogspot.com/_fiEOBlE4kKQ/TSZwg1cYOSI/AAAAAAAAABA/rtqVGkMTmh0/s400/jcapplet.png" width="373" /></a></div><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Digite "<b>jchelloworld</b>" no campo "<i>Package:</i>" e "<b>JCHelloWorld</b>" no campo "<i>Name</i>" e pressione "<i>Finish</i>".</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"></span></span><br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://1.bp.blogspot.com/_fiEOBlE4kKQ/TSZ19AdmxMI/AAAAAAAAABE/DF5Dn0hgYXY/s1600/jcprojectfinal.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/_fiEOBlE4kKQ/TSZ19AdmxMI/AAAAAAAAABE/DF5Dn0hgYXY/s1600/jcprojectfinal.png" /></a></div><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">A imagem acima ilustra como deve ficar seu projeto ao final. Clique duas vezes e JCHelloWorld.java e realize as seguintes alterações no código conforme abaixo.</span></span><br />
<pre class="java" name="code">package jchellorworld;
import javacard.framework.*;
public class JCHelloWorld extends Applet {
/** Buffer de Eco */
private byte[] echoBytes;
/** Tamanho Máximo do Buffer */
private static final short LENGTH_ECHO_BYTES = 256;
/**
* Only this class's install method should
* create the applet object.
*/
private JCHelloWorld() {
//Inicia Buffer de Eco
echoBytes = new byte[LENGTH_ECHO_BYTES];
//Torna Selecionavel
register();
}
/**
* Installs this applet.
* @param bArray the array containing installation parameters
* @param bOffset the starting offset in bArray
* @param bLength the length in bytes of the parameter data
* in bArray
*/
public static void install
(byte bArray[], short bOffset, byte bLength)
throws ISOException
{
//Apenas o Método Install pode criar o Applet
new JCHelloWorld();
}
/**
* Processes an incoming APDU.
* @see APDU
* @param apdu the incoming APDU
* @exception ISOException with the response bytes per
* ISO 7816-4
*/
public void process(APDU apdu) throws ISOException {
//Adquire Referencia do Buffer APDU
byte buffer[] = apdu.getBuffer();
//Adquire Quantidade de dados Recebidos
short bytesRead = apdu.setIncomingAndReceive();
//Quantidade a se Ecoar
short echoOffset = (short)0;
//Ao Selecionar boa prática retornar 0x9000
if (selectingApplet())
return;
//Copia dado Recebido para buffer de eco
while ( bytesRead > 0 ) {
Util.arrayCopyNonAtomic(
buffer, //Fonte de Dados
ISO7816.OFFSET_CDATA,//Ponto de Inicio
echoBytes, //Destino dos Dados
echoOffset, //Ponto de Inicio
bytesRead); //Quantidade a copiar
//Desloca OffSet
echoOffset += bytesRead;
//Atualiza Quantidade Remanescente
bytesRead = apdu.receiveBytes(ISO7816.OFFSET_CDATA);
}
//Informa JCRE que haverá dados de resposta
apdu.setOutgoing();
//Informa JCRE quantidade de dados
apdu.setOutgoingLength( (short) (echoOffset + 5) );
//Ecoa o Cabeçalho Recebido
apdu.sendBytes( (short)0, (short) 5);
//Ecoa os Dados recebidos
apdu.sendBytesLong( echoBytes, (short) 0, echoOffset );
}
}
</pre><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Salve todo o Projeto.</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">O Código em questão é o exemplo que se recebe junto com o JCDK e pode ser encontrado em "<b>C:\JCDK222\samples\src\com\sun\javacard\samples\HelloWorld\HelloWorld.java</b>".</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Agora vá no "<i>Package Explorer</i>" e selecione o arquivo "<b>JCHelloWorld.java</b>" e clique no menu "<i>Java Card</i>" e "<i>Generate Script</i>".</span></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://1.bp.blogspot.com/_fiEOBlE4kKQ/TSfNdeBZkuI/AAAAAAAAABI/0cOjR2V8gC4/s1600/genscript.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/_fiEOBlE4kKQ/TSfNdeBZkuI/AAAAAAAAABI/0cOjR2V8gC4/s1600/genscript.png" /></a></div><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"> Com isso 2 novos arquivos serão criados no "<i>Package Explorer</i>".</span></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://4.bp.blogspot.com/_fiEOBlE4kKQ/TSfOaAOdgkI/AAAAAAAAABM/i5Df64ScAY0/s1600/generated_scripts.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/_fiEOBlE4kKQ/TSfOaAOdgkI/AAAAAAAAABM/i5Df64ScAY0/s1600/generated_scripts.png" /></a></div><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Esses arquivos contém os APDU's que usaremos para acessar o Applet enquanto ele estiver sendo simulado pelo JCWDE.</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Para iniciar a simulação clique no menu "<b>JCWDE > Debug</b>" e pressione "OK".</span></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://4.bp.blogspot.com/_fiEOBlE4kKQ/TSfQ1YgAJdI/AAAAAAAAABQ/RkMDxEpFF7k/s1600/start_jcwde.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="http://4.bp.blogspot.com/_fiEOBlE4kKQ/TSfQ1YgAJdI/AAAAAAAAABQ/RkMDxEpFF7k/s400/start_jcwde.png" width="366" /></a></div><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Se tudo ocorreu bem seu Applet deve estar sendo executado conforme a figura abaixo.</span></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"><a href="http://3.bp.blogspot.com/_fiEOBlE4kKQ/TSfUE4VqD_I/AAAAAAAAABY/MgCkEHk1HJo/s1600/jcwde_console.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/_fiEOBlE4kKQ/TSfUE4VqD_I/AAAAAAAAABY/MgCkEHk1HJo/s1600/jcwde_console.png" /></a></div><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Agora execute o "<b>APDU Tool</b>" que se encontra em "<b>C:\JCDK222\bin\apdutool.bat</b>".</span></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://2.bp.blogspot.com/_fiEOBlE4kKQ/TSfWR_s0pdI/AAAAAAAAABc/wWK8uAC5Abo/s1600/apdutool_console.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/_fiEOBlE4kKQ/TSfWR_s0pdI/AAAAAAAAABc/wWK8uAC5Abo/s1600/apdutool_console.png" /></a></div><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Se chegou até aqui, parabéns pois configurou o ambiente todo corretamente e está pronto para desenvolver para qualquer Java Card disponíveis atualmente no mercado.</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Agora abra os arquivos de Script "<b>create-JCHelloWorld.script</b>" e </span></span><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">"<b>select-JCHelloWorld.script</b>" </span></span><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">que o Eclipse criou para você nesses arquivos se encontram os APDU's para teste do seu Applet.</span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Vamos alimentar o cartão digitando o seguinte comando:<i> </i></span></span><br />
<div style="font-family: "Courier New",Courier,monospace;"><span style="font-size: small;"><i>powerup;</i></span></div><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Com isso você receberá em retorno o ATR do Simulador : "<i style="font-family: "Courier New",Courier,monospace;">0x3B 0xF0 0x11 0x00 0xFF 0x00</i>". </span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Vamos selecionar o Card Manager do Simulador digitando o APDU : </span></span><br />
<div style="font-family: "Courier New",Courier,monospace;"><i><span style="font-size: small;">0x00 0xA4 0x04 0x00 0x09 0xa0 0x00 0x00 0x00 0x62 0x03 0x01 0x08 0x01 0x7F;</span></i></div><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"> Com isso você receberá em retorno o APDU enviado e o Famoso SW1=90 SW2=00 em resposta.</span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Vamos Instalar o Applet tornando-o Selecionavel, isso irá rodar o Método "<i>install</i>" do Applet, digite o APDU:</span></span><br />
<div style="font-family: "Courier New",Courier,monospace;"><i><span style="font-size: small;">0x80 0xB8 0x00 0x00 0xd 0xb 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x00 0x00 0x00 0x7F;</span></i></div><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Em resposta você deverá receber o 9000 indicando tudo Ok.</span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Vamos enfim selecionar nosso Applet digitando o APDU :</span></span><br />
<div style="font-family: "Courier New",Courier,monospace;"><i><span style="font-size: small;">0x00 0xA4 0x04 0x00 0xb 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x00 0x00 0x7F;</span></i></div><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Em resposta nosso Applet deverá retornar 9000. </span></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://4.bp.blogspot.com/_fiEOBlE4kKQ/TSfgDwO0bcI/AAAAAAAAABk/IzyA8mM6XW4/s1600/apdutool_startup.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/_fiEOBlE4kKQ/TSfgDwO0bcI/AAAAAAAAABk/IzyA8mM6XW4/s1600/apdutool_startup.png" /></a></div><div class="separator" style="clear: both; text-align: center;"></div><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Nesse ponto nossa aplicação estará pronta para realizar o que programamos nela ou seja ecoar de volta qualquer dados que enviarmos a ela.</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Então vamos enviar nossos dados para ela, como esse Applet é super simples ele não checa os Bytes CLA, INS, P1 e P2, ou seja a aplicação sempre ecoará o que receber no seguinte formato [CLA,INS,P1,P2] + [DATA se existir].</span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Vamos montar nosso primeiro APDU ISO-7816:</span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>CLA = <span style="font-family: "Courier New",Courier,monospace;">0x00</span></b></span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>INS = <span style="font-family: "Courier New",Courier,monospace;">0x00</span></b></span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>P1 = <span style="font-family: "Courier New",Courier,monospace;">0x00</span></b></span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>P2 = <span style="font-family: "Courier New",Courier,monospace;">0x00</span></b></span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Lc = <span style="font-family: "Courier New",Courier,monospace;">0x06 </span>- </b>Aqui indicamos que enviaremos 6 bytes de dados.<b> </b></span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>DATA = <span style="font-family: "Courier New",Courier,monospace;">0x0A 0x0B 0x0C 0x0D 0x0E 0x0F</span></b></span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Le = <span style="font-family: "Courier New",Courier,monospace;">0x7F</span></b> </span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Logo digite no APDU Tool :</span></span><br />
<div style="font-family: "Courier New",Courier,monospace;"><i><span style="font-size: small;">0x00 0x00 0x00 0x00 0x06 0x0A 0x0B 0x0C 0x0D 0x0E 0x0F 0x7F;</span></i></div><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Em resposta teremos :</span></span><br />
<div style="font-family: "Courier New",Courier,monospace;"><i><span style="font-size: small;">0x00 0x00 0x00 0x00 0x06 0x0A 0x0B 0x0C 0x0D 0x0E 0x0F 0x90 0x00;</span></i></div><div style="font-family: "Courier New",Courier,monospace;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="http://4.bp.blogspot.com/_fiEOBlE4kKQ/TShYi1qk_LI/AAAAAAAAABo/xBW7nkws1j8/s1600/test_hello.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/_fiEOBlE4kKQ/TShYi1qk_LI/AAAAAAAAABo/xBW7nkws1j8/s1600/test_hello.png" /> </a></div><div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: justify;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Se tudo estiver conforme a figura acima, parabéns, você escreveu e testou um Applet Java Card com sucesso! E está pronto para testar os demais Applets que o JCDK traz como demonstração na pasta "<i>Sample</i>"</span></span>.</div><div class="separator" style="clear: both; text-align: justify;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Uma breve explicação sobre o código fonte em questão, todos seus Applets extenderão "<b>javacard.framework.Applet</b>" e você deverá re-escrever dois métodos em especial "<i style="font-family: "Courier New",Courier,monospace;">install</i>" e "<i><span style="font-family: "Courier New",Courier,monospace;">process</span></i>" o método install é chamado pelo Card Manager do cartão assim que um comando de instalação (Global Platform) é invocado pelo Host. Lembrem-se no artigo sobre Global Platform havia explicado que o processo de instalação de uma aplicação no cartão compreendem em duas partes, carga (load) e instalação (install for install ou install for make selectable). </span></span></div><div class="separator" style="clear: both; text-align: justify;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">No método install você deverá instanciar seu Applet através do construtor, iniciar variáveis, alocar recursos e finalmente registrar seu Applet na lista de aplicações do cartão através do método "<span style="font-family: "Courier New",Courier,monospace;">register</span>", que pode ou não receber parametros no ato da instalação.</span></span></div><div class="separator" style="clear: both; text-align: justify;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">O método process é chamado sempre que o Host envia dados para o cartão, lembre-se do comando ISO-7816 "<b>select</b>" que enviamos antes de enviar-mos nossa APDU para o cartão, ele informa ao JCRE para selecionar nosso Applet na lista de aplicações e a partir desse momento todos os APDU's seguintes serão enviados para nosso Applet através do método process.</span></span></div><div class="separator" style="clear: both; text-align: justify;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span></span></div><div class="separator" style="clear: both; text-align: justify;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">Bom espero que esse artigo tenha sido esclarecedor para você, no próximo artigo estarei ensinando como fazer tudo isso utilizando um cartão físico real, para tanto será necessário um Java Card de Desenvolvimento e um Leitor de cartões de contato.</span></span></div><div class="separator" style="clear: both; text-align: justify;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span></span></div><div class="separator" style="clear: both; text-align: justify;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Um Grande Abraço e até a Próxima!</b></span></span></div><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"><span id="goog_987762285"></span><span id="goog_987762286"></span> </span></span><br />
<span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"> </span></span></div><div style="text-align: justify;"></div>Ricardo Massaohttp://www.blogger.com/profile/13929394839245906485noreply@blogger.com9tag:blogger.com,1999:blog-2847438594432791658.post-58130147641627453822010-12-16T18:08:00.000-08:002010-12-16T18:08:10.125-08:00O Global Platform<div class="separator" style="clear: both; text-align: center;"><a href="https://sites.google.com/site/ricardotakaqui/gplogo_2010.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="56" src="https://sites.google.com/site/ricardotakaqui/gplogo_2010.gif" width="400" /></a></div><br />
<div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">O Global Platform é uma das especificações mais importantes de todo processo de desenvolvimento e utilização Java Card, para aqueles que almejam ser especialistas no desenvolvimento de aplicativos Java Card comerciais é primordial o seu conhecimento.</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">Curiosamente é uma das especificações menos divulgadas e documentadas até em livros do gênero. </span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">A especificação é extensa, complexa e meio pesada de se ler e compreender, e posso dizer sem dúvidas de longe é uma das partes mais intimidadoras de todo processo de desenvolvimento. </span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">Porém não se preocupe com um pouco de insistência essa barreira será vencida.</span></div><span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><b>História.</b></span><br />
<div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">O Mercado Francês é um dos pioneiros na implantação de cartões com chip para operações de débito e crédito, essa ação diminuiu em 98% a quantidade de fraudes com cartões.</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">Em 1993 a Europay, MasterCard e Visa, grandes operadoras de cartões, criaram em conjunto um padrão conhecido como <b>EMV</b>.</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">O padrão EMV define várias regras de operações com cartões com chip, como características físicas e elétricas, estrutura de segurança, interoperabilidade dos cartões nos terminais a nível global e regras de interação entre cartão e terminal baseadas no padrão <b>ISO 7816</b>.</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">O EMV define quatro regras básicas nas aplicações:</span></div><ul style="text-align: justify;"><li><span style="font-family: Arial,Helvetica,sans-serif;">Autenticação off-line, ou seja o terminal precisa se autenticar no cartão sem estar conectado a meios externos.</span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;">Gestão de Riscos, o cartão grava todas as transações e dispara um alarme caso certas condições de risco ocorram.</span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;"> Autenticação por PIN (Personal Identification Number) off-line, o PIN nada mais é que a senha numérica do cartão, essa regra define que esse PIN deve ser armazenada de maneira sigilosa e o mesmo deve ser "<i>match on card</i>"(autenticada dentro do cartão) sem o terminal estar conectado a meios externos.</span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;">Autenticação on-line, de modo exporádico o cartão pode ser verificado junto a uma base de dados on-line.</span></li>
</ul><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">Porém o padrão EMV deixa em aberto para implementação diversos parâmetros de segurança, o que obviamente levou cada operadora desenvolver seus próprios sistemas, a Visa com o VSDC (Visa Smart Debit Card), a Master Card com o M/Chip, JCB com o J/Chip.</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">A Visa por sua vez desenvolveu um dos sistemas mais notáveis e seguros chamado de Visa Open Platform que especificam diversas regras como autenticação mútua, instalador de applets, gerenciamento do ciclo de vida do cartão, etc.</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">Em 1999 é fundada a organização Global Platform, trata-se de uma organização sem fins lucrativos, concentrada na padronização da infraestrura de desenvolvimento, distribuição e gerenciamento de smart cards. Essa organização se divide em 3 comites : <i>the Card Committe, Device Committe e System Committe.</i></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">Para nós desenvolvedores apenas o Card Committe importa, pois as especificações dela está presente em mais de 90% dos cartões no mercado. Muito provavelmente no seu cartão de Débito e Crédito com chip na sua carteira, seu SIM Card no Celular, seu Cartão com Certificado Digital, etc.</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">Assim como a especificação Java Card o Global Platform possui diversas versões e cabe ao desenvolvedor utilizar a correta pois pode variar de versão de Chip para Chip.</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">A mais comum é a Global Platform 2.1.1.</span></div><span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><b><span style="font-family: Arial,Helvetica,sans-serif;">Global Platform.</span></b></span><br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://sites.google.com/site/ricardotakaqui/GPArchiteture.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="348" src="https://sites.google.com/site/ricardotakaqui/GPArchiteture.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Arquitetura Global Platform</td><td class="tr-caption" style="text-align: center;"><br />
</td></tr>
</tbody></table><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">A Figura acima demonstra a arquitetura Global Platform, que tem como premissa o Esquema Dinâmico de Multi-aplicações para Cartões. O Global Platform é a evolução natural do Visa Open Platform e foi adotada pela maioria dos fabricantes de Chip para Smart Cards.</span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Global Platform é neutro, ou seja independe do ambiente que está executando, no caso do Java Card ele se encontra na camada do JCRE (Java Card Runtime Environment).</span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Card Manager.</b></span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">O Card Manager é Motor do GP (Global Platform) e todos os cartões que implementam a especificação GP tem um, o card manager implementa o <b>Security Domain</b>, que tem a função básica de gerenciar a autenticação entre Host e Cartão através de uma conexão segura ou mutual authentication, o ciclo de vida do cartão e aplicativos, carga/instalação/exclusão de aplicativos (Applets no caso do JC), gerenciamento de chaves do algoritmo criptografico usado para operações em ambiente seguro (DES/TripleDES/AES).</span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">O Card Manager pode ser acessado utilizando-se o comando <i>select</i> (ISO 7816-4) mais o <i>AID</i> (Application Identifier), gravem bem esse conceito pois será muito utilizado lá na frente.</span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>AID - Application Identifier.</b></span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Todos os Aplicativos para Smart Card tem um, seus Applets terão, o Card Manager do seu cartão de Crédito/Débito com Chip, seu SIM Card GSM no Celular, etc.</span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b> </b>Basicamente ele é utilizado para se selecionar a aplicação dentro do cartão análogamente podemos comparar o AID com o nome de um Arquivo no HD do seu PC.</span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Ele segue os Padrões <b>ISO 7816</b> e tem o seguinte formato <b>[RID + PIX]</b>.</span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">RID (Registered Provider Identifier), consiste de obrigatoriamente 5 bytes e identifica o fabricante/desenvolvedor da aplicação e é publicada por uma autoridade <b>ISO 7816-5</b>.</span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">PIX (Proprietary Application Identifier Extension), consiste no identificador de Aplicativo e é definido pelo fabricante/desenvolvedor do aplicativo.</span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Por exemplo o AID do Card Manager do cartão Visa Electron é [A0 00 00 00 03 20 10] onde RID = [A0 00 00 00 03] PIX = [20 10].</span></span></span></div><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Life Cicle Models.</b></span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">O Modelo do Ciclo de Vida de um cartão consiste em :</span></span></span><br />
<ul><li><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>OP_READY</b></span></span></span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>INITIALIZED</b></span></span></span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>SECURED</b></span></span></span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>CARD_LOCKED</b></span></span></span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>TERMINATED </b></span></span></span></li>
</ul><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">OP_READY e INITIALIZED é utilizado na fase de pré-personalização do cartão.</span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">SECURED, CARD_LOCKED, TERMINATED, utilizado ao longo da vida do cartão.</span></span></span></div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">O Ciclo de Vida, por exemplo como sendo uma fabricante do cartão você é responsável pela personalização do cartão que definem centenas de configurações do cartão como Protocolo de Comunicação T=0 ou T=1, configuração da Velocidade de Comunicação se é ou não negociavel, Cold ATR e Warm ATR, diversas configurações sobre como deve se comportar o GP, como deve se comportar o JCRE, etc. </span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Após todo o processo o cartão é colocado no modo OP_READY nesse modo diversas configurações são desativadas. Poucas pessoas conhecem esse procedimento. ( Sou um dos poucos privilegiados. =D ).</span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Uma vez em OP_READY o cartão é vendido para os integradores de cartões, que por sua vez configuram a chave do criptografador utilizado no Mutual Authentication, instalam suas aplicações com configurações em modo padrão e por fim colocam o cartão em modo INITIALIZED.</span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Esse cartão agora é passado por exemplo para um banco que por sua vez pode iniciar os dados contidos na aplicação com os dados do cliente, ou mesmo atualiza-la com uma versão mais nova de aplicativo e por fim o cartão é colocado em modo SECURED.</span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Uma vez em modo SECURED o cartão ainda pode ter seus aplicativos atualizados e seu Card Manager acessado, porém indica que já foi totalmente personalizado e que pode ser entregue ao cliente.</span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">O Cliente tem seu cartão roubado e avisa a operadora, a operadora adiciona esse cartão na black list.</span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Primeira hipótese o ladrão tenta passar esse cartão numa conhecida lojas de convêniencia, o cartão é passado para CARD_LOCKED pelo terminal que detecta a infração, todos os aplicativos do cartão são travados sobrando apenas o Card Manager e a resposta ATR.</span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Segunda hipótese o ladrão tenta violar o cartão utilizando um programa malicioso, após algumas tentativas o cartão detecta a tentativa de fraude, nesse momento dados são destruídos e o cartão passa para o modo TERMINATED, nesse ponto todas funcionalidades são bloqueadas, todos os APDU's são direcionados para o Card Manager porém agora o Security Domain apenas responderá ao comando GET DATA.</span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Esse foi um exemplo do ciclo de vida de um cartão, todas as passagens de estado são irreverssiveis, por exemplo quando se passa de OP_READY para INITIALIZED não se pode reverter para o modo OP_READY e assim sucessivamente.</span></span></span></div><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">O Modelo do ciclo de vida de um aplicativo consiste em :</span></span></span><br />
<ul><li><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>INSTALLED</b></span></span></span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>SELECTABLE</b></span></span></span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>LOCKED</b></span></span></span></li>
</ul><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Após a carga da aplicação no cartão ele precisa ser instalado, uma vez instalado o aplicativo entra para a lista de Aplicações disponíveis no cartão em modo INSTALLED, porém ainda não é selecionável, ou seja acessível pelo comando <i>select</i> da ISO 7816-4.</span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Uma vez instalado o Aplicativo pode ser passado para o modo SELECTABLE, no caso de um applet Java Card nesse momento o JCRE chama o método que deve ser ser sobreescrito na sua aplicação Java Card "<i>public static void install (byte bArray[], short bOffset, byte bLength)</i>", nesse método todos os recursos devem ser iniciados e o Applet Instanciado, feito isso o aplicativo estará pronto para uso e pode ser selecionado pelo comando <i>select</i>.</span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">O Aplicativo pode ser passado para LOCKED, com isso ele não pode mais ser acessado, porém esse modo é reversível através do Card Manager.</span></span></span></div><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span></span></span><br />
<div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b><span style="font-family: Arial,Helvetica,sans-serif;">Comandos Global Platform.</span></b></span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">A Globlal Platform especifica um pequeno grupo de comandos <b>APDU's </b>seguindo a norma <b>ISO 7816-4</b>, são elas :</span></span></span></span></div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>DELETE.</b></span></span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Esse comando é utilizado para exclusão de objetos executáveis do cartão, Applets no caso do Java Card através do seu AID.</span></span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>GET DATA.</b></span></span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Esse comando retorna um objeto de dados,</span></span></span></span><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"> que dependendo do parametro passado pode variar entre o Número de Identificação do Fabricante, Identificador do Cartão, detalhes pertinentes a Chave do motor criptografico para operações em ambientes seguros, etc.</span></span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>GET STATUS.</b></span></span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Esse comando retorna um objeto de dados, que dependendo do parametro passado pode variar entre Security Domain, Aplicativos Executaveis, Módulos Executáveis e Life Cicles dos Aplicativos e do Card Manager.</span></span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>INSTALL.</b></span></span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b> </b>Esse comando é responsável por realizar vários passos requeridos para tornar uma aplicação instalada e selecionavel, ou seja torna a Aplicação <i>INSTALLED, </i><i>SELECTABLE</i><span style="font-family: Arial,Helvetica,sans-serif;">, etc.</span></span></span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>LOAD.</b></span></span></span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Esse comando é responsável pela carga de um arquivo para o cartão, caso o pacote LOAD ultrapasse 256 bytes, ele deve ser dividido e enviado sequencialmente em diversos pacotes LOAD's, no caso do Java Card é esse comando que faz a carga dos Applets no cartão.</span></span></span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b></b></span></span><b>MANAGE CHANNEL.</b></span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Esse comando gerencia diversos canais lógicos abertos no cartão. O canal lógico de número Zero nunca pode ser fechado.</span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>PUT KEY.</b></span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Esse comando altera uma das chaves do motor criptografico utilizado para proteção do canal de comunicação seguro e dados internos.</span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b> SELECT.</b></span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Esse comando é exatamente o mesmo definido pela norma ISO 7816-4.</span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>SET STATUS.</b></span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Esse comando altera o Life Cicle do cartão do OP_READY para INITIALIZED, do INITIALIZED para SECURED e assim sucessivamente.</span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b> STORE DATA.</b></span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Esse comando é responsável pela carga de dados para uma determinada Aplicação ou para o Security Domain, assim como no caso do comando LOAD, se o pacote STORE DATA ultrapassar 256 bytes, ele deve ser dividido e enviado sequencialmente.<b> </b></span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b> </b><br />
</span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>O SCP ou Secure Channel Protocol 1 / 2</b>.</span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Sem dúvidas nenhuma é a parte mais desafiadora do Global Platform, essa parte é conhecida também como <b>Mutual Authentication</b>, ela é responsável por autenticar um Host no cartão.</span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">O processo utiliza derivação de uma chave TripleDES(GP2.1.1) ou AES(GP2.2), essa derivação mais um numero gerado aleatoriamente pelo cartão e pelo host formam dois criptogramas que ao serem autenticados definem a chave do criptografador a ser utilizado durante toda comunicação entre Host e Cartão.</span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Não entrarei em muitos detalhes sobre esse tópico pois tornará o artigo mais gigantesco do que já está, em Tutoriais Futuros espero demonstrar o uso desse processo de autenticação utilizando o Visa Open Platform API. </span></span></span></div><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span></span></span><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://sites.google.com/site/ricardotakaqui/SCP.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="224" src="https://sites.google.com/site/ricardotakaqui/SCP.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Fluxo do Mutual Autentication (Global Platform 2.1.1)</td><td class="tr-caption" style="text-align: center;"><br />
</td></tr>
</tbody></table><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span></span></span><br />
<div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Seguindo o Fluxo da figura acima, inicialmente selecionamos o Card Manager ou Security Domain do Cartão usando o comando <i>[select + AID]</i>, em resposta o cartão deve enviar um pacote de dados que fornece informações sobre o cartão no formato <a href="http://en.wikipedia.org/wiki/Abstract_Syntax_Notation_One#Example_encoded_in_DER">DER (Distinguished Encodin Rules) que é definida pela ASN.1 (Abstract Syntax Notation One)(link)</a>.</span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Dependendo esse Pacote pode conter diversas informações sobre como está configurarado o Secure Channel Protocol e o Security Domain.</span></span></span></div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>INITIALIZE UPDATE. </b></span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">É o comando APDU utilizado para se iniciar a autenticação mutua entre host e cartão.</span></div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>EXTERNAL AUTHENTICATE.</b></span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"></span>O Cartão envia um pacote de dados em resposta ao INITIALIZE UPDATE, com posse desses dados a Chave secreta é derivada e uma série de calculos criptograficos são realizados, como resultado disso ao final termos a chave de Sessão e uma espécie de assinatura digital garantindo que a chave que está no cartão é a mesma que o Host possui, com isso um pacote de comando chamado EXTERNAL AUTHENTICATE é criado e enviado para o cartão que por sua vez executará uma série de cálculos e validará à autenticação.</span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Somente após esses complexos procedimentos é possível utilizar os diversos comandos definidos pela GP como instalação/exclusão de um Applet, PUT KEY, etc.</span></span></span></div><br />
<div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>O GPShell</b>.</span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">O GPShell é um aplicativo de linha de comando que utiliza uma API Open Source que pode ser usado nas sua aplicações para auxilia-lo com esses detalhes do Global Platform.</span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">No futuro quando estiver postando Tutoriais que utilizam Java Cards físicos ensinarei como usar essa ferramenta para carga/instalação/exclusão dos Applets no cartão.</span></span></span></div><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Links para consulta :</span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><a href="http://en.wikipedia.org/wiki/EMV">http://en.wikipedia.org/wiki/EMV</a></span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><a href="http://www.globalplatform.org/">http://www.globalplatform.org/</a></span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><a href="http://sourceforge.net/projects/globalplatform/files/">http://sourceforge.net/projects/globalplatform/files/</a> </span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span></span></span><br />
<div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Bom isso foi um brevissímo resumo sobre o que é o Global Platform e qual a sua importancia no mundo dos Smart Cards. No próximo Artigo estarei demonstrando como se configura a IDE Eclipse para desenvolvimento e simulação de uma simples Applet Hellow World.</span></span></span></div><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Um Feliz Natal e Próspero Ano Novo! Abraços a todos!</b><br />
</span></span></span>Ricardo Massaohttp://www.blogger.com/profile/13929394839245906485noreply@blogger.com0tag:blogger.com,1999:blog-2847438594432791658.post-62801446914162685152010-12-07T04:18:00.000-08:002010-12-07T04:18:43.254-08:00ISO/IEC 7816<div class="separator" style="clear: both; text-align: center;"><a href="http://www.iso.org/iso/logo_iso.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="http://www.iso.org/iso/logo_iso.gif" /></a></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">ISO (International Organization for Standartization) e IEC (Intenational Eletrotechinical Commission), são os responsáveis pela padronização relacionada aos Smart Cards de contato.</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">Essa ISO (7816) pode ser divida em quatorze partes sendo ela:</span></div><ul><li><span style="font-family: Arial,Helvetica,sans-serif; font-size: small;"><b>ISO 7816-1 : Características Físicas.</b></span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif; font-size: small;"><b>ISO 7816-2 :</b></span><span style="font-size: small;"><span class="mw-headline" id="7816-2:_Cards_with_contacts_.E2.80.94_Dimensions_and_location_of_the_contacts"> <span style="font-size: small;"><b style="font-family: Arial,Helvetica,sans-serif;">Cartões com Contato - Dimensões e Locais dos Contatos.</b></span></span></span></li>
<li><span style="font-size: small;"><span class="mw-headline" id="7816-2:_Cards_with_contacts_.E2.80.94_Dimensions_and_location_of_the_contacts"><span style="font-size: small;"><b style="font-family: Arial,Helvetica,sans-serif;">ISO 7816-3 : Cartões com Contato - Interface Elétrica e Protocolos de Transmissão.</b></span></span></span></li>
<li><span style="font-size: small;"><span class="mw-headline" id="7816-2:_Cards_with_contacts_.E2.80.94_Dimensions_and_location_of_the_contacts"><span style="font-size: small;"><b style="font-family: Arial,Helvetica,sans-serif;">ISO 7816-4 : Organização, Segurança e Comandos para Intercâmbio.</b></span></span></span></li>
<li><span style="font-size: small;"><span class="mw-headline" id="7816-2:_Cards_with_contacts_.E2.80.94_Dimensions_and_location_of_the_contacts"><span style="font-size: small;"><b style="font-family: Arial,Helvetica,sans-serif;">ISO 7816-5 : Registro dos Provedores de Aplicações.</b></span></span></span></li>
<li><span style="font-size: small;"><span class="mw-headline" id="7816-2:_Cards_with_contacts_.E2.80.94_Dimensions_and_location_of_the_contacts"><span style="font-size: small;"><b style="font-family: Arial,Helvetica,sans-serif;">ISO 7816-6 : Elementos de Dados para Intercâmbio Interindustriais.</b></span></span></span></li>
<li><span style="font-size: small;"><span class="mw-headline" id="7816-2:_Cards_with_contacts_.E2.80.94_Dimensions_and_location_of_the_contacts"><span style="font-size: small;"><b style="font-family: Arial,Helvetica,sans-serif;">ISO 7816-7 : Comandos Interindustriais SCQL (Structured Card Query Language).</b></span></span></span></li>
<li><span style="font-size: small;"><span class="mw-headline" id="7816-2:_Cards_with_contacts_.E2.80.94_Dimensions_and_location_of_the_contacts"><span style="font-size: small;"><b style="font-family: Arial,Helvetica,sans-serif;">ISO 7816-8 : Comandos para Operações de Segurança.</b></span></span></span></li>
<li><span style="font-size: small;"><span class="mw-headline" id="7816-2:_Cards_with_contacts_.E2.80.94_Dimensions_and_location_of_the_contacts"><span style="font-size: small;"><b style="font-family: Arial,Helvetica,sans-serif;">ISO 7816-9 : Comandos para o Gerenciamento do Cartão.</b></span></span></span></li>
<li><span style="font-size: small;"><span class="mw-headline" id="7816-2:_Cards_with_contacts_.E2.80.94_Dimensions_and_location_of_the_contacts"><span style="font-size: small;"><b style="font-family: Arial,Helvetica,sans-serif;">ISO 7816-10 : Sinais Eletrônicos e Answer to Reset para Cartões Síncronos.</b></span></span></span></li>
<li><span style="font-size: small;"><span class="mw-headline" id="7816-2:_Cards_with_contacts_.E2.80.94_Dimensions_and_location_of_the_contacts"><span style="font-size: small;"><b style="font-family: Arial,Helvetica,sans-serif;">ISO 7816-11 : Verificação Pessoal Através de Métodos Biométricos.</b></span></span></span></li>
<li><span style="font-size: small;"><span class="mw-headline" id="7816-2:_Cards_with_contacts_.E2.80.94_Dimensions_and_location_of_the_contacts"><span style="font-size: small;"><b style="font-family: Arial,Helvetica,sans-serif;">ISO 7816-12 : Cartões de Contato - Interface Elétrica USB e Procedimentos de Operações.</b></span></span></span></li>
<li><span style="font-size: small;"><span class="mw-headline" id="7816-2:_Cards_with_contacts_.E2.80.94_Dimensions_and_location_of_the_contacts"><span style="font-size: small;"><b style="font-family: Arial,Helvetica,sans-serif;">ISO 7816-13 : Comandos para Gerenciamento da Aplicação em Ambientes de Multi-Aplicação.</b></span></span></span></li>
<li><span style="font-size: small;"><span class="mw-headline" id="7816-2:_Cards_with_contacts_.E2.80.94_Dimensions_and_location_of_the_contacts"><span style="font-size: small;"><b style="font-family: Arial,Helvetica,sans-serif;">ISO 7816-15 : Informação de Aplicativos Criptograficos.</b></span></span></span></li>
</ul><span style="font-size: small;"><span class="mw-headline" id="7816-2:_Cards_with_contacts_.E2.80.94_Dimensions_and_location_of_the_contacts"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;"></span></span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Embora a lista seja extensa, não se preocupe não é necessário conhecer cada uma das quatorze partes, a não ser que seja um curioso ou queira se tornar um expert, fora que cada um desses documentos é vendida a parte porém existem algumas publicações on-line.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Felizmente para desenvolvimento de Applets Java Card só é necessário conhecer a Parte 4.</span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><b>ISO 7816 - Parte 4 : Organização, Segurança e Comandos para Intercâmbio:</b> </span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Essa Parte da ISO/IEC 7816 especifica :</span><br />
<ul><li><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">O conteúdo das mensagens, comandos e respostas através de um dispositivo entre o cartão e a aplicação Host (Ex. um PC, sistemas embarcados, etc).</span></span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"> A estrutura de conteúdo do "<i>historical bytes</i>"</span> enviados pelo cartão durante o "<i>answer to reset</i>".</span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;">Estrutura de arquivos e dados, visto na interface enquanto processa comandos interindustriais para intercâmbio.</span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;">Métodos de acesso aos arquivos e dados do cartão.</span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;">Métodos para Mensagens Seguras.</span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;">Métodos de acesso aos algoritimos processados pelo cartão.</span></li>
</ul><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">Antes de continuar é necessário um pré-requisito primordial por parte daqueles que almejam programar para Java Card.</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">Conhecer o Sistema Binário e Hexadecimal, isso mesmo toda troca de informação entre sua Aplicação e o Cartão se dará via comandos Hexadecimais. Como explicar notações Binárias e Hexadecimais está fora do escopo deste artigo segue dois links para estudo :</span></div><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><a href="http://pt.wikipedia.org/wiki/Sistema_bin%C3%A1rio_%28matem%C3%A1tica%29">Sistema Binário (link)</a></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><a href="http://pt.wikipedia.org/wiki/Sistema_hexadecimal">Sistema Hexadecimal (link)</a></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><b><span style="font-family: Arial,Helvetica,sans-serif;">Modelo de Comunicação do Smart Card.</span></b></span><br />
<div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">A comunicação entre o host e o cartão ocorre de forma "<i>half-duplex</i>"</span><b><span style="font-family: Arial,Helvetica,sans-serif;"> </span></b>ou seja enquanto o host envia dados para o cartão, o mesmo não envia dados para o host e vice-versa.</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">Por exemplo quando dois computadores se comunicam via rede utilizando o protocolo TCP/IP eles trocam entre sí informações utilizando pequenos pacotes de dados conhecidos como Pacotes IP.</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">Análogamente enquanto host e cartão se comunicam, eles trocam entre sí pequenos pacotes de dados conhecidos como <b>APDU (Application Protocol Data Unit)</b>.</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">Diferente da comunicação do Protocolo TCP/IP na comunicação ISO 7816-4 via APDU's o cartão se comporta de modo escravo (<i>slave mode</i>) ou seja ele sempre aguarda dados do host, os processa e retorna uma resposta.</span></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://sites.google.com/site/ricardotakaqui/smart_comunication.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://sites.google.com/site/ricardotakaqui/smart_comunication.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Modelo de Comunicação entre Host e Smart Card</td><td class="tr-caption" style="text-align: center;"><br />
</td></tr>
</tbody></table><span style="font-family: Arial,Helvetica,sans-serif;"> </span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"> <b>Protocolo APDU.</b></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">O Protocolo APDU especificado na ISO 7816 Parte 4 é um protocolo de nível de Aplicação entre Host e Cartão. E compreende dois tipos de Pacotes de dados o "<i>Command APDU</i>"<b> </b>usado para envio de dados para o cartão e o "<i>Response APDU</i>" usado para resposta do cartão para o Host.</span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><b>Command APDU.</b></span><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://sites.google.com/site/ricardotakaqui/Command_APDU.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="87" src="https://sites.google.com/site/ricardotakaqui/Command_APDU.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Pacote de Dados Command APDU</td><td class="tr-caption" style="text-align: center;"><br />
</td></tr>
</tbody></table><span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"> "<i>Mandatory Header</i>" são os dados que devem obrigatóriamente estar presentes no pacote.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">"<i>Optional Body</i>" são os dados opcionais no pacote.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">"<b>CLA</b>" - Tamanho 1 byte - Class Byte, identifica a categoria do APDU de comando e resposta.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">"<b>INS</b>" - Tamanho 1 byte - Instruction Byte, especifica a Instrução do Comando.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">"<b>P1</b>" - Tamanho 1 byte - Parameter Byte, paramentro do comando.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">"<b>P2</b>" - Tamanho 1 byte - Parameter Byte, paramentro do comando.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">"<b>Lc</b>" - Tamanho 1 byte - Length Command, Quantidade em bytes de dados contidos no "<i>Data Field</i>".</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">"<b>Data Field</b>" - Tamanho de 1 à 256 bytes - Data Field, dados a ser enviado para o Cartão.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">"<b>Le</b>" - Tamanho 1 byte - Length Expected, Quantidade de dados esperado em resposta do Cartão.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><b>Response APDU.</b></span><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://sites.google.com/site/ricardotakaqui/Response_APDU.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="90" src="https://sites.google.com/site/ricardotakaqui/Response_APDU.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Pacote de Dados Response APDU</td><td class="tr-caption" style="text-align: center;"><br />
</td></tr>
</tbody></table><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><b> </b>"<i>Mandatory Trailer</i>" são os dados que devem obrigatóriamente estar presentes no pacote.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">"<i>Optional Body</i>" são os dados opcionais no pacote.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">"<b>Data Field</b>" </span><span style="font-family: Arial,Helvetica,sans-serif;"> - Tamanho de 1 à 256 bytes - Data Field, dados a ser enviado para o Host, geralmente possue a quantidade especificada no campo "<b>Le</b>" que o Host préviamente envia no Command APDU porém isso não é regra.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">"<b>SW1</b>" - Tamanho 1 byte - Status Word 1 - Status do Processamento 1.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">"<b>SW2</b>" - Tamanho 1 byte - Status Word 2 - Status do Processamento 2.</span><br />
<br />
<div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">Juntas SW1 e SW2 formam uma Word (Palavra), geralmente conhecida pelos programadores Assembler, uma Word tem o tamanho de 2 bytes ou <span style="font-family: "Courier New",Courier,monospace;">short<span style="font-family: Arial,Helvetica,sans-serif;"> para os intimos.</span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Um exemplo de Status Word é 0x9000 que segundo a ISO 7816 significa <b>OK </b>logo você sempre vai adorar 90 00 enquanto programa para Java Cards. </span></span></span></div><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><a href="http://www.cardwerk.com/smartcards/smartcard_standard_ISO7816-4_5_basic_organizations.aspx#chap5_3">Informações mais detalhadas sobre o APDU aqui. (link)</a> </span></span></span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Answer To Reset (ATR).</b></span></span></span><br />
<div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Imediatamente após alimentar ou resetar o cartão, o mesmo envia para o Host o ATR.</span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">O ATR consiste de um pacote de até 33 bytes, onde os primeiros bytes indicam o protocolo se T=0 ou T=1, a velocidade de comunicação, tamanho do "<i>historical bytes</i>", etc.</span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">O historical bytes são os ultimos bytes do pacote e são utilizados para identificar um determinado tipo de cartão, alguns podem ser alterados como forma de personalização.</span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Resumindo com o ATR do cartão geralmente é possivel de se identificar o tipo e fabricante do mesmo.</span></span></span></div><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><a href="http://ludovic.rousseau.free.fr/softwares/pcsc-tools/smartcard_list.txt">Nesse Link você encontra uma lista de ATR's mantida pelo Prof. Ludovic Rousseau e está em constante atualização. (link)</a></span></span></span><br />
<br />
<div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Os próximos itens especificado pela ISO 7816 - Parte 4, são estrutura de arquivos e dados, métodos de acessos e algoritimos. Não explicarei essa parte pois ela não é utilizada no desenvolvimento de Aplicativos Java Card.</span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">O responsável por esses detalhes no caso do Java Card é o Global Platform que no caso será o assunto do próximo artigo, aguardem.</span></span></span></div><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><a href="http://www.cardwerk.com/smartcards/smartcard_standard_ISO7816.aspx">Link para Consultas ISO-7816. (link)</a></span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Bibliografia : <i>Java Card TM Technology for Smart Cards, Autor : Zhiqun Chen, Editora : Addison-Wesley, ISBN : 0-201-70329-7</i></span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Até a próxima, Abraços.</b></span><i> </i></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"> </span>Ricardo Massaohttp://www.blogger.com/profile/13929394839245906485noreply@blogger.com0tag:blogger.com,1999:blog-2847438594432791658.post-51543677269135342622010-12-03T20:17:00.000-08:002010-12-03T20:23:22.662-08:00A Arquitetura Java Card<div class="separator" style="clear: both; text-align: center;"><a href="https://sites.google.com/site/ricardotakaqui/javacard_tilted.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://sites.google.com/site/ricardotakaqui/javacard_tilted.gif" /></a></div><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><b>O Java Card.</b></span><br />
<div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">Smart Cards representam uma das menores plataformas computacionais do mundo, isso quer dizer são limitados em recurso de processamento e memória.</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">Conforme visto é de se imaginar o enorme desafio que foi implementar a plataforma Java e ainda otimizar recursos para instalação de diversos Applets, confiram.</span> </div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"> <b style="font-family: Arial,Helvetica,sans-serif;">Java Card Virtual Machine (JCVM).</b></div><span style="font-family: Arial,Helvetica,sans-serif;"><b></b></span><br />
<div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">A JCVM é responsável pela interpretação do bytecode (compilação do código escrito em Java)<b> </b> e diferente da JVM dos Desktops, a JCVM foi estratégicamente dividida em duas partes, uma "<i>off-card</i>"(fora do cartão) e outra "<i>on-card</i>"(dentro do cartão).</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">A parte off-card é responsável por todo serviço pesado e roda no PC onde está sendo desenvolvida a aplicação, essa parte cuida do Class Loading, verificação do bytecode, linking e otimizações.</span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">A parte on-card como é de se esperar interpreta o bytecode, porém devida aos limitados recursos dos cartões apenas um Subset Java (parte da linguagem) é suportada, alguns cartões implementam o Garbage Collector porém é opcional.</span></div><div style="text-align: justify;"><br />
</div><span style="font-family: Arial,Helvetica,sans-serif;"><b>Caracteristicas Java Suportadas (Java Card 2.2.2):</b></span><br />
<ul><li><span style="font-family: Arial,Helvetica,sans-serif;">Tipos Primitivos : <span style="font-family: "Courier New",Courier,monospace;">boolean, byte e short.</span></span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Arrays de Uma Dimensão.</span></span></span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Java</span> packages, classes, interfaces e exceptions.</span></span></span></span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Orientação a Objetos, heranças, métodos virtuais, sobrecarga e escopo de acessos.</span></span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;">O Tipo <span style="font-family: "Courier New",Courier,monospace;">int<span style="font-family: Arial,Helvetica,sans-serif;"> de 32 bit integer é opcional (logo não use). </span></span></span></li>
</ul><span style="font-family: Arial,Helvetica,sans-serif;"><b>Caracteristicas Java Não Suportadas (Java Card 2.2.2):</b></span><br />
<ul><li><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Tipos Primitivos: <span style="font-family: "Courier New",Courier,monospace;">long, double e float.</span></span></span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;">char<span style="font-family: Arial,Helvetica,sans-serif;"> e <span style="font-family: "Courier New",Courier,monospace;">String.</span></span></span></span></span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Arrays Multi-Dimensionais.</span></span></span></span></span></span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Carga de Classe Dinamica.</span></span></span></span></span></span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Gerenciador de Segurança.</span></span></span></span></span></span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Garbage Collector (alguns cartões implementam) e finalizador.</span></span></span></span></span></span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"> Threads.</span></span></span></span></span></span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Serialização de Objetos.</span></span></span></span></span></span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Clonagem de Objetos.</span></span></span></span></span></span></li>
</ul><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"> <b>Arquivos CAP e Export.</b></span></span></span></span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Uma explicação sucinta sobre o que é um arquivo CAP, ele nada mais é que um JAR com a mesma estrutura inclusive zipado. Ou seja é o binário executavel do Java Card.</span></span></span></span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Export files não são usados no processo on-card, eles são como arquivos Header para linking como os da Linguagem C, na parte em que eu for explicar sobre como compilar Applets mostrarei como se usa os arquivos EXP.</span></span></span></span></span></span><br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://sites.google.com/site/ricardotakaqui/jcvm.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://sites.google.com/site/ricardotakaqui/jcvm.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-family: Arial,Helvetica,sans-serif;">Java Card Virtual Machine</span></td><td class="tr-caption" style="text-align: center;"></td><td class="tr-caption" style="text-align: center;"></td><td class="tr-caption" style="text-align: center;"></td><td class="tr-caption" style="text-align: center;"></td></tr>
</tbody></table><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"> <b>Java Card Runtime Environment (JCRE).</b></span></span></span></span></span></span><br />
<div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Como o própio nome diz "<i>Ambiente de Execuçao Java Card</i>", é o coração do Java Card.</span></span></span></span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">O JCRE provê uma clara separação entre o sistema do Smart Card e as Aplicações (Applets).</span></span></span></span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">O JCRE é responsável pelo gerenciamento de recursos, rede de comunicações, execução dos Applets provendo todo serviço on-card (JCVM), instala os Applets, gerencia segurança, emcapsula e oculta o Hardware do fabricante, etc.</span></span></span></span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Muitos fabricantes embutem suas próprias API's nessa camada como sendo um diferencial no produto, como por exemplo algorítimos de Criptografia não suportadas nativamente pela API padrão do Java Card, emulador de cartões MiFare, implementações PKCS#15 usados para certificação digital, ou até implementações do prórpio cliente. Para isso se dá o nome de customização da Máscara da ROM do cartão.</span></span></span></span></span></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Como pode ser visto o JCRE faz tudo no cartão, não entrarei a fundo sobre isso pois é assunto para um livro.</span></span></span></span></span></span></div><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span></span></span></span></span></span><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://sites.google.com/site/ricardotakaqui/jcre.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://sites.google.com/site/ricardotakaqui/jcre.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Java Card Runtime Environment 2.2.2</td><td class="tr-caption" style="text-align: center;"><br />
</td></tr>
</tbody></table><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span></span></span></span></span></span><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://sites.google.com/site/ricardotakaqui/jcre3.gif" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="213" src="https://sites.google.com/site/ricardotakaqui/jcre3.gif" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Java Card Runtime Environment 3.0.1</td><td class="tr-caption" style="text-align: center;"><br />
</td></tr>
</tbody></table><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span></span></span></span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Java Card API's.</b></span></span></span></span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Consiste de um grupo padrão de classes para desenvolvimento de aplicações de acordo com o modelo ISO7816.</span></span></span></span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Uma analogia com o JDK(Java Development Kit) onde temos:</span></span></span></span></span></span><br />
<div style="font-family: Times,"Times New Roman",serif;"><b>java.lang.System</b></div><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">No JCDK(Java Card Development Kit) temos :</span></span></span></span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><b style="font-family: Times,"Times New Roman",serif;">javacard.framework.JCSystem</b></span></span></span></span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;">Para</span><b style="font-family: Times,"Times New Roman",serif;"> </b>quem está acostumado no desenvolvimento Java, é simples assim sem segredos.</span></span></span></span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span></span></span></span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;">Essa é a arquitetura Java Card de maneira resumida, no próximo artigo estarei introduzindo o ISO7816 Parte 4 que é praticamente o Dialeto que usaremos para se comunicar-se com o cartão.</span></span></span></span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span></span></span></span></span></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Bibliografia : <i>Java Card TM Technology for Smart Cards, Autor : Zhiqun Chen, Editora : Addison-Wesley, ISBN : 0-201-70329-7</i></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><i> </i></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-family: Arial,Helvetica,sans-serif;"><b>Até a Próxima, Abraços!</b></span></span></span></span></span></span>Ricardo Massaohttp://www.blogger.com/profile/13929394839245906485noreply@blogger.com4tag:blogger.com,1999:blog-2847438594432791658.post-89547325377230249482010-12-01T19:26:00.000-08:002010-12-02T17:53:58.445-08:00A Tecnologia Java Card<span style="font-family: Arial,Helvetica,sans-serif;">Hoje contarei a História por trás do Java Card e qual foi a motivação para sua criação.</span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;">No início, desenvolver para Smart Cards era um processo lento e difícil, pois embora os cartões possuíssem padrões no tamanho e no protocolo de comunicação, cada um funcionava de maneira diferente de fabricante para fabricante.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">As ferramentas de desenvolvimento eram fornecidas pelos fabricantes dos Chips utilizando como base a linguagem Assembler os SDKs (Software Developement Kit) eram dedicados a apenas um tipo ou família de chips, ou seja o desenvolvimento de uma aplicação era específica para cada fabricante e determinado Chip.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Isso fazia que o desenvolvimento fosse limitado a um pequeno grupo de programadores especialistas em Hardware e Software de um único smart card especifico.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Esse profissional era dotado de um grande conhecimento sobre como lidar com as limitações do hardware, gerenciamento de memória e os mínimos detalhes sobre a plataforma usada.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Porém isso gerava um grande problema, pois é muito difícil ou muitas vezes impossível de se portar a aplicação para outras plataformas no caso outros Smart Cards.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><b>Aplicando Java nos Smart Cards.</b></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">A Tecnologia Java Card oferece uma maneira prática de vencer esses obstáculos ocultando as implementações de Hardware do cartão. Ou seja desde que o cartão implemente a especificação Java Card, não importa o tipo de processador se 8, 16 ou 32 bits, se é arquitetura Cisc ou Risc, se possue 1Kb ou 8Gb de memória.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">O Cartão permitirá que aplicativos (chamados de Applets), escritos na Linguagem Java executem de maneira transparente seja qual for o Hardware.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Essencialmente a Tecnologia Java Card define a segurança, portabilidade e multiaplicativos que incorporam as várias vantagens da Linguagem Java como por exemplo "<i>write once run anywhere</i>" (escreva uma vez e rode-o em qualquer lugar). </span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">A segurança é uma preocupação primordial, uma das características por exemplo é o nível de acesso a todos os métodos e varíaveis são estritamente controlados, e não existe modo de forjar ponteiros para ativar programas maliciosos na memória.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Java Cards permitem que sejam instalados vários Applets e cada Applet dentro do cartão é isolado por um firewall isso evita que uma aplicação hostil comprometa o sistema.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Porém um Applet pode permitir explicitamente acesso de outros Applets através de uma característica chamada de RMI (Remote Method Invocation).</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><b>Breve História das Especificações.</b></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Em Novembro de 1996 um grupo de Engenheiros da Schlumberger introduziram uma API Java Card para desenvolvimento em seus Smart Cards, propondo também um rascunho inicial para a especificação Java Card, meses depois Bull, Gemplus e </span><span style="font-family: Arial,Helvetica,sans-serif;">Schlumberger se unem para cofundar o <b>Java Card Forum </b>um consórcio industrial criado para identificar e resolver questões relacionadas a tecnologia Java Card.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Finalmente a Sun Microsystems da suporte oficialmente a especificação Java Card 1.0 que não passava de uma API e não uma Plataforma extensivel.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Em Novembro de 1997 a Sun Microsystems anuncia a especificação Java Card 2.0 com diferenças significantes como uma maneira de se escrever applets utilizando a Orientação a Objetos e especifica mais o Ambiente em Tempo de Execução.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Em Março de 1999 é anunciada a especificação Java Card 2.1 pode ser considerada uma Plataforma completa pois é epecificado o Java Card API, JCRE (Java Card Runtime Environment) e o JCVM (Java Card Virtual Machine).</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Em Maio de 2000 é anunciada a especificação Java Card 2.1.1.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Em Setembro de 2002 é anunciada a especificação Java Card 2.2 o qual introduz a característica RMI (O Primeiro Java Card que testei não necessáriamente nesse ano).</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Em Outubro de 2003 é anunciada a especificação Java Card 2.2.1 (É sem dúvida o Java Card que mais utilizei e aprendi tudo que sei).</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Em Março de 2006 é anunciada a epecificação Java Card 2.2.2 essa é a ultima versão 2 e introduziu interfaces para desenvolvimento de Biometria. (É o Java Card que ando Testando atualmente).</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"> Em Maio de 2009 é anunciada a epecificação Java Card 3.0.1 não mais pela finada Sun Microsystem mais pela então Oracle (seja o que Deus quiser). </span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Promete ser ô Java Card, o estado da arte, vem em duas versões <b>Classic </b>(evolução direto do 2.2.2) e <b>Connected</b>. </span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Muitas mudanças foram realizadas como suporte a Multi-Threading, Network, Web Applications, Java Servlets API ou seja um servidor Web com Tomcat que você levará na carteira. </span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Vejo muitas pessoas interessadas em Java Card 3 e o que posso seguramente dizer a vocês, não esperem ter um desses tão cedo em mãos, pois muitas fabricantes ainda estão desenvolvendo o Chip que atenda à Especificação Java Card 3 levará um certo (longo) tempo para ele desembarcar aqui em terras Tupiniquins, enquanto isso não acontece o negócio é brincar com o SDK da Oracle ou conseguir um exclusivo cartão de testes com a Gemalto ou Oberthur.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Bibliografia : <i>Java Card TM Technology for Smart Cards, Autor : Zhiqun Chen, Editora : Addison-Wesley, ISBN : 0-201-70329-7</i></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Bom essa foi a História por trás do Java Card, todos os exemplos, tutoriais que postarei são voltados para Java Card 2.2.2</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><b>Aguardem, um Grande Abraço a Todos!</b></span>Ricardo Massaohttp://www.blogger.com/profile/13929394839245906485noreply@blogger.com2tag:blogger.com,1999:blog-2847438594432791658.post-31033801123057565822010-11-30T19:12:00.000-08:002010-12-02T18:06:31.989-08:00Gênesis<span style="font-family: Arial,Helvetica,sans-serif;">Olá e seja bem vindo, me chamo Ricardo e criei esse Blog, pois percebi o crescente uso da tecnologia Smart Cards no uso do Cotidiano.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Porém percebi também uma grande carência de Informações Técnicas sobre os mesmos e uma carência ainda maior de Profissionais Capacitados para trabalhar com elas.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Sou Especialista na área e trabalho com os mais diversos tipos de Smart Cards com ou sem contato. E o cartão que mais gosto de trabalhar e sem dúvidas o mais interessante de todos é o Java Card.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Espero que gostem da Iniciativa e que seja muito prazeroso o seu aprendizado da mesma forma que é para mim compartilhar um pouco da minha experiência com vocês.</span><br />
<br />
<span style="font-family: Arial,Helvetica,sans-serif;"><b>Smart Cards.</b></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Um Smart Card (Cartão Inteligente), armazena e processa informações através de circuitos integrados de silício (Chip) embutidos em um cartão plástico de material geralmente composto por PVC (Policloreto de Vinila) ou Policarbonato.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Esses Chip's podem ser acessados tanto por "contato" como por campo eletro-magnético "sem-contato", também possuem a capacidade de gerênciar alimentação elétrica e processamento de dados.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Muitos possuem técnicas avançadas de proteção por Hardware como mixagem de blocos no substrato de Silício e DPA Countermeasures</span><span style="font-family: Arial,Helvetica,sans-serif;"><a href="http://www.cryptography.com/technology/dpa.html">(link)</a>.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><b>Breve História.</b></span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">A idéia de se embutir um chip em um cartão plástico surgiu de dois inventores alemães Jürgen Dethloff e Helmut Grötrupp em 1968 o qual patentearam a invenção mais tarde. </span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><b> </b>Em 1970 Kunitaka Arimura do Arimura Technology Institute no Japão registra também uma patente de um Smart Card.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Entre 1974 e 1979 Roland Moreno um Jornalista Francês registrou 47 patentes referentes a Smart Cards em 11 Países.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">No final dos anos 70, a CII Honeywell Bull agora conhecida como Groupe Bull (uma compania de computadores Francesa), foi a primeira a comercializar a Tecnologia Smart Cards e introduziu no mercado os cartões micro-processados.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">No início dos anos 80, os primeiros Smart Cards começaram a ser utilizados na França e Alemanha como cartões pré-pagos de Telefonia e cartões de débito e crédito bancarios, essas tentativas de sucesso provou o potencial dos Smart Cards contra fraudes e sua flexibilidade.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Com o recente avanço da tecnologia em Chips e os modernos Motores Criptograficos, Smart Cards se tornaram mais poderosos e vem sendo usados nas mais diversas aplicações como armazenamento de crédito eletrônico, substituindo o dinheiro de papel, armazenando prontuários médicos, prevenindo acesso não autorizado a serviços de TV a Cabo e Satélite, promovendo segurança em serviços de Telefonia Móvel (GSM),</span><span style="font-family: Arial,Helvetica,sans-serif;"> Cartão de Registro de Identidade Civíl</span><span style="font-family: Arial,Helvetica,sans-serif;"> <a href="http://portal.mj.gov.br/data/Pages/MJ4E0605EDITEMID518E8A7092B640EA90176383BD4E89A1PTBRNN.htm">(link)</a> , Certificação Digital, e muito mais.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Como podem ver é segmento em desenvolvimento com centenas de possibilidades de uso e aplicação ainda pouco explorada.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Minha intenção é rechear esse Blog com dados técnicos, tutoriais com código fontes e exemplos. Inicialmente focarei meus esforços na Tecnologia Java Card porém nada impede de falar sobre as outras tecnologias como MiFare (RFID), Crypto Memory, etc.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Criticas e Sugestões serão bem vindas desde que construtivas. </span><br />
<span style="font-family: Arial,Helvetica,sans-serif;">Perguntas do tipo "<i>Como faço para ler um Cartão de Crédito?</i>" ou "<i>Como Credito o Vale Refeição / Transporte</i>" serão prontamente ignoradas.</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><br />
</span><br />
<span style="font-family: Arial,Helvetica,sans-serif;"><b>Um Grande Abraço!</b></span>Ricardo Massaohttp://www.blogger.com/profile/13929394839245906485noreply@blogger.com8