Christina Quast | 254acae | 2015-04-01 19:36:34 +0200 | [diff] [blame] | 1 | #!/usr/bin/env python |
| 2 | |
| 3 | from smartcard.scard import * |
| 4 | import smartcard.util |
| 5 | |
| 6 | CMD_SEL_ROOT = [0xA0, 0xA4, 0x00, 0x00, 0x02, 0x3F, 0x00] |
| 7 | CMD_SEL_FILE = [0xA0, 0xA4, 0x00, 0x00, 0x02, 0x7F, 0x20] |
| 8 | CMD_GET_DATA = [0xA0, 0xC0, 0x00, 0x00, 0x16] |
| 9 | # SuperSIM ATR |
| 10 | atr_supersim= [0x3B, 0x9A, 0x94, 0x00, 0x92, 0x02, 0x75, 0x93, 0x11, 0x00, 0x01, 0x02, 0x02, 0x19] |
| 11 | |
| 12 | # Faster sysmocom SIM |
| 13 | ATR_SYSMOCOM1 = [0x3B, 0x99, 0x18, 0x00, 0x11, 0x88, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x60] |
| 14 | ATR_SYSMOCOM2 = [0x3B, 0x99, 0x11, 0x00, 0x11, 0x88, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x60] |
| 15 | NEW_ATR = ATR_SYSMOCOM2 |
| 16 | |
| 17 | def pattern_match(inpt): |
| 18 | if (inpt == ATR_SYSMOCOM1): |
| 19 | return NEW_ATR |
| 20 | elif (inpt == CMD_SEL_FILE): |
| 21 | return CMD_SEL_ROOT |
| 22 | else: |
| 23 | return inpt |
| 24 | |
| 25 | def connect_to_card(hcontext, reader): |
| 26 | hresult, hcard, dwActiveProtocol = SCardConnect(hcontext, reader, |
| 27 | SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1) |
| 28 | if hresult != SCARD_S_SUCCESS: |
| 29 | raise Exception('Unable to connect: ' + |
| 30 | SCardGetErrorMessage(hresult)) |
| 31 | print 'Connected with active protocol', dwActiveProtocol |
| 32 | return hresult, hcard, dwActiveProtocol |
| 33 | |
| 34 | def establish_context(): |
| 35 | hresult, hcontext = SCardEstablishContext(SCARD_SCOPE_USER) |
| 36 | if hresult != SCARD_S_SUCCESS: |
| 37 | raise Exception('Failed to establish context : ' + |
| 38 | SCardGetErrorMessage(hresult)) |
| 39 | print 'Context established!' |
| 40 | |
| 41 | hresult, readers = SCardListReaders(hcontext, []) |
| 42 | if hresult != SCARD_S_SUCCESS: |
| 43 | raise Exception('Failed to list readers: ' + |
| 44 | SCardGetErrorMessage(hresult)) |
| 45 | print 'PCSC Readers:', readers |
| 46 | |
| 47 | if len(readers) < 1: |
| 48 | raise Exception('No smart card readers') |
| 49 | |
| 50 | reader = readers[0] |
| 51 | print "Using reader:", reader |
| 52 | |
| 53 | return (hcontext, reader) |
| 54 | |
| 55 | |
| 56 | def release_context(hcontext): |
| 57 | hresult = SCardReleaseContext(hcontext) |
| 58 | if hresult != SCARD_S_SUCCESS: |
| 59 | raise Exception('Failed to release context: ' + |
| 60 | SCardGetErrorMessage(hresult)) |
| 61 | print 'Released context.' |
| 62 | |
| 63 | def send_receive_cmd(cmd, hcard, dwActiveProtocol): |
| 64 | print("Response: ") |
| 65 | new_cmd = pattern_match(cmd) |
| 66 | print(' '.join([hex(i) for i in cmd])) |
| 67 | hresult, response = SCardTransmit(hcard, dwActiveProtocol, |
| 68 | new_cmd) |
| 69 | if hresult != SCARD_S_SUCCESS: |
| 70 | raise Exception('Failed to transmit: ' + |
| 71 | SCardGetErrorMessage(hresult)) |
| 72 | resp = pattern_match(response) |
| 73 | print 'Ans: ' + smartcard.util.toHexString(resp, |
| 74 | smartcard.util.HEX) |
| 75 | return response |
| 76 | |
| 77 | def disconnect_card(hcard): |
| 78 | hresult = SCardDisconnect(hcard, SCARD_UNPOWER_CARD) |
| 79 | if hresult != SCARD_S_SUCCESS: |
| 80 | raise Exception('Failed to disconnect: ' + |
| 81 | SCardGetErrorMessage(hresult)) |
| 82 | print 'Disconnected' |
| 83 | |
| 84 | |
| 85 | def do_intercept(cmd, dwActiveProtocol): |
Christina Quast | cce4b09 | 2015-04-03 11:43:09 +0200 | [diff] [blame] | 86 | return send_receive_cmd(cmd, hcard, dwActiveProtocol) |
Christina Quast | 254acae | 2015-04-01 19:36:34 +0200 | [diff] [blame] | 87 | |
| 88 | def init(): |
| 89 | (hcontext, reader) = establish_context() |
| 90 | hresult, hcard, dwActiveProtocol = connect_to_card(hcontext, reader) |
| 91 | return hcard, hcontext, dwActiveProtocol |
| 92 | |
| 93 | def exit(hcard, hcontext): |
| 94 | disconnect_card(hcard) |
| 95 | release_context(hcontext) |
| 96 | |
| 97 | hcard, hcontext, dwActiveProtocol = init() |
| 98 | |
| 99 | do_intercept(CMD_SEL_ROOT, dwActiveProtocol) |
| 100 | do_intercept(CMD_SEL_FILE, dwActiveProtocol) |
| 101 | do_intercept(CMD_GET_DATA, dwActiveProtocol) |
| 102 | |
| 103 | exit(hcard, hcontext) |