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