Trabajar con comandos APDU utilizando el ejemplo EToken

"... El camino no es tan difícil de entender. Las fuerzas de la naturaleza, las inclinaciones naturales, los patrones de eventos ...
Una comprensión primitiva del mundo nota solo cuatro elementos y no va más allá de esto. Es como si el universo se redujera a cuatro fenómenos comprensibles ".
Stephen Erickson.
"Marea de medianoche".

imagen

Hola Habr!

El tema de APDU se ha planteado repetidamente, pero principalmente se trata de tarjetas inteligentes, para las cuales necesita un lector de tarjetas y una tarjeta que no sea una lástima, además de software, ya que trabajar con la interfaz de la consola OpenSC, al menos en Window $, es un inconveniente, por decir lo menos.
Para hacer esto, escribí un pequeño programa con una interfaz de ventana que funciona a través de winscard.
Las fuentes y los binarios se pueden descargar aquí .
Compilado en Visual Studio 2008, debe agregar el proyecto WinSCard.Lib del SDK de Microsoft Windows al proyecto.

Lo más probable es que haya peces azules EToken PRO Java 72 K con certificados EDS caducados hace muchos años (usando una "batalla" con un EDS existente, ¡no se recomienda el token para experimentos!).
También son adecuados JaCarta Pro, que difieren de los etokens solo externamente.
También puede intentar trabajar con Gemalto SafeNet eToken 5100, pueden ver el contenido de los directorios, pero no podrán leer el archivo debido al tiempo de espera muy pequeño (probablemente varios milisegundos) entre los comandos para seleccionar y leer el archivo, como resultado de lo cual el comando para leer el archivo se refiere manualmente ya en un lugar vacío (código de error 69 85). Quizás esta sea una de las razones por las que en algunas plataformas en estos tokens ya no ven las claves. Con respecto a SafeNet eToken 5100 (con una inscripción honesta en el lado "Hecho en China"), observo lo siguiente: "JaCarta Single Client" no quiere trabajar con él y muestra un mensaje de que este producto no es compatible, el eToken PKI Client 5.1 de 64 bits de Aladdin No lo ve, pero la versión 32 para Win XP funciona con él, aunque para este token es recomendable instalar el cliente de autenticación SafeNet original.

Otros tokens, incluida la familia JaCarta, no funcionarán, ya que los comandos APDU para todos ellos son completamente diferentes y su valor digital descrito en el estándar ISO7816 no coincide.

Los detalles sobre el formato de los comandos APDU se pueden encontrar, por ejemplo, aquí .
Un lector con un pez azul puede familiarizarse con el trabajo de APDU sin levantarse del sofá.
Es necesario instalar el controlador para eToken eToken PKI Client 5.1 o "JaCarta Single Client" y conectar el token.

Para una vista detallada del contenido del token en una forma conveniente y conciliación con lo que dan los comandos APDU, puede usar el Editor Autoit JaCarta que escribí.

Inicie APDUExplorer, seleccione “Aladdin Token JC 0” o “ARDS JaCarta 0” o “SafeNet Token JC 0” de la lista de lectores y puede ingresar comandos.
Puede ingresar tanto a través de dos puntos como a través de espacios o todos juntos.

Primero, puede verificar el rendimiento haciendo clic en "Verificar ATR" y obtener una respuesta simbólica.

El primer comando es seleccionar el applet predeterminado e ir al directorio raíz con el identificador 3f00 (este identificador es quizás lo único común a los tokens de cualquier proveedor).
00: A4: 00: 04: 00

A continuación, obtenemos una lista de carpetas en el directorio raíz
80: 01: 01: 00: 04: 09: 02: 00: 00: CD (el comando es la constante "Lista de carpetas de informes").
Se debe recibir una respuesta:
0a 02 66 66 0b 01 00 90 00

El segundo byte en la respuesta es el tamaño de los datos recibidos: dos bytes, es decir, solo una carpeta (el identificador de archivo o carpeta en la APDU siempre toma dos bytes).
Y solo vemos una carpeta con el identificador 66 66, llamada directorio AID de Aladdin.

Lista de archivos de informes (también constante)
80: 01: 02: 00: 04: 09: 02: 00: 00: CD
Debe ser recibido
0a 00 0b 01 00 90 00
La respuesta en la posición 01 es 00.

Ir al directorio 66 66
00 A4 08 04 02 66 66 00
Este es el comando SELECCIONAR ARCHIVO, su formato: cuatro bytes, el comando 00 A4 08 04 en sí, luego el tamaño del campo de datos de la ruta completa (en el ejemplo 02 bytes), luego se debe completar la ruta en sí (en el ejemplo 66 66) y 00.

Informe de la lista de directorios 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
El campo de respuesta 01 (tamaño de respuesta) indica 04, es decir 4 bytes = dos carpetas 50 01 y 50 00, mientras que 50 01 es la carpeta de servicio y 50 00 es la principal, llamada PKCS # 11, donde se almacenan todos los datos

Lista de directorios de informes 66 66
80: 01: 02: 00: 04: 09: 02: 00: 00: CD
Resv bytes:
0a 00 0b 01 00 90 00
No hay archivos aquí.

Los estudios han demostrado que no hay carpetas y archivos visibles en el directorio 50 01, así que vaya al directorio principal 50 00
00 A4 08 04 04 66 66 50 00 00
Lista de carpetas de informes
80: 01: 01: 00: 04: 09: 02: 00: 00: CD
La respuesta dependerá de lo que esté almacenado en el token.
Lista de archivos de informes
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 archivos (campo de respuesta 01), luego cada 2 bytes estos son nombres de archivos, luego hay información de servicio.

Cada token de los modelos estudiados siempre tiene un directorio del sistema b000 y el archivo del sistema 0002, intente leerlo, y otros archivos pueden leerse con el mismo principio.
Vaya al directorio b0 00
00 A4 08 04 06 66 66 50 00 B0 00 00
Obtenga una lista de archivos
80: 01: 02: 00: 04: 09: 02: 00: 00: CD
Resv bytes:
0a 02 00 02 0b 01 00 90 00
Vemos el archivo 00 02 (el byte en el campo de respuesta 01 es el tamaño del nombre (cada nombre siempre toma dos bytes, los siguientes campos son los nombres de archivo, en este caso solo hay un archivo, que está determinado por el valor del campo 01).

Seleccione el archivo 0002 de B000 para la ruta completa
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
El formato de respuesta es el siguiente: preámbulo - 2 bytes, tipo de archivo - 1 byte (archivo 02, carpeta 01), delimitador - 2 bytes, nombre del archivo - 2 bytes, delimitador - 2 bytes, tamaño del archivo - 2 bytes, delimitador - 2 bytes, derechos de acceso - 1 byte (00 - disponible para todos, 63 está protegido por un código PIN). Luego viene algo de información general, que termina con el código para la ejecución exitosa del comando APDU - 90 00.

Lea este archivo, los dos últimos bytes del comando son el tamaño del búfer, cuánto leer (en este caso, es igual al tamaño del archivo).
80 18 00 00 04 0E 02 00 00 10
Resv bytes: (el valor en cada caso será diferente):
00 06 63 61 72 64 63 66 00 00 00 00 00 00 00 00 90 00

No considero la autenticación en el etoken aquí, ya que consiste en una secuencia de comandos de preguntas y respuestas y está encriptada (hay un proyecto Antitoken donde el problema de autorización en estos productos se resolvió fundamentalmente).
Algunos otros tokens, como JaCarta GOST-2, admiten la autenticación simplemente pasando un código PIN.

Puede obtener los valores APDU de los comandos de cualquier tarjeta inteligente y token interceptando el tráfico WinSCard.dll ejecutando un sniffer compilado desde aquí (los experimentos han demostrado que este sniffer está instalado y se ejecuta solo en Win XP).

Como referencia, posibles resultados de ejecutar comandos APDU:
90 00 - OK
69 85 - Condiciones de uso no cumplidas
63 00 - Falló la autenticación del criptograma del host (autenticación externa)
64 00 - Sin diagnóstico específico
67 00 - Longitud incorrecta en Lc
67 XX - Error, parámetro incorrecto P3 (código ISO)
68 81 - El canal lógico no es compatible o no está activo
69 82 - Estado de seguridad no satisfecho
69 83 - Código secreto bloqueado
69 85 - No hay EF actualmente seleccionado, no hay comando para monitorear / no hay Transaction Manager File
6A 80 - Los parámetros en el campo de datos son incorrectos
6A 81 - La tarjeta está bloqueada o el comando no es compatible
6A 82 - Archivo no encontrado
6A 85 - Lc inconsistente con la estructura TLV
6A 86 - P1 P2 incorrecto
6A 88 - Datos de referencia no encontrados (Init upd)
6D 00 - Instrucciones inválidas
6E 00 - Clase inválida

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


All Articles