Newsgroup: it.comp.appl.access
Titolo: leggere da smart card

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
 
 
 


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
 
 
 
 

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


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
 
 
 
 

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


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
 
 
 
 

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