Omikey Cardman 5321 RFID reader en Debian
¿Harto de teclear la clave cuando te salta el salvapantallas? ¿Harto de que el vecino de cubículo cotillee to correo cuando se te olvida bloquear el escritorio? Tenemos una solución. El Omnikey Cardman 5321 es un lector de tarjetas RFID y de tarjetas de contactos bastante barato, pero el fabricante no proporciona información :-( . Esta recetilla explica como usarlo en Debian usando el driver binario que distribuyen ellos.
Ingredientes
Los siguientes son paquetes debian:
- python-pyscard
- python-serial
El siguiente paquete de mi repo (no oficial):
- pcscd (1.5.3-1.1)
El driver (solo binarios):
- ifdokrfid_lnx-2.6.0.tar.gz
Selecciona el apropiado(32/64 bits) en la página del fabricante.
Instalación de paquetes
Instala los paquetes Debian y la versión modificada de pcscd. Extrae el driver del fabricante en un directorio cualquiera y sitúate en él con una consola de root.
# ./install -d /usr/lib/pcsc/drivers
Finalmente reinicia pcscd:
# /etc/init.d/pcscd restart
Script de auto-login
En tu directorio de binarios personales (por ejemplo, ~/bin) guarda el siguiente script con el nombre printId:
#! /usr/bin/env python
from sys import stdin, exc_info
from time import sleep
from smartcard.CardConnectionObserver import CardConnectionObserver
from smartcard.CardMonitoring import CardMonitor, CardObserver
from smartcard.util import *
from smartcard import CardConnection
from smartcard.scard import SCARD_PROTOCOL_T1
# define the apdus used in this script
GUID = [0xff, 0xca, 0, 0, 0]
class MyCardObserver( CardObserver ):
def __init__( self ):
self.observer = CardConnectionObserver()
def update( self, observable, (addedcards, removedcards) ):
for card in addedcards:
proto = SCARD_PROTOCOL_T1
card.connection = card.createConnection()
card.connection.connect(proto)
card.connection.addObserver(self.observer)
apdu = GUID
response, sw1, sw2 = card.connection.transmit(apdu, proto)
card.uid = response
print "+Inserted: ", response
for card in removedcards:
print "-Removed: ", card.uid
try:
cardmonitor = CardMonitor()
selectobserver = MyCardObserver()
cardmonitor.addObserver(selectobserver)
while True:
sleep(60)
cardmonitor.deleteObserver(selectobserver)
except:
print exc_info()[0], ':', exc_info()[1]
Ejecutando este script podrás leer el identificador de las tarjetas RFID. En principio lo he configurado para que funcione con mis tarjetas Mifare 1k. Por ejemplo, al acercar mi tarjeta sale algo parecido a esto:
$ ~/bin/printId
+Inserted: [204, 101, 19, 48]
Guarda esos números y añade un nuevo script en tu directorio de binarios con el nombre autoLock:
#! /usr/bin/env python
from sys import stdin, exc_info
from time import sleep
from smartcard.CardConnectionObserver import CardConnectionObserver
from smartcard.CardMonitoring import CardMonitor, CardObserver
from smartcard.util import *
from smartcard import CardConnection
from smartcard.scard import SCARD_PROTOCOL_T1
import subprocess
# APDU to get ID
GUID = [0xff, 0xca, 0, 0, 0]
AuthorizedCards = (
[204, 101, 19, 48], # Pon aquí tus tarjetas
)
class MyCardObserver( CardObserver ):
def __init__( self ):
self.observer = CardConnectionObserver()
def update( self, observable, (addedcards, removedcards) ):
for card in addedcards:
proto = SCARD_PROTOCOL_T1
card.connection = card.createConnection()
card.connection.connect(proto)
card.connection.addObserver(self.observer)
apdu = GUID
response, sw1, sw2 = card.connection.transmit(apdu, proto)
card.uid = response
if card.uid in AuthorizedCards:
subprocess.call(['gnome-screensaver-command', '-d'])
for card in removedcards:
if card.uid in AuthorizedCards:
subprocess.call(['gnome-screensaver-command', '--lock', '-a'])
cardmonitor = CardMonitor()
selectobserver = MyCardObserver()
cardmonitor.addObserver(selectobserver)
while True:
sleep(60)
cardmonitor.deleteObserver(selectobserver)
El array AuthorizedCards debe inicializarse con las tarjetas que tú autorizas a que desbloqueen tu escritorio.
¿Seguridad?
Nada, seguridad ninguna. ¿No ves que ni siquiera leo los certificados de tu tarjeta? Vamos, que si trabajas en la CIA, el CNI, la NASA o una central nuclear procura refinar un poco el procedimiento. Yo me he parado aquí porque con este lector RFID no parece que pueda escribir nada, solo leer. Si consigues escribir algo avisa.
Cambios a pcscd
Lo único que he hecho es deshabilitar libhal y habilitar libusb para que funcione tal y como lo configura el fabricante. Solo he tocado el debian/rules, el debian/control y el debian/changelog:
--- orig/pcsc-lite-1.5.3/debian/rules 2009-06-06 19:54:49.000000000 +0200
+++ new/pcsc-lite-1.5.3/debian/rules 2009-05-18 21:35:38.000000000 +0200
@@ -48,6 +48,9 @@
# we add LDFLAGS="-lpthread" for bug #253629
./configure $(confflags) \
+ --enable-libusb \
+ --disable-libhal \
+ --enable-extendedapdu \
--sysconfdir=/etc \
--prefix=/usr \
--enable-usbdropdir=/usr/lib/pcsc/drivers \
--- orig/pcsc-lite-1.5.3/debian/control 2009-06-06 19:54:49.000000000 +0200
+++ new/pcsc-lite-1.5.3/debian/control 2009-05-18 21:35:01.000000000 +0200
@@ -2,7 +2,7 @@
Section: misc
Priority: extra
Maintainer: Ludovic Rousseau <rousseau@debian.org>
-Build-Depends: debhelper (>= 6.0.7~), flex, autotools-dev, libhal-dev
+Build-Depends: debhelper (>= 6.0.7~), flex, autotools-dev, libusb-dev
Standards-Version: 3.8.1
Vcs-Svn: svn://svn.debian.org/svn/collab-maint/deb-maint/pcsc-lite/trunk
Vcs-Browser: http://svn.debian.org/viewsvn/collab-maint/deb-maint/pcsc-lite/trunk/
--- orig/pcsc-lite-1.5.3/debian/changelog 2009-06-06 19:54:49.000000000 +0200
+++ new/pcsc-lite-1.5.3/debian/changelog 2009-05-18 21:33:03.000000000 +0200
@@ -1,3 +1,9 @@
+pcsc-lite (1.5.3-1.1) unstable; urgency=low
+
+ * Re-enabled libusb to make OmniKey cardreaders work.
+
+ -- Francisco Moya <paco@debian.org> Mon, 18 May 2009 21:32:55 +0200
+
pcsc-lite (1.5.3-1) unstable; urgency=low
* New upstream release