Foros de consultas y discusión

Extracción de datos

Nicolás Balparda, modificado hace 7 años.

Extracción de datos

Youngling Mensajes: 2 Fecha de incorporación: 11/04/17 Mensajes recientes
Hola, ¿cómo están?

Estoy queriendo hacer una integración con desde .NET y he intentado de diversas maneras (diversos código externos) pero cada vez que quiero hacer la extracción del dato de la cédula me devuelve 6A 86

He leído en otro thread que podía deberse al P1, pero cuando cambio a 00 dicha valor me devuelve que los parametros P1-P2 son incorrectos. Estoy usando la aplicación https://sourceforge.net/projects/jsmartcard/?source=typ_redirect para asegurarme que desde algo ya hecho puedo hacer la extracción de los datos previo a involucrarme en mi propio código. 

Por otro lado, aún no entiendo totalmente que valor debería pasar - si es que tengo que pasar - en el Le. 

Les agradezco desde ya.

Saludos,

Nicolás
thumbnail
Guillermo Dotta, modificado hace 7 años.

RE: Extracción de datos

Youngling Mensajes: 12 Fecha de incorporación: 29/09/16 Mensajes recientes
Cómo estás Nicolás?
Ese código de error corresponde a parámetros incorrectos (6A 86). Qué comandos estás enviando?El Le es el parámetro que le indica a la tarjeta cuántos bytes vas a recibir. Hay comandos que lo verifican explícitamente y si no ponés la cantidad exacta te da error.

Algunas consideraciones que hay que tener para leer los archivos en general:
- La lectura siempre se da en dos pasos, primero seleccionando el archivo con el comando select file y luego leyendo una cantidad de bytes con el comando read binary.
- La cantidad de bytes a leer en el segundo paso es arbitraria, pero para saber el tamaño del archivo, se tiene que mirar un campo en el FCI Template, que es la respuesta del select File. Es decir, cuando se selecciona el archivo, la tarjeta retorna una estructura de datos que contiene. entre otras cosas, el tamaño del archivo. De ahí se puede obtener la cantidad de bytes para pasarle al sucesivo read Binary.
- Los archivos están codificados en el contexto de la aplicación de identificación y firma (IAS), por lo que conviene seleccionar esa aplicación previo a leer los archivos.


Te paso un ejemplo de secuencia de comandos para leer los datos que estás intentando leer:

1) Select IAS - 00A40400 0C A0 00 00 00 18 40 00 00 01 63 42 00 - Es un Select File pero en el contenido se envía el Application ID, que es ese.
El resultado es vacío, solamente reportando el 9000 que indica éxito.

2) Select File 7001 del número de tarjeta - 00A40000 02 7001
El P1 se pone a 00 porque es lo que se usa para seleccionar archivos elementales (EF), como lo es el archivo que contiene este dato.
El P2 se pone a 00 para pedir que se responda el FCI Template, que necesitamos para sacar el tamaño del archivo. 

Respuesta: 6F 13 81 02 00 0C 82 01 01 83 02 70 01 8A 01 05 8C 03 03 FF 00
Esta respuesta es un TLV, que es la forma estándar de codificar datos en tarjetas. Un TLV es una terna de TAG, LENGTH y VALUE. El TAG identifica el tipo de información contenida, el Length el largo en bytes de la misma y el Value el contenido propiamente dicho. En este caso, el tag 6F indica que es un FCI Template, y el largo 13h son los 19 bytes que componen el mismo.
El TLV de tag 81 indica el largo del archivo seleccionado, el 02 es el largo de esa información y el contenido, 000C, es el largo del archivo que vamos a leer.
El TLV de tag 83 indica el ID del archivo, que es de 02 bytes y previsiblemente su contenido es 7001, que es el archivo que leímos.
El resto de los TLVs (82, 8A y 8C) corresponden a información de control del archivo, que no es relevante para lo que querés hacer ahora.

3) Read Binary. 00B0 0000 0C
Acá B0 es el comando, y el P1 y P2 especifican el offset del cual se quiere empezar a leer dentro del archivo. Esto es útil para archivos grandes, como la foto de la persona, que deben ser leidos en varios pasos, dado que en cada uno se pueden leer solamente FF = 255 bytes.
El 0C es el largo del archivo del número de tarjeta, que lo obtuvimos del FCI template en el paso anterior. Si le enviamos eso estamos seguros que leemos todo el archivo. Si le enviamos menos va a devolver el archivo truncado y si mandamos más puede dar error o meter ceros como padding, en cuyo caso no podemos saber si es contenido legítimo o relleno justamente...
En este caso la respuesta es el TLV del número de tarjeta: 5F01 09 30303030304D484151
El TAG es 5F01 y el largo 9 bytes. El contenido viene en hexa, pero si lo decodificamos como ASCII usando alguna herramienta como esta obtenemos: 00000MHAQ
Esto es el número de TARJETA, que es el que encontrás impreso en una esquina en texto y en código de barras. Sirve para identificar individualmente la tarjeta mientras que el número de persona (lo que habitualmente llamamos número de cédula) identifica a la persona independientemente de cuántas veces sacó el documento. Este dato se obtiene del archivo 7002, de los datos biográficos.


4) Select File 7002 de datos Biográficos. 00A40000 02 7001
El FCI template en este caso da: 6F 13 81 02 00 A2 82 01 01 83 02 70 02 8A 01 05 8C 03 03 FF 00
Con lo que ya vimos en el caso anterior, el tamaño del archivo es 00A2, es decir, A2. En este caso es particularmente importante consultarlo, ya que al tener información de largo variable, el largo de este archivo naturalmente varía de persona a persona.


5) Read Binary. 00B0 0000 A2
La respuesta es la siguiente: 1F 01 14 2A 2A 2A 54 45 53 54 2A 2A 2A 20 41 50 45 4C 4C 49 44 4F 49 1F 02 15 2A 2A 2A 54 45 53 54 2A 2A 2A 20 41 50 45 4C 4C 49 44 4F 49 49 1F 03 12 2A 2A 2A 54 45 53 54 2A 2A 2A 20 4E 4F 4D 42 52 45 53 1F 04 03 55 52 59 1F 05 08 32 38 31 30 31 39 36 31 1F 06 0E 4D 4F 4E 54 45 56 49 44 45 4F 2F 55 52 59 1F 07 08 39 39 39 39 39 39 39 39 1F 08 04 15 09 20 16 1F 09 08 33 30 31 31 32 30 31 37 1F 0A 1C 44 45 53 54 49 4E 4F 3A 20 41 47 45 53 49 43 20 45 53 50 45 43 49 4D 45 4E 20 56 33

Es una concatenación de varios TLV donde cada uno contiene un dato distinto. En este caso los TLV tienen TAGS de 2 bytes.
Primer Apellido: 1F01 14 2A 2A 2A 54 45 53 54 2A 2A 2A 20 41 50 45 4C 4C 49 44 4F 49 - "***TEST*** APELLIDOI"
Segundo Apellido: 1F02 15 2A 2A 2A 54 45 53 54 2A 2A 2A 20 41 50 45 4C 4C 49 44 4F 49 49 - "***TEST*** APELLIDOII"
Nombres: 1F03 12 2A 2A 2A 54 45 53 54 2A 2A 2A 20 4E 4F 4D 42 52 45 53 - "***TEST*** NOMBRES"
Nacionalidad: 1F04 03 55 52 59 - "URY"
.... y todo así... La referencia completa de estos TLV la encontras acá.
En particular, el Tag 1F07 contiene el número de persona (aka. Número de cédula).
1F07 08 39 39 39 39 39 39 39 39 - "99999999" que corresponde a la cédula de prueba 9.999.999-9

De esa manera podés extraer todos los datos biográficos a partir del TLV correspondiente, y más información de otros archivos, como por ejemplo la foto. La referencia de ID de archivos e ID de TLVs la encontrás en la documentación ya referenciada.

Espero que te sirvan estos ejemplos para resolver el problema. Contanos cómo te va.
Saludos
​​​​​​​Guillermo
thumbnail
Guillermo Dotta, modificado hace 7 años.

RE: Extracción de datos

Youngling Mensajes: 12 Fecha de incorporación: 29/09/16 Mensajes recientes
Te paso el proyecto de Smartcard explorer en un post aparte porque cuando lo quise hacer juntos se me perdió el post y lo tuve que reescribir de cero...

Saludos
​​​​​​​Guillermo
Nicolás Balparda, modificado hace 7 años.

RE: Extracción de datos

Youngling Mensajes: 2 Fecha de incorporación: 11/04/17 Mensajes recientes
Guillermo, ¿cómo estás?

Bien, ahora he logrado conectarme - aunque siempre estoy medio que hardcodeando la longitud porque nunca me la retorna (no sé si es porque utilice un DLL para acelerar el proceso y la misma me está ocultando el dato del largo a leer).

Se me generaron nuevas preguntas:

  1. Pude obtener los datos de la cédula. Ahora, la fecha de expedición me retorna en formato raro. ¿Cómo está codificado? Porque según la lectura me dice que son 4 bytes nomás y no 8 como dice la guía.
  2. Para obtener la foto, entiendo que es con el comando 70 04. Lo que retorna, en bytes, ¿puede que sean sólo 52 bytes? No lo estoy logrando convertir a una imagen.
  3. Estoy verificando el PIN, pero siempre me dice que los intentos son incorrectos. ¿Qué PIN de prueba debería utilizar?

Te agradezco desde ya la respuesta.

Saludos,

​​​​​​​Nicolás
thumbnail
Guillermo Dotta, modificado hace 7 años.

RE: Extracción de datos

Youngling Mensajes: 12 Fecha de incorporación: 29/09/16 Mensajes recientes

Bien, ahora he logrado conectarme - aunque siempre estoy medio que hardcodeando la longitud porque nunca me la retorna (no sé si es porque utilice un DLL para acelerar el proceso y la misma me está ocultando el dato del largo a leer).

Qué biblioteca estás usando? Si invocaste el Select File con P2=00, el resultado debería ser el FCI Template como te puse en los ejemplos anteriores, y ese tiene el tamaño del archivo en el TLV correspondiente. Si querés pegame la respuesta que estás obteniendo y la vemos.

Se me generaron nuevas preguntas:
 
  1. Pude obtener los datos de la cédula. Ahora, la fecha de expedición me retorna en formato raro. ¿Cómo está codificado? Porque según la lectura me dice que son 4 bytes nomás y no 8 como dice la guía.
  2. Para obtener la foto, entiendo que es con el comando 70 04. Lo que retorna, en bytes, ¿puede que sean sólo 52 bytes? No lo estoy logrando convertir a una imagen.
  3. Estoy verificando el PIN, pero siempre me dice que los intentos son incorrectos. ¿Qué PIN de prueba debería utilizar?
a) Es un issue conocido en la personalización. Ese campo está codificado como packed BCD (Binary Coded Decimal - https://en.wikipedia.org/wiki/Binary-coded_decimal) en lugar de ASCII. Esto implica que la lectura es directa, sin pasar por una tabla ASCII. Si te fijas en el ejemplo que puse yo, el TLV correspondiente a la fecha de expedición es 1F 08 04 15 09 20 16, por lo que la fecha de expedición es 15/09/2016, o sea, poniendo directamente los bytes en hexa como vienen.

b) Difícil que sea esa cantidad... Poné acá el comando que estás pasando a la tarjeta así lo vemos. Desde ya te digo igual que la foto es más grande que 255 bytes, por lo que es necesario leer más de una vez. La foto es un JPG estándar.

c) Qué resultado exacto te está dando? Las cédulas de prueba salen personalizadas con 1234 como PIN.

Saludos,
​​​​​​​Guillermo