20110315

Adaptación de la aplicación de cambio de PIN del DNI Electrónico para Mac OS X 10.6

De nuevo nos encontramos con que la solución de software oficial no funciona adecuadamente. La aplicación que ofrece el portal del DNI electrónico para cambiar el PIN se basa en un programa hecho en java, pero que utiliza por debajo una librería (JPC/SC) que debe ser adecuada para el sistema operativo donde se utilice.
En este caso, la librería que se incluye para Mac OS X sólo está compilada para arquitecturas PowerPC. Como la versión de java incluida a partir de Mac OS X 10.6 sólo está compilada para arquitectura Intel, el programa de cambio de PIN no funciona.
Aparte, tenemos la cuestión de que lo que se ofrece como aplicación es un conjunto de archivos y un script de inicio que sólo funciona si es lanzado desde la terminal y estando dentro del directorio donde está el programa.
Por lo tanto, vamos a explicar a continuación cómo compilar una versión de JPC/SC nativa para OS X 10.6 Intel, y ya de paso empaquetaremos la aplicación de Java con todo lo necesario, de una forma más amigable para los usuarios del sistema usando la herramienta Jar Bundler  de Apple.

He dejado disponible la aplicación generada aquí para quien no tenga los medios, los conocimientos o las ganas de seguir todos estos pasos.








Requerimientos previos

Por supuesto, necesitaremos tener instaladas las herramientas de desarrollo de Apple, que se pueden obtener gratuitamente (hay que registrarse) en la web de desarrolladores de Apple (versiones anteriores a XCode 4), o bien (XCode 4) pagando en la Mac App Store o suscribiéndose al programa de pago de desarrollador de Mac OS.
También será necesario tener instalada una versión de Java en el equipo. En este caso utilizamos la instalación Java 1.6 que ofrece Apple con el sistema.

Compilación de JPC/SC
Tras descomprimirlo, tendremos que modificar los siguientes arhivos de configuración para que la librería se cree correctamente:

Archivo Config
Cambiar
PCSCDIR=/usr/local/pcsc
#PCSCDIR=/usr
por
#PCSCDIR=/usr/local/pcsc
PCSCDIR=/System/Library/Frameworks/PCSC.framework/Versions/Current
PCSCINCDIR=/System/Library/Frameworks/PCSC.framework/Versions/Current/Headers
#PCSCDIR=/usr
JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home
Y cambiar
JPCSCJAR_INSTALL_DIR=${DESTDIR}${INSTALL_DIR}/share/java
por
JPCSCJAR_INSTALL_DIR=${DESTDIR}${INSTALL_DIR}/lib

Archivo Makefile (dentro de src/jpcsc)
Cambiar
INCLDEFS += -I${PCSCDIR}/include -I${PCSCDIR}/include/PCSC
por
INCLDEFS += -I${PCSCINCDIR} -I${PCSCDIR}/include -I${PCSCDIR}/include/PCSC
Cambiar
LDFLAGS += -L{PCSDIR}/lib -lpcslite -lpthread
por
LDFLAGS += -framework PCSC -lpthread -arch i386 -arch x86_64

Cambiar
DSTLIB = libjpcsc.so
por
DSTLIB = libjpcsc.jnilib
Cambiar
CCFLAGS += -Wall
por
CCFLAGS += -Wall -arch i386 -arch x86_64
Y cambiar
LINK = ${CC} -shared -o ${ARCHDIR}/${DSTLIB} ${COBJS} ${LDFLAGS}
por
LINK = ${CC} -dynamiclib -o ${ARCHDIR}/${DSTLIB} ${COBJS} ${LDFLAGS}

Archivo jpcsc.h (dentro de src/jpcsc)
Cambiar

#else
#include <winscard.h>
#endif
por

#else
#define USE_SCARD_CONTROL_112
#include <winscard.h>
#include "/System/Library/Frameworks/Kernel.framework/Versions/A/Headers/sys/types.h"
typedef unsigned long LONG;
typedef unsigned int DWORD;
#endif

Con todo esto, nos hemos asegurado de que el entorno de compilación sea capaz de encontrar todas las librerías que necesita, además de crear el tipo de librería adecuado (jnilib) con las arquitecturas que soporta el sistema operativo (Intel 32-bit y 64-bit).
Una vez hechos los cambios, accederemos desde la terminal al directorio de jpcsc y compilamos
$cd jpcsc
$make
Si hemos hecho todo correctamente, obtendremos una nueva versión del archivo libjpcsc.jnilib dentro del directorio build/darwin.



Creación de la aplicación PAD Virtual
Descargamos la aplicación java desde el área de descargas de la web sede del DNI electrónico:
Tras descomprimir el archivo obtenido, sustituimos en el directorio la librería PowerPC libjpcsc.jnilib por la que acabamos de crear para arquitectura Intel.
Ahora, para acceder a la aplicación, bastaría con que abriéramos una ventana de terminal, desplazarnos al directorio de la misma y lanzar el script incluido:
$cd PADVirtual v1.20
$./Cambio_de_PIN.sh

Sin embargo, las herramientas de desarrollo de Apple incluyen una utilidad que nos permite "empaquetar" las apliaciones de Java dentro de un ejecutable de Mac OS X, mucho más amigable para el usuario que el uso de scripts desde la terminal. Estos son los pasos para hacerlo en este caso.
Abrir la aplicación Jar Bundler, que se encuentra dentro del directorio Applications/Utilities en la instalación de XCode (normalmente en /Developer).
Añadimos el archivo JAR principal (en este caso DNIeCambioDePIN.jar), elegimos la versión de Java (en este caso 1.5) y, si queremos, añadimos también un icono.
En la segunda opción añadimos el resto de archivos necesarios. En este caso se trata de: configuracion.propertieskv.cacertlibjpcsc.jniliblog4j-1.2.16.jar (este último es opcional y puede descargarse desde aquí).
Finalmente, marcamos la opción "Set working directory to inside Application Package".
 Ahora, al pulsar en el botón "Create Application…", elegiremos un nombre y un destino para nuestra nueva aplicación, que podremos utilizar como cualquier otra que tengamos en el ordenador.

Notas
Como la aplicación utiliza su directorio de trabajo dentro del paquete, hay que asegurarse de que todos los usuarios tienen permiso de lectura y escritura sobre la aplicación (por ejemplo usando la opción "Obtener Información" en el menú archivo del Finder).

Si se ha instalado en el equipo el software OpenSC + DNIe o bien OpenDNIe, es posible que, tras elegir el lector de tarjetas en la aplicación y pulsar en el botón "Siguiente", aparezca un mensaje diciendo que la tarjeta está ocupada.
Esto suele suceder porque el sistema operativo está intentando acceder al contenido de la tarjeta usando el módulo tokend de OpenSC. Para liberar el acceso a la tarjeta para la aplicación de cambio de PIN, se debe eliminar el directorio: /System/Library/Security/tokend/OpenSC.tokend
Una vez hecho este cambio, basta con extraer la tarjeta del DNIe y volver a insertarla en el lector antes de volver a intentar cambiar el PIN.
En el momento de redactarse esta entrada, el modulo tokend de la versión más reciente de OpenSC (0.12.1 svn-trunk-253) no funciona correctamente con el DNI electrónico y puede ser eliminado si no se utiliza ninguna otra tarjeta de acceso compatible con OpenSC aparte del DNI electrónico. Si no fuera este el caso, bastaría con mover temporalmente a otra ubicación el directorio Opensc.tokend o renombrado con otra extensión (por ejemplo Opensc.tokend.disabled), mientras se realice el cambio de PIN, y luego volver a dejarlo como estaba.

Actualización (Junio 2011): Las últimas versiones de OpenSC (se ha probado con la 0.12.2 svn-trunk-400) tienen un módulo tokend que sí que funciona correctamente con el DNI electrónico, incluyendo la integración con los llaveros del sistema, por lo tanto no conviene eliminar definitivamente el directorio Opensc.tokend y debería ser renombrado con otra extensión (por ejemplo Opensc.tokend.disabled), mientras se realice el cambio de PIN, y luego volver a dejarlo como estaba.

7 comentarios:

  1. Muchas gracias por la información. Con la Info de la Policia nunca lo hubiera conseguido.

    Un saludo.

    ResponderEliminar
  2. Mil gracias por el programa. Si no, me hubiera sido imposible!!

    Un saludo!

    ResponderEliminar
  3. EL pad virtual del gobierno sigue sin funcionar. He intentado descargar desde tus links pero están rotos. Podrías redistribuir el PADVirtual que has creado.
    Gracias

    ResponderEliminar
    Respuestas
    1. Hola. Los links de descarga deberían volver a funcionar ahora sin problemas. Prueba a ver.

      Eliminar
  4. La aplicacion que generaste no se puede abrir, pone que esta dañada y no se puede abrir

    ResponderEliminar
    Respuestas
    1. Hola
      a partir de Mountain Lion, todo el software que no haya sido firmado digitalmente presenta este tipo de mensaje como protección del sistema.

      En esta nota técnica de Apple te explican como saltártelo temporalmente o definitivamente:

      http://support.apple.com/kb/HT5290?viewlocale=es_ES&locale=es_ES

      Un saludo

      Eliminar
  5. Mil gracias, me estaba volviendo loca buscando el fallo

    ResponderEliminar