- changed vpcd driver to use ifdhandler api v 3.0, since

support for v 1.0 has been dropped as of pcsc-lite 1.6
- fixed initialization error of vpcd due to uninitialized value
- changed virtual smartcard to use todays python syntax


git-svn-id: https://vsmartcard.svn.sourceforge.net/svnroot/vsmartcard@163 96b47cad-a561-4643-ad3b-153ac7d7599c
This commit is contained in:
frankmorgner
2010-06-22 14:06:07 +00:00
parent 34cbb09b80
commit 0b03fced4a
3 changed files with 60 additions and 37 deletions

View File

@@ -11,16 +11,23 @@
* List of Defined Functions Available to IFD_Handler 1.0 * List of Defined Functions Available to IFD_Handler 1.0
*/ */
RESPONSECODE RESPONSECODE
IO_Create_Channel(DWORD channelid) IFDHCreateChannel (DWORD Lun, DWORD Channel)
{ {
Log1(PCSC_LOG_DEBUG, ""); Log1(PCSC_LOG_DEBUG, "");
if (vicc_init() < 0) return IFD_COMMUNICATION_ERROR; if (vicc_init() < 0)
return IFD_COMMUNICATION_ERROR;
return IFD_SUCCESS; return IFD_SUCCESS;
} }
RESPONSECODE RESPONSECODE
IO_Close_Channel(void) IFDHCreateChannelByName (DWORD Lun, LPSTR DeviceName)
{
return IFDHCreateChannel (Lun, 0);
}
RESPONSECODE
IFDHCloseChannel (DWORD Lun)
{ {
Log1(PCSC_LOG_DEBUG, ""); Log1(PCSC_LOG_DEBUG, "");
RESPONSECODE r = IFD_Eject_ICC(); RESPONSECODE r = IFD_Eject_ICC();
@@ -30,11 +37,11 @@ IO_Close_Channel(void)
} }
RESPONSECODE RESPONSECODE
IFD_Get_Capabilities(DWORD tag, PUCHAR value) IFDHGetCapabilities (DWORD Lun, DWORD Tag, PDWORD Length, PUCHAR Value)
{ {
char *atr; char *atr;
int size; int size;
switch (tag) { switch (Tag) {
case TAG_IFD_ATR: case TAG_IFD_ATR:
size = vicc_getatr(&atr); size = vicc_getatr(&atr);
@@ -44,48 +51,57 @@ IFD_Get_Capabilities(DWORD tag, PUCHAR value)
} }
Log2(PCSC_LOG_DEBUG, "Got ATR (%d bytes)", size); Log2(PCSC_LOG_DEBUG, "Got ATR (%d bytes)", size);
memcpy(value, atr, size); if (*Length < size)
return IFD_COMMUNICATION_ERROR;
memcpy(Value, atr, size);
*Length = size;
free(atr); free(atr);
return IFD_SUCCESS;
break;
case TAG_IFD_SLOTS_NUMBER: case TAG_IFD_SLOTS_NUMBER:
(*value) = 0; if (*Length < 1)
return IFD_SUCCESS; return IFD_COMMUNICATION_ERROR;
//case TAG_IFD_POLLING_THREAD_KILLABLE: *Value = 1;
//return IFD_SUCCESS; *Length = 1;
break;
default: default:
Log2(PCSC_LOG_DEBUG, "unknown tag %d", (int)tag); Log2(PCSC_LOG_DEBUG, "unknown tag %d", (int)Tag);
return IFD_ERROR_TAG;
} }
return IFD_ERROR_TAG; return IFD_SUCCESS;
} }
RESPONSECODE RESPONSECODE
IFD_Set_Capabilities(DWORD tag, PUCHAR value) IFDHSetCapabilities (DWORD Lun, DWORD Tag, DWORD Length, PUCHAR Value)
{ {
return IFD_NOT_SUPPORTED; return IFD_NOT_SUPPORTED;
} }
RESPONSECODE RESPONSECODE
IFD_Set_Protocol_Parameters(DWORD protocoltype, UCHAR selectionflags, UCHAR IFDHSetProtocolParameters (DWORD Lun, DWORD Protocol, UCHAR Flags, UCHAR PTS1,
pts1, UCHAR pts2, UCHAR pts3) UCHAR PTS2, UCHAR PTS3)
{ {
Log1(PCSC_LOG_DEBUG, ""); Log1(PCSC_LOG_DEBUG, "");
return IFD_SUCCESS; return IFD_SUCCESS;
} }
RESPONSECODE RESPONSECODE
IFD_Power_ICC(DWORD a) IFDHPowerICC (DWORD Lun, DWORD Action, PUCHAR Atr, PDWORD AtrLength)
{ {
switch (a) { switch (Action) {
case IFD_POWER_DOWN: case IFD_POWER_DOWN:
if (vicc_poweroff() < 0) { if (vicc_poweroff() < 0) {
Log1(PCSC_LOG_ERROR, "could not powerdown"); Log1(PCSC_LOG_ERROR, "could not powerdown");
return IFD_COMMUNICATION_ERROR; return IFD_COMMUNICATION_ERROR;
} }
break;
*AtrLength = 0;
return IFD_SUCCESS;
case IFD_POWER_UP: case IFD_POWER_UP:
if (vicc_poweron() < 0) { if (vicc_poweron() < 0) {
Log1(PCSC_LOG_ERROR, "could not powerup"); Log1(PCSC_LOG_ERROR, "could not powerup");
@@ -99,11 +115,11 @@ IFD_Power_ICC(DWORD a)
} }
break; break;
default: default:
Log2(PCSC_LOG_ERROR, "%d not supported", a); Log2(PCSC_LOG_ERROR, "%d not supported", Action);
return IFD_NOT_SUPPORTED; return IFD_NOT_SUPPORTED;
} }
return IFD_SUCCESS; return IFDHGetCapabilities (Lun, TAG_IFD_ATR, AtrLength, Atr);
} }
RESPONSECODE RESPONSECODE
@@ -130,41 +146,47 @@ IFD_Confiscate_ICC(void)
} }
RESPONSECODE RESPONSECODE
IFD_Transmit_to_ICC(SCARD_IO_HEADER SendPci, PUCHAR TxBuffer, DWORD TxLength, IFDHTransmitToICC (DWORD Lun, SCARD_IO_HEADER SendPci, PUCHAR TxBuffer,
PUCHAR RxBuffer, PDWORD RxLength, PSCARD_IO_HEADER RecvPci) DWORD TxLength, PUCHAR RxBuffer, PDWORD RxLength,
PSCARD_IO_HEADER RecvPci)
{ {
Log1(PCSC_LOG_DEBUG, ""); if (!RxLength || !RecvPci)
(*RxLength) = 0; return IFD_COMMUNICATION_ERROR;
char *rapdu;
char *rapdu;
int size = vicc_transmit(TxLength, (char *) TxBuffer, &rapdu); int size = vicc_transmit(TxLength, (char *) TxBuffer, &rapdu);
if (size < 0) { if (size < 0) {
Log1(PCSC_LOG_ERROR, "could not send apdu or receive rapdu"); Log1(PCSC_LOG_ERROR, "could not send apdu or receive rapdu");
*RxLength = 0;
return IFD_COMMUNICATION_ERROR; return IFD_COMMUNICATION_ERROR;
} }
(*RxLength) = size; (*RxLength) = size;
RxBuffer = memcpy(RxBuffer, rapdu, size); RxBuffer = memcpy(RxBuffer, rapdu, size);
free(rapdu); free(rapdu);
RecvPci->Protocol = 1;
return IFD_SUCCESS; return IFD_SUCCESS;
} }
RESPONSECODE RESPONSECODE
IFD_Is_ICC_Present(void) IFDHICCPresence (DWORD Lun)
{ {
switch (vicc_present()) { switch (vicc_present()) {
case 0: return IFD_ICC_NOT_PRESENT; case 0:
case 1: return IFD_ICC_PRESENT; return IFD_ICC_NOT_PRESENT;
case 1:
return IFD_ICC_PRESENT;
default: default:
Log1(PCSC_LOG_DEBUG, "Could not get ICC state"); Log1(PCSC_LOG_DEBUG, "Could not get ICC state");
return IFD_COMMUNICATION_ERROR; return IFD_COMMUNICATION_ERROR;
} }
return IFD_COMMUNICATION_ERROR;
} }
RESPONSECODE RESPONSECODE
IFD_Is_ICC_Absent(void) IFDHControl (DWORD Lun, DWORD dwControlCode, PUCHAR TxBuffer, DWORD TxLength,
PUCHAR RxBuffer, DWORD RxLength, LPDWORD pdwBytesReturned)
{ {
return IFD_Is_ICC_Present(); return IFD_ERROR_NOT_SUPPORTED;
} }

View File

@@ -90,7 +90,7 @@ int opensock(unsigned short port)
} }
int waitforclient(int server, long int secs, long int usecs) { int waitforclient(int server, long int secs, long int usecs) {
int sock; int sock = 0;
fd_set rfds; fd_set rfds;
FD_ZERO(&rfds); FD_ZERO(&rfds);
@@ -189,7 +189,8 @@ int vicc_transmit(int apdu_len, const char *apdu, char **rapdu) {
} }
int vicc_present(void) { int vicc_present(void) {
if (client_sock > 0) return 1; if (client_sock > 0)
return 1;
else { else {
/* Wait up to one microsecond. */ /* Wait up to one microsecond. */
client_sock = waitforclient(server_sock, 0, 1); client_sock = waitforclient(server_sock, 0, 1);

View File

@@ -387,7 +387,7 @@ class VirtualICC(object): # {{{
try: try:
self.sock = self.connectToPort(host, port) self.sock = self.connectToPort(host, port)
self.sock.settimeout(None) self.sock.settimeout(None)
except socket.error as e: except socket.error, e:
print "Failed to open socket: " + str(e) + ". Is pcscd running? Is vpcd installed?" print "Failed to open socket: " + str(e) + ". Is pcscd running? Is vpcd installed?"
sys.exit() sys.exit()