diff --git a/virtualsmartcard/src/vpcd/ifd.c b/virtualsmartcard/src/vpcd/ifd.c index 657ba67..47db51d 100644 --- a/virtualsmartcard/src/vpcd/ifd.c +++ b/virtualsmartcard/src/vpcd/ifd.c @@ -11,16 +11,23 @@ * List of Defined Functions Available to IFD_Handler 1.0 */ RESPONSECODE -IO_Create_Channel(DWORD channelid) +IFDHCreateChannel (DWORD Lun, DWORD Channel) { Log1(PCSC_LOG_DEBUG, ""); - if (vicc_init() < 0) return IFD_COMMUNICATION_ERROR; + if (vicc_init() < 0) + return IFD_COMMUNICATION_ERROR; return IFD_SUCCESS; } RESPONSECODE -IO_Close_Channel(void) +IFDHCreateChannelByName (DWORD Lun, LPSTR DeviceName) +{ + return IFDHCreateChannel (Lun, 0); +} + +RESPONSECODE +IFDHCloseChannel (DWORD Lun) { Log1(PCSC_LOG_DEBUG, ""); RESPONSECODE r = IFD_Eject_ICC(); @@ -30,11 +37,11 @@ IO_Close_Channel(void) } RESPONSECODE -IFD_Get_Capabilities(DWORD tag, PUCHAR value) +IFDHGetCapabilities (DWORD Lun, DWORD Tag, PDWORD Length, PUCHAR Value) { char *atr; int size; - switch (tag) { + switch (Tag) { case TAG_IFD_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); - memcpy(value, atr, size); + if (*Length < size) + return IFD_COMMUNICATION_ERROR; + + memcpy(Value, atr, size); + *Length = size; free(atr); - return IFD_SUCCESS; + break; case TAG_IFD_SLOTS_NUMBER: - (*value) = 0; - return IFD_SUCCESS; + if (*Length < 1) + return IFD_COMMUNICATION_ERROR; - //case TAG_IFD_POLLING_THREAD_KILLABLE: - //return IFD_SUCCESS; + *Value = 1; + *Length = 1; + break; 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 -IFD_Set_Capabilities(DWORD tag, PUCHAR value) +IFDHSetCapabilities (DWORD Lun, DWORD Tag, DWORD Length, PUCHAR Value) { return IFD_NOT_SUPPORTED; } RESPONSECODE -IFD_Set_Protocol_Parameters(DWORD protocoltype, UCHAR selectionflags, UCHAR - pts1, UCHAR pts2, UCHAR pts3) +IFDHSetProtocolParameters (DWORD Lun, DWORD Protocol, UCHAR Flags, UCHAR PTS1, + UCHAR PTS2, UCHAR PTS3) { Log1(PCSC_LOG_DEBUG, ""); return IFD_SUCCESS; } RESPONSECODE -IFD_Power_ICC(DWORD a) +IFDHPowerICC (DWORD Lun, DWORD Action, PUCHAR Atr, PDWORD AtrLength) { - switch (a) { + switch (Action) { case IFD_POWER_DOWN: if (vicc_poweroff() < 0) { Log1(PCSC_LOG_ERROR, "could not powerdown"); return IFD_COMMUNICATION_ERROR; } - break; + + *AtrLength = 0; + + return IFD_SUCCESS; case IFD_POWER_UP: if (vicc_poweron() < 0) { Log1(PCSC_LOG_ERROR, "could not powerup"); @@ -99,11 +115,11 @@ IFD_Power_ICC(DWORD a) } break; default: - Log2(PCSC_LOG_ERROR, "%d not supported", a); + Log2(PCSC_LOG_ERROR, "%d not supported", Action); return IFD_NOT_SUPPORTED; } - return IFD_SUCCESS; + return IFDHGetCapabilities (Lun, TAG_IFD_ATR, AtrLength, Atr); } RESPONSECODE @@ -130,41 +146,47 @@ IFD_Confiscate_ICC(void) } RESPONSECODE -IFD_Transmit_to_ICC(SCARD_IO_HEADER SendPci, PUCHAR TxBuffer, DWORD TxLength, - PUCHAR RxBuffer, PDWORD RxLength, PSCARD_IO_HEADER RecvPci) +IFDHTransmitToICC (DWORD Lun, SCARD_IO_HEADER SendPci, PUCHAR TxBuffer, + DWORD TxLength, PUCHAR RxBuffer, PDWORD RxLength, + PSCARD_IO_HEADER RecvPci) { - Log1(PCSC_LOG_DEBUG, ""); - (*RxLength) = 0; - char *rapdu; + if (!RxLength || !RecvPci) + return IFD_COMMUNICATION_ERROR; + char *rapdu; int size = vicc_transmit(TxLength, (char *) TxBuffer, &rapdu); + if (size < 0) { Log1(PCSC_LOG_ERROR, "could not send apdu or receive rapdu"); + *RxLength = 0; return IFD_COMMUNICATION_ERROR; } (*RxLength) = size; RxBuffer = memcpy(RxBuffer, rapdu, size); free(rapdu); + RecvPci->Protocol = 1; return IFD_SUCCESS; } RESPONSECODE -IFD_Is_ICC_Present(void) +IFDHICCPresence (DWORD Lun) { switch (vicc_present()) { - case 0: return IFD_ICC_NOT_PRESENT; - case 1: return IFD_ICC_PRESENT; + case 0: + return IFD_ICC_NOT_PRESENT; + case 1: + return IFD_ICC_PRESENT; default: - Log1(PCSC_LOG_DEBUG, "Could not get ICC state"); - return IFD_COMMUNICATION_ERROR; + Log1(PCSC_LOG_DEBUG, "Could not get ICC state"); + return IFD_COMMUNICATION_ERROR; } - return IFD_COMMUNICATION_ERROR; } 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; } diff --git a/virtualsmartcard/src/vpcd/vpcd.c b/virtualsmartcard/src/vpcd/vpcd.c index 94636b0..023661e 100644 --- a/virtualsmartcard/src/vpcd/vpcd.c +++ b/virtualsmartcard/src/vpcd/vpcd.c @@ -90,7 +90,7 @@ int opensock(unsigned short port) } int waitforclient(int server, long int secs, long int usecs) { - int sock; + int sock = 0; fd_set rfds; FD_ZERO(&rfds); @@ -189,7 +189,8 @@ int vicc_transmit(int apdu_len, const char *apdu, char **rapdu) { } int vicc_present(void) { - if (client_sock > 0) return 1; + if (client_sock > 0) + return 1; else { /* Wait up to one microsecond. */ client_sock = waitforclient(server_sock, 0, 1); diff --git a/virtualsmartcard/src/vpicc/VirtualSmartcard.py b/virtualsmartcard/src/vpicc/VirtualSmartcard.py index 5ab9762..d6fea46 100644 --- a/virtualsmartcard/src/vpicc/VirtualSmartcard.py +++ b/virtualsmartcard/src/vpicc/VirtualSmartcard.py @@ -387,7 +387,7 @@ class VirtualICC(object): # {{{ try: self.sock = self.connectToPort(host, port) 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?" sys.exit()