DNIe: Dealing with the electronic ID card

Although this has already been discussed previously , I wanted to give another lap to the issue DNIe under Linux. And what the hell!, After spending one day and a half on the subject, I wanted to leave the tutorial available somewhere, if I have to do it again.

When I started I was recommended that I tried on Windows first and then if it works, I should try again on Linux. And although I followed the advice, it turns out I am definitely worse in Windows than in Linux (I ended up having to reinstall Windows again), so I tried again where I felt comfortable and understood what I do.
Basically I have been following this three blog posts:
* DNIe on Ubuntu
*
Linux DNIe Squeeze
*
DNIe on Ubuntu

The first thing I discovered is that one should not rely on the libraries from the repositories (I use Debian Squeeze). So I installed bare hands OpenSC and its dependencies.

First thing to do is to download the latest libraries available on the website of dnielectronico, in my case:

$ wget https://www.dnielectronico.es/descargas/PKCS11_para_Sistemas_Unix/opensc-dnie_1.4.8_amd64_lenny.tar
$ tar xvf opensc-dnie_1.4.8_amd64_lenny.tar
$ cd opensc-dnie_1.4.8_amd64_lenny

And also download the dependencies that are no longer available for Debian Squeeze:

$ wget https://ftp.es.debian.org/debian/pool/main/libt/libtool/libltdl3_1.5.26-4+lenny1_amd64.deb
$ wget https://ftp.es.debian.org/debian/pool/main/o/openct/libopenct1_0.6.14-3_amd64.deb

When this is done, we can begin to install the dnie drivers:

# dpkg-i *. deb libltdl3
# dpkg-i *. deb libopenct
# dpkg-i *. deb libopensc2
# dpkg-i *. deb opensc_
# apt-get install pinentry-qt4
# dpkg-i *. deb opensc-dnie

And then we make sure not to screw it in future updates, blocking the libraries:

# echo libopenct1 hold | dpkg - set-selections
# echo opensc hold | dpkg - set-selections
# echo libopensc2 hold | dpkg - set-selections

Now comes the nice part, where we see that everything works … or not:

$ sudo apt-get install pcscd pcsc-tools
$ pcsc_scan
PC / SC device scanner
V 1.4.16 (c) 2001-2009, Ludovic Rousseau
Compiled with PC / SC lite version: 1.5.5
Scanning present readers ...
0: Gemplus GemPC Twin 00 00

Mon Sep 5 20:01:11 2011
Reader 0: Gemplus GemPC Twin 00 00
Card state: Card inserted,
[…]
Electronic DNI (Spanish electronic ID card)
https://www.dnielectronico.es
$ opensc-tool-l
[opensc-tool] ctx.c: 367: load_dynamic_driver: dynamic library ‘/ usr/lib64/libopensc-dnie.so’: invalid module version
[Opensc-tool] ctx.c: 467: load_card_drivers: Unable to load ‘dnie’.
Readers Known about:
Driver Name Nr
Pcsc 0 00 00 Gemplus Twin GemPC
$ opensc-tool-a
[opensc-tool] ctx.c: 367: load_dynamic_driver: dynamic library ‘/ usr/lib64/libopensc-dnie.so’: invalid module version
[Opensc-tool] ctx.c: 467: load_card_drivers: Unable to load ‘dnie’.
Using With A card reader: Gemplus GemPC Twin 00 00
[Opensc-tool] reader-pcsc.c: 239: pcsc_transmit: unable to transmit
[Opensc-tool] apdu.c: 394: do_single_transmit: unable to transmit APDU
3b: 7f: 38:00:00:00:6 a: 44:4 e: 49:65:10:02:4 c: 34:01:13:03:90:00
Delawar @ FZ18E: ~ $ opensc-tool-n
[opensc-tool] ctx.c: 367: load_dynamic_driver: dynamic library ‘/ usr/lib64/libopensc-dnie.so’: invalid module version
[Opensc-tool] ctx.c: 467: load_card_drivers: Unable to load ‘dnie’.
Using With A card reader: Gemplus GemPC Twin 00 00
[Opensc-tool] reader-pcsc.c: 239: pcsc_transmit: unable to transmit
[Opensc-tool] apdu.c: 394: do_single_transmit: unable to transmit APDU
Unidentified card

At this point, we learn that we have screwed up somewhere in the installation and OpenSC is waiting for a version of the module that is not what we have installed. Do not panic, there is a solution . We “only” have to create a module that uses the module installed, but deceiving OpenSC by saying it is another version.

My module version is 1.0.4 and opensc the 0.11.13-1.1, you must change this numbers with yours:

$ mkdir / tmp / dnie
$ cd / tmp / dnie
$ cp / usr/lib/libopensc-dnie.so.1.0.4 libopensc-dnie.so.1.0.4_orig

Edit a file:

$ vi patch.c
char * version_maligna = "0.11.13-1.1";
sc_driver_version char * () {
version_maligna return;
}

Patching the library and place it where it belongs:


$ gcc-fpic -g-c-Wall patch.c
$ objcopy - redefine-sym-libopensc sc_driver_version = orig_sc_driver_version libopensc-dnie.so.1.0.4 dnie.so.1.0.4_orig
$ chmod + x libopensc-dnie.so.1.0.4
$ gcc-shared-Wl,-soname, libwrapper-dnie.so libopensc-dnie.so.1.0.4 patch.o-o-dnie.so.1.0.0 libwrapper
$ sudo cp-dnie.so.1.0.0 libwrapper libopensc-dnie.so.1.0.4 / usr / lib
$ sudo ldconfig

Now that we have the library, we make opensc to use it in the file / etc / opensc / opensc.conf, replacing module = / usr / lib / libopensc-dnie.so, by < em> module = / usr / lib / libwrapper-dnie.so, .

Now opensc recognizes our electronic ID:

$ opensc-tool -l
Known Readers about:
Driver Name Nr
Pcsc 0 00 00 Gemplus Twin GemPC

How to use the browser or an application to sign has already been extensively described in other manuals, including the official pages of the electronic ID.

Leave a Reply

Your e-mail address will not be published. Required fields are marked *