@ -152,6 +152,24 @@ if (rv != SCARD_S_SUCCESS) { \
LOGW ( ( w ) , " : OK \n " ) ; \
}
static int pcsc_get_atr ( struct bankd_worker * worker )
{
long rc ;
char pbReader [ MAX_READERNAME ] ;
/* use DWORD type as this is what the PC/SC API expects */
DWORD dwReaderLen = sizeof ( pbReader ) ;
DWORD dwAtrLen = worker - > card . atr_len = sizeof ( worker - > card . atr ) ;
DWORD dwState , dwProt ;
rc = SCardStatus ( worker - > reader . pcsc . hCard , pbReader , & dwReaderLen , & dwState , & dwProt ,
worker - > card . atr , & dwAtrLen ) ;
PCSC_ERROR ( worker , rc , " SCardStatus " )
worker - > card . atr_len = dwAtrLen ;
LOGW ( worker , " Card ATR: %s \n " , osmo_hexdump_nospc ( worker - > card . atr , worker - > card . atr_len ) ) ;
end :
return rc ;
}
static int pcsc_open_card ( struct bankd_worker * worker )
{
long rc ;
@ -171,16 +189,23 @@ static int pcsc_open_card(struct bankd_worker *worker)
PCSC_ERROR ( worker , rc , " SCardConnect " )
}
/* use DWORD type as this is what the PC/SC API expects */
char pbReader [ MAX_READERNAME ] ;
DWORD dwReaderLen = sizeof ( pbReader ) ;
DWORD dwAtrLen = worker - > card . atr_len = sizeof ( worker - > card . atr ) ;
DWORD dwState , dwProt ;
rc = SCardStatus ( worker - > reader . pcsc . hCard , pbReader , & dwReaderLen , & dwState , & dwProt ,
worker - > card . atr , & dwAtrLen ) ;
PCSC_ERROR ( worker , rc , " SCardStatus " )
worker - > card . atr_len = dwAtrLen ;
LOGW ( worker , " Card ATR: %s \n " , osmo_hexdump_nospc ( worker - > card . atr , worker - > card . atr_len ) ) ;
rc = pcsc_get_atr ( worker ) ;
end :
return rc ;
}
static int pcsc_reset_card ( struct bankd_worker * worker , bool cold_reset )
{
long rc ;
DWORD dwActiveProtocol ;
LOGW ( worker , " Resetting card in '%s' (%s) \n " , worker - > reader . name ,
cold_reset ? " cold reset " : " warm reset " ) ;
rc = SCardReconnect ( worker - > reader . pcsc . hCard , SCARD_SHARE_SHARED , SCARD_PROTOCOL_T0 ,
cold_reset ? SCARD_UNPOWER_CARD : SCARD_RESET_CARD , & dwActiveProtocol ) ;
PCSC_ERROR ( worker , rc , " SCardReconnect " ) ;
rc = pcsc_get_atr ( worker ) ;
end :
return rc ;
}
@ -213,6 +238,7 @@ static void pcsc_cleanup(struct bankd_worker *worker)
const struct bankd_driver_ops pcsc_driver_ops = {
. open_card = pcsc_open_card ,
. reset_card = pcsc_reset_card ,
. transceive = pcsc_transceive ,
. cleanup = pcsc_cleanup ,
} ;