Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

leggere da smart card

136 views
Skip to first unread message

BFS

unread,
Mar 26, 2020, 5:06:16 AM3/26/20
to
qualcuno si è cimentato nel leggere dati da una smart card?
nel dettaglio sfruttando winscard.dll?
mi perdo tra la marea di funzioni e parametri delle varie funzioni della dll

attualmente importo i dati dalla smartcard (tessera sanitaria)
appoggiandomi a un tool esterno che fa il lavoro sporco di leggerla e
salvare il contenuto in un txt che prendo in gestione, ma vorrei
svincolarmi da software/ocx esterni

grazie
BFS



BFS

unread,
Mar 27, 2020, 3:07:05 AM3/27/20
to
allora ho fatto quasi tutto
rilevo il lettore
rilevo se la carta è inserita o meno
navigo la carta fino a trovare i dati anagrafici
ottengo i dati anagrafici ma solo parzialmente, solo i primi 150 caratteri

il problema l'ho con questa funzione di WinScard.dll forse non ho
compreso qualche parametro

Private Declare Function SCardTransmit Lib "WinScard.dll" ( _
ByVal hCard As Long, _
ByRef pioSendRequest As SCARD_IO_REQUEST, _
ByRef sendbuff As Byte, _
ByVal SendBuffLen As Integer, _
ByRef pioRecvRequest As SCARD_IO_REQUEST, _
ByRef RecvBuff As Byte, _
ByRef RecvBuffLen As Integer) As Long


il contenuto della tessera dovrei trovarmelo in RecvBuff che è un buffer
di 516 byte
ma nel buffer mi trovo solo 150 caratteri e il resto vuoto fino a
saturazione del buffer

anche se raddoppio la grandezza del buffer non cambia nulla, 150
caratteri e il resto vuoto

qualche idea?
BFS




@Alex

unread,
Mar 27, 2020, 4:00:06 AM3/27/20
to
Immagino tu abbia verificato che il buffer passato sia adeguatamente predisposto con i Null prima di passarlo... ma magari un'occhio in più..

In questo Link trovi come chiedere all'api quanto vuole il buffer e poi lo dimensioni:

result = SCardListReaders(0, 0, 0, bufferSize)
readers = String$(bufferSize, Chr$(0))

Ovviamente poi lo passi...

Qui trovi un codice abbastanza esaustivo:

https://stackoverflow.com/questions/42756249/trying-to-understand-dll-returns-for-string-types

@Alex

BFS

unread,
Mar 27, 2020, 4:57:49 AM3/27/20
to
quella parte serve per reperire il nome del del lettore e non ho problemi.
in quel caso viene scritto su una stringa che ti confermo aver
inizializzato a null



il problema ce l'ho quando vado a leggere i dati del titolare della tessera
in pratica dal codice presente qui

https://www.iprogrammatori.it/forum-programmazione/visual-basic/problema-con-lettura-varie-smart-card-t23162.html


quello che ottengo a questo punto :


Dim apdu(261) As Byte
Dim recvbuf(258) As Byte
Dim recvlen As Integer
Dim iosendreq As SCARD_IO_REQUEST
Dim iorecvreq As SCARD_IO_REQUEST

'....

' LEGGO I BINARY PROVENIENTI DALLA CARTA
apdu(0) = &H0 'CLA
apdu(1) = &HB0 'INS
apdu(2) = &H0 'P1
apdu(3) = &H0 'P2
apdu(4) = &H96 'LC

recvlen = 257

iosendreq.dwprotocol = activeprotocol
iosendreq.dbPciLength = Len(iosendreq)
iorecvreq.dwprotocol = activeprotocol
iorecvreq.dbPciLength = Len(iosendreq)

retval = SCardTransmit(hCard, iosendreq, apdu(0), 5, iorecvreq,
recvbuf(0), recvlen)
If (retval <> 0) Then
MsgBox ("Errore n." & CStr(retval))
End If

risposta = ""

For K = 0 To apdu(4) - 1: risposta = risposta + Chr(recvbuf(K)): Next K


la lunghezza del buffer la si imposta tramite apdu(4)

almeno da quello che leggo qui

http://www.di-srv.unisa.it/~ads/corso-security/www/CORSO-0102/eToken/architettura/panoramica_apdu.htm

essendo settato a esadecimale 96 ottengo appunto 150 caratteri
ma anche andando a variare quel

apdu(4) = &H96
esempio a
apdu(4) = &HC8 (200 caratteri)

il risultato non cambia

BFS




@Alex

unread,
Mar 27, 2020, 5:12:37 AM3/27/20
to
Non avendo modo di provarlo fatico ad aiutarti..
Ora il link sotto non è vba ma immagino non ti sia difficile ricondurlo.
Da quanto vedo apdu(4) identifica il PRIMO dato ed apdu(5) il lenght...

https://blogs.sap.com/2014/05/01/communication-with-a-smart-card-from-powerbuilder/

@Alex

BFS

unread,
Mar 27, 2020, 11:37:47 AM3/27/20
to
ad ogni risposta del lettore negli ultimi due byte mi trovo 0x90 e 0x00
che mi indicano che non ci sono errori ne nel comando trasmesso ne nel
risultato tornato indietro

"La risposta dei microchip ad un comando è codificata in una Response
APDUcomposta da un corpo opzionale DATA seguito da due byte SW1 (Status
Word 1) e SW2 (Status Word2).
SW1 SW2 0x90 0x00 Comando eseguito con successo "

infatti se restringo la dimensione del buffer che passo come parametro
la stringa restituita è più corta mentre se l'aumento si riempie di
spazi bianchi

a questo punto ho il DUBBIO atroce che il resto dei dati anagrafici
siano in un'altra cartella del file sistem della smart card
ma putroppo non trovo da nessuna parte la descrizione del file sistem
della tessera sanitaria


Peccato, allo stato attuale riesco ad ottenere cognome, nome, codice
fiscale e data di nascita



BFS




@Alex

unread,
Mar 27, 2020, 2:05:13 PM3/27/20
to
Mi fermo non potendo fare alcuna prova, ma, da come dici la procedura restituisce il valore corretto di avvenuta lettura, quindi proceduralmente stai facendo bene...

Non so se spulciando qualche link può uscire qualche altra idea o simili...

@Alex
0 new messages