blob: 73a99e8b139c2254c6698793a90f39cb2269a81e [file] [log] [blame]
Sylvain Munaut76504e02010-12-07 00:24:32 +01001# -*- coding: utf-8 -*-
2
Sylvain Munaut76504e02010-12-07 00:24:32 +01003# Copyright (C) 2009-2010 Sylvain Munaut <tnt@246tNt.com>
4# Copyright (C) 2010 Harald Welte <laforge@gnumonks.org>
5#
6# This program is free software: you can redistribute it and/or modify
7# it under the terms of the GNU General Public License as published by
8# the Free Software Foundation, either version 2 of the License, or
9# (at your option) any later version.
10#
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY; without even the implied warranty of
13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14# GNU General Public License for more details.
15#
16# You should have received a copy of the GNU General Public License
17# along with this program. If not, see <http://www.gnu.org/licenses/>.
18#
19
Vadim Yanitskiyfa617ac2020-02-26 22:33:08 +070020from smartcard.CardConnection import CardConnection
Sylvain Munautbdca2522010-12-09 13:31:58 +010021from smartcard.CardRequest import CardRequest
Daniel Willmanndd014ea2020-10-19 10:35:11 +020022from smartcard.Exceptions import NoCardException, CardRequestTimeoutException, CardConnectionException
Sylvain Munaut76504e02010-12-07 00:24:32 +010023from smartcard.System import readers
Sylvain Munaut76504e02010-12-07 00:24:32 +010024
Daniel Willmanndd014ea2020-10-19 10:35:11 +020025from pySim.exceptions import NoCardError, ProtocolError
Sylvain Munaute7c15cd2010-12-07 10:01:55 +010026from pySim.transport import LinkBase
Sylvain Munaut76504e02010-12-07 00:24:32 +010027from pySim.utils import h2i, i2h
28
29
Sylvain Munaute7c15cd2010-12-07 10:01:55 +010030class PcscSimLink(LinkBase):
Harald Welteee3501f2021-04-02 13:00:18 +020031 """ pySim: PCSC reader transport link."""
Sylvain Munaut76504e02010-12-07 00:24:32 +010032
Harald Welteeb05b2f2021-04-10 11:01:56 +020033 def __init__(self, reader_number:int=0, **kwargs):
34 super().__init__(**kwargs)
Daniel Willmann677d41b2020-10-19 10:34:31 +020035 r = readers()
Sylvain Munautbdca2522010-12-09 13:31:58 +010036 self._reader = r[reader_number]
37 self._con = self._reader.createConnection()
Sylvain Munaut76504e02010-12-07 00:24:32 +010038
39 def __del__(self):
Vadim Yanitskiy1f8acd92020-02-27 02:42:56 +070040 try:
41 # FIXME: this causes multiple warnings in Python 3.5.3
42 self._con.disconnect()
43 except:
44 pass
Sylvain Munaut76504e02010-12-07 00:24:32 +010045 return
46
Harald Welteee3501f2021-04-02 13:00:18 +020047 def wait_for_card(self, timeout:int=None, newcardonly:bool=False):
Sylvain Munautbdca2522010-12-09 13:31:58 +010048 cr = CardRequest(readers=[self._reader], timeout=timeout, newcardonly=newcardonly)
49 try:
50 cr.waitforcard()
51 except CardRequestTimeoutException:
52 raise NoCardError()
53 self.connect()
54
55 def connect(self):
56 try:
Vadim Yanitskiyfa617ac2020-02-26 22:33:08 +070057 # Explicitly select T=0 communication protocol
58 self._con.connect(CardConnection.T0_protocol)
59 except CardConnectionException:
60 raise ProtocolError()
Sylvain Munautbdca2522010-12-09 13:31:58 +010061 except NoCardException:
62 raise NoCardError()
63
Alexander Chemerisd2d660a2017-07-18 16:52:25 +030064 def get_atr(self):
65 return self._con.getATR()
66
Sylvain Munautbdca2522010-12-09 13:31:58 +010067 def disconnect(self):
68 self._con.disconnect()
69
Sylvain Munaut76504e02010-12-07 00:24:32 +010070 def reset_card(self):
Vadim Yanitskiy41c22172020-02-26 22:18:32 +070071 self.disconnect()
72 self.connect()
Sylvain Munaut76504e02010-12-07 00:24:32 +010073 return 1
74
Harald Weltec34f9402021-04-10 10:55:24 +020075 def _send_apdu_raw(self, pdu):
Sylvain Munaut76504e02010-12-07 00:24:32 +010076
Sylvain Munaut76504e02010-12-07 00:24:32 +010077 apdu = h2i(pdu)
78
79 data, sw1, sw2 = self._con.transmit(apdu)
80
81 sw = [sw1, sw2]
82
83 # Return value
84 return i2h(data), i2h(sw)