Gustavo Azambuja
Overactive
Published in
4 min readFeb 20, 2018

--

En 2015 la primera cédula electrónica de Uruguay fue emitida, dos sistemas de intercambio de datos (por contacto y por cercanía), datos públicos, datos privados, firma digital para documentos, información suficiente para remplazar el pasaporte en viajes internacionales (norma ICAO), y un largo etcétera son las funcionalidades del nuevo documento de identidad emitido por el estado uruguayo.

Lamentablemente los usos en el día a día aún son escasos incluso en la misma administración pública, pero en Overactive nos hicimos de un lector USB y quisimos entender cómo utilizar el nuevo documento digital en la práctica.

Lector de tarjetas inteligentes (smartcards)

En el departamento de Investigación e Innovación (R&I) nos marcamos dos objetivos claros:

  1. Leer la información pública en el chip.
  2. Firmar/encriptar un string o hash con la clave privada en el documento.

Existen librerías para varios lenguajes, algunos mas complejos que otros, pero quisimos ir a lo básico, no solo por el objetivo de entender como funciona, sino por la portabilidad que nos ofrece a otros sistemas embebidos o de bajos recursos. Elegimos Python.

Vamos a utilizar APDU. El Application Protocol Data Unit (APDU) es la unidad de comunicación entre un lector de tarjetas y una tarjeta inteligente. Básicamente enviamos comandos (en formato hexadecimal) y recibimos el contenido o respuesta.

AGESIC tiene muy buena documentación (aunque con algunos errores menores) disponible en https://centroderecursos.agesic.gub.uy

Comencemos, los requisitos para usar ésto son los siguientes (al menos en Linux y/o Mac):

# Python 2.7
# PyScard (pip install pyscard)

Objetivo 1, obtener los datos públicos:

En el siguiente código me voy a conectar al lector, aguardar que pongan un documento de identidad válido. Cuando se detecte el documento voy a hacer un loop por todo su contenido agregándolo a una lista que luego mostraré en formato json.

Vista del documento de identidad electrónico inserto en el lector.

El código está comentado explicando cada función:

Si ejecutamos este código con un lector y documento conectado, nos devolverá algo similar a:

# python cedula_uruguaya.py
{“data”: [“\”tag0x1\”:\”MIS APELLIDOS\””, “\”tag0x3\”:\”MIS NOMBRES\””, “\”tag0x4\”:\”URY\””, “\”tag0x5\”:\”01121999\””, “\”tag0x6\”:\”MONTEVIDEO/URY\””, “\”tag0x7\”:\”1234567\””]}

Bien, eso no fue tan complicado… ahora falta poder encriptar un string utilizando la firma digital y clave privada.

Objetivo 2: Firmar un string.

Para ésto necesitamos primero desbloquear el documento. Me explico: hasta aquí la información que obtuvimos es la misma que se puede leer a simple vista cuando ves el documento físico. Pero si quieres acceder a la huella digital o a la firma digital de la persona, necesitas desbloquearla con el PIN del usuario. Este PIN fue ingresado cuando el ciudadano retiró su documento en el registro civil; es un código numérico de entre cuatro y doce dígitos.

Para desbloquear la tarjeta debemos ejecutar el comando para probar el PIN seguido por el PIN en hexadecimal. En el siguiente ejemplo el PIN sería 1234:

runCommand( [0x00, 0x20, 0x00, 0x11, 0x0C ] + [0x31, 0x32, 0x33, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ] )

CUIDADO: Si el PIN falla nos devolverá un código con la cantidad de intentos restantes. Si se nos acaban los intentos habrá que ir hasta la oficina del registro civil para desbloquear el documento.

Como último paso deberíamos enviar el comando para acceder a la firma digital y enviar el string (en hexadecimal) que queremos encriptar:

runCommand( [0x00, 0xA4, 0x04, 0x00, 0x0c, 0xA0, 0x00, 0x00, 0x00, 0x18, 0x40, 0x00, 0x00, 0x01, 0x63, 0x42, 0x00, 0x00] )
runCommand( [0x00, 0x22, 0x41, 0xB6, 0x06, 0x84, 0x01, 0x01, 0x80, 0x01, 0x02] )
runCommand( [0x00, 0x2A, 0x90, 0xA0, 0x20, 0x90, 0x19] + MYHEXSTRING )
runCommand( [0x00, 0x2A, 0x9E, 0x9A, 0x00, 0xFF, 0x00] )

Pueden ver y descargar el código completo aquí. Podrán ejecutarlo de la siguiente forma:

python cedula_uruguaya.py getData 1234 “Hola mundo”

La seguridad, simplicidad y funcionalidad que ofrece el nuevo documento de identidad uruguayo es fantástica. Esperamos que mas empresas se dispongan a incorporar lectores, utilizar la información y aceptar la firma electrónica.

En resumen podemos decir que una vez que entiendes la mecánica de los comandos APDU, se vuelve una tarea simple obtener los datos y utilizar la firma electrónica. Ésto puede simplificar enormemente la interacción con usuarios tanto a través de Internet como en locales dónde la empresa pueda disponer de los lectores.

En nuestro laboratorio ya estamos trabajando en el siguiente paso: firmar paquetes de información que luego son guardados de forma 100% segura dentro de una blockchain y smartcontract.

--

--