Trabalhando com comandos APDU usando o exemplo EToken

"... O caminho não é tão difícil de entender. As forças da natureza, inclinações naturais, padrões de eventos ...
Uma compreensão primitiva do mundo percebe apenas quatro elementos e não vai além disso. É como se o universo se resumisse a quatro fenômenos compreensíveis e compreensíveis ".
Stephen Erickson.
"Maré da meia-noite."

imagem

Olá Habr!

O tópico do APDU foi levantado repetidamente, mas principalmente cartões inteligentes, para os quais você precisa de um leitor de cartões e um cartão que não seja uma pena, além de software, já que trabalhar com a interface do console OpenSC, pelo menos no Window $, é inconveniente, para dizer o mínimo.
Para fazer isso, escrevi um pequeno programa com uma interface de janela que funciona através do winscard.
Fontes e binários podem ser baixados aqui .
Compilado no Visual studio 2008, você precisa adicionar o projeto WinSCard.Lib do Microsoft Windows SDK ao projeto.

Provavelmente haverá EToken PRO Java 72 K com certificados EDS expirados há muitos anos (usando uma "batalha" com um EDS existente, o token não é recomendado para experimentos!).
Também são adequados o JaCarta Pro, que difere dos etokens apenas externamente.
Você também pode tentar trabalhar com o Gemalto SafeNet eToken 5100, eles podem visualizar o conteúdo dos diretórios, mas não poderão ler o arquivo devido ao tempo limite muito pequeno (provavelmente vários milissegundos) entre os comandos para selecionar e ler o arquivo, como resultado do comando para ler o arquivo manualmente já está em um local vazio (código de erro 69 85). Talvez esse seja um dos motivos pelos quais, em algumas plataformas desses tokens, eles não veem mais as chaves. Em relação ao SafeNet eToken 5100 (com uma inscrição honesta no lado “Fabricado na China”), observo o seguinte: “O JaCarta Single Client” não deseja trabalhar com ele e exibe uma mensagem de que este produto não é suportado, o eToken PKI Client de 64 bits da Aladdin Ele não o vê, mas a versão 32 do Win XP funciona com ele, embora para esse token seja recomendável instalar o SafeNet Authentication Client original.

Outros tokens, incluindo a família JaCarta, não funcionarão, pois os comandos APDU para todos eles são completamente diferentes e seu valor digital descrito no padrão ISO7816 não corresponde.

Detalhes sobre o formato dos comandos APDU podem ser encontrados, por exemplo, aqui .
Um leitor com um peixe azul pode se familiarizar com o trabalho da APDU sem se levantar do sofá.
É necessário instalar o driver do eToken eToken PKI Client 5.1 ou "JaCarta Single Client" e conectar o token.

Para uma visão detalhada do conteúdo do token em uma forma conveniente e reconciliação com o que os comandos do APDU fornecem, você pode usar o escrito por mim no Editor do Autoit JaCarta .

Inicie o APDUExplorer, selecione “Aladdin Token JC 0” ou “ARDS JaCarta 0” ou “SafeNet Token JC 0” na lista de leitores e você pode inserir comandos.
Você pode inserir dois pontos e espaços ou todos juntos.

Primeiro, você pode verificar o desempenho clicando em "Verificar ATR" e obter uma resposta do token.

O primeiro comando é selecionar o applet padrão e ir para o diretório raiz com o identificador 3f00 (esse identificador é talvez a única coisa comum aos tokens de qualquer fornecedor).
00: A4: 00: 04: 00

Em seguida, obtemos uma lista de pastas no diretório raiz
80: 01: 01: 00: 04: 09: 02: 00: 00: CD (o comando é a constante "Lista de pastas de relatório").
Uma resposta deve ser recebida:
0a 02 66 66 0b 01 00 90 00

O segundo byte na resposta é o tamanho dos dados recebidos - dois bytes, ou seja, apenas uma pasta (o arquivo ou o identificador de pasta no APDU sempre leva dois bytes).
E vemos apenas uma pasta com o identificador 66 66, chamada diretório Aladdin AID.

Lista de arquivos de relatório (também constante)
80: 01: 02: 00: 04: 09: 02: 00: 00: CD
Deve ser recebido
0a 00 0b 01 00 90 00
A resposta na posição 01 é 00.

Vá para o diretório 66 66
00 A4 08 04 02 66 66 00
Este é o comando SELECT FILE, seu formato: quatro bytes, o próprio comando 00 A4 08 04, o tamanho do campo de dados do caminho completo (no exemplo 02 bytes) e o próprio caminho (no exemplo 66 66) e 00 devem ser concluídos.

Lista de diretórios 66 66
80: 01: 01: 00: 04: 09: 02: 00: 00: CD
Resv bytes:
0a 04 50 01 50 00 0b 01 00 90 00
O campo de resposta 01 (tamanho da resposta) indica 04, ou seja, 4 bytes = duas pastas 50 01 e 50 00, sendo 50 01 a pasta de serviço e 50 00 a pasta principal, denominada diretório PKCS # 11, onde todos os dados são armazenados

Lista de diretórios de relatórios 66 66
80: 01: 02: 00: 04: 09: 02: 00: 00: CD
Resv bytes:
0a 00 0b 01 00 90 00
Nenhum arquivo aqui.

Estudos demonstraram que não há pastas e arquivos visíveis no diretório 50 01, portanto, vá para o diretório principal 50 00
00 A4 08 04 04 66 66 50 00 00
Lista de Pastas de Relatório
80: 01: 01: 00: 04: 09: 02: 00: 00: CD
A resposta dependerá do que está armazenado no token.
Lista de arquivos de relatório
80: 01: 02: 00: 04: 09: 02: 00: 00: CD
Resv bytes:
0a 14 00 0f 00 02 00 03 00 04 00 05 00 06 00 07 00 08 00 09 00 0a 0b 01 00 90 00
Vemos 14 arquivos (campo de resposta 01); depois, a cada 2 bytes, esses são nomes de arquivos, há informações de serviço.

Cada token dos modelos estudados sempre possui um diretório de sistema b000 e o arquivo de sistema 0002, tente lê-lo e outros arquivos podem ser lidos pelo mesmo princípio.
Vá para o diretório b0 00
00 A4 08 04 06 66 66 50 00 B0 00 00
Obter uma lista de arquivos
80: 01: 02: 00: 04: 09: 02: 00: 00: CD
Resv bytes:
0a 02 00 02 0b 01 00 90 00
Vemos o arquivo 00 02 (o byte no campo de resposta 01 é o tamanho do nome (cada nome sempre leva dois bytes, os seguintes campos são os nomes dos arquivos, neste caso, existe apenas um arquivo, que é determinado pelo valor do campo 01).

Selecione o arquivo 0002 de B000 para o caminho completo
00 A4 08 04 08 66 66 50 00 B0 00 00 02 00
Resv bytes:
01 01 02 02 02 00 02 03 02 00 10 04 08 00 ff 00 00 ff ff ff ff 05 00 90 00
O formato da resposta é o seguinte: preâmbulo - 2 bytes, tipo de arquivo - 1 byte (arquivo 02, 01 pasta), delimitador - 2 bytes, nome do arquivo - 2 bytes, delimitador - 2 bytes, tamanho do arquivo - 2 bytes, delimitador - 2 bytes, direitos de acesso - 1 byte (00 - disponível para todos, 63 é protegido por um código PIN). Em seguida, vêm algumas informações gerais, terminando com o código para a execução bem-sucedida do comando APDU - 90 00.

Leia este arquivo, os dois últimos bytes do comando têm o tamanho do buffer a ser lido (neste caso, é igual ao tamanho do arquivo).
80 18 00 00 04 0E 02 00 00 10
Resv bytes: (o valor em cada caso será diferente):
00 06 63 61 72 64 63 66 00 00 00 00 00 00 00 00 90 00

Não considero a autenticação no etoken aqui, pois consiste em uma sequência de comandos de perguntas e respostas e é criptografada (existe um projeto Antitoken em que o problema de autorização nesses produtos foi fundamentalmente resolvido).
Alguns outros tokens, como o JaCarta GOST-2, suportam autenticação simplesmente passando um código PIN.

Você pode obter os valores APDU dos comandos de quaisquer cartões inteligentes e tokens interceptando o tráfego do WinSCard.dll executando um sniffer compilado a partir daqui (experimentos demonstraram que esse sniffer está instalado e é executado somente no Win XP).

Para referência, possíveis resultados da execução de comandos APDU:
90 00 - OK
69 85 - Condições de uso não estritas
63 00 - Falha na autenticação do criptograma do host (autenticação ext)
64 00 - Nenhum diagnóstico específico
67 00 - Comprimento errado em Lc
67 XX - Erro, parâmetro P3 incorreto (código ISO)
68 81 - Canal lógico não suportado ou não está ativo
69 82 - Status de segurança não satisfeito
69 83 - Código secreto bloqueado
69 85 - Nenhum EF selecionado no momento, nenhum comando para monitorar / nenhum arquivo do Transaction Manager
6A 80 - Os parâmetros no campo de dados estão incorretos
6A 81 - Cartão bloqueado ou comando não suportado
6A 82 - Arquivo não encontrado
6A 85 - Lc inconsistente com a estrutura TLV
6A 86 - P1 P2 incorreto
6A 88 - Dados referenciados não encontrados (Atualização inicial)
6D 00 - Instrução inválida
6E 00 - Classe inválida

Source: https://habr.com/ru/post/pt446552/


All Articles