- 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:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user