tesseramento/pysc.py

102 lines
3.3 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# https://www.mmxforge.net/index.php/sviluppo/python/item/9-lettura-dei-dati-della-tessera-sanitaria-con-python
from smartcard.System import readers
import array
import string
import datetime
r = readers()
reader = r[0]
print("Sto usando: {}".format(reader.name))
connection = reader.createConnection()
connection.connect()
#Seleziona del MF
#CLS 00, istruzione A4 (seleziona file), P1 = P2 = 0 (seleziona per ID),
#Lc: 2, Data: 3F00 (id del MF)
SELECT_MF = [0x00, 0xA4, 0x00, 0x00, 0x02, 0x3F, 0x00]
data, sw1, sw2 = connection.transmit(SELECT_MF)
#se tutto è andato a buon fine sw1 e sw2 contengono
#rispettivamente i valori 0x90 e 0x00 il corrispettivo del 200 in HTTP
#Seleziona del DF1...vedi sopra
SELECT_DF1 = [0x00, 0xA4, 0x00, 0x00, 0x02, 0x11, 0x00]
data, sw1, sw2 = connection.transmit(SELECT_DF1)
#Seleziona del file EF.Dati_personali... vedi sopra sopra
SELECT_EF_PERS = [0x00, 0xA4, 0x00, 0x00, 0x02, 0x11, 0x02]
data, sw1, sw2 = connection.transmit(SELECT_EF_PERS)
#leggiamo i dati
#CLS 00, istruzione B0 (leggi i dati binari contenuti nel file
READ_BIN = [0x00, 0xB0, 0x00, 0x00, 0x00, 0x00]
data, sw1, sw2 = connection.transmit(READ_BIN)
#data contiene i dati anagrafici in formato binario
#trasformiamo il tutto in una stringa
stringa_dati_personali = array.array('B', data).tostring()
dimensione = int(stringa_dati_personali[0:6],16)
print("Dimensione in byte dei dati: {}".format( dimensione))
numero_field = 0
prox_field_size = int(stringa_dati_personali[6:8], 16)
da = 8
a = da + prox_field_size
if prox_field_size > 0:
codice_emettitore = stringa_dati_personali[da:a]
print("Codice emettitore: {}".format(codice_emettitore.decode("utf-8")))
numero_field += 1
da = a
a +=2
prox_field_size = int(stringa_dati_personali[da:a], 16)
da=a
a += prox_field_size
if prox_field_size > 0:
data_rilascio_tessera = stringa_dati_personali[da:a]
year = int(data_rilascio_tessera[-4:])
month = int(data_rilascio_tessera[2:4])
day = int(data_rilascio_tessera[0:2])
dtm_data_rliascio = datetime.date(year, month, day)
# print(string("Data rilascio tessera: ", data_rilascio_tessera[0:2], "/", data_rilascio_tessera[2:4], "/", data_rilascio_tessera[-4:])
print("Data rilascio tessera: {}".format(dtm_data_rliascio))
numero_field += 1
da = a
a +=2
prox_field_size = int(stringa_dati_personali[da:a], 16)
da=a
a += prox_field_size
if prox_field_size > 0:
data_scadenza_tessera = stringa_dati_personali[da:a]
year = int(data_scadenza_tessera[-4:])
month = int(data_scadenza_tessera[2:4])
day = int(data_scadenza_tessera[0:2])
dtm_data_scadenza = datetime.date(year, month, day)
# print("Data scadenza tessera: ", data_scadenza_tessera[0:2]+"/"+data_scadenza_tessera[2:4]+"/"+data_scadenza_tessera[-4:])
print("Data scadenza tessera: {}".format(dtm_data_scadenza))
numero_field += 1
# da = a
# a +=2
# prox_field_size = int(stringa_dati_personali[da:a], 16)
# da=a
# a += prox_field_size
# if prox_field_size > 0:
# cognome = stringa_dati_personali[da:a]
# print("Cognome: {}".format(cognome))
# numero_field += 1
while a < dimensione:
da = a
a += 2
prox_field_size = int(stringa_dati_personali[da:a], 16)
da=a
a += prox_field_size
if prox_field_size > 0:
field = stringa_dati_personali[da:a]
print("Field#{}: {}".format(numero_field, field))
numero_field += 1