Trasteando con el NFC

Jugué a Skylanders prácticamente desde su lanzamiento, sin embargo, lo abandoné hará cosa de un año cuando salió a la venta el Lego Dimensions. Bajo mi punto de vista, este último es superior al anterior en todos los aspectos, y encima, de Lego.

Pues bien, hace unos días, mi figurilla de Green Arrow de Lego Dimensions dejó de funcionar.

Reparando la figurilla

Echando un vistazo por diversos foros, encontré una solución que consistía en leer la figura con una aplicación de lectura de NFC de un móvil con Android, ya que los iPhone todavía no permiten utilizar su hardware NFC a sus aplicaciones de usuario. Haciendo uso del móvil de una amiga (ya que yo no tengo Android) y aplicando esta solución, en efecto, se reparó mi figurilla. Pero no solo eso, también se despertó en mi un interés por conocer los secretos de la tecnología NFC.

Primeros pasos con NFC

A los pocos días del incidente, ya tenía en casa mi propio lector/escritor de NFC. Concretamente un ACR122U, tras haberme informado sobre su compatibilidad con Linux y OSX.

Totalmente ajeno a esta tecnología, decidí instalarme la biblioteca libnfc, que me facilitarían la comunicación entre mis programas y las tarjetas. Mi objetivo en este punto era poder leer las figurillas de Lego por mi mismo, sin necesidad de tener que pedir el móvil de nuevo a algún amigo en caso de alguna de ellas volviese a fallar. Sin embargo, cada modelo de tarjeta es diferente, así que me informé sobre las tarjetas utilizadas por las figurillas del Lego Dimensions, que resultaron ser unas NTAG213.

Accediendo al data sheet del fabricante pude aprender mucho sobre el funcionamiento de estas tarjetas, los estados en que pueden encontrarse, los comandos que aceptan, la información que contienen, etc. La memoria de las tarjetas se organiza en 45 páginas de 4 bytes. Los 9 primeros bytes contienen el número de serie único de cada tarjeta, sin embargo, dos de esos bytes contienen información sobre control de errores, por lo que solo 7 bytes se utilizan para identificarlas.
El resto de páginas hasta la 4, contienen información sobre el sistema, zonas de la tarjeta bloqueadas contra lectura o escritura, etc. Desde la página 4 hasta la 39 tenemos acceso a la memoria de usuario, zona de la tarjeta que podremos utilizar para escribir nuestros propios datos. Las siguientes páginas hasta la 45 contienen de nuevo más información reservada, entre la que se encuentra el password con el que podemos proteger la lectura de distintas zonas de nuestra tarjeta, entre otras cosas.

Tras varias horas de programación en C, haciendo uso de las funciones proporcionadas por la biblioteca libnfc (nfc_initiator_transceive_bytes) y los códigos de los comandos de lectura (0x30) y escritura (0xA2) proporcionados por la hoja de datos del fabricante de las NTAG, conseguí desarrollar un programa que me permitiese leer mis figurillas de Lego. No obstante, la memoria de usuario desde la página 30 en adelante resultó estar protegida por contraseña en estas figuras, por lo que me fue imposible leer más allá.

Tarjetas libres

Debido a la protección por contraseña, y a un problema con el comando de autenticación del ACR122U con las NTAG213, me fue imposible leer las tarjetas originales, y tampoco quería arriesgarme a escribir en ellas, por lo tanto la única solución que se me ocurrió para continuar con mis ansias de conocimiento fue adquirir algunas tarjetas libres.
Una vez me llegaron las nuevas tarjetas, las cuales obviamente no estaban protegidas por contraseña, tuve vía libre para leer y escribir en ellas a mis anchas, lo cual me hizo muy feliz.

No obstante, para poder escribir figuras compatibles con el videojuego, es necesario conocer el algoritmo mediante el cual se generan las contraseñas a partir de los identificadores únicos de cada tarjeta, así como las claves y algoritmos de cifrado que utiliza el juego para cifrar o descifrar la información almacenada en cada tarjeta. No entraré en detalles sobre esto último aquí, ya que mi objetivo con este proyecto ha sido meramente didáctico y no tengo intención de ir más allá.

Este proyecto me ha permitido aprender mucho sobre la tecnología NFC, el uso de la biblioteca libre libnfc, el funcionamiento de determinadas tarjetas NFC, las apdu que se utilizan para comunicarse con el lector, y sobre todo me ha permitido mejorar mis habilidades con el lenguaje C y el depurador gdb, tras varias horas rastreando el origen de un maldito “segmentation fault”.

Written by: