Re: Bug in reconnecting to a card.
"Abraham Macias Paredes" <[email protected]> Fri, 23 Sep 2016 14:49:55 +0200
| Newsgroups | gmane.comp.lib.muscle |
|---|---|
| Message-ID | <[email protected]> |
Hi again, After some tests I think that a second “Connect” invalidates the transactions (Python test attached). Or maybe there are a couple of seconds of timeout before invalidating the transactions and allowing the connection (because when you run the test you can notice a couple of seconds of delay before the second “connect”). The output of the test in my Windows 10 is: c:\Python27>python.exe test.py Context established! PCSC Readers: ['Dell Smart Card Reader Keyboard 0'] Using reader: Dell Smart Card Reader Keyboard 0 Connected with active protocol 1 Start transaction Connect again Connected with active protocol 1 Start transaction (card 2) End transaction (card 2) End transaction in the first connection Exception: failed to end a transaction: Se ha reiniciado la tarjeta inteligente, por lo que no es vßlida ninguna informaci¾n de estado compartido. Released context. press Enter to continue Best regards! De: Pcsclite-muscle [mailto:pcsclite-muscle-bounces+amacias=solutia-it.es@lists.alioth.debian.org] En nombre de Abraham Macias Paredes Enviado el: viernes, 23 de septiembre de 2016 13:31 Para: 'Talks about MUSCLE' <[email protected]> Asunto: Re: [Pcsclite-muscle] Bug in reconnecting to a card. Hi, * Do you get the same behavior on Windows? No, in Windows seems that “disconnect” and “reconnect” ends all started transactions. * What should be the correct behavior of pcsc-lite? I think that is logical to think that when you “reconnect” or “disconnect” a card, all estarted transactions are ended. Thank you and best regards! De: Pcsclite-muscle [mailto:pcsclite-muscle-bounces+amacias=solutia-it.es@lists.alioth.debian.org] En nombre de Ludovic Rousseau Enviado el: viernes, 23 de septiembre de 2016 12:54 Para: Talks about MUSCLE <[email protected] <mailto:[email protected]> > Asunto: Re: [Pcsclite-muscle] Bug in reconnecting to a card. 2016-09-23 12:45 GMT+02:00 Abraham Macias Paredes <[email protected] <mailto:[email protected]> >: Hi PCSC lite Project people, Hello, I’m developing a software that nowadays is not stable (my software is buggy), but I detected that a bug in my software causes a bug in pcsc-lite. The “SCardReconnect” doesn’t check if the connection has a transaction opened. So if you open a transtaction and reconnects the transaction is still opened. And also you can open a new transaction. Interesting. Do you get the same behavior on Windows? What should be the correct behavior of pcsc-lite? Bye -- Dr. Ludovic Rousseau _______________________________________________ Pcsclite-muscle mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pcsclite-muscle
test.py
(text/plain, 3.2 KB)
#! /usr/bin/env python
from smartcard.scard import *
import smartcard.util
SELECT = [0x00, 0xA4, 0x04, 0x00, 0x0A, 0xA0, 0x00, 0x00, 0x00, 0x62,
0x03, 0x01, 0x0C, 0x06, 0x01]
COMMAND = [0x00, 0x00, 0x00, 0x00]
try:
hresult, hcontext = SCardEstablishContext(SCARD_SCOPE_USER)
if hresult != SCARD_S_SUCCESS:
raise Exception('Failed to establish context : ' +
SCardGetErrorMessage(hresult))
print 'Context established!'
try:
hresult, readers = SCardListReaders(hcontext, [])
if hresult != SCARD_S_SUCCESS:
raise Exception('Failed to list readers: ' +
SCardGetErrorMessage(hresult))
print 'PCSC Readers:', readers
if len(readers) < 1:
raise Exception('No smart card readers')
reader = readers[0]
print "Using reader:", reader
try:
hresult, hcard, dwActiveProtocol = SCardConnect(hcontext, reader,
SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1)
if hresult != SCARD_S_SUCCESS:
raise Exception('Unable to connect: ' +
SCardGetErrorMessage(hresult))
print 'Connected with active protocol', dwActiveProtocol
print "Start transaction"
hresult = SCardBeginTransaction(hcard)
if hresult != SCARD_S_SUCCESS:
raise error, 'failed to begin a transaction: ' + SCardGetErrorMessage(hresult)
print "Connect again"
hresult, hcard2, dwActiveProtocol = SCardConnect(hcontext, reader,
SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1)
if hresult != SCARD_S_SUCCESS:
raise Exception('Unable to connect: ' +
SCardGetErrorMessage(hresult))
print 'Connected with active protocol', dwActiveProtocol
print "Start transaction (card 2)"
hresult = SCardBeginTransaction(hcard2)
if hresult != SCARD_S_SUCCESS:
raise error, 'failed to begin a transaction: ' + SCardGetErrorMessage(hresult)
print 'End transaction (card 2)'
hresult = SCardEndTransaction(hcard2, SCARD_LEAVE_CARD)
if hresult != SCARD_S_SUCCESS:
raise error, 'failed to end a transaction: ' + SCardGetErrorMessage(hresult)
print 'End transaction in the first connection'
hresult = SCardEndTransaction(hcard, SCARD_LEAVE_CARD)
if hresult != SCARD_S_SUCCESS:
raise error, 'failed to end a transaction: ' + SCardGetErrorMessage(hresult)
except Exception, message:
print "Exception:", message
finally:
hresult = SCardReleaseContext(hcontext)
if hresult != SCARD_S_SUCCESS:
raise Exception('Failed to release context: ' +
SCardGetErrorMessage(hresult))
print 'Released context.'
except Exception, message:
print "Exception:", message
import sys
if 'win32' == sys.platform:
print 'press Enter to continue'
sys.stdin.read(1)