blob: 57797ac0d6b0905d328d7d771612c69df1d9385e [file] [log] [blame]
Christina Quast254acae2015-04-01 19:36:34 +02001#!/usr/bin/env python
2
3from smartcard.scard import *
4import smartcard.util
5
6CMD_SEL_ROOT = [0xA0, 0xA4, 0x00, 0x00, 0x02, 0x3F, 0x00]
7CMD_SEL_FILE = [0xA0, 0xA4, 0x00, 0x00, 0x02, 0x7F, 0x20]
8CMD_GET_DATA = [0xA0, 0xC0, 0x00, 0x00, 0x16]
9# SuperSIM ATR
10atr_supersim= [0x3B, 0x9A, 0x94, 0x00, 0x92, 0x02, 0x75, 0x93, 0x11, 0x00, 0x01, 0x02, 0x02, 0x19]
11
12# Faster sysmocom SIM
13ATR_SYSMOCOM1 = [0x3B, 0x99, 0x18, 0x00, 0x11, 0x88, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x60]
14ATR_SYSMOCOM2 = [0x3B, 0x99, 0x11, 0x00, 0x11, 0x88, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x60]
15NEW_ATR = ATR_SYSMOCOM2
16
17def 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
25def 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
34def 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
56def 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
63def 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
77def 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
85def do_intercept(cmd, dwActiveProtocol):
Christina Quastcce4b092015-04-03 11:43:09 +020086 return send_receive_cmd(cmd, hcard, dwActiveProtocol)
Christina Quast254acae2015-04-01 19:36:34 +020087
88def init():
89 (hcontext, reader) = establish_context()
90 hresult, hcard, dwActiveProtocol = connect_to_card(hcontext, reader)
91 return hcard, hcontext, dwActiveProtocol
92
93def exit(hcard, hcontext):
94 disconnect_card(hcard)
95 release_context(hcontext)
96
97hcard, hcontext, dwActiveProtocol = init()
98
99do_intercept(CMD_SEL_ROOT, dwActiveProtocol)
100do_intercept(CMD_SEL_FILE, dwActiveProtocol)
101do_intercept(CMD_GET_DATA, dwActiveProtocol)
102
103exit(hcard, hcontext)