simtrace2/usb_application/ccid_raw.py

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()