blob: a242976423a726b2a6e3bee3b44746ac2afa8f95 [file] [log] [blame]
Sylvain Munaut76504e02010-12-07 00:24:32 +01001#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3
4""" pySim: PCSC reader transport link
5"""
6
7#
8# Copyright (C) 2009-2010 Sylvain Munaut <tnt@246tNt.com>
9# Copyright (C) 2010 Harald Welte <laforge@gnumonks.org>
10#
11# This program is free software: you can redistribute it and/or modify
12# it under the terms of the GNU General Public License as published by
13# the Free Software Foundation, either version 2 of the License, or
14# (at your option) any later version.
15#
16# This program is distributed in the hope that it will be useful,
17# but WITHOUT ANY WARRANTY; without even the implied warranty of
18# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19# GNU General Public License for more details.
20#
21# You should have received a copy of the GNU General Public License
22# along with this program. If not, see <http://www.gnu.org/licenses/>.
23#
24
25from smartcard.Exceptions import NoCardException
26from smartcard.System import readers
27from smartcard.CardConnectionObserver import ConsoleCardConnectionObserver
28
29from pySim.exceptions import NoCardError
Sylvain Munaute7c15cd2010-12-07 10:01:55 +010030from pySim.transport import LinkBase
Sylvain Munaut76504e02010-12-07 00:24:32 +010031from pySim.utils import h2i, i2h
32
33
Sylvain Munaute7c15cd2010-12-07 10:01:55 +010034class PcscSimLink(LinkBase):
Sylvain Munaut76504e02010-12-07 00:24:32 +010035
36 def __init__(self, reader_number=0, observer=0):
37 r = readers();
38 try:
39 self._con = r[reader_number].createConnection()
40 if (observer):
41 observer = ConsoleCardConnectionObserver()
42 self._con.addObserver(observer)
43 self._con.connect()
44 #print r[reader_number], b2h(self._con.getATR())
45 except NoCardException:
46 raise NoCardError()
47
48 def __del__(self):
49 self._con.disconnect()
50 return
51
52 def reset_card(self):
53 self._con.disconnect()
54 try:
55 self._con.connect()
56 except NoCardException:
57 raise NoCardError()
58 return 1
59
60 def send_apdu_raw(self, pdu):
Sylvain Munaute7c15cd2010-12-07 10:01:55 +010061 """see LinkBase.send_apdu_raw"""
Sylvain Munaut76504e02010-12-07 00:24:32 +010062
Sylvain Munaut76504e02010-12-07 00:24:32 +010063 apdu = h2i(pdu)
64
65 data, sw1, sw2 = self._con.transmit(apdu)
66
67 sw = [sw1, sw2]
68
69 # Return value
70 return i2h(data), i2h(sw)