blob: 962bf88f38cbe53d49376afc91a1ec6be85bb6f7 [file] [log] [blame]
Christina Quast69d1f902015-04-03 11:41:23 +02001import usb.core
2import usb.util
3
Christina Quast88c7fa12015-04-06 00:35:03 +02004from ccid_raw import SmartcardConnection
Christina Quast95270b12015-04-04 19:59:03 +02005import phone
6
Christina Quast88c7fa12015-04-06 00:35:03 +02007from contextlib import closing
8
9
Christina Quast69d1f902015-04-03 11:41:23 +020010def find_dev():
11 dev = usb.core.find(idVendor=0x03eb, idProduct=0x6004)
12 if dev is None:
13 raise ValueError("Device not found")
14 else:
15 print("Found device")
16 return dev
17
Christina Quast88c7fa12015-04-06 00:35:03 +020018def pattern_match(inpt):
19 print("Matching inpt", inpt)
20 if (inpt == ATR_SYSMOCOM1):
21 return NEW_ATR
22 elif (inpt == CMD_SEL_FILE):
23 return CMD_SEL_ROOT
24 else:
25 return inpt
Christina Quast69d1f902015-04-03 11:41:23 +020026
27SIM_WR = 0x1
28SIM_RD = 0x82
29SIM_INT = 0x83
30
31PHONE_WR = 0x4
32PHONE_RD = 0x85
33PHONE_INT = 0x86
34
Christina Quast88c7fa12015-04-06 00:35:03 +020035ERR_TIMEOUT = 110
Christina Quast69d1f902015-04-03 11:41:23 +020036
Christina Quast88c7fa12015-04-06 00:35:03 +020037def poll_ep(dev, ep):
38 try:
39 return dev.read(ep, 64, 1000)
40 except usb.core.USBError as e:
41 if e.errno != ERR_TIMEOUT:
42 raise
43 return None
Christina Quast69d1f902015-04-03 11:41:23 +020044
Christina Quast88c7fa12015-04-06 00:35:03 +020045def write_phone(dev, resp):
46 dev.write(PHONE_WR, resp, 1000)
47
Christina Quast95270b12015-04-04 19:59:03 +020048def do_mitm():
Christina Quast69d1f902015-04-03 11:41:23 +020049 dev = find_dev()
Christina Quast88c7fa12015-04-06 00:35:03 +020050 with closing(SmartcardConnection()) as sm_con:
Christina Quast6f664a32015-04-06 19:08:04 +020051 atr = sm_con.getATR()
Christina Quast88c7fa12015-04-06 00:35:03 +020052 while True:
53 cmd = poll_ep(dev, PHONE_INT)
54 if cmd is not None:
55 print(cmd)
56 assert cmd[0] == ord('R')
Christina Quast6f664a32015-04-06 19:08:04 +020057# FIXME: restart card anyways?
58# sm_con.reset_card()
59 write_phone(dev, atr)
Christina Quast69d1f902015-04-03 11:41:23 +020060
Christina Quast88c7fa12015-04-06 00:35:03 +020061 cmd = poll_ep(dev, PHONE_RD)
62 if cmd is not None:
63 print(cmd)
64 sim_data = sm_con.send_receive_cmd(cmd)
Christina Quast88c7fa12015-04-06 00:35:03 +020065 write_phone(dev, sim_data)