SCardConnect
Gestione della connessione tra card e lettore
Una volta stabilito un contesto valido, il prossimo passo è quello
di connettere la card inserita nel lettore e il lettore stesso. Non c’è
infatti un meccanismo plug&play che fa si che, una volta inserita
la card nel lettore, questi si interfaccino reciprocamente in modo automatico.
La funzione in grado di fornire tale servizio è:
LONG SCardConnect(SCARDCONTEXT hContext,
LPCSTR szReader,
DWORD
dwShareMode,
DWORD dwPreferredProtocols,
LPSCARDHANDLE
phCard,
LPDWORD
pdwActiveProtocol );
Parametri:
hContext: handle valido della connessione al PC/SC Resource Manager.
szReader: nome del lettore cui la card deve connettersi
dwShareMode: tipologia della connessione: “exclusive” o
“shared”.
DwPreferredProtocols: protocollo di comunicazione della card utilizzato
phCard: handle ottenuto per la connessione
pdwActiveProtocol: protocollo di comunicazione effettivamente
utilizzato durante la connessione.
Tale funzione, come detto, apre una connessione tra la card, che deve
essere già presente nel lettore, e il lettore, identificato dalla
stringa szReader, magari ottenuta tramite la funzione SCardListReaders.
La connessione è stabilita nell’ambito di un contesto valido
col card manager, puntato dall’handle hContext (ottenuto dalla funzione
ScardEstablishContext ). Se il contesto selezionato non è valido,
è ritornato un errore.
La connessione può avvenire in modo esclusivo o in modo condiviso:
la scelta tra queste due modalità avviene tramite il parametro
dwShareMode. E’ inoltre necessario selezionare il tipo di protocollo
di comunicazione che deve essere utilizzato, in accordo con la specifica
ISO 7816-3, mentre il protocollo effettivamente utilizzato è restituito
tramite il parametro pdwActiveProtocol.
In effetti, nella specifica PC/SC, il parametro DwPreferredProtocol è
una maschera di bit, cosa che rende possibile il fato che, per una card,
sia possibile utilizzare più protocolli di comunicazione: questo
è il motivo per cui il protocollo effettivamente utilizzato è
restituito in out da pdwActiveProtocol.
Se l’esecuzione va a buon fine, la funzione restituisce un’handle
alla connessione appena stabilita. Tale handle è puntato da phCard.
La avvenuta connessione causa, dal punto di vista fisico, l’alimentazione
elettrica e il reset della card.
Valori e significato del parametro dwShareMode
|
SCARD_SHARE_SHARED |
L’applicazione che richiede la connessione accetta
di condividere il lettore con altre applicazioni |
SCARD_SHARE_EXCLUSIVE |
L’applicazione che richiede la connessione
rifiuta di condividere il lettore con altre applicazioni
|
Valori e significato del parametro dwPreferredProtocols Meaning (*) |
SCARD_PROTOCOL_T0 |
Usa il protocollo di comunicazione T0 |
SCARD_PROTOCOL_T0 |
Usa il protocollo di comunicazione T1 |
SCARD_PROTOCOL_RAW |
Tipo di protocollo utilizzato solo dalle memory card |
(*) per maggiori chiarimenti sui protocolli di comuinicazione,
si veda l’ISO 7816-3
In ambienti multitasking, può succedere che un’applicazione,
abilitata all’accesso condiviso alla card, faccia un reset della
card stessa. In tal caso, ogni successivo tentativo, da parte di un’altra
applicazione abilitata, di eseguire operazioni sulla stessa carta fallirà
con codice di errore SCARD_W_RESET_CARD . Per ovviare a tale scenario,
si utilizza la funzione seguente, la quale permette all’applicazione
chiamante di realizzare un modo di catturare la condizione di reset della
card e di porvi rimedio:
LONG SCardReconnect( SCARDHANDLE hCard, DWORD dwShareMode,
DWORD
dwPreferredProtocols,
DWORD
dwInitialization,
LPDWORD
pdwActiveProtocol );
Parametri:
hCard: handle restituito da una precedente chiamata della funzione
SCardConnect.
dwShareMode: come per omonimo in SCardConnect.
DwPreferredProtocols: come per omonimo in SCardConnect
DwInitialization: specifica il tipo di inizializzazione da effettuare
PdwActiveProtocol: come per omonimo in SCardConnect.
La funzione riapre una connessione alla card. Perché ciò
sia possibile, è necessario che la connessione in questione possieda
un handle valido hCard. Quindi, presupposto indispensabile all’utilizzo
di ScardReconnect, è il precedente utilizzo di SCardConnect.
Il parametro DwInitialization permette di specificare quale debba essere
l’effetto collaterale della riconnessione, come un “warm-reset”
o un “cold-reset”.
Si noti che questa funzione può essere utilizzata anche solo per
cambiare la modalità di accesso, tramite il parametro dwShareMode.
Valore e significato del parametro dwInitialization |
SCARD_LEAVE_CARD |
Non ha alcun effetto |
SCARD_RESET_CARD |
Reset della card (warm-reset) |
SCARD_UNPOWER_CARD |
Toglie alimentazione alla card (cold-reset) |
SCARD_EJECT_CARD |
Espelle la card dal lettore (per lettori servoassistiti) |
Una volta che un’applicazione ha effettuato tutte le operazioni
sulla card, deve rilasciare la connessione stabilita tramite la SCardConnect.
Ciò è realizzato dalla funzione
LONG SCardDisconnect(SCARDHANDLE hCard,
DWORD dwDisposition );
Parametri:
hCard: handle alla connessione ottenuta tramite SCardConnect.
DwDisposition: Azione che il lettore deve effettuare sulla card
in fase di
disconnessione
Valore e significato del parametro DwDisposition |
SCARD_LEAVE_CARD |
Non ha alcun effetto |
SCARD_RESET_CARD |
Reset della card (warm-reset) |
SCARD_UNPOWER_CARD |
Toglie alimentazione alla card (cold-reset) |
SCARD_EJECT_CARD |
Espelle la card dal lettore (per lettori servoassistiti) |
In più, PC/SC fornisce un ulteriore valore SCARD_CONFISCATE_CARD,
che fa si che la card non sia più fisicamente restituita dal lettore
(si pensi al caso in cui al Bancomat si sbaglia ad inserire il valore
PIN più volte!)
Si noti che questa funzione, in ambiente multitasking, è quella
che giustifica l’esigenza di avere una funzione come SCardRiconnect.
Inoltre, è possibile conoscere, in ogni momento, lo stato del
lettore cui si è connessi tramite
LONG SCardStatus( SCARDHANDLE hCard, LPSTR szReaderName,
LPDWORD
pcchReaderLen, LPDWORD pdwState,
LPDWORD
pdwProtocol, LPBYTE pbAtr,
LPDWORD
pcbAtrLen );
Parametri:
hCard: handle alla connessione stabilita tramite SCardConnect
szReaderName: nome del lettore da controllare
pcchReaderLen: lunghezza della stringa szReaderName
pdwState: stato del lettore
pdwProtocol: protocollo utilizzato dal lettore
pbAtr: stringa ATR inviata dalla card al lettore
pcbAtrLen: lunghezza della stringa ATR
La funzione in questione ritorna lo stato corrente del lettore cui la
card è connessa tramite l’handle hCard. Il nome del lettore
è memorizzato in szReaderName, se c’è una card inserita
nel lettore in pdwProtocol è memorizzato il protocollo di comunicazione
utilizzato e in pbAtr è memorizzata la stringa ATR che la card
ha inviato al lettore. Lo stato corrente è memorizzato in pdwState.
Quest’ultimo è una un OR dei seguenti possibili valori
Valori in OR per pdwState |
SCARD_ABSENT |
Nessuna card nel lettore |
SCARD_PRESENT |
C’è una card nel lettore, ma non è
stata inserita nella posizione giusta |
SCARD_SWALLOWED |
C’è una card nel lettore, messa in posizione
corretta, ma tale card non è alimentata |
SCARD_POWERED |
La card nel lettore è alimentata, ma l’handler
del lettore non è a conoscenza del MODE della card |
SCARD_NEGOTIABLEMODE |
La card ha subito un reset ed è pronta
per una negoziazione PTS |
SCARD_SPECIFICMODE |
La card ha subito un reset, ed è stato stabilito
uno specifico protocollo di comunicazione |
|