Source code for desfire.pcsc

from smartcard.pcsc.PCSCCardConnection import translateprotocolheader
from smartcard.scard import SCardTransmit
from smartcard.scard import SCardGetErrorMessage
from smartcard.Exceptions import CardConnectionException

from .device import Device


[docs]class PCSCNotConnected(Exception): """Tried to transmit to non-open connection."""
[docs]class PCSCDevice(Device): """DESFire protocol wrapper for pyscard interface.""" def __init__(self, card_connection): """ :card_connection: :py:class:`smartcard.pcsc.PCSCCardConnection.PCSCCardConnection` instance. Call ``card_connection.connect()`` before calling any DESFire APIs. """ self.card_connection = card_connection
[docs] def transceive(self, bytes): if not self.card_connection.hcard: raise PCSCNotConnected("Tried to transit to non-open connection: {}".format(self.card_connection)) protocol = self.card_connection.getProtocol() pcscprotocolheader = translateprotocolheader(protocol) # http://pyscard.sourceforge.net/epydoc/smartcard.scard.scard-module.html#SCardTransmit hresult, response = SCardTransmit(self.card_connection.hcard, pcscprotocolheader, bytes) if hresult != 0: raise CardConnectionException('Failed to transmit with protocol ' + str(pcscprotocolheader) + '. ' + SCardGetErrorMessage(hresult)) return response