blob: e0424e86f483c88aa9216b77f3310f13edcd0448 [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
Christina Quastf2e53f02015-04-11 08:42:38 +02009from util import HEX
Christina Quast9547e9f2015-04-14 22:18:30 +020010from constants import *
Christina Quast88c7fa12015-04-06 00:35:03 +020011
Christina Quast69d1f902015-04-03 11:41:23 +020012def find_dev():
13 dev = usb.core.find(idVendor=0x03eb, idProduct=0x6004)
14 if dev is None:
15 raise ValueError("Device not found")
16 else:
17 print("Found device")
18 return dev
19
Christina Quast88c7fa12015-04-06 00:35:03 +020020def pattern_match(inpt):
21 print("Matching inpt", inpt)
Christina Quast94ddb912015-04-11 12:29:41 +020022 if (inpt == ATR_SYSMOCOM1) or (inpt == ATR_STRANGE_SIM):
23 print("ATR: ", inpt)
Christina Quast88c7fa12015-04-06 00:35:03 +020024 return NEW_ATR
25 elif (inpt == CMD_SEL_FILE):
Christina Quast94ddb912015-04-11 12:29:41 +020026 print("CMD_SEL_FILE:", inpt)
27 return CMD_SEL_ROOT
28 elif (inpt == CMD_GET_DATA):
29 print("CMD_DATA:", inpt)
Christina Quast88c7fa12015-04-06 00:35:03 +020030 return CMD_SEL_ROOT
31 else:
32 return inpt
Christina Quast69d1f902015-04-03 11:41:23 +020033
Christina Quast88c7fa12015-04-06 00:35:03 +020034def poll_ep(dev, ep):
35 try:
Christina Quast3a47a4f2015-04-11 18:16:14 +020036 return dev.read(ep, 64, 10)
Christina Quast88c7fa12015-04-06 00:35:03 +020037 except usb.core.USBError as e:
38 if e.errno != ERR_TIMEOUT:
39 raise
40 return None
Christina Quast69d1f902015-04-03 11:41:23 +020041
Christina Quast88c7fa12015-04-06 00:35:03 +020042def write_phone(dev, resp):
Christina Quastf2e53f02015-04-11 08:42:38 +020043 print("WR: ", HEX(resp))
Christina Quast3a47a4f2015-04-11 18:16:14 +020044 dev.write(PHONE_WR, resp, 10)
Christina Quast88c7fa12015-04-06 00:35:03 +020045
Christina Quast95270b12015-04-04 19:59:03 +020046def do_mitm():
Christina Quast69d1f902015-04-03 11:41:23 +020047 dev = find_dev()
Christina Quast88c7fa12015-04-06 00:35:03 +020048 with closing(SmartcardConnection()) as sm_con:
Christina Quast6f664a32015-04-06 19:08:04 +020049 atr = sm_con.getATR()
Christina Quast88c7fa12015-04-06 00:35:03 +020050 while True:
51 cmd = poll_ep(dev, PHONE_INT)
52 if cmd is not None:
Christina Quastf2e53f02015-04-11 08:42:38 +020053 print("Int line ", HEX(cmd))
Christina Quast88c7fa12015-04-06 00:35:03 +020054 assert cmd[0] == ord('R')
Christina Quast6f664a32015-04-06 19:08:04 +020055# FIXME: restart card anyways?
56# sm_con.reset_card()
Christina Quastf2e53f02015-04-11 08:42:38 +020057 print("Write atr: ", HEX(atr))
Christina Quast6f664a32015-04-06 19:08:04 +020058 write_phone(dev, atr)
Christina Quast69d1f902015-04-03 11:41:23 +020059
Christina Quast88c7fa12015-04-06 00:35:03 +020060 cmd = poll_ep(dev, PHONE_RD)
61 if cmd is not None:
Christina Quastf2e53f02015-04-11 08:42:38 +020062 print("RD: ", HEX(cmd))
Christina Quast88c7fa12015-04-06 00:35:03 +020063 sim_data = sm_con.send_receive_cmd(cmd)
Christina Quast88c7fa12015-04-06 00:35:03 +020064 write_phone(dev, sim_data)