diff --git a/usb_application/ccid_raw.py b/usb_application/ccid_raw.py index e9b1fbab..b12ba35b 100755 --- a/usb_application/ccid_raw.py +++ b/usb_application/ccid_raw.py @@ -3,101 +3,81 @@ 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] +import array -# 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 +class SmartcardException(Exception): + pass -def pattern_match(inpt): - if (inpt == ATR_SYSMOCOM1): - return NEW_ATR - elif (inpt == CMD_SEL_FILE): - return CMD_SEL_ROOT - else: - return inpt +class SmartcardConnection: +# hcard, dwActiveProtocol, hcontext, reader -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!' + def __init__(self): + self.establish_context() + self.connect_card() - 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: ' + + 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 'Released context.' + print 'Connected with active protocol', self.dwActiveProtocol -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 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!' -def disconnect_card(hcard): - hresult = SCardDisconnect(hcard, SCARD_UNPOWER_CARD) - if hresult != SCARD_S_SUCCESS: - raise Exception('Failed to disconnect: ' + - SCardGetErrorMessage(hresult)) - print 'Disconnected' + 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: ") + hresult, resp = SCardTransmit(self.hcard, self.dwActiveProtocol, + cmd.tolist()) + if hresult != SCARD_S_SUCCESS: + raise SmartcardException('Failed to transmit: ' + + SCardGetErrorMessage(hresult)) + print 'Ans: ' + smartcard.util.toHexString(resp, + smartcard.util.HEX) + 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 do_intercept(cmd, dwActiveProtocol): - return send_receive_cmd(cmd, hcard, dwActiveProtocol) - -def ccid_raw_init(): - (hcontext, reader) = establish_context() - hresult, hcard, dwActiveProtocol = connect_to_card(hcontext, reader) - return hcard, hcontext, dwActiveProtocol - -def ccid_raw_exit(hcard, hcontext): - disconnect_card(hcard) - release_context(hcontext) + def close(self): + self.disconnect_card() + self.release_context() if __name__ == '__main__': - hcard, hcontext, dwActiveProtocol = ccid_raw_init() - do_intercept(CMD_SEL_ROOT, dwActiveProtocol) - do_intercept(CMD_SEL_FILE, dwActiveProtocol) - do_intercept(CMD_GET_DATA, dwActiveProtocol) - ccid_raw_exit() + import constants + + sm_con = SmartcardConnection() + 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()