mirror of
https://github.com/logos-blockchain/logos-execution-zone.git
synced 2026-05-14 20:19:51 +00:00
47 lines
1.2 KiB
Python
47 lines
1.2 KiB
Python
from types import TracebackType
|
|
from smartcard.System import readers
|
|
from smartcard.pcsc.PCSCReader import PCSCReader
|
|
|
|
from .apdu import APDUResponse
|
|
from .exceptions import TransportError
|
|
|
|
|
|
class Transport:
|
|
def __init__(self) -> None:
|
|
self.connection: PCSCReader = None
|
|
|
|
def __enter__(self) -> 'Transport':
|
|
self.connect()
|
|
return self
|
|
|
|
def __exit__(
|
|
self,
|
|
type_: type[BaseException] | None,
|
|
value: BaseException | None,
|
|
traceback: TracebackType | None
|
|
) -> None:
|
|
self.disconnect()
|
|
|
|
def connect(self, index: int = 0) -> None:
|
|
r = readers()
|
|
if not r:
|
|
raise TransportError('No smart card readers found')
|
|
self.connection = r[index].createConnection()
|
|
self.connection.connect()
|
|
|
|
def disconnect(self) -> None:
|
|
if self.connection:
|
|
self.connection.disconnect()
|
|
self.connection = None
|
|
|
|
def send_apdu(self, apdu: bytes) -> APDUResponse:
|
|
if not self.connection:
|
|
self.connect()
|
|
|
|
apdu_list = list(apdu)
|
|
|
|
response, sw1, sw2 = self.connection.transmit(apdu_list)
|
|
|
|
sw = (sw1 << 8) | sw2
|
|
return APDUResponse(response, sw)
|