Augusto LangeEduardo Schneider
Jeferson Ghisio
1
O que é um Smart Card?
Cartão com chip embutido que transmite, armazena e processa
dados; Característicasdefinidas na ISO 7816
2
Aplicações:
- CPF- Controle de acessos- ID- TRI- Celular
3
Mercado dos Smart Cards:Quantidade de Smart Cards no Brasil (milhões):
4
Porque investir em Smart Cards?
99% dos POS Visanet aceitam smart cards 25% ATMs aceitam smart cards
• POS - Máquinas que lêem cartões de crédito e de débito utilizadas em restaurantes, etc..
• ATM – Máquinas que se retira dinheiro do banco.
5
Tipos de Smart Card:
Contato Físico Radio Frequência Sem contato físico (contactless)
6
7
Controle de comunicação – APDU (Application Protocol Data Units)
Comunicação half- duplex T= 0 (envio byte- a- byte) T= 1 (envio de blocos de bytes)
8
• Cartão é introduzido no leitor
• Leitor verifica que o cartão está devidamente posicionado
• Leitor aplica energia aos contactos
• Leitor activa o sinal de Reset
• Cartão responde com ATR (Answer To Reset)
9
ATR (Answer To Reset)
Seqüência de inicialização de leitura de um smart card Cadeia de caracteres com informações do próprio smart
card Obtido quando o smart card é conectado Define várias características da comunicaçãoque se seguirá (ritmo, protocolo, etc)Exemplos: – 3B 23 00 35 13 FF (Schlumberger MicroPayflex) – 3B 1F 11 00 67 80 42 46 49 53 45 10 52 66 FF 81 90
00 (Nokia branded SC) – 3B 1F 94 00 6A 01 38 46 49 53 45 10 8C 02 FF 07 90
00 (GSM- SIM Saunalahti)
10
Análise de um ATR
3B A7 00 40 18 80 65 A2 08 01 01 52
TS = 3B Direct Convention (bit menos significativo)
T0 = A7 00 (Historical bytes) TD = 40 Protocol T = 0 + Historical bytes: 18 80 65 A2 08 01 01 52 Gemplus GPK8000
11
Estrutura APDU (Aplication Protocol Data Unit)
- CLA (1-byte) - define a classe da instrução – INS (1-byte) - define a instrução específica de entre o conjunto de
instruções definido por CLA. – P1 (1-byte) - especifica o modo de endereçamento usado pela
instrução [CLA, INS]. – P2 (1-byte) - também especifica o modo de endereçamento usado
pela instrução [CLA, INS]. - Lc - Número de bytes do campo “Data field” - Le - Número de bytes a enviar para o cartão
12
Resposta-APDU
- ACK (1-byte) - Indica recepção de dados. (igual INS) – NULL (1-byte) – Manda mensagem para leitora não enviar
nenhum dado para o cartão pois este está a trabalhar ainda em um comando.
– SW1 (1-byte) – Campo utilizado pelo cartão para mandar uma resposta sobre o Status da transmissão de volta para o leitor.
– SW2 (1-byte) - (opcional) Campo que pode ser incluído nos bytes de processos, devolve um status para o leitor.
13
Obrigatório Corpo Opcional Obrigatório
ACK NULL Data Field SW1 SW2
É utilizada paridade par para testar os dados transmitidos.
14
Aplicacao
15
Limitações da Linguagem
• Tipos primitivos “grandes”: long, double, float ;
• Caracteres e strings• Arrays multidimensionais• Carga dinâmica de classes• Security manager• Serialização e clone de objetos
16
Java Card Applets Pequenos aplicativos que executam em
Java Cards (“Cardlets”)
17
Frameworks• javacard.framework– Abstrações de Applet, PIN, APDU, System e
Util
• javacardx.framework– Implementação de rotinas ISO 7816- 4 (filesystem)
• javacardx.crypto– Suporte a criptografia
18
Ferramentas para desenvolvimento:
• Sun Java Card Development Kit (gratuito)http://java.sun.com/products/javacard/dev_kit.html• Axalto VIEWS (evaluation)http:// www.simagine.org (requer login)• JCOP (Plug eclipse)http://www.zurich.ibm.com/jcop/news/news.html• JCardExpress (Projeto opensource brasileiro)http://jcardexpress.dev.java.net
19
Exemplo do Hello World
public class HelloWorldJC extends javacard.framework.Applet{ // CLA Byte final - PROCESS static byte HELLO_CLA = (byte) 0xB0;
// Verifica PIN final static byte INS_HELLO = (byte) 0x20;
public static void install (byte[] bArray, short bOffset, byte bLength) { (new HelloWorldJC()).register( bArray, (short) (bOffset + 1),
Array[bOffset]); }
20
// processa o comando APDU public void process(APDU apdu) {
byte[] buffer = apdu.getBuffer();
if ((buffer[ISO7816.OFFSET_CLA] == 0) && (buffer[ISO7816.OFFSET_INS] == (byte) (0xA4))) return;
// Valida o CLA byte if (buffer[ISO7816.OFFSET_CLA] != HELLO_CLA) ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
21
// Seleciona a instrução apropriada (Byte INS) switch (buffer[ISO7816.OFFSET_INS]) {
case INS_HELLO : getHello(apdu); return;
default :
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED); }
}
22
private void getHello(APDU apdu) { // cadeia de bytes com a mensagem: "hello world" byte[] hello = { 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', ‘d’};
// informa ao JCRE que será enviado uma resposta short le = apdu.setOutgoing(); short totalBytes = (short) hello.length;
// informa ao JCRE o tamanho da mensagem em bytes apdu.setOutgoingLength(totalBytes);
// envia a mensagem para o host apdu.sendBytesLong(hello, (short) 0, (short) hello.length); }
}
23
• Java Card (site oficial)http://java.sun.com/products/javacard• JSR 268http://jcp.org/aboutJava/communityprocess/edr/jsr268/
index.html• Portal Java Card Brasilhttp://www.javacard.com.br• OpenCard Frameworkhttp://www.opencard.org• Wikipediahttp://pt.wikipedia.org/
24
Top Related