prothandler.c
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00017 #include "config.h"
00018 #include <string.h>
00019
00020 #include "misc.h"
00021 #include "pcscd.h"
00022 #include "ifdhandler.h"
00023 #include "debuglog.h"
00024 #include "readerfactory.h"
00025 #include "prothandler.h"
00026 #include "atrhandler.h"
00027 #include "ifdwrapper.h"
00028 #include "eventhandler.h"
00029
00035 UCHAR PHGetDefaultProtocol(PUCHAR pucAtr, DWORD dwLength)
00036 {
00037 SMARTCARD_EXTENSION sSmartCard;
00038
00039
00040
00041
00042 memset(&sSmartCard, 0x00, sizeof(SMARTCARD_EXTENSION));
00043
00044 if (ATRDecodeAtr(&sSmartCard, pucAtr, dwLength))
00045 return sSmartCard.CardCapabilities.CurrentProtocol;
00046 else
00047 return 0x00;
00048 }
00049
00055 UCHAR PHGetAvailableProtocols(PUCHAR pucAtr, DWORD dwLength)
00056 {
00057 SMARTCARD_EXTENSION sSmartCard;
00058
00059
00060
00061
00062 memset(&sSmartCard, 0x00, sizeof(SMARTCARD_EXTENSION));
00063
00064 if (ATRDecodeAtr(&sSmartCard, pucAtr, dwLength))
00065 return sSmartCard.CardCapabilities.AvailableProtocols;
00066 else
00067 return 0x00;
00068 }
00069
00080 DWORD PHSetProtocol(struct ReaderContext * rContext,
00081 DWORD dwPreferred, UCHAR ucAvailable, UCHAR ucDefault)
00082 {
00083 DWORD protocol;
00084 LONG rv;
00085 UCHAR ucChosen;
00086
00087
00088 if (dwPreferred == 0)
00089 return SET_PROTOCOL_WRONG_ARGUMENT;
00090
00091
00092 if (! (dwPreferred & ucAvailable))
00093 {
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106 Log2(PCSC_LOG_ERROR, "Protocol T=%d requested but unsupported by the card",
00107 (SCARD_PROTOCOL_T0 == dwPreferred) ? 0 : 1);
00108 return SET_PROTOCOL_WRONG_ARGUMENT;
00109 }
00110
00111
00112 protocol = ucDefault;
00113
00114
00115 dwPreferred &= ucAvailable;
00116
00117
00118 if (dwPreferred & SCARD_PROTOCOL_T1)
00119 ucChosen = SCARD_PROTOCOL_T1;
00120 else
00121 if (dwPreferred & SCARD_PROTOCOL_T0)
00122 ucChosen = SCARD_PROTOCOL_T0;
00123 else
00124
00125 return SET_PROTOCOL_WRONG_ARGUMENT;
00126
00127 Log2(PCSC_LOG_INFO, "Attempting PTS to T=%d",
00128 (SCARD_PROTOCOL_T0 == ucChosen ? 0 : 1));
00129 rv = IFDSetPTS(rContext, ucChosen, 0x00, 0x00, 0x00, 0x00);
00130
00131 if (IFD_SUCCESS == rv)
00132 protocol = ucChosen;
00133 else
00134 if (IFD_NOT_SUPPORTED == rv)
00135 Log2(PCSC_LOG_INFO, "PTS not supported by driver, using T=%d",
00136 (SCARD_PROTOCOL_T0 == protocol) ? 0 : 1);
00137 else
00138 if (IFD_PROTOCOL_NOT_SUPPORTED == rv)
00139 Log2(PCSC_LOG_INFO, "PTS protocol not supported, using T=%d",
00140 (SCARD_PROTOCOL_T0 == protocol) ? 0 : 1);
00141 else
00142 {
00143 Log3(PCSC_LOG_INFO, "PTS failed (%d), using T=%d", rv,
00144 (SCARD_PROTOCOL_T0 == protocol) ? 0 : 1);
00145
00146
00147
00148
00149
00150 return SET_PROTOCOL_PPS_FAILED;
00151 }
00152
00153 return protocol;
00154 }
00155