mirror of https://gerrit.osmocom.org/simtrace2
103 lines
3.4 KiB
Python
Executable File
103 lines
3.4 KiB
Python
Executable File
#!/usr/bin/env python
|
|
|
|
from smartcard.scard import *
|
|
import smartcard.util
|
|
|
|
import array
|
|
|
|
from util import HEX
|
|
|
|
class SmartcardException(Exception):
|
|
pass
|
|
|
|
class SmartcardConnection:
|
|
# hcard, dwActiveProtocol, hcontext, reader
|
|
|
|
def __init__(self):
|
|
self.establish_context()
|
|
self.connect_card()
|
|
|
|
def getATR(self):
|
|
hresult, reader, state, protocol, atr = SCardStatus(self.hcard)
|
|
if hresult != SCARD_S_SUCCESS:
|
|
print 'failed to get status: ' + SCardGetErrorMessage(hresult)
|
|
print 'Reader:', reader
|
|
print 'State:', state
|
|
print 'Protocol:', protocol
|
|
print 'ATR:', HEX(atr)
|
|
return array.array('B', atr)
|
|
|
|
def reset_card(self):
|
|
hresult, self.dwActiveProtocol = SCardReconnect(self.hcard, SCARD_SHARE_SHARED,
|
|
SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, SCARD_RESET_CARD)
|
|
if hresult != SCARD_S_SUCCESS:
|
|
raise SmartcardException('Unable to retrieve Atr: ' +
|
|
SCardGetErrorMessage(hresult))
|
|
|
|
def connect_card(self):
|
|
hresult, self.hcard, self.dwActiveProtocol = SCardConnect(self.hcontext, self.reader,
|
|
SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1)
|
|
if hresult != SCARD_S_SUCCESS:
|
|
raise SmartcardException('Unable to connect: ' +
|
|
SCardGetErrorMessage(hresult))
|
|
print 'Connected with active protocol', self.dwActiveProtocol
|
|
|
|
def establish_context(self):
|
|
hresult, self.hcontext = SCardEstablishContext(SCARD_SCOPE_USER)
|
|
if hresult != SCARD_S_SUCCESS:
|
|
raise SmartcardException('Failed to establish context : ' +
|
|
SCardGetErrorMessage(hresult))
|
|
print 'Context established!'
|
|
|
|
hresult, readers = SCardListReaders(self.hcontext, [])
|
|
if hresult != SCARD_S_SUCCESS:
|
|
raise SmartcardException('Failed to list readers: ' +
|
|
SCardGetErrorMessage(hresult))
|
|
print 'PCSC Readers:', readers
|
|
|
|
if len(readers) < 1:
|
|
raise SmartcardException('No smart card readers')
|
|
|
|
self.reader = readers[0]
|
|
print "Using reader:", self.reader
|
|
|
|
def release_context(self):
|
|
hresult = SCardReleaseContext(self.hcontext)
|
|
if hresult != SCARD_S_SUCCESS:
|
|
raise SmartcardException('Failed to release context: ' +
|
|
SCardGetErrorMessage(hresult))
|
|
print 'Released context.'
|
|
|
|
def send_receive_cmd(self, cmd):
|
|
print("Cmd to SIM: " + HEX(cmd))
|
|
hresult, resp = SCardTransmit(self.hcard, self.dwActiveProtocol,
|
|
cmd.tolist())
|
|
if hresult != SCARD_S_SUCCESS:
|
|
raise SmartcardException('Failed to transmit: ' +
|
|
SCardGetErrorMessage(hresult))
|
|
print 'SIM Ans: ' + HEX(resp)
|
|
return array.array('B', resp)
|
|
|
|
def disconnect_card(self):
|
|
hresult = SCardDisconnect(self.hcard, SCARD_UNPOWER_CARD)
|
|
if hresult != SCARD_S_SUCCESS:
|
|
raise SmartcardException('Failed to disconnect: ' +
|
|
SCardGetErrorMessage(hresult))
|
|
print 'Disconnected'
|
|
|
|
|
|
def close(self):
|
|
self.disconnect_card()
|
|
self.release_context()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
import constants
|
|
|
|
sm_con = SmartcardConnection()
|
|
sm_con.getATR()
|
|
print(sm_con.send_receive_cmd(constants.CMD_SEL_ROOT))
|
|
print(sm_con.send_receive_cmd(constants.CMD_SEL_FILE))
|
|
print(sm_con.send_receive_cmd(constants.CMD_GET_DATA))
|
|
sm_con.close()
|