2012-07-02 22 views
7

Estoy intentando leer una tarjeta inteligente (German Gesundheitskarte) usando javax.smartcardioUso LEER BINARIO para leer más de 256 bytes

En el definition de la "PD" EF su longitud se especifica como 850 bytes. El contenido debe ser un ISO5589-15 cadena XML codificado en formato gzip como se especifica here

Como CommandAPDU envío

00 B0 00 00 00 

para obtener los primeros 256 bytes. Después de enviar

00 B0 00 FF 00 

consigo los siguientes 256 bytes.

Pero, ¿cómo puedo obtener el resto?

¿Cómo sabré cuando termina los datos binarios?

German Specification Part 1 | German Specification Part 2

Respuesta

8

READ BINARY APDU permiten bytes para el desplazamiento de archivo, codificado en P1 y P2, y el uso de la longitud Le, por READ BINARY el número de bytes en la respuesta. P1 es alto byte, o el byte más significativo. Sin embargo, el bit superior de P1 está reservado para indicar si P1 también contiene un identificador de archivo corto . Debe permanecer a su valor 0 si ya está leyendo un archivo, dejándole con un desplazamiento del máximo 32Ki - 1.

no puedo leer las especificaciones que ha asociado pero vamos a suponer que el READ BINARY APDU en su la tarjeta funciona de la misma manera.

Su comando para leer los primeros 256 bytes parece correcta, señalando que Le==0x00 indica una lectura de 256 bytes.

para leer los bytes comenzando en el desplazamiento 256, 512, etc., incrementando comenzar P1, por ejemplo:

00 B0 01 00 00 
00 B0 02 00 00 
00 B0 03 00 00 

Para leer 256 bytes comenzando en el offset 257 (0x101):

00 B0 01 01 00 

Offset 600 (0x258):

00 B0 02 58 00 

En su código, si usted está usando Java int para almacenar el desplazamiento, por lo general va a terminar incrementando P1 con algo como esto:

int offset; 
int P1, P2; 

while (continueReading) 
{ 
    // ... 
    P1 = (offset >> 8) & 0xFF; 
    P2 = offset & 0x00FF; 
    // ... 
    // send APDU 
} 

¿Cómo se indica el tamaño de un archivo depende de la aplicación. Por lo general, puede obtener el tamaño del archivo desde la estructura de información de control de archivos (FCI) devuelta por un SELECT en el EF (00 A4 00 00 02 fileId). Sin embargo, el tamaño del archivo también puede estar incrustado en el contenido del archivo. Si es posible, no debe confiar en las palabras de estado para decirle el tamaño del archivo.


Adición: Le, Ne y extraña INS

Es importante que sólo aumenta el offset con la cantidad de bytes que se recibe realmente dentro de los datos de respuesta (RDATA). Tenga en cuenta que si P3 = Le que Le codifica Ne, que es , el tamaño máximo de los datos de respuesta. Puede recibir menos que eso.

Si el tamaño del archivo es 32Ki o más, necesita utilizar LEER BINARIO con INS impar (B7) para leer los datos superiores a 32Ki. En ese caso, el RDATA también puede contener gastos generales. Obviamente eso, a su vez, puede influir en los cálculos de compensación y los cálculos para leer hasta el final del archivo.

+1

P3 no es la cantidad de bytes que deben leerse. Mantiene Le, que es la codificación del número máximo de bytes que se devolverán en la APDU de respuesta. Es casi lo mismo. –

+1

depende de a quién le preguntes realmente. Pasé demasiado tiempo con las especificaciones de GSM, donde 'P3' = Longitud, pero tu punto sigue siendo bueno, la mayoría de las personas usa' Le' y está_ más claro. – pb2q

+1

Eso no fue un ataque a su postura. El problema es que muchos creadores de especificaciones no entienden la diferencia, por lo que de forma predeterminada se ha convertido en una de las dos (o, a veces, en una combinación de ambas). –

4

el desplazamiento es en P1 & P2, aunque el bit más alto se utiliza para indicar que desea seleccionar algo con un determinado SFI. Entonces puede usar P1 también para los bytes. Después de eso, tendrá que avanzar hacia READ BINARY with an odd INS (B1).

Así se puede leer hasta 2^15 - 1 bytes usando el binario de lectura normal. Eso es 32Ki - 1. Y, por supuesto, unos pocos bytes adicionales debido a los bytes devueltos por la APDU.

yo siempre leer archivos desde tarjetas inteligentes usando el siguiente método: 1 determinar el tamaño del archivo, por ejemplo, utilizando el FCI (Información de control de archivos) devuelto con un SELECCIONAR por ID. DE ARCHIVO (00 A4 02 00 02 ${FILE_ID}), debe analizar la respuesta. A continuación, aumente el desplazamiento por el número de bytes devueltos cada vez. Nunca solicite más que el tamaño máximo de archivo, ya que el comportamiento de la mayoría de las tarjetas difiere, no está definido o simplemente es incorrecto).

Tema avanzado: Si usa READ BINARY with ODD INS, debe restar el encabezado del DO cada vez que aumenta el desplazamiento. En ese caso, leer hasta el final se vuelve un poco problemático porque necesitaría agregar la sobrecarga del encabezado al byte Le.

+1

Tenga en cuenta que esta información se puede encontrar en la norma ISO 7816-4. Es un software de pago, pero generalmente puede encontrar las especificaciones de forma ilegal sin costo, o puede extraer la información de otras librerías. Si está creando software comercial, ¡compre la especificación! –

0

si la tarjeta lo admite, probablemente pueda utilizar el formato de longitud extendida. si especifica 00 en el campo lc/le puede usar dos bytes siguientes para la longitud

0

Una pequeña adición a la IMO, una respuesta muy útil por parte de Maarten Bodewes sobre la lectura de archivos más grandes, y la sugerencia de stajo para usar Le extendido . Espero que esto les ahorre a otros tiempo y esfuerzo.

Tratar de usar por mucho tiempo Le dice es complicado:

  • extendido Le obliga a un uso prolongado, así Lc.
  • Extended Lc no debe ser 0, de acuerdo con el estándar, por lo que no puede comenzar en offset 0
  • Y si su Lc no es 0, debe utilizar el "B1" INS.
  • El B1 luego hace que sea un poco más complicado calcular los tamaños correctos, como explicó Maarten Bodewes.

Además de eso, primero debe averiguar si la tarjeta admite Lc/Le extendida en absoluto; la información sobre esto se extiende a través de los bytes históricos de ATR, el EF.ATR y la información de EF actual.

Por lo tanto, aunque en teoría es posible leer lotes grandes de datos de un solo archivo, en la práctica cuesta mucho esfuerzo y tampoco se puede leer el archivo completo con un comando.

Considere lo anterior antes de tomar el esfuerzo de usar Le extendido para leer.

Cuestiones relacionadas