#!/usr/bin/env python from smartcard.scard import * import smartcard.util CMD_SEL_ROOT = [0xA0, 0xA4, 0x00, 0x00, 0x02, 0x3F, 0x00] CMD_SEL_FILE = [0xA0, 0xA4, 0x00, 0x00, 0x02, 0x7F, 0x20] CMD_GET_DATA = [0xA0, 0xC0, 0x00, 0x00, 0x16] # SuperSIM ATR atr_supersim= [0x3B, 0x9A, 0x94, 0x00, 0x92, 0x02, 0x75, 0x93, 0x11, 0x00, 0x01, 0x02, 0x02, 0x19] # Faster sysmocom SIM ATR_SYSMOCOM1 = [0x3B, 0x99, 0x18, 0x00, 0x11, 0x88, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x60] ATR_SYSMOCOM2 = [0x3B, 0x99, 0x11, 0x00, 0x11, 0x88, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x60] NEW_ATR = ATR_SYSMOCOM2 def pattern_match(inpt): if (inpt == ATR_SYSMOCOM1): return NEW_ATR elif (inpt == CMD_SEL_FILE): return CMD_SEL_ROOT else: return inpt def connect_to_card(hcontext, reader): hresult, hcard, dwActiveProtocol = SCardConnect(hcontext, reader, SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1) if hresult != SCARD_S_SUCCESS: raise Exception('Unable to connect: ' + SCardGetErrorMessage(hresult)) print 'Connected with active protocol', dwActiveProtocol return hresult, hcard, dwActiveProtocol def establish_context(): hresult, hcontext = SCardEstablishContext(SCARD_SCOPE_USER) if hresult != SCARD_S_SUCCESS: raise Exception('Failed to establish context : ' + SCardGetErrorMessage(hresult)) print 'Context established!' hresult, readers = SCardListReaders(hcontext, []) if hresult != SCARD_S_SUCCESS: raise Exception('Failed to list readers: ' + SCardGetErrorMessage(hresult)) print 'PCSC Readers:', readers if len(readers) < 1: raise Exception('No smart card readers') reader = readers[0] print "Using reader:", reader return (hcontext, reader) def release_context(hcontext): hresult = SCardReleaseContext(hcontext) if hresult != SCARD_S_SUCCESS: raise Exception('Failed to release context: ' + SCardGetErrorMessage(hresult)) print 'Released context.' def send_receive_cmd(cmd, hcard, dwActiveProtocol): print("Response: ") new_cmd = pattern_match(cmd) print(' '.join([hex(i) for i in cmd])) hresult, response = SCardTransmit(hcard, dwActiveProtocol, new_cmd) if hresult != SCARD_S_SUCCESS: raise Exception('Failed to transmit: ' + SCardGetErrorMessage(hresult)) resp = pattern_match(response) print 'Ans: ' + smartcard.util.toHexString(resp, smartcard.util.HEX) return response def disconnect_card(hcard): hresult = SCardDisconnect(hcard, SCARD_UNPOWER_CARD) if hresult != SCARD_S_SUCCESS: raise Exception('Failed to disconnect: ' + SCardGetErrorMessage(hresult)) print 'Disconnected' def do_intercept(cmd, dwActiveProtocol): return send_receive_cmd(cmd, hcard, dwActiveProtocol) def init(): (hcontext, reader) = establish_context() hresult, hcard, dwActiveProtocol = connect_to_card(hcontext, reader) return hcard, hcontext, dwActiveProtocol def exit(hcard, hcontext): disconnect_card(hcard) release_context(hcontext) hcard, hcontext, dwActiveProtocol = init() do_intercept(CMD_SEL_ROOT, dwActiveProtocol) do_intercept(CMD_SEL_FILE, dwActiveProtocol) do_intercept(CMD_GET_DATA, dwActiveProtocol) exit(hcard, hcontext)