Foros Python

Versión completa: Extraer datos vía SCard
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Páginas: 1 2
Acceder al api de windows para extraer los datos publicos de un dni ? Si es asi , podriais orientarme con el prodeso ?

Gracias.
Hola, bienvenido. ¿A qué te refieres con DNI? ¿El documento nacional de identidad? De ser así, ¿de qué país?

Saludos.
Si es al dni español , ya tengo acomunicacion con el lector y la tarjeta , pero no consigo extraer datos publicos del dni . No tengo claro como interpretar lo que devuelve la api winscard.

Tengo comunicacion con el lector y el dni y obtengo respuesta y datos , pero no entiendo como buscar en esos datos el numero y el nombre que es lo que necesito , ya que solo tengo que acceder a la parte publica .
Bien, necesitaría un poco más de información para poder ayudarte. Tendría que ver cómo te comunicas con la API y qué respuesta obtienes. ¿Podrías proveer esa parte de tu código? Por otro lado, ¿en qué se relaciona con la API de Windows?

Saludos.
Estoy usando este acceso a winscard mediante ctypes que se encuentra en el repositorio github

https://github.com/tpdn/python-winscard

Y esto es lo que hago en mi codigo :

import ctypes
import winscard

sc = winscard.SCard()

readers = sc.list_readers()

r = readers[0]

r.connect()

print r.status()

cardid = r.transmit((0xFF,0xCA,0x00,0x00,0x00), winscard.SCARD_PCI_T0)

print cardid

r.disconnect()


Y esta es la respuesta que obtengo : [110,0]
He seguido investigando y he podido averiguar que la tarjeta tiene una estructura de directorio con archivos en su interior , se que tengo que leer el fichero con la ruta 50156004 , pero aqui me pierdo
¿Tienes a tu alcance algún tipo de documentación que indique qué información puede extraerse (y cómo hacerlo)? ¿Estás seguro que tienes los permisos necesarios para acceder a dicha información?
Tengo lector y varios dnis de mi familia , los datos que intento leer son publicos , se puede acceder sin ningun problema , la funcion de la dll que devuelve datos de la tarjeta es esta

LONG SCardTransmit(
SCARDHANDLE hCard,
LPCSCARD_I0_REQUEST pioSendPci,
LPCBYTE pbSendBuffer,
DWORD cbSendLength,
LPSCARD_IO_REQUEST pioRecvPci,
LPBYTE pbRecvBuffer,
LPDWORD pcbRecvLength
);

es una funcion de la api de windows de winscard para ser mas concretos , el resultado de la lectura lo devuelve en pbRecvBuffer , pero no se como acceder a su contenido.

Ya consigo verificiar si la tarjeta introducida es o no un dni , esto se hace verificando el contenido de ciertas posiciones del atr que devuelve la funcion de la dll SCardStatusA

Pero no se como acceder al contenido devuelto por la funcion indicada antes.

Gracias por tu interes
La llamada a SCardTransmit la realiza la función transmit (como puede verse en el código de fuente), y esta última retorna el valor de pbRecvBuffer, tal como lo haces en tu código. Así que por lo que puedo ver, no tendrías ningún error "estructural".

Según la documentación que tengas sobre la tarjeta que intentas leer, habría que interpretar el resultado que estás obteniendo, o bien chequear la información que estás enviando. Si puedes proveer un enlace a algún tipo de documentación que estés utilizando tal vez podría orientarte un poco más. Por ejemplo, ¿cómo sabes que la serie de bytes 0xFF, 0xCA, 0x00, etc. debe retornar un determinado tipo de información?

Un saludo.
Eso era una prueba , ya he conseguido posicionarme en el directorio padre de la tarjeta y he conseguido desdender hasta el fichero donde esta la informacion que necesito , pero ahora me devuelve un error que no se como solucionar , en este enlace se encuentra la info que hay que ir mandando a la tarjeta https://www.dnie.es/PDFs/obtiene_CDF.pdf , me encuentro ahora en la linea donde el comando a mandar es 00 B0 00 00 FF , con el que leemos los 255 primeros bytes del fichero , pero en vez de devolver 30 82 01….90 00 , los ... contienen informacion especifica para cda dni la funcion me retorna este error WinSCardError: 0x80100008L que significa segun la api de windows que el tamaño del buffer para recibir los datos es demasiado pequeño , creo que el error esta en la definicion de la funcion en la clase

def transmit(self, sender, ioSendPci=None, ioRecvPci=None):
send_buffer = create_bytearray(sender)
send_size = DWORD(sizeof(send_buffer))
recv_buffer = (BYTE * 64)()
recv_size = DWORD(64)
result = ULONG(scard_dll.SCardTransmit(self.card, ioSendPci, send_buffer, send_size, ioRecvPci, recv_buffer,
pointer(recv_size)))
if not result.value == SCARD_S_SUCCESS:
raise WinSCardError(result.value)
return recv_buffer[:recv_size.value]

Crees que si cambio el 64 por 256 solucionaria mi problema?

Solucionado , he cambiado el tamaño de 64 a 256 y ya tengo acceso a toda la informacion , ahora me toca pasarlo de hex a ascii y localizar el tramo donde se encuentra guardado el numero del documento y el nombre del titular , muchas gracias por tu ayuda , me ha sevido mucho.
Páginas: 1 2