Leggere la Tessera Sanitaria

di il
17 risposte

Leggere la Tessera Sanitaria

Ciao a tutti,
devo leggere i dati contenuti nella tessera sanitaria, per cui mi sono procurato un lettore di SmartCard,
ma ora volevo capire quale era il modo più semplice per leggerla.
Esiste una DLL possibilmente gratuita per interfacciarsi con il lettore  ?

Sui pacchetti NuGET ho provato a scrivere “smart card” ma sono usciti troppi risultati, prima di provarli tutti volevo sapere se qualcuno di voi può consigliarmi cosa usare.

Grazie mille
Sergio

17 Risposte

  • Re: Leggere la Tessera Sanitaria

    Mi sembra che tu possa risolvere con OpenSC … fai qualche ricerca

  • Re: Leggere la Tessera Sanitaria

    Ciao Oregon,

    Quali dati hai bisogno di recuperare dalla Tessera Sanitaria ??? 

    Io avevo fatto a suo tempo una mia Libreria per recuperare in VB.NET i dati anagrafici ( nome,cognome e Codice Fiscale ) del cliente da banda magnetica del Cliente per miei programmi.

    Ma giocandoci su riuscivo a leggere il tutto … 

    Guardo dove ho messo e se ricordo il tutto ed eventualmente aggiorno quì.

    P.S. Io ho lavorato di Sicuro su TS della Liguria e Toscana ….. ogni regione poi aveva all' epoca TS diverse con funzioni abilitate/disabilitate.

    Byeee

  • Re: Leggere la Tessera Sanitaria

    29/10/2023 - dpsandro ha scritto:


    Ciao Oregon,

    Quali dati hai bisogno

    Guarda che non sono io quelli che ha fatto la domanda 

  • Re: Leggere la Tessera Sanitaria

    Grazie ad entrambi per la risposta.

    Dalla tessera sanitaria devo ricavarmi più dati anagrafici possibili, così evito di dover digitare a mano i dati su di un form con i dati dell'utente.
    Quindi, codice fiscale, nome e cognome, data e luogo di nascita, e se possibile anche residenza, anche se credo questo dato non c'è più.

    NON mi interessano dati sanitari o altro.

    Ho scaricato OpenSC e installato, sto provando ad usare opensc-explorer.exe e opensc-tool.exe ma non riesco a ricavare quei dati.
    Purtroppo non ho mai avuto a che fare con le Smart Card quindi sono a digiuno di termini come ATR, DF, o altro e non capisco quindi dove andare a prendere i dati.

    Se provo “opensc-tool -n” mi risponde con “CSN card”, ed è già un buon inizio,
    poi se provo con “opensc-tool -a” (cioè leggo i byte ATR) mi risponde con “3b:ff:18:00:ff:81:31:fe:55:00:6b:…………”
    ma non saprei che farmene
    Se provo con “open-tool -f” (cioè lista dei file) mi risponde con
    3f00 type: DF, size: 0
    select[N/A] lock[N/A] delete[NEVR] create[NEVR] rehab[NEVR] inval[NEVR] list[N/A] sec: FF:FF:FF:FF:FF:FF:FF:FF:FF:FF

    e anche qui putroppo non saprei cosa sia

    C'è una qualche documentazione in proposito ??

    Tu @dpsandro hai idea di come fare ??

    Grazie mille
    Sergio

  • Re: Leggere la Tessera Sanitaria

    Ciao SirJo,

    Aggiornamento su SmartCard …

    Questo mi era sfuggito : Problema con la lettura di varie Smart Card - Forum Visual Basic 6.0 (iprogrammatori.it)

    Spero non sia VIETATO !!! 

    e comunque io ho usato alla fine della storia questa GitHub - danm-de/pcsc-sharp: PC/SC wrapper classes for .NET, written in C# 

    naturalmente per usarla al tempo usavo VB.NET ( 2019 o giù di lì ) e comunque penso che ai giorni nostri ci siano sistemi più facili da implementare e riutilizzare. 

    Poi ricordo di aver buttato anche ad un manuale dedicato proprio alle SMART-CARD e pure di un italiano  :

    About Me (ugochirico.com)  - Grande Ugo !!! 

    e pure quì avevo cercato di capire qualcosa 

    A Smart Card Framework for .NET - CodeProject

    O mamma mia che tempi che furono …

    P.S. Scusa Oregon  oramai a una certa età si sbaglia continuamente !!!

  • Re: Leggere la Tessera Sanitaria

    Grazie mille !!
    Inizio a lavorarci su, poi vi dico

    ma dalla pagina https://github.com/danm-de/pcsc-sharp come faccio a ricavarmi la DLL ???

  • Re: Leggere la Tessera Sanitaria

    Aggiornamento:

    ci sono riuscito !!!

    prima di tutto ho provato con OpenSC che però ho scoperto non è una propria e vera libreria, ma una serie di tools .EXE che comunicano con la smart card, ma comunque ci sono riuscito utilizzando opensc-explorer.exe che mi ha creato sul disco locale un file con i dati della smartcard

    poi mi sono interfacciato direttamente con winscard.dll e con l'aiuto del link suggerito da dpsandro (vedi post precedente) sono riuscito ad estrarre i dati che mi servivano

    Grazie mille
    Sergio

  • Re: Leggere la Tessera Sanitaria

    02/11/2023 - SirJo ha scritto:


    Aggiornamento:

    ci sono riuscito !!!

    prima di tutto ho provato con OpenSC che però ho scoperto non è una propria e vera libreria, ma una serie di tools .EXE che comunicano con la smart card, ma comunque ci sono riuscito utilizzando opensc-explorer.exe che mi ha creato sul disco locale un file con i dati della smartcard

    poi mi sono interfacciato direttamente con winscard.dll e con l'aiuto del link suggerito da dpsandro (vedi post precedente) sono riuscito ad estrarre i dati che mi servivano

    Grazie mille
    Sergio

    Ciao, io dovrei integrare questa funzionalità in un programma per una associazione ma sto avendo grossi problemi… Per caso hai il modulo su git o in qualche altro tipo di repository? 

    Mi sarebbe davvero utile… grazie! 

  • Re: Leggere la Tessera Sanitaria

    ….. che problemi stai avendo ???

    sei riuscito a comunicare con il lettore ???

  • Re: Leggere la Tessera Sanitaria

    Riesco a connettermi ed ottenere il nome dei lettori connessi ma probabilmente ho problemi nel navigare tra la struttura della carta. 

    Tutte le letture mi restituiscono un buffer vuoto.

  • Re: Leggere la Tessera Sanitaria

    Una volta ottenuta la lista dei lettori presenti devi

    1) creare un context con

    SCardEstablishContext(SCARD_SCOPE_SYSTEM, IntPtr.Zero, IntPtr.Zero, hContext)

    2) collegarti alla carta con

    SCardConnect(hContext, ReaderName, SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0 Or SCARD_PROTOCOL_T1, phCard, activeProtocol)

    3) selezionare la cartella “root” (&H3F00)
    4) selezionare la cartella DF1 (&H1100)
    5) selezionare il file EF (&H1102)
    6) leggere i dati dal file

    eccoti la mappa della tessera sanitaria:

  • Re: Leggere la Tessera Sanitaria

    La sequenza che uso è la stessa… forse sbaglio la sintassi da utilizzare o sbaglio qualche conversione da vb6 a .net….

    Hai per caso sottomano l'esempio di come hai dichiarato le strutture e di come chiami realmente  la funzione di lettura?

    Scusami ma ci sto sbattendo la testa da giorni ed è per una associazione (non sono un programmatore professionista)

  • Re: Leggere la Tessera Sanitaria

    Eccoti qui qualcosa, ma forse sarebbe meglio che mostri il codice dove ti va in errore

        <DllImport("winscard.dll", CharSet:=CharSet.Auto, SetLastError:=True)>
        Private Shared Function SCardEstablishContext(ByVal dwScope As Integer, ByVal pvReserved1 As IntPtr, ByVal pvReserved2 As IntPtr, ByRef phContext As IntPtr) As Integer
        End Function
    
        <DllImport("winscard.dll", CharSet:=CharSet.Auto, SetLastError:=True)>
        Private Shared Function SCardReleaseContext(ByVal hContext As IntPtr) As Integer
        End Function
    
        <DllImport("winscard.dll", CharSet:=CharSet.Auto, SetLastError:=True)>
        Private Shared Function SCardConnect(ByVal hContext As IntPtr, _
            ByVal szReaderName As String, _
            ByVal dwShareMode As Integer, _
            ByVal dwPreferredProtocols As Integer, _
            ByRef phCard As IntPtr, _
            ByRef pdwActiveProtocol As Integer) As Integer
        End Function
    
        <DllImport("winscard.dll", CharSet:=CharSet.Auto, SetLastError:=True)>
        Private Shared Function SCardListReaders(ByVal hContext As IntPtr, ByVal mszGroups As String, _
            ByVal mszReaders As String, ByRef pcchReaders As UInteger) As Integer
        End Function
    
        <DllImport("winscard.dll", CharSet:=CharSet.Auto, SetLastError:=True)>
        Private Shared Function SCardDisconnect(ByVal phCard As IntPtr, _
            ByVal dwDisposition As Integer) As Integer
        End Function
    
        <DllImport("winscard.dll", CharSet:=CharSet.Auto, SetLastError:=True)>
        Private Shared Function SCardTransmit(ByVal phCard As IntPtr, _
            ByRef pioSendPci As SCARD_IO_REQUEST, _
            ByVal pbSendBuffer As Byte(), _
            ByVal cbSendLength As Int32, _
            ByRef pioRecvPci As SCARD_IO_REQUEST, _
            ByVal pbRecvBuffer As Byte(), _
            ByRef RecvBuffLen As Int32) As Integer
        End Function
    
        <StructLayout(LayoutKind.Sequential)> _
        Private Structure SCARD_IO_REQUEST
            Dim dwProtocol As Int32
            Dim dbPciLength As Int32
        End Structure
    
  • Re: Leggere la Tessera Sanitaria

    Io provavo con la PCSC sharp ed arrivavo al problema detto prima.

    Utilizzando la modalità winscard.dll mi va ancora peggio.

    Ho riprovato dichiarando le strutture esattamente con il codice che hai postato ma in:

    SCardConnect(hContext, ReaderName, SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0 Or SCARD_PROTOCOL_T1, phCard, activeProtocol)

    occorre specificare il ReaderName.

    Ho provato con:

                Dim SCARD_SCOPE_SYSTEM As Integer = 2
               Dim hContext As IntPtr
               Dim retSCardEstablishContext As Integer
               retSCardEstablishContext = SCardEstablishContext(SCARD_SCOPE_SYSTEM, IntPtr.Zero, IntPtr.Zero, hContext)
               If retSCardEstablishContext <> 0 Then
                   ' error
               End If
               Dim retSCardListReaders As Integer
               Dim group As String = String.Empty
               Dim readers As String = String.Empty
               Dim pcchReaders As UInteger
               retSCardListReaders = SCardListReaders(0, group, readers, pcchReaders)
               If retSCardListReaders <> 0 Then
                   ' error
               End If
    

    Sia retSCardEstablishContext  che retSCardListReaders  non danno errori ma non capisco come estrarre il nome. pcchReaders vale 98

Devi accedere o registrarti per scrivere nel forum
17 risposte